[Mono-dev] Anonymous Pipe Stream Implementation

Atsushi Eno atsushieno at veritas-vos-liberabit.com
Tue Jul 16 09:45:09 UTC 2013


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).



More information about the Mono-devel-list mailing list