@@ -4,7 +4,6 @@ static int selector_sockets(SgSocketSelector *selector)
4
4
/* filter closed socket */
5
5
SgObject h = SG_NIL , t = SG_NIL , cp ;
6
6
int i = 0 ;
7
- Sg_LockMutex (& selector -> lock );
8
7
SG_FOR_EACH (cp , selector -> sockets ) {
9
8
SgObject slot = SG_CAR (cp );
10
9
if (Sg_SocketOpenP (SG_SOCKET (SG_CAR (slot )))) {
@@ -13,7 +12,6 @@ static int selector_sockets(SgSocketSelector *selector)
13
12
}
14
13
}
15
14
selector -> sockets = h ;
16
- Sg_UnlockMutex (& selector -> lock );
17
15
return i ;
18
16
}
19
17
@@ -31,14 +29,12 @@ static void strip_sockets(SgSocketSelector *selector, SgObject slots)
31
29
if (!SG_NULLP (slots )) {
32
30
/* remove the returned sockets from the targets */
33
31
SgObject h = SG_NIL , t = SG_NIL , cp ;
34
- Sg_LockMutex (& selector -> lock );
35
32
SG_FOR_EACH (cp , selector -> sockets ) {
36
33
if (SG_FALSEP (Sg_Memq (SG_CAR (cp ), slots ))) {
37
34
SG_APPEND1 (h , t , SG_CAR (cp ));
38
35
}
39
36
}
40
37
selector -> sockets = h ;
41
- Sg_UnlockMutex (& selector -> lock );
42
38
}
43
39
}
44
40
@@ -106,13 +102,17 @@ SgObject Sg_SocketSelectorClear(SgSocketSelector *selector)
106
102
if (Sg_SocketSelectorWaitingP (selector )) {
107
103
Sg_Error (UC ("There's a thread already waiting for %A" ), selector );
108
104
}
105
+ Sg_LockMutex (& selector -> lock );
106
+
109
107
selector_sockets (selector );
110
108
sockets = selector -> sockets ;
111
109
SG_FOR_EACH (cp , sockets ) {
112
110
remove_socket (selector , SG_SOCKET (SG_CAAR (cp )));
113
111
}
114
112
cp = selector -> sockets ;
115
113
selector -> sockets = SG_NIL ;
114
+
115
+ Sg_UnlockMutex (& selector -> lock );
116
116
return cp ;
117
117
}
118
118
@@ -142,8 +142,8 @@ SgObject Sg_SocketSelectorAdd(SgSocketSelector *selector,
142
142
t -> nsec = sp -> tv_nsec + usec * 1000 ;
143
143
to = SG_OBJ (t );
144
144
}
145
- slot = Sg_Cons (socket , Sg_Cons (to , data ));
146
145
Sg_LockMutex (& selector -> lock );
146
+ slot = Sg_Cons (socket , Sg_Cons (to , data ));
147
147
add_socket (selector , slot );
148
148
selector -> sockets = Sg_Cons (slot , selector -> sockets );
149
149
selector_sockets (selector );
@@ -268,13 +268,14 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
268
268
}
269
269
270
270
selector -> waiting = TRUE;
271
- Sg_UnlockMutex (& selector -> lock );
272
271
273
272
retry :
273
+ Sg_UnlockMutex (& selector -> lock );
274
274
r = selector_wait (selector , n , sp );
275
+
276
+ Sg_LockMutex (& selector -> lock );
275
277
selector -> waiting = FALSE;
276
278
if (SG_NULLP (r ) && selector -> retry ) {
277
- Sg_LockMutex (& selector -> lock );
278
279
/*
279
280
socket is added during waiting. here we do
280
281
- update timeout
@@ -304,7 +305,6 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
304
305
}
305
306
306
307
selector -> waiting = TRUE;
307
- Sg_UnlockMutex (& selector -> lock );
308
308
309
309
goto retry ;
310
310
} else {
@@ -324,6 +324,7 @@ SgObject Sg_SocketSelectorWait(SgSocketSelector *selector, SgObject timeout)
324
324
strip_sockets (selector , strip );
325
325
}
326
326
327
+ Sg_UnlockMutex (& selector -> lock );
327
328
return Sg_Values2 (r , timedout );
328
329
}
329
330
0 commit comments