I wondered about this, and it's clear to me that HOL4's Holmake tool has been 
implicitly relying on garbage collection of unreachable fds.  In particular, 
when I compile and run Holmake with mlton I can get excessive fd OS exceptions 
that I don't see with Poly/ML.  I guessed I had a bug to fix, but Poly/ML was 
encouraging me to ignore the problem :)

Make of that what you will.

Happy new year,
Michael

On 26/12/18, 20:50, "polyml on behalf of David Matthews" 
<polyml-boun...@inf.ed.ac.uk on behalf of david.matth...@prolingua.co.uk> wrote:

    I've had a look at this and I think I know what is going wrong.  There 
    is a global table that holds information about open streams.  There is 
    an interlock to prevent two threads both growing the table at the same 
    time but it turns out there is no interlock to prevent one thread 
    growing it while another thread is reading an entry.  I've fixed this 
    and pushed some changes to a MultiThreadIO branch on GitHub.
    
    However, the table itself is really a relic of some very old code and 
    the whole thing needs to be replaced.  The table does two things.  One 
    is to ensure that streams are not persistent: i.e. if a stream is opened 
    and a reference to the stream is saved using PolyML.SaveState.saveState 
    or PolyML.export then any attempt to use it when the saved state is 
    reloaded will fail with an exception.  The other use of the table is to 
    enable streams to be garbage-collected: i.e. if a stream is no longer 
    reachable then at some point the stream will be closed.
    
    Achieving non-persistence is easy as a result of some recent changes. 
    Garbaging-collecting streams is more difficult.  Does anyone actually 
    rely on streams being garbage-collected?  Would doing away with that and 
    requiring streams to be closed explicitly cause any problems?
    
    David
    
    On 24/12/2018 16:20, Kostirya wrote:
    > Hello.
    > I got sometimes Segmentation fault.
    > The GDB backtrace of core file is bellow.
    > It is multi thread server. I call Socket.bind and Socket.listen in
    > main thread and then I create worker threads.
    > If server have one worker thread then error is not occur.
    > 
    > 
    > OS is CentOS, Poly/ML 5.7.2 Testing (Git version v5.7.1-161-g33045f8)
    > 
    > #0  0x00007fbf878faa87 in get_stream(PolyWord) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #1  0x00007fbf878fac32 in writeArray(TaskData*, SaveVecEntry*,
    > SaveVecEntry*, bool) [clone .isra.7] () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #2  0x00007fbf878fc0be in IO_dispatch_c(TaskData*, SaveVecEntry*,
    > SaveVecEntry*, SaveVecEntry*) () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #3  0x00007fbf878fd2a1 in PolyBasicIOGeneral ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #4  0x000000000041406d in area1 ()
    > #5  0x0000000000002001 in ?? ()
    > #6  0x00007fbf87b57320 in ?? () from /home/nick/polyml/lib/libpolyml.so.9
    > #7  0x00007fbf81e49e30 in ?? ()
    > #8  0x0000000000006001 in ?? ()
    > #9  0x0000000000010008 in ?? ()
    > #10 0x00007fbf879171ed in Processes::FindAllocationSpace(TaskData*,
    > unsigned long, bool) () from /home/nick/polyml/lib/libpolyml.so.9
    > #11 0x00007fbf7c00a4d0 in ?? ()
    > #12 0x00007fbf81e4a660 in ?? ()
    > #13 0x00007fbf8792c9f1 in X86TaskData::SwitchToPoly() ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #14 0x00007fbf8792cbcc in X86TaskData::EnterPolyCode() ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #15 0x00007fbf87916fc9 in NewThreadFunction(void*) ()
    > 
    > 
    > ==============================================================
    > 
    > This one more backtrace.
    > 
    > #0  0x00007ff5a378ba87 in get_stream(PolyWord) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #1  0x00007ff5a379ef08 in getSelectResult(TaskData*, SaveVecEntry*,
    > int, WaitSelect*) () from /home/nick/polyml/lib/libpolyml.so.9
    > #2  0x00007ff5a379f481 in selectCall(TaskData*, SaveVecEntry*, int) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #3  0x00007ff5a37a03ed in Net_dispatch_c(TaskData*, SaveVecEntry*,
    > SaveVecEntry*) () from /home/nick/polyml/lib/libpolyml.so.9
    > #4  0x00007ff5a37a12f7 in PolyNetworkGeneral ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #5  0x00000000004078a2 in area1 ()
    > #6  0x0000000000002001 in ?? ()
    > #7  0x00007ff5a39e8320 in ?? () from /home/nick/polyml/lib/libpolyml.so.9
    > #8  0x00007ff59d4d9e30 in ?? ()
    > #9  0x000000000000a001 in ?? ()
    > #10 0x0000000000010008 in ?? ()
    > #11 0x00007ff5a37a81ed in Processes::FindAllocationSpace(TaskData*,
    > unsigned long, bool) () from /home/nick/polyml/lib/libpolyml.so.9
    > #12 0x00007ff59800c980 in ?? ()
    > #13 0x00007ff59d4da660 in ?? ()
    > #14 0x00007ff5a37bd9f1 in X86TaskData::SwitchToPoly() ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #15 0x00007ff5a37bdbcc in X86TaskData::EnterPolyCode() ()
    > ---Type <return> to continue, or q <return> to quit---
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #16 0x00007ff5a37a7fc9 in NewThreadFunction(void*) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #17 0x00007ff5a2968e25 in start_thread () from /lib64/libpthread.so.0
    > #18 0x00007ff5a2c7534d in clone () from /lib64/libc.so.6
    > 
    > 
    > ==============================================================
    > 
    > This one more backtrace.
    > 
    > 
    > #0  0x00007f88d2be3a87 in get_stream(PolyWord) () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #1  0x00007f88d2be5b85 in IO_dispatch_c(TaskData*, SaveVecEntry*,
    > SaveVecEntry*, SaveVecEntry*) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #2  0x00007f88d2be62a1 in PolyBasicIOGeneral () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #3  0x000000000040580d in area1 ()
    > #4  0x0000000000002001 in ?? ()
    > #5  0x00007f88d2e40320 in ?? () from /home/nick/polyml/lib/libpolyml.so.9
    > #6  0x00007f88cc931e30 in ?? ()
    > #7  0x000000000000a001 in ?? ()
    > #8  0x0000000000010008 in ?? ()
    > #9  0x00007f88d2c001ed in Processes::FindAllocationSpace(TaskData*,
    > unsigned long, bool) () from /home/nick/polyml/lib/libpolyml.so.9
    > #10 0x00007f88c800c980 in ?? ()
    > #11 0x00007f88cc932660 in ?? ()
    > #12 0x00007f88d2c159f1 in X86TaskData::SwitchToPoly() () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #13 0x00007f88d2c15bcc in X86TaskData::EnterPolyCode() () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #14 0x00007f88d2bfffc9 in NewThreadFunction(void*) () from
    > /home/nick/polyml/lib/libpolyml.so.9
    > #15 0x00007f88d1dc0e25 in start_thread () from /lib64/libpthread.so.0
    > #16 0x00007f88d20cd34d in clone () from /lib64/libc.so.6
    > 
    > 
    > =====================================================================
    > 
    > This one more backtrace.
    > 
    > 
    > #0  0x00007f1ed86fca87 in get_stream(PolyWord) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #1  0x00007f1ed8710209 in selectCall(TaskData*, SaveVecEntry*, int) ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #2  0x00007f1ed87113ed in Net_dispatch_c(TaskData*, SaveVecEntry*,
    > SaveVecEntry*) () from /home/nick/polyml/lib/libpolyml.so.9
    > #3  0x00007f1ed87122f7 in PolyNetworkGeneral ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #4  0x00000000004078a2 in area1 ()
    > #5  0x0000000000002001 in ?? ()
    > #6  0x00007f1ed8959320 in ?? () from /home/nick/polyml/lib/libpolyml.so.9
    > #7  0x00007f1ecdffae30 in ?? ()
    > #8  0x000000000000a001 in ?? ()
    > #9  0x0000000000010008 in ?? ()
    > #10 0x00007f1ed87191ed in Processes::FindAllocationSpace(TaskData*,
    > unsigned long, bool) () from /home/nick/polyml/lib/libpolyml.so.9
    > #11 0x00007f1ed000c980 in ?? ()
    > #12 0x00007f1ecdffb660 in ?? ()
    > #13 0x00007f1ed872e9f1 in X86TaskData::SwitchToPoly() ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #14 0x00007f1ed872ebcc in X86TaskData::EnterPolyCode() ()
    >     from /home/nick/polyml/lib/libpolyml.so.9
    > #15 0x00007f1ed8718fc9 in NewThreadFunction(void*) ()
    > _______________________________________________
    > polyml mailing list
    > polyml@inf.ed.ac.uk
    > http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
    > 
    _______________________________________________
    polyml mailing list
    polyml@inf.ed.ac.uk
    http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
    

_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to