On Sat, Jan 9, 2016 at 8:54 PM, Mariano Martinez Peck <marianop...@gmail.com> wrote: > Hi Ben, allf > > Ok, I can also confirm that doing ExternalAddress allocate: 76 does work in > Linux. And yes, since it's opaque I don't have to map it and just allocating > the correct size is enough.
Its probably not 76 bytes in 64-bit though. Can someone on 64-bit report the result of my little C-code sample. Probably its okay initially to waste a few bytes on 32-bit until we have something to calculate these at runtime (btw, what is the current state/plans for such a feature). > I expect this would work in all GNU libc (glibc) based UNIXses. > Esteban, well, I thought the init function would do both, allocate and init, > but in glibc it seems it only init. In OSX it seems it does both. But from > the API point of view it's not explicit that they should allocate the space. > > Anyway, I think we get this working this time. Thanks all for the help. > > Now the problem I am facing (in Linux) is that my none blocking pipes do not > seem to be none blocking or either feof() call is not working as expected. > Ok, I have to deal with this one now. Do you have any code samples? Sounds like an interesting thing to have a look at. cheers -ben > > Thanks!! > > > On Sat, Jan 9, 2016 at 9:44 AM, Ben Coman <b...@openinworld.com> wrote: >> >> On Sat, Jan 9, 2016 at 12:15 PM, Ben Coman <b...@openinworld.com> wrote: >> > 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. >> >> Whoops, I missed that the space for the struct seems actually >> allocated by ExternalAddress. Doh! there it is staring at me with the >> #allocate: message. So I guess a separate ExternalXXX object isn't >> required. >> >> > >> > | 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. >> >> btw I confirmed *my* structure size by compiling and running... >> #include <stdio.h> >> #include <spawn.h> >> posix_spawn_file_actions_t tst; >> int main() >> { >> printf("-->sizeof=%d\n", sizeof(posix_spawn_file_actions_t)); >> } >> >> -->sizeof=76 >> >> cheers -ben >> >> > 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 >> >>> >> > > > > -- > Mariano > http://marianopeck.wordpress.com