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 - theANNOTATE_LOCK_RELEASE()annotation is missing.
Possible Correction Strategies
- Make sure that anANNOTATE_LOCK_RELEASE(address)annotation is executed on every flow path from anANNOTATE_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.