A newer version of this document is available. Customers should click here to go to the newest version.
Dangling Lock
Occurs when a task does not release a lock before the task ends.

ID  |  
        Code Location  |  
        Description  |  
       
|---|---|---|
1  |  
        Allocation site  |  
        If present, represents the location and associated call stack when the lock was created.  |  
       
2  |  
        Lock owned  |  
        If present, represents the location and its associated call stack when the lock was last acquired.  |  
       
3  |  
        Parallel site  |  
        If present, represents the location and associated call stack of the site-begin annotation of the parallel site containing the task that acquired the lock.  |  
       
Example
void problem()
{
    ANNOTATE_SITE_BEGIN(dangle_site1);        // Parallel site
        ANNOTATE_TASK_BEGIN(task1);
            ANNOTATE_LOCK_ACQUIRE(&dangle);   // Lock owned
        ANNOTATE_TASK_END();
     // ...
    ANNOTATE_SITE_END();
} 
   In this example:
There is a parallel site that contains a task.
The lock is acquired in the task.
The lock is not released before the end of the task - the ANNOTATE_LOCK_RELEASE() annotation is missing.
Possible Correction Strategies
Make sure that an ANNOTATE_LOCK_RELEASE(address) annotation is executed on every flow path from an ANNOTATE_LOCK_ACQUIRE(address) annotation to the end of the task. If a code region has multiple exit flow paths, make sure the lock is released on all the paths.
Consider putting the lock-acquire and lock-release in the constructor and destructor of a static object, so that lock release happens automatically.
Consider putting a lock release in an exception handler if a the locked region might exit from an exception.