mirror of
https://github.com/swisspol/GCDWebServer.git
synced 2024-10-06 15:52:14 +08:00
Processing data on serial queue to prevent data racing conditions
This commit is contained in:
parent
c3c7aaad00
commit
90959e8b35
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user