<div dir="ltr"><div>The problem with simply switching to using Mutex is that it would break compatibility with older versions using an Event.</div><div><br></div><div>I tried coding a backwards compatible version.</div><a href="https://github.com/pijyoi/libzmq/blob/eventhang/src/signaler.cpp">https://github.com/pijyoi/libzmq/blob/eventhang/src/signaler.cpp</a><br>

<div>It first locks using a Mutex, then locks again using the old Event mechanism for backwards compatibility. However, if locking using the Event times out (1 sec), it assumes that the Event mechanism has hung and proceeds as though it had acquired the Event (and will release the Event at the end)</div>

<div><br></div><div>I am not so sure if the assumption that a 1 sec timeout means that it has hung is valid in all situations though.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Nov 9, 2013 at 5:36 PM, Pieter Hintjens <span dir="ltr"><<a href="mailto:ph@imatix.com" target="_blank">ph@imatix.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Felipe,<br>
<br>
Can you reproduce the case? If you can make a patch and test case, we<br>
can backport this to 4.0 and 3.2 stable if it applies there.<br>
<br>
-Pieter<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Nov 8, 2013 at 8:46 PM, Felipe Farinon<br>
<<a href="mailto:felipe.farinon@powersyslab.com">felipe.farinon@powersyslab.com</a>> wrote:<br>
> In windows, the code that creates a mutual exclusive section uses the<br>
> 'Event' mechanism.<br>
><br>
>      HANDLE sync = CreateEvent (&sa, FALSE, TRUE, TEXT<br>
> ("Global\\zmq-signaler-port-sync"));<br>
>      if (sync == NULL && GetLastError () == ERROR_ACCESS_DENIED)<br>
>        sync = OpenEvent (SYNCHRONIZE | EVENT_MODIFY_STATE, FALSE, TEXT<br>
> ("Global\\zmq-signaler-port-sync"));<br>
><br>
>      win_assert (sync != NULL);<br>
><br>
>      //  Enter the critical section.<br>
>      DWORD dwrc = WaitForSingleObject (sync, INFINITE);<br>
>      zmq_assert (dwrc == WAIT_OBJECT_0);<br>
><br>
>      // Some code here...<br>
><br>
>      brc = SetEvent (sync);<br>
>      brc = CloseHandle (sync);<br>
><br>
><br>
> win_assert and zmq_asserts abort the program if the conditions passed to<br>
> them aren't met. If the program is aborted before calling 'SetEvent' on<br>
> sync, the event is unsetted forever and all zeromq applications that<br>
> call this code will block on 'WaitForSingleObject'. A preferred way to<br>
> handle this is using 'Mutex' since if this scenario happens,<br>
> WaitForSingleObject will not freeze forever but will return WAIT_ABANDONED.<br>
> _______________________________________________<br>
> zeromq-dev mailing list<br>
> <a href="mailto:zeromq-dev@lists.zeromq.org">zeromq-dev@lists.zeromq.org</a><br>
> <a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev" target="_blank">http://lists.zeromq.org/mailman/listinfo/zeromq-dev</a><br>
<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
-<br>
Pieter Hintjens<br>
CEO of iMatix.com<br>
Founder of ZeroMQ community<br>
blog: <a href="http://hintjens.com" target="_blank">http://hintjens.com</a><br>
</font></span><div class="HOEnZb"><div class="h5">_______________________________________________<br>
zeromq-dev mailing list<br>
<a href="mailto:zeromq-dev@lists.zeromq.org">zeromq-dev@lists.zeromq.org</a><br>
<a href="http://lists.zeromq.org/mailman/listinfo/zeromq-dev" target="_blank">http://lists.zeromq.org/mailman/listinfo/zeromq-dev</a><br>
</div></div></blockquote></div><br></div>