Skip to content

Commit fa41f26

Browse files
committed
Add an option to set the priority of the dispatch queue
1 parent 845969e commit fa41f26

4 files changed

Lines changed: 18 additions & 6 deletions

File tree

GCDWebServer/Core/GCDWebServer.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET;
176176
*/
177177
extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval;
178178

179+
/**
180+
* Set the dispatch queue priority on which server connection will be
181+
* run (NSNumber / long).
182+
*
183+
*
184+
* The default value is DISPATCH_QUEUE_PRIORITY_DEFAULT.
185+
*/
186+
extern NSString* const GCDWebServerOption_DispatchQueuePriority;
187+
179188
#if TARGET_OS_IPHONE
180189

181190
/**

GCDWebServer/Core/GCDWebServer.m

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
NSString* const GCDWebServerOption_ConnectionClass = @"ConnectionClass";
6464
NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET = @"AutomaticallyMapHEADToGET";
6565
NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval = @"ConnectedStateCoalescingInterval";
66+
NSString* const GCDWebServerOption_DispatchQueuePriority = @"DispatchQueuePriority";
6667
#if TARGET_OS_IPHONE
6768
NSString* const GCDWebServerOption_AutomaticallySuspendInBackground = @"AutomaticallySuspendInBackground";
6869
#endif
@@ -170,6 +171,7 @@ @interface GCDWebServer () {
170171
Class _connectionClass;
171172
BOOL _mapHEADToGET;
172173
CFTimeInterval _disconnectDelay;
174+
dispatch_queue_priority_t _dispatchQueuePriority;
173175
NSUInteger _port;
174176
dispatch_source_t _source4;
175177
dispatch_source_t _source6;
@@ -195,7 +197,7 @@ @implementation GCDWebServer
195197

196198
@synthesize delegate=_delegate, handlers=_handlers, port=_port, serverName=_serverName, authenticationRealm=_authenticationRealm,
197199
authenticationBasicAccounts=_authenticationBasicAccounts, authenticationDigestAccounts=_authenticationDigestAccounts,
198-
shouldAutomaticallyMapHEADToGET=_mapHEADToGET;
200+
shouldAutomaticallyMapHEADToGET=_mapHEADToGET, dispatchQueuePriority=_dispatchQueuePriority;
199201

200202
+ (void)initialize {
201203
GCDWebServerInitializeFunctions();
@@ -493,7 +495,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6
493495

494496
- (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSocket isIPv6:(BOOL)isIPv6 {
495497
dispatch_group_enter(_sourceGroup);
496-
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, kGCDWebServerGCDQueue);
498+
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, dispatch_get_global_queue(_dispatchQueuePriority, 0));
497499
dispatch_source_set_cancel_handler(source, ^{
498500

499501
@autoreleasepool {
@@ -599,6 +601,7 @@ - (BOOL)_start:(NSError**)error {
599601
_connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]);
600602
_mapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue];
601603
_disconnectDelay = [_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue];
604+
_dispatchQueuePriority = [_GetOption(_options, GCDWebServerOption_DispatchQueuePriority, @(DISPATCH_QUEUE_PRIORITY_DEFAULT)) longValue];
602605

603606
_source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO];
604607
_source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES];

GCDWebServer/Core/GCDWebServerConnection.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ @interface GCDWebServerConnection () {
8888
@implementation GCDWebServerConnection (Read)
8989

9090
- (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block {
91-
dispatch_read(_socket, length, kGCDWebServerGCDQueue, ^(dispatch_data_t buffer, int error) {
91+
dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) {
9292

9393
@autoreleasepool {
9494
if (error == 0) {
@@ -247,10 +247,10 @@ - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCo
247247
@implementation GCDWebServerConnection (Write)
248248

249249
- (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block {
250-
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, kGCDWebServerGCDQueue, ^{
250+
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{
251251
[data self]; // Keeps ARC from releasing data too early
252252
});
253-
dispatch_write(_socket, buffer, kGCDWebServerGCDQueue, ^(dispatch_data_t remainingData, int error) {
253+
dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) {
254254

255255
@autoreleasepool {
256256
if (error == 0) {

GCDWebServer/Core/GCDWebServerPrivate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,6 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for
168168
*/
169169

170170
#define kGCDWebServerDefaultMimeType @"application/octet-stream"
171-
#define kGCDWebServerGCDQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
172171
#define kGCDWebServerErrorDomain @"GCDWebServerErrorDomain"
173172

174173
static inline BOOL GCDWebServerIsValidByteRange(NSRange range) {
@@ -200,6 +199,7 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO
200199
@property(nonatomic, readonly) NSDictionary* authenticationBasicAccounts;
201200
@property(nonatomic, readonly) NSDictionary* authenticationDigestAccounts;
202201
@property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET;
202+
@property(nonatomic, readonly) dispatch_queue_priority_t dispatchQueuePriority;
203203
- (void)willStartConnection:(GCDWebServerConnection*)connection;
204204
- (void)didEndConnection:(GCDWebServerConnection*)connection;
205205
@end

0 commit comments

Comments
 (0)