eina/lock: add errno wrapping for backtrace() calls in thread debug blocks

Summary:
somehow backtrace() is able to generate EINVAL in certain cases even though
this is not documented anywhere. these irrelevant errors should not be noticed
by users of the api during debugging, as this can cause some tests/apps to
randomly fail without explanation

@fix

Reviewers: ManMower, devilhorns

Reviewed By: ManMower

Subscribers: cedric, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D6377
This commit is contained in:
Mike Blumenkrantz 2018-06-25 15:18:11 -04:00
parent 93228108ef
commit 83bab7cab4
1 changed files with 6 additions and 0 deletions

View File

@ -225,7 +225,10 @@ eina_lock_take_try(Eina_Lock *mutex)
if (mutex->recursive) return ret;
mutex->locked = 1;
mutex->lock_thread_id = pthread_self();
/* backtrace() can somehow generate EINVAL even though this is not documented anywhere? */
int err = errno;
mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), EINA_LOCK_DEBUG_BT_NUM);
errno = err;
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_append(_eina_tracking,
@ -295,7 +298,10 @@ eina_lock_take(Eina_Lock *mutex)
if (mutex->recursive) return ret;
mutex->locked = 1;
mutex->lock_thread_id = pthread_self();
/* backtrace() can somehow generate EINVAL even though this is not documented anywhere? */
int err = errno;
mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), EINA_LOCK_DEBUG_BT_NUM);
errno = err;
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_append(_eina_tracking,