On 23 November 2012 18:00, Max Leske <[email protected]> wrote: > Ok, thanks Igor. > > So it seems the only remaining option (apart from providing a C library) it > to use Assembly. Assembly is not my territory at all but here's how I think > it could work: > > … > emitCall: [:gen | | fork dup2 execv | > fork := NativeBoost forCurrentPlatform > getGlobalSymbolPointer: 'fork'. > dup2 := NativeBoost forCurrentPlatform > getGlobalSymbolPointer: 'dup2'. > execv := NativeBoost forCurrentPlatform getGlobalSymbolPointer > gen asm mov: fork asUImm32 to: gen asm EAX. > gen asm call: gen asm EAX. > "somehow get the fork return value and test for 0. > only execute the following lines if pid = 0" > gen asm mov: dup2 asUImm32 to: gen asm EAX. > gen asm call: gen asm EAX. > gen asm mov: execv asUImm32 to: gen asm EAX. > gen call: gen asm EAX. > ] > > As you can see, I have absolutely no clue what I'm doing :) (just a good > copycat). I figure that everything from fork() to exec() needs to be in the > same Assembly sequence to ensure that the child process doesn't try to > execute VM code (multiple #emitCall:'s probably wouldn't work). > > I think that if you could help me fill in the code for where I simply used a > comment, I could come up with the rest (writing function specs etc.). I'l try > at least. >
yes i can help. where i can get the code? btw, your code is actually very close to how it should be done. > Cheers, > Max > -- Best regards, Igor Stasenko.
