Problem with Socket under Linux...
Ian Piumarta
ian.piumarta at inria.fr
Mon Apr 22 12:53:19 UTC 2002
Hi Goran,
> int sqSocketReceiveDataAvailable(SocketPtr s)
> {
> if (!socketValid(s))
> return -1;
> if (SOCKETSTATE(s) == Connected)
> {
> if (socketReadable(SOCKET(s)))
> return true;
> PSP(s)->pendingEvents|= READ_NOTIFY;
> aioHandle(SOCKET(s), dataHandler, PSP(s), AIO_RW);
> }
> return false;
> }
>
> I don't really now why this code looks like it does but I do wonder why
> the unix version notifies the readSemaphore even if the socket is not
> "socketReadable".
It probably comes from my misunderstanding of exactly the conditions
under which the semaphore should be signalled. (As far as I know,
nobody ever specified the behaviour of the socket semaphore stuff in
any kind of rigorous manner -- so I'm basically guessing where to
signal them.) If the Unix and win behaviours differ then I happily
concede that the win version is probably right.
> I don't really know what aioHandle is/does
It ensures that the socket is select()ed for i/o, which might not be the
case if it has just been connected and no reads were performed before
asking if data is available, or if a read of all available data has just
completed.
> but I
> assume it will result in that "notify()" is called which in turn signals
> the readSema.
Correct. The notify() is done in the function dataHandler().
> Obviously I am missing something fundamental here -
> shouldn't the readSemaphore only be signalled if there is something to
> read?
This should be the case, since the signal happens in the dataHandler which
is only called when select() determines that data is available on the
socket.
> On Win32 it seems to never signal the semaphore which also
> seems.... funny. :-)
It depends on the assumptions. Does polling a socket for data enable
the signaling of its semaphore, or must you actually try to read data
from it first?
I suggest you try commenting out the line
PSP(s)->pendingEvents|= READ_NOTIFY;
and then run every socket test in your possession to see what works/breaks.
> We have just semi-verified it's a Linux - thing, Jonas here running
> on Win2k does not have it - at least not when doing some simple
> tests.
If you send me your test suite then I'll hack on this at my end. (I
need to fix a problem with mouse wheels anyway, so this is the perfect
opportunity to look at the socket stuff.)
Thanks!
Ian
More information about the Squeak-dev
mailing list
|