NSURLConnection using setDelegateQueue deadlocks
NSURLConnection using setDelegateQueue deadlocks
- Subject: NSURLConnection using setDelegateQueue deadlocks
- From: Michael Link <email@hidden>
- Date: Mon, 19 Dec 2011 20:24:13 -0600
Is there some trick to getting NSURLConnection to work with an NSOperationQueue on iOS 5, and perhaps Lion but I haven't tried it there? It seems that it causes a deadlock every time just after the last delegate message has been sent (connectionDidFinishLoading:). The project is using ARC.
The connection is setup like this:
_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[_connection setDelegateQueue:_queue];
[_connection start];
The operation queue used is setup in this category method of NSOperationQueue
+ (NSOperationQueue*)URLConnectionQueue
{
static NSOperationQueue* _S_operationQueue;
static dispatch_once_t _S_once;
dispatch_once(&_S_once, ^{
_S_operationQueue = [[NSOperationQueue alloc] init];
_S_operationQueue.name = @"com.falkor.URLConnectionQueuedLoading";
});
return _S_operationQueue;
}
The connection runs and finishes sending the connectionDidFinishLoading: message and then deadlocks on the thread that created it. Interestingly enough it appears that a runloop is still required to even start the connection when it's setup to use a NSOperationQueue for the delegate messages otherwise the connection is never started.
Thread 7 (process 22301):
#0 0x960f8b42 in select$DARWIN_EXTSN ()
#1 0x017107fb in __CFSocketManager ()
#2 0x97e9fed9 in _pthread_start ()
#3 0x97ea36de in thread_start ()
Thread 6 (process 22301):
#0 0x960f6c22 in mach_msg_trap ()
#1 0x960f61f6 in mach_msg ()
#2 0x0177c13a in __CFRunLoopServiceMachPort ()
#3 0x016df605 in __CFRunLoopRun ()
#4 0x016dedb4 in CFRunLoopRunSpecific ()
#5 0x016deccb in CFRunLoopRunInMode ()
#6 0x00e2de40 in +[NSURLConnection(Loader) _resourceLoadLoop:] ()
#7 0x00d3f4e6 in -[NSThread main] ()
#8 0x00d3f457 in __NSThread__main__ ()
#9 0x97e9fed9 in _pthread_start ()
#10 0x97ea36de in thread_start ()
Thread 5 (process 22301):
#0 0x960f8876 in __psynch_mutexwait ()
#1 0x97e9e6af in pthread_mutex_lock ()
#2 0x0216b7e1 in URLConnectionClient::cancelConnection ()
#3 0x0209cc0c in URLConnection::cancel ()
#4 0x0209cbf2 in CFURLConnectionCancel ()
#5 0x00e2fdca in -[NSURLConnectionInternalConnection _invalidate] ()
#6 0x00e2ed10 in __66-[NSURLConnectionInternal _withConnectionDisconnectFromConnection]_block_invoke_0 ()
#7 0x00e2ee94 in __65-[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]_block_invoke_0 ()
#8 0x00d6b64e in -[NSBlockOperation main] ()
#9 0x00d641f7 in -[__NSOperationInternal start] ()
#10 0x00d63efa in -[NSOperation start] ()
#11 0x00df40bd in __block_global_6 ()
#12 0x02487445 in _dispatch_call_block_and_release ()
#13 0x024884e6 in _dispatch_worker_thread2 ()
#14 0x97ea1b24 in _pthread_wqthread ()
#15 0x97ea36fe in start_wqthread ()
Thread 4 (process 22301):
#0 0x960f6c22 in mach_msg_trap ()
#1 0x960f61f6 in mach_msg ()
#2 0x0177c13a in __CFRunLoopServiceMachPort ()
#3 0x016df605 in __CFRunLoopRun ()
#4 0x016dedb4 in CFRunLoopRunSpecific ()
#5 0x016deccb in CFRunLoopRunInMode ()
#6 0x057cd220 in RunWebThread ()
#7 0x97e9fed9 in _pthread_start ()
#8 0x97ea36de in thread_start ()
Thread 3 (process 22301):
#0 0x960f883e in __psynch_cvwait ()
#1 0x97ea3e21 in _pthread_cond_wait ()
#2 0x97e5442c in pthread_cond_wait$UNIX2003 ()
#3 0x00d7a8fc in -[__NSOperationInternal waitUntilFinished] ()
#4 0x00d7a85e in -[NSOperation waitUntilFinished] ()
#5 0x00e2ff0e in -[NSURLConnectionInternalConnection invokeForDelegate:] ()
#6 0x00e2ee4f in -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:] ()
#7 0x00e2ecb0 in -[NSURLConnectionInternal _withConnectionDisconnectFromConnection] ()
#8 0x00d73fe2 in _NSURLConnectionReleaseClient ()
#9 0x0216b306 in URLConnectionClient::releaseClientLocked ()
#10 0x0209342d in URLConnectionClient::processEvents ()
#11 0x0216916b in non-virtual thunk to URLConnectionInstanceData::multiplexerClientPerform() ()
#12 0x02093137 in MultiplexerSource::perform ()
#13 0x0177c97f in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ ()
#14 0x016dfb73 in __CFRunLoopDoSources0 ()
#15 0x016df454 in __CFRunLoopRun ()
#16 0x016dedb4 in CFRunLoopRunSpecific ()
#17 0x016deccb in CFRunLoopRunInMode ()
#18 0x00d7341f in -[NSRunLoop(NSRunLoop) runMode:beforeDate:] ()
#19 0x0000e723 in -[FBLoginOperation main] (self=0xfa19a90, _cmd=0x166971a) at LoginOperation.m:142
#20 0x0000e542 in -[FBLoginOperation start] (self=0xfa19a90, _cmd=0x6aadf8b) at LoginOperation.m:127
#21 0x00df40bd in __block_global_6 ()
#22 0x02487445 in _dispatch_call_block_and_release ()
#23 0x024884e6 in _dispatch_worker_thread2 ()
#24 0x97ea1b24 in _pthread_wqthread ()
#25 0x97ea36fe in start_wqthread ()
Thread 2 (process 22301):
#0 0x960f990a in kevent ()
#1 0x02489373 in _dispatch_mgr_invoke ()
#2 0x02487cd0 in _dispatch_mgr_thread ()
Thread 1 (process 22301):
#0 0x960f6c22 in mach_msg_trap ()
#1 0x960f61f6 in mach_msg ()
#2 0x0177c13a in __CFRunLoopServiceMachPort ()
#3 0x016df580 in __CFRunLoopRun ()
#4 0x016dedb4 in CFRunLoopRunSpecific ()
#5 0x016deccb in CFRunLoopRunInMode ()
#6 0x024b8879 in GSEventRunModal ()
#7 0x024b893e in GSEventRun ()
#8 0x0043ba9b in UIApplicationMain ()
#9 0x00002336 in main (argc=1, argv=0xbffff668) at main.mm:16
--
Michael_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden