Hi,

I am porting a tooling class that I wrote on GST for my SIP and MGCP code
to Pharo. This class will create a socket and then fork a RX and TX process.
I have some issues with 'stopping' the socket. I have created an example
that shows the issue in Pharo 2.0 and Pharo 1.4 with the pharovm (and to
have more debug output with a re-compiled one).


        | s rx |
        s := Socket newUDP.
        rx := [
                [s waitForData. s halt]
                        on: ConnectionClosed do: [ s halt]
                ] fork.
        "Wait for the process to hit the readSemaphore"
        (Delay forSeconds: 3) wait.
        s close.


My expectation is that I will get the ConnectionClosed signal or at least
that >>#waitForData will return once the socket is closed. This is based
on reading the comment of >>#waitForData.


The Socket>>#waitForData documentation reads like this:
        "Wait for data to arrive.  This method will block until
        data is available or the socket is closed.  If the socket is closed
        a ConnectionClosed exception will be signaled."


I had a look at the socket plugin and the following is happening. First
aio is disabled, the state set to ThisEndClosed, then ::close is called
and in the above case the result is '0' and the following code will be
executed:

 else if (0 == result)
     {
       /* close completed synchronously */
       SOCKETSTATE(s)= Unconnected;
       FPRINTF((stderr, "closeConnection: disconnected\n"));
       SOCKET(s)= -1;
     }


this means that my 'rx' process will happily wait on the readSemaphore
of the Socket and will never be woken up.


My question are probably:

1.) Is this the intended behavior for Socket>>#close and Socket>>#waitForData?
2.) How should I terminate my RX process?

kind regards
        holger

PS: The issue is probably socket specific and not related to UDP.

Reply via email to