Will the real sqUnixSocket.c step forward?

John M McIntosh johnmci at smalltalkconsulting.com
Tue Apr 30 21:43:34 UTC 2002

>So the patch isn't complete. Today we managed to "fumble" ourselves 
>around it by
>hacking waitForDataUntil: and doing a "(Delay milliSeconds: 10) 
>wait" instead of
>the wait with timeout on the readsemaphore. Yep, ugly as hell but it 
>works well
>enough for us to continue developing...
>regards, Göran
>PS. I will help in any way I can with this - Squeak needs rock solid 
>Sockets. DS
>Göran Hultgren, goran.hultgren at bluefish.se
>GSM: +46 70 3933950, http://www.bluefish.se
>\"Department of Redundancy department.\" -- ThinkGeek


Well lets see if we can fix this.

Now I wonder if there is a race condition on the flag READNOTIFy such 
that a socketReadable says no but by the time you get to aioHandle, 
then data lurks?

What if you did this instead

/* answer whether the socket has data available for reading */

int sqSocketReceiveDataAvailable(SocketPtr s)
   if (!socketValid(s))
     return -1;
   if (SOCKETSTATE(s) == Connected)
       PSP(s)->pendingEvents|= READ_NOTIFY;
       if (socketReadable(SOCKET(s))) {
         PSP(s)->pendingEvents &= ~READ_NOTIFY;
// I'll run out on a tree branch here and assume that this &= ~ will 
reset READ_NOTIFY flag bit, but hey it might be wrong C code in fact 
let's say it is, so please check confirm etc that I'm actually kinda 
right in wanting to turn just the READ_NOTIFY bit off without 
mangling the other bits.
      	return true;
       aioHandle(SOCKET(s), dataHandler, AIO_RWX);
   return false;

Mind I'm not sure what happens between athe socketReadable and 
aioHandle logic if data arrives on the socket?
John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
Corporate Smalltalk Consulting Ltd.  http://www.smalltalkconsulting.com

More information about the Squeak-dev mailing list