On Sat, Jan 9, 2016 at 7:12 AM, Mariano Martinez Peck
<marianop...@gmail.com> wrote:
>
> On Jan 8, 2016 4:13 PM, "Ben Coman" <b...@openinworld.com> wrote:
>>
>> On Sat, Jan 9, 2016 at 2:04 AM, Mariano Martinez Peck
>> <marianop...@gmail.com> wrote:
>> > Hi guys,
>> >
>> > I wonder if someone could give me a hand to find out why a FFI calling I
>> > am
>> > doing is crashing. In OSX it works correct but I am testing in CentOS
>> > and it
>> > fails. I wonder if it also crashes in other Linuxes too.
>>
>> I only had enough time to run it a few time so you know it also
>> crashes in Debian Jessie 32-bit. There were no debug logs.  I got
>> these sorts of messages...
>>
>
> Thanks!
>
>> *** Error in `/home/ben/tst/pharo-vm/pharo': free(): invalid next size
>> (fast): 0x08841a70 ***
>>
>> pharo: malloc.c:3695: _int_malloc: Assertion `(unsigned long) (size)
>> >= (unsigned long) (nb)' failed.
>> *** Error in `/home/ben/tst/pharo-vm/pharo': malloc(): memory
>> corruption: 0x0984c1e0 ***
>>
>>
>> Searching github for "posix_spawn_file_actions_init "
>> (https://git.io/vuSPL)
>> I see a lot a function definitions of the form...
>>    int posix_spawn_file_actions_init(posix_spawn_file_actions_t *fa)
>>   {
>>        fa->__actions = 0;
>>        return 0;
>>    }
>>
>> ...so it seems you need to first allocate the space for the struct and
>> then pass the address of that.
>
> I thought the same. But I also read in glibc that that the init and destroy
> would free and alloc exactly so that you don't have to do it.
>
> In fact, the structure is known to be opaque. I cannot rely in what I see in
> internet since each os may have a different.
>
> And I cant get the size of it from ffi so I cannot allocate accurately.  I
> think I am screw. I don't want to go to plugin side grrr ..
>
> And osx does work.
>
> I think I will try against glibc rather than libc.
>
> Another idea?
>
>> {
>>   int __allocated;
>>   int __used;
>>   struct __spawn_action *__actions;
>>   int __pad[16];
>> } posix_spawn_file_actions_t;
>> // http://linux.die.net/include/spawn.h
>>
>
> But that's opaque right? I cannot rely on that

Your ExternalAddress use only allocates 4 bytes for the pointer.  You
need to also allocate the space for the structure.  I guess these may
need separate ExternalXXX objects, but just as hack experiment I find
below that n:=68 crashes and n:=69 its fine.

| posixSpawnFileActionsT n |
n := 68.  "n := 69"
posixSpawnFileActionsT := ExternalAddress allocate: n.
OSSUnixSubprocess new primitivePosixSpawnFileActionsInit:
posixSpawnFileActionsT.
posixSpawnFileActionsT free.


In trying to understand this I found an interesting article...
     http://www.catb.org/esr/structure-packing/
What I don't know is for a 32-bit OS on a 64-bit machine, is my
pointer 4 or 8 bytes?
Assuming 4 I derive the structure size for my 32-bit system is...
4      int __allocated;
4      int __used;
4      struct __spawn_action *__actions;
64    int __pad[16];
76    posix_spawn_file_actions_t;

76 - 68 = 8 is an interesting round number, but I can't quite reason it out.

With FFI how to you allocate some external memory and then get a
pointer to it to pass to primitivePosixSpawnFileActionsInit ?

cheers -ben

>> > I am using latest Pharo 5.0 with Spur. To reproduce:
>> >
>> > 1) Get latest Pharo 5.0 and Spur via:
>> > wget -O- get.pharo.org/alpha+vm | bash
>> >
>> > 2) Inside Pharo, load my prototype tool:
>> >
>> > Gofer it
>> > package: 'OSSubprocess';
>> > url: 'http://smalltalkhub.com/mc/marianopeck/OSSubprocess/main';
>> > load.
>> >
>> > 3) This is the code I am executing and it's crashing:
>> >
>> > | posixSpawnFileActionsT | posixSpawnFileActionsT := ExternalAddress
>> > allocate: 4. OSSUnixSubprocess new primitivePosixSpawnFileActionsInit:
>> > posixSpawnFileActionsT. posixSpawnFileActionsT free.
>> > 4) The primitive is as simple as:
>> >
>> > primitivePosixSpawnFileActionsInit: aPosixSpawnFileActionsT
>> > ^ self ffiCall: #( int posix_spawn_file_actions_init(void*
>> > aPosixSpawnFileActionsT) ) module: LibC
>> >
>> > I have no idea what I am doing wrong. And again, this works on OSX. The
>> > function I am calling is:  int
>> > posix_spawn_file_actions_init(posix_spawn_file_actions_t *file_actions);
>> > as
>> > you can read in [1]
>> >
>> > Below is the stacktrace I get the Linux terminal.
>> >
>> > Any hint is greatly appreciated.
>> >
>> > Thanks,
>> >
>> >
>> > [1]
>> >
>> > http://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn_file_actions_destroy.html
>>

Reply via email to