Thanks, that's quite a lot of effort :)

Whoever touches the runtime part should judge if making changes in the runtime/icalls in this manner is acceptable. I'm particulary not sure about using icalls from System.Core.dll.

Also we cannot expose any internal API as public, for example:
https://github.com/smokingrope/mono/commit/8837a69d202ddb7d8350ebd052ff44d9e889a627#L7R437

Atsushi Eno

SmokingRope wrote:
Thanks for the feedback

I started this project merely as an investigation into whether it was even possible to implement in unix, and so hadn't really thought far enough ahead as to sharing it. The code is now pushed to a fork on github: https://github.com/smokingrope/mono/commit/8837a69d202ddb7d8350ebd052ff44d9e889a627

In terms of compatiblity i have not needed to change any existing dll references. At this point i have added two internal calls to the corlib\System.IO.MonoIO class. Perhaps you could look over these new internal calls and give a little more specific advice on what (if anything) needs conditioned out. I reused the poll() wrapper from the sockets implementation, (as MonoIO.PollFD) so i assume that is ok. I am re-using the existing CreatePipe() function for pipe creation, so that behaves the same as before. The GetPipeHandle() internal call just initializes a handle that was inherited from a parent process in mono's file descriptor table, which would not strike me as a compatibilty concern on it's own as it's only doing mono platform work.

A new problem has presented itself, which some expert feedback would be appreciated. Based on the sample code: http://msdn.microsoft.com/en-us/library/bb546102.aspx

1) Process.Start() is called on the server application to launch the client application 2) When the client application is started, it will inherit the pipe handle and eventually start using it
  3) The server application calls DisposeLocalCopyOfClientHandle()
  4) The server writes to the pipe


There is a synchronization issue between when 2 and 3 run, because in my testing, sometimes the Process.Start() call has not fully completed launching the child process, and closing the client handle on the server side cause the pipe to be broken before the client is fully booted. Because the pipe is broken step 4 should fail, though right now this isn't quite happening :)

With a Thread.Sleep(10) in DisposeLocalCopyOfClientHandle() the code seems to work about 50% of the time on my machine. With no sleep, the pipe seems to be broken every time.

With the technical explanation out of the way, is there any way i could wait / yield, and force the Process.Start() to complete launching the client before DisploseLocalCopyOfClientHandle() complete? I can certainly find some threshold where Thread.Sleep() reliably fixes the issue on my machine, but it may not be nearly as reliable across platforms either, and may need to be pretty huge (multiple seconds maybe?) to really get good reliability that way.

I also would still appreciate some feedback on the handle inheritance problem.

There aren't any tests yet, and i'm pretty severely violating the coding standards document at this point, so both of those things are still on my todo list. I'd also like to throw together the win32 implementation as well (something that would be compatible with the MS.NET <http://MS.NET> implementation).

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to