diff --git a/GCDWebServer/Core/GCDWebServerConnection.m b/GCDWebServer/Core/GCDWebServerConnection.m index b48edc61..2dbad18f 100644 --- a/GCDWebServer/Core/GCDWebServerConnection.m +++ b/GCDWebServer/Core/GCDWebServerConnection.m @@ -77,7 +77,8 @@ - (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block; @implementation GCDWebServerConnection { CFSocketNativeHandle _socket; BOOL _virtualHEAD; - + + dispatch_queue_t _dataQueue ; CFHTTPMessageRef _requestMessage; GCDWebServerRequest* _request; GCDWebServerHandler* _handler; @@ -363,7 +364,8 @@ - (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)local _remoteAddressData = remoteAddress; _socket = socket; GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket); - + + _dataQueue = dispatch_queue_create("gcdwebserver.connection.data", DISPATCH_QUEUE_SERIAL) ; [_server willStartConnection:self]; if (![self open]) { @@ -413,7 +415,7 @@ - (void)dealloc { @implementation GCDWebServerConnection (Read) - (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { - dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { + dispatch_read(_socket, length, _dataQueue, ^(dispatch_data_t buffer, int error) { @autoreleasepool { if (error == 0) { size_t size = dispatch_data_get_size(buffer); @@ -570,10 +572,10 @@ - (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCom @implementation GCDWebServerConnection (Write) - (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { - dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ + dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, _dataQueue, ^{ [data self]; // Keeps ARC from releasing data too early }); - dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { + dispatch_write(_socket, buffer, _dataQueue, ^(dispatch_data_t remainingData, int error) { @autoreleasepool { if (error == 0) { GWS_DCHECK(remainingData == NULL);