# define rwlock_rdlock(lock) RWLOCK_CALL (rdlock (&lock))
# define rwlock_wrlock(lock) RWLOCK_CALL (wrlock (&lock))
# define rwlock_unlock(lock) RWLOCK_CALL (unlock (&lock))
+# define mutex_define(class,name) class pthread_mutex_t name
+# define MUTEX_CALL(call) \
+ ({ int _err = pthread_mutex_ ## call; assert_perror (_err); })
+# define mutex_init(lock) \
+ ({ pthread_mutexattr_t _attr; \
+ pthread_mutexattr_init (&_attr); \
+ pthread_mutexattr_settype (&_attr, PTHREAD_MUTEX_RECURSIVE); \
+ MUTEX_CALL (init (&lock, &_attr)); })
+# define mutex_lock(_lock) MUTEX_CALL (lock (&_lock))
+# define mutex_unlock(lock) MUTEX_CALL (unlock (&lock))
+# define mutex_fini(lock) MUTEX_CALL (destroy (&lock))
# define once(once_control, init_routine) \
ONCE_CALL (once (&once_control, init_routine))
#else
# define rwlock_rdlock(lock) ((void) (lock))
# define rwlock_wrlock(lock) ((void) (lock))
# define rwlock_unlock(lock) ((void) (lock))
+# define mutex_define(class,name) class int name
+# define mutex_init(lock) ((void) (lock))
+# define mutex_lock(lock) ((void) (lock))
+# define mutex_unlock(lock) ((void) (lock))
+# define mutex_fini(lock) ((void) (lock))
# define once_define(class,name)
# define once(once_control, init_routine) init_routine()
#endif /* USE_LOCKS */
__libdw_seterrno (DWARF_E_NOMEM); /* no memory. */
return NULL;
}
- rwlock_init (result->dwarf_lock);
+ mutex_init (result->dwarf_lock);
eu_search_tree_init (&result->cu_tree);
eu_search_tree_init (&result->tu_tree);
eu_search_tree_init (&result->split_tree);
if (dwarf->mem_tails != NULL)
free (dwarf->mem_tails);
pthread_rwlock_destroy (&dwarf->mem_rwl);
- rwlock_fini (dwarf->dwarf_lock);
+ mutex_fini (dwarf->dwarf_lock);
/* Free the pubnames helper structure. */
free (dwarf->pubnames_sets);
bool scan_debug_types = false;
do
{
- rwlock_wrlock(attr->cu->dbg->dwarf_lock);
+ mutex_lock (attr->cu->dbg->dwarf_lock);
cu = __libdw_intern_next_unit (attr->cu->dbg, scan_debug_types);
- rwlock_unlock(attr->cu->dbg->dwarf_lock);
+ mutex_unlock (attr->cu->dbg->dwarf_lock);
if (cu == NULL)
{
if (main == NULL)
return NULL;
- rwlock_wrlock(main->dwarf_lock);
+ mutex_lock (main->dwarf_lock);
/* Only try once. */
if (main->alt_dwarf == (void *) -1)
{
- rwlock_unlock (main->dwarf_lock);
+ mutex_unlock (main->dwarf_lock);
return NULL;
}
if (main->alt_dwarf != NULL)
{
result = main->alt_dwarf;
- rwlock_unlock (main->dwarf_lock);
+ mutex_unlock (main->dwarf_lock);
return result;
}
if (main->alt_dwarf == NULL)
{
main->alt_dwarf = (void *) -1;
- rwlock_unlock (main->dwarf_lock);
+ mutex_unlock (main->dwarf_lock);
return NULL;
}
result = main->alt_dwarf;
- rwlock_unlock (main->dwarf_lock);
+ mutex_unlock (main->dwarf_lock);
return result;
}
void
dwarf_setalt (Dwarf *main, Dwarf *alt)
{
- rwlock_wrlock (main->dwarf_lock);
+ mutex_lock (main->dwarf_lock);
if (main->alt_fd != -1)
{
}
main->alt_dwarf = alt;
- rwlock_unlock (main->dwarf_lock);
+ mutex_unlock (main->dwarf_lock);
}
INTDEF (dwarf_setalt)
allocations for this Dwarf. */
pthread_rwlock_t mem_rwl;
- /* The dwarf_lock is a read-write lock designed to ensure thread-safe access
- and modification of an entire Dwarf object. */
- rwlock_define(, dwarf_lock);
+ /* Recursive mutex intended for setting/getting alt_dwarf, next_tu_offset,
+ and next_cu_offset. Covers dwarf_getsrclines, dwarf_getsrcfiles and
+ dwarf_macro_getsrcfiles. Should also be held when calling
+ __libdw_intern_next_unit. */
+ mutex_define(, dwarf_lock);
/* Internal memory handling. This is basically a simplified thread-local
reimplementation of obstacks. Unfortunately the standard obstack
Dwarf_Off locs_base;
/* Synchronize access to the abbrev member of a Dwarf_Die that
- refers to this Dwarf_CU. */
+ refers to this Dwarf_CU. Covers __libdw_die_abbrev. */
rwlock_define(, abbrev_lock);
- /* Synchronize access to the split member of this Dwarf_CU. */
+ /* Synchronize access to the split member of this Dwarf_CU.
+ Covers __libdw_find_split_unit. */
rwlock_define(, split_lock);
/* Memory boundaries of this CU. */
if (found != NULL)
return *found;
- rwlock_wrlock (dbg->dwarf_lock);
+ mutex_lock (dbg->dwarf_lock);
if (start < *next_offset)
__libdw_seterrno (DWARF_E_INVALID_DWARF);
}
}
- rwlock_unlock (dbg->dwarf_lock);
+ mutex_unlock (dbg->dwarf_lock);
return result;
}