@@ -122,18 +122,19 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
122
122
__block dispatch_fd_t newSocket = accept (listenSocket, NULL , NULL );
123
123
124
124
__block dispatch_io_t io = 0 ;
125
+ __block int dispatchOpsCount = 0 ;
126
+ __block void (^decrementDispatchOpsCount)() = ^{
127
+ if (--dispatchOpsCount <= 0 ) {
128
+ if (newSocket != 0 ) {
129
+ close (newSocket);
130
+ newSocket = 0 ;
131
+ }
132
+ }
133
+ };
125
134
__block TNSInspectorProtocolHandler protocolHandler = nil ;
126
135
__block TNSInspectorIoErrorHandler dataSocketErrorHandler = ^(NSObject * dummy, NSError * error) {
127
136
@synchronized (inspectorLock ()) {
128
- if (io) {
129
- dispatch_io_close (io, DISPATCH_IO_STOP);
130
- io = 0 ;
131
- }
132
- }
133
-
134
- if (newSocket) {
135
- close (newSocket);
136
- newSocket = 0 ;
137
+ io = 0 ;
137
138
}
138
139
139
140
if (protocolHandler) {
@@ -146,8 +147,10 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
146
147
};
147
148
148
149
@synchronized (inspectorLock ()) {
150
+ ++dispatchOpsCount;
149
151
io = dispatch_io_create (DISPATCH_IO_STREAM, newSocket, queue,
150
152
^(int error) {
153
+ decrementDispatchOpsCount ();
151
154
CheckError (error, dataSocketErrorHandler);
152
155
});
153
156
}
@@ -175,8 +178,12 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
175
178
176
179
@synchronized (inspectorLock ()) {
177
180
if (io) {
181
+ ++dispatchOpsCount;
178
182
dispatch_io_write (io, 0 , data, queue,
179
183
^(bool done, dispatch_data_t data, int error) {
184
+ if (done) {
185
+ decrementDispatchOpsCount ();
186
+ }
180
187
CheckError (error, dataSocketErrorHandler);
181
188
});
182
189
}
@@ -190,6 +197,9 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
190
197
}
191
198
192
199
__block dispatch_io_handler_t receiver = ^(bool done, dispatch_data_t data, int error) {
200
+ if (done) {
201
+ decrementDispatchOpsCount ();
202
+ }
193
203
if (!CheckError (error, dataSocketErrorHandler)) {
194
204
return ;
195
205
}
@@ -204,9 +214,13 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
204
214
@synchronized (inspectorLock ()) {
205
215
if (io) {
206
216
dispatch_io_set_low_water (io, length);
217
+ ++dispatchOpsCount;
207
218
dispatch_io_read (
208
219
io, 0 , length, queue,
209
220
^(bool done, dispatch_data_t data, int error) {
221
+ if (done) {
222
+ decrementDispatchOpsCount ();
223
+ }
210
224
if (!CheckError (error, dataSocketErrorHandler)) {
211
225
return ;
212
226
}
@@ -220,6 +234,7 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
220
234
#pragma clang diagnostic ignored "-Warc-retain-cycles"
221
235
@synchronized (inspectorLock ()) {
222
236
if (io) {
237
+ ++dispatchOpsCount;
223
238
dispatch_io_read (io, 0 , 4 , queue, receiver);
224
239
}
225
240
}
@@ -231,6 +246,7 @@ TNSCreateInspectorServer(TNSInspectorFrontendConnectedHandler connectedHandler,
231
246
232
247
@synchronized (inspectorLock ()) {
233
248
if (io) {
249
+ ++dispatchOpsCount;
234
250
dispatch_io_read (io, 0 , 4 , queue, receiver);
235
251
}
236
252
}
0 commit comments