e.curSocket = this;
Worker w = e.Worker;
w.Init (this, e, SocketOperation.Accept);
- socket_pool_queue (Worker.Dispatcher, w.result);
+ int count;
+ lock (readQ) {
+ readQ.Enqueue (e.Worker);
+ count = readQ.Count;
+ }
+ if (count == 1)
+ socket_pool_queue (Worker.Dispatcher, w.result);
return true;
}
#endif
throw new InvalidOperationException ();
SocketAsyncResult req = new SocketAsyncResult (this, state, callback, SocketOperation.Accept);
- socket_pool_queue (Worker.Dispatcher, req);
+ int count;
+ lock (readQ) {
+ readQ.Enqueue (req.Worker);
+ count = readQ.Count;
+ }
+ if (count == 1)
+ socket_pool_queue (Worker.Dispatcher, req);
return req;
}
req.Offset = 0;
req.Size = receiveSize;
req.SockFlags = SocketFlags.None;
- socket_pool_queue (Worker.Dispatcher, req);
+ int count;
+ lock (readQ) {
+ readQ.Enqueue (req.Worker);
+ count = readQ.Count;
+ }
+ if (count == 1)
+ socket_pool_queue (Worker.Dispatcher, req);
return req;
}
req.Size = receiveSize;
req.SockFlags = SocketFlags.None;
req.AcceptSocket = acceptSocket;
- socket_pool_queue (Worker.Dispatcher, req);
+ int count;
+ lock (readQ) {
+ readQ.Enqueue (req.Worker);
+ count = readQ.Count;
+ }
+ if (count == 1)
+ socket_pool_queue (Worker.Dispatcher, req);
return(req);
}
Queue queue = null;
if (operation == SocketOperation.Receive ||
operation == SocketOperation.ReceiveFrom ||
- operation == SocketOperation.ReceiveGeneric) {
+ operation == SocketOperation.ReceiveGeneric ||
+ operation == SocketOperation.Accept) {
queue = Sock.readQ;
} else if (operation == SocketOperation.Send ||
operation == SocketOperation.SendTo ||
Worker worker = null;
SocketAsyncCall sac = null;
lock (queue) {
- // queue.Count will only be 0 if the socket is closed while receive/send
+ // queue.Count will only be 0 if the socket is closed while receive/send/accept
// operation(s) are pending and at least one call to this method is
// waiting on the lock while another one calls CompleteAllOnDispose()
if (queue.Count > 0)