title: Application hanging in __semwait_signal ()
body: <p>I have a user of my application that sometimes when they run the application it gets stuck at the following point ...</p>
  
  <pre><code>0x92542782 in __semwait_signal ()
  (gdb) where
  #0  0x92542782 in __semwait_signal ()
  #1  0x9254243e in _pthread_cond_wait ()
  #2  0x925440d8 in pthread_cond_wait$UNIX2003 ()
  #3  0x95232670 in fe_fragment_render_quad ()
  #4  0x9522f07f in fe_sw_quad ()
  #5  0x9522edf9 in fe_context_quad ()
  #6  0x95227915 in fe_tree_render_apply_1 ()
  #7  0x9522244f in fe_tree_render_apply ()
  #8  0x95220c9b in fe_tree_render_ ()
  #9  0x9522443c in fe_tree_render_texture ()
  #10 0x95224295 in texture_retain ()
  #11 0x95223d5d in fe_texture_new ()
  #12 0x95222a62 in fe_tree_create_texture ()
  #13 0x95222159 in fe_tree_render_apply ()
  #14 0x95220c9b in fe_tree_render_ ()
  #15 0x9522443c in fe_tree_render_texture ()
  #16 0x95224295 in texture_retain ()
  #17 0x95223d5d in fe_texture_new ()
  #18 0x95222a62 in fe_tree_create_texture ()
  #19 0x95222159 in fe_tree_render_apply ()
  #20 0x95220c9b in fe_tree_render_ ()
  #21 0x9522443c in fe_tree_render_texture ()
  #22 0x95224295 in texture_retain ()
  #23 0x95223d5d in fe_texture_new ()
  #24 0x95222a62 in fe_tree_create_texture ()
  #25 0x95222159 in fe_tree_render_apply ()
  #26 0x95220c9b in fe_tree_render_ ()
  #27 0x95220bef in fe_tree_render_ ()
  #28 0x9522443c in fe_tree_render_texture ()
  #29 0x95224295 in texture_retain ()
  #30 0x95223d5d in fe_texture_new ()
  #31 0x95222a62 in fe_tree_create_texture ()
  #32 0x95222159 in fe_tree_render_apply ()
  #33 0x95220c9b in fe_tree_render_ ()
  #34 0x952201e2 in fe_tree_render_tree ()
  #35 0x9520e72a in fe_tree_render_image ()
  #36 0x9520dfea in fe_image_render_ ()
  #37 0x9520dae7 in fe_image_get_bitmap ()
  #38 0x9520d8b7 in -[CIContextImpl render:toBitmap:rowBytes:bounds:format:colorSpace:] ()
  #39 0x918f29e8 in cgxcoreimage_instance_render ()
  #40 0x918f2ae8 in cgxcoreimage_provider_create_data ()
  #41 0x9841d601 in faultDataAcquireBytePointer ()
  #42 0x9837f20f in CGAccessSessionGetBytePointer ()
  #43 0x983db0e0 in img_decode_read ()
  #44 0x983daf47 in img_colormatch_read ()
  #45 0x983dad7c in img_alphamerge_read ()
  #46 0x983b8ee9 in img_data_lock ()
  #47 0x983b5ee6 in CGSImageDataLock ()
  #48 0x92b16748 in ripc_AcquireImage ()
  #49 0x92b143be in ripc_DrawImage ()
  #50 0x983b5b60 in CGContextDrawImage ()
  #51 0x990ed9c6 in CUIPenCG::DrawImage ()
  #52 0x990f9e85 in CUIRenderer::DrawImage ()
  #53 0x990eaa94 in CUIRenderer::Draw ()
  #54 0x90d6059c in -[NSCoreUIImageRep draw] ()
  #55 0x90d60481 in -[NSImageRep drawInRect:] ()
  #56 0x90d602fd in __-[NSImageRep drawInRect:fromRect:operation:fraction:respectFlipped:hints:]_block_invoke_2 ()
  #57 0x90d6025b in NSGraphicsContextPushContextWithFlippedMetadata_drawWithBlock_ ()
  #58 0x90cb4673 in __-[NSImageRep drawInRect:fromRect:operation:fraction:respectFlipped:hints:]_block_invoke_1 ()
  #59 0x90cb3b39 in -[NSImageRep drawInRect:fromRect:operation:fraction:respectFlipped:hints:] ()
  #60 0x90caed89 in -[NSImage _drawMappingAlignmentRectToRect:withState:backgroundStyle:operation:fraction:flip:hints:] ()
  #61 0x90d5f42e in -[NSButtonCell drawImage:withFrame:inView:] ()
  #62 0x90d5e941 in -[NSButtonCell _configureAndDrawImageWithRect:cellFrame:controlView:] ()
  #63 0x90d5cba8 in -[NSButtonCell drawInteriorWithFrame:inView:] ()
  #64 0x90d5c1bd in -[NSButtonCell drawWithFrame:inView:] ()
  #65 0x90d5489e in -[NSControl drawRect:] ()
  #66 0x90d4cce1 in -[NSView _drawRect:clip:] ()
  #67 0x90d4b97f in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #68 0x90d4bcb4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #69 0x90d4bcb4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #70 0x90d730c2 in -[NSToolbarItemViewer _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #71 0x90d4bcb4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #72 0x90d4bcb4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #73 0x90d4bcb4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:] ()
  #74 0x90d49e9e in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
  #75 0x90d49a13 in -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
  #76 0x90d46359 in -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] ()
  #77 0x90ca6f26 in -[NSView displayIfNeeded] ()
  #78 0x90c70292 in -[NSWindow displayIfNeeded] ()
  #79 0x90c6ed30 in -[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] ()
  #80 0x90c6e892 in -[NSWindow orderWindow:relativeTo:] ()
  #81 0x90c6c054 in -[NSWindow makeKeyAndOrderFront:] ()
  #82 0x000151a2 in -[AppController applicationFinishedLaunching:] ()
  #83 0x9208f253 in _nsnote_callback ()
  #84 0x98facc29 in __CFXNotificationPost ()
  #85 0x98fac65a in _CFXNotificationPostNotification ()
  #86 0x92084120 in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
  #87 0x920914fd in -[NSNotificationCenter postNotificationName:object:] ()
  #88 0x90ca78f2 in -[NSApplication _postDidFinishNotification] ()
  #89 0x90ca7802 in -[NSApplication _sendFinishLaunchingNotification] ()
  #90 0x90dfe565 in -[NSApplication(NSAppleEventHandling) _handleAEOpen:] ()
  #91 0x90dfe185 in -[NSApplication(NSAppleEventHandling) _handleCoreEvent:withReplyEvent:] ()
  #92 0x920c446c in -[NSAppleEventManager dispatchRawAppleEvent:withRawReply:handlerRefCon:] ()
  #93 0x920c4230 in _NSAppleEventManagerGenericHandler ()
  #94 0x929c0de6 in aeDispatchAppleEvent ()
  #95 0x929c0ce5 in dispatchEventAndSendReply ()
  #96 0x929c0bf2 in aeProcessAppleEvent ()
  #97 0x97cae381 in AEProcessAppleEvent ()
  #98 0x90c77ed2 in _DPSNextEvent ()
  #99 0x90c7750a in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
  #100 0x90c3969b in -[NSApplication run] ()
  #101 0x90c31735 in NSApplicationMain ()
  #102 0x0000262e in start ()
  (gdb) 
  </code></pre>
  
  <p>When you debug a bit more and print the NSImage instance it is trying to draw ...</p>
  
  <pre><code>(gdb) frame 60
  (gdb) po *(int*)($ebp+8)
  &lt;NSImage 0x1261f10 Name=ForwardTemplate Size={20, 20} Reps=(
     NSPDFImageRep 0x18abc30 Size={20, 20} ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=20x20 Alpha=NO
  )&gt;
  </code></pre>
  
  <p>This is one of the template images for the "forward transport" custom button in the application's toolbar. (see <a href="http://www.cancelmonday.com/beatler" rel="nofollow noreferrer">http://www.cancelmonday.com/beatler</a> for a screen shot)</p>
  
  <p>I am just looking for ideas on what I can do to try and debug this further as the hard thing is that it is only this one user that is reporting this issue and I cannot reproduce it locally.</p>
  
  <p>Any help would be greatly appreciated.</p>
  
  <p><strong>Update</strong></p>
  
  <p>Thanks to <em>diciu</em> I ran ...</p>
  
  <pre><code>thread apply all bt
  </code></pre>
  
  <p>This did show up a problem with a load of threads sat waiting and an example stack for a thread is ...</p>
  
  <pre><code>Thread 365 (process 1866):
  #0  0x92542782 in __semwait_signal ()
  #1  0x9254243e in _pthread_cond_wait ()
  #2  0x925440d8 in pthread_cond_wait$UNIX2003 ()
  #3  0x920b7b5e in -[NSCondition wait] ()
  #4  0x920a5531 in -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:] ()
  #5  0x920b7cb7 in -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:] ()
  #6  0x000183e8 in -[BLImageLoader main] ()
  #7  0x920b73b3 in -[__NSOperationInternal start] ()
  #8  0x920b6fe0 in ____startOperations_block_invoke_2 ()
  #9  0x925487b8 in _dispatch_call_block_and_release ()
  #10 0x9253a97e in _dispatch_worker_thread2 ()
  #11 0x9253a401 in _pthread_wqthread ()
  #12 0x9253a246 in start_wqthread ()
  </code></pre>
  
  <p>These threads do update the UI but it is always done through ...</p>
  
  <pre><code>[item performSelectorOnMainThread:@selector(setDisplayImage:) withObject:image waitUntilDone:YES];
  </code></pre>
  
  <p>I thought this would be safe, are there any issues with lots of threads e.g. 400+ all wanting to ...</p>
  
  <p><code>performSelectorOnMainThread</code> </p>
  
  <p>...within the same time period?</p>