@@ -4,7 +4,6 @@ static int selector_sockets(SgSocketSelector *selector)
44 /* filter closed socket */
55 SgObject h = SG_NIL , t = SG_NIL , cp ;
66 int i = 0 ;
7- Sg_LockMutex (& selector -> lock );
87 SG_FOR_EACH (cp , selector -> sockets ) {
98 SgObject slot = SG_CAR (cp );
109 if (Sg_SocketOpenP (SG_SOCKET (SG_CAR (slot )))) {
@@ -13,7 +12,6 @@ static int selector_sockets(SgSocketSelector *selector)
1312 }
1413 }
1514 selector -> sockets = h ;
16- Sg_UnlockMutex (& selector -> lock );
1715 return i ;
1816}
1917
@@ -31,14 +29,12 @@ static void strip_sockets(SgSocketSelector *selector, SgObject slots)
3129 if (!SG_NULLP (slots )) {
3230 /* remove the returned sockets from the targets */
3331 SgObject h = SG_NIL , t = SG_NIL , cp ;
34- Sg_LockMutex (& selector -> lock );
3532 SG_FOR_EACH (cp , selector -> sockets ) {
3633 if (SG_FALSEP (Sg_Memq (SG_CAR (cp ), slots ))) {
3734 SG_APPEND1 (h , t , SG_CAR (cp ));
3835 }
3936 }
4037 selector -> sockets = h ;
41- Sg_UnlockMutex (& selector -> lock );
4238 }
4339}
4440
@@ -106,13 +102,17 @@ SgObject Sg_SocketSelectorClear(SgSocketSelector *selector)
106102 if (Sg_SocketSelectorWaitingP (selector )) {
107103 Sg_Error (UC ("There's a thread already waiting for %A" ), selector );
108104 }
105+ Sg_LockMutex (& selector -> lock );
106+
109107 selector_sockets (selector );
110108 sockets = selector -> sockets ;
111109 SG_FOR_EACH (cp , sockets ) {
112110 remove_socket (selector , SG_SOCKET (SG_CAAR (cp )));
113111 }
114112 cp = selector -> sockets ;
115113 selector -> sockets = SG_NIL ;
114+
115+ Sg_UnlockMutex (& selector -> lock );
116116 return cp ;
117117}
118118
@@ -142,8 +142,8 @@ SgObject Sg_SocketSelectorAdd(SgSocketSelector *selector,
142142 t -> nsec = sp -> tv_nsec + usec * 1000 ;
143143 to = SG_OBJ (t );
144144 }
145- slot = Sg_Cons (socket , Sg_Cons (to , data ));
146145 Sg_LockMutex (& selector -> lock );
146+ slot = Sg_Cons (socket , Sg_Cons (to , data ));
147147 add_socket (selector , slot );
148148 selector -> sockets = Sg_Cons (slot , selector -> sockets );
149149 selector_sockets (selector );
@@ -268,13 +268,14 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
268268 }
269269
270270 selector -> waiting = TRUE;
271- Sg_UnlockMutex (& selector -> lock );
272271
273272 retry :
273+ Sg_UnlockMutex (& selector -> lock );
274274 r = selector_wait (selector , n , sp );
275+
276+ Sg_LockMutex (& selector -> lock );
275277 selector -> waiting = FALSE;
276278 if (SG_NULLP (r ) && selector -> retry ) {
277- Sg_LockMutex (& selector -> lock );
278279 /*
279280 socket is added during waiting. here we do
280281 - update timeout
@@ -304,7 +305,6 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
304305 }
305306
306307 selector -> waiting = TRUE;
307- Sg_UnlockMutex (& selector -> lock );
308308
309309 goto retry ;
310310 } else {
@@ -324,6 +324,7 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
324324 strip_sockets (selector , strip );
325325 }
326326
327+ Sg_UnlockMutex (& selector -> lock );
327328 return Sg_Values2 (r , timedout );
328329}
329330
0 commit comments