Processing data on serial queue to prevent data racing conditions

This commit is contained in:
tifroz 2019-03-13 16:32:27 -07:00
parent c3c7aaad00
commit 90959e8b35

View File

@ -77,7 +77,8 @@ NS_ASSUME_NONNULL_END
@implementation GCDWebServerConnection {
CFSocketNativeHandle _socket;
BOOL _virtualHEAD;
dispatch_queue_t _dataQueue ;
CFHTTPMessageRef _requestMessage;
GCDWebServerRequest* _request;
GCDWebServerHandler* _handler;
@ -363,7 +364,8 @@ NS_ASSUME_NONNULL_END
_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 @@ NS_ASSUME_NONNULL_END
@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 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
@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);