I am seeing a deadlock I think... It works in the debugger, but hangs when
running alone. The killThread is called as part of the
applicationWillTerminate delegate method.

My thought is that somehow after blocking to wait for kConditionThreadIdle,
my performSelectorOnMainThread is getting called. When this happens, it gets
stuck because the main thread is already blocked.

Perhaps after calling if (![self threadMustExit]), but before dispatching to
the main thread?

Does anyone have any thoughts on this or a good way to prevent it?

Trygve

-(void)awakeFromNib
{
 lock = [[NSConditionLock alloc] initWithCondition:kConditionThreadRunning];

[NSThread detachNewThreadSelector:@selector(threadMethod:) toTarget:self
withObject:self];
}


- (void)threadMethod:(id)anObject
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    
    while (1)
    {
        if (![self threadMustExit])
            [self doStuff];
        
        if (![self threadMustExit])
            [self performSelectorOnMainThread:@selector(doThreadUnsafeStuff)
                  withObject:nil waitUntilDone:YES];

        if ([lock lockWhenCondition:kConditionThreadMustExit)
        {
            [lock unlock];
            break;
        }
    }
    
    [lock lock];
    [lock unlockWithCondition:kConditionThreadIdle];
    
    [pool release];
}


- (BOOL)threadMustExit
{
    [lock lock];
    BOOL threadMustExit = ([lock condition] == kConditionThreadMustExit);
    [lock unlock];
    
    return (threadMustExit);
}


-(void)killThread
{
    [lock lock];
    if ([lock condition] == kConditionThreadRunning)
    {
        //    instruct thread to exit
        [lock unlockWithCondition:kConditionThreadMustExit];
        
        //    Wait for thread to exit
        [lock lockWhenCondition:kConditionThreadIdle];
        [lock unlock];
    }
    else
        [lock unlock];
}




_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to