On Sun, 1 May 2011 16:16:43 +0200 (CEST) Vincent Torri <[email protected]> said:
> > > On Sun, 1 May 2011, Enlightenment SVN wrote: > > > Log: > > oh dear. this new eina_lock thing is a bit of a mess isn't it now? > > some fundamental errors there. don't go replacing pthread locks with > > wrappers unless you know full well what u are doing. havnig threads > > only work while "threads are initted" and then init/shtudown the thread > > thing every time u spawn a thread.. is pretty silly. what if a thread > > ends in the background WHILE u have a lock.. u try unlock.. u know > > what ? your unlock DOES nothing. so you retain a lock. next time u > > want to lock once a thread is around.. u have a deadlock issue. > > > > even better - the checking if threads are initted and up is not > > locked, so it can come up while it is being checked. more race > > conditions. u need to clokc the init/shutdown AND lock the checking of > > the value... and even then u STILl have problem #1 above. so that code > > is now gone. > > > > also trylock trturn inverse logic to the original pthread func and the > > macros in evas that used it were not changed accordingly! aaagh! > > > > i've also added backtrace debug ability to eina threads if compiled in > > - u can get a bt of who last locked something. i had to do this just to > > begin to grasp what on earth was going on. it's off by default. > > also... the locks are error check locks to trylock can detect > > deadlocks. speacil "2" return for now. better than a poke in the eye > > with a sharp stick until we decide what to do. for now i hopew i have > > killed this thread lock bug. > > can i try to mimic that to debug threads on Windows too ? do you have a working "backtrace". yes - gnu extensions. :) or you mean the deadlock detection thats in pthread for error check locks? > Vincent > > > > > > > > > > > Author: raster > > Date: 2011-05-01 06:24:08 -0700 (Sun, 01 May 2011) > > New Revision: 59085 > > Trac: http://trac.enlightenment.org/e/changeset/59085 > > > > Modified: > > trunk/eina/src/include/eina_inline_lock_posix.x > > > > Modified: trunk/eina/src/include/eina_inline_lock_posix.x > > =================================================================== > > --- trunk/eina/src/include/eina_inline_lock_posix.x 2011-05-01 > > 12:58:35 UTC (rev 59084) +++ > > trunk/eina/src/include/eina_inline_lock_posix.x 2011-05-01 13:24:08 > > UTC (rev 59085) @@ -19,6 +19,7 @@ > > #ifndef EINA_INLINE_LOCK_POSIX_X_ > > #define EINA_INLINE_LOCK_POSIX_X_ > > > > +#include <errno.h> > > #ifndef __USE_UNIX98 > > # define __USE_UNIX98 > > # include <pthread.h> > > @@ -27,8 +28,29 @@ > > # include <pthread.h> > > #endif > > > > -typedef pthread_mutex_t Eina_Lock; > > +/* > > +#define EINA_LOCK_DEBUG 1 > > +*/ > > > > +#ifdef EINA_LOCK_DEBUG > > +#include <execinfo.h> > > +#define EINA_LOCK_DEBUG_BT_NUM 64 > > +typedef void (*Eina_Lock_Bt_Func) (); > > +#endif > > + > > +typedef struct _Eina_Lock Eina_Lock; > > + > > +struct _Eina_Lock > > +{ > > + pthread_mutex_t mutex; > > +#ifdef EINA_LOCK_DEBUG > > + pthread_t lock_thread_id; > > + Eina_Lock_Bt_Func lock_bt[EINA_LOCK_DEBUG_BT_NUM]; > > + int lock_bt_num; > > + Eina_Bool locked : 1; > > +#endif > > +}; > > + > > EAPI extern Eina_Bool _eina_threads_activated; > > > > #ifdef EINA_HAVE_DEBUG_THREADS > > @@ -44,12 +66,19 @@ > > > > if (pthread_mutexattr_init(&attr) != 0) > > return EINA_FALSE; > > +/* use errorcheck locks. detect deadlocks. > > #ifdef PTHREAD_MUTEX_RECURSIVE > > if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) > > return EINA_FALSE; > > #endif > > - if (pthread_mutex_init(mutex, &attr) != 0) > > + */ > > + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK) != 0) > > return EINA_FALSE; > > +#ifdef EINA_LOCK_DEBUG > > + memset(mutex, 0, sizeof(Eina_Lock)); > > +#endif > > + if (pthread_mutex_init(&(mutex->mutex), &attr) != 0) > > + return EINA_FALSE; > > > > pthread_mutexattr_destroy(&attr); > > > > @@ -59,53 +88,95 @@ > > static inline void > > eina_lock_free(Eina_Lock *mutex) > > { > > - pthread_mutex_destroy(mutex); > > + pthread_mutex_destroy(&(mutex->mutex)); > > +#ifdef EINA_LOCK_DEBUG > > + memset(mutex, 0, sizeof(Eina_Lock)); > > +#endif > > } > > > > static inline Eina_Bool > > eina_lock_take(Eina_Lock *mutex) > > { > > - if (_eina_threads_activated) > > - { > > + Eina_Bool ret; > > #ifdef EINA_HAVE_DEBUG_THREADS > > - if (_eina_threads_debug) > > - { > > - struct timeval t0, t1; > > - int dt; > > - > > - gettimeofday(&t0, NULL); > > - pthread_mutex_lock(&(x)); > > - gettimeofday(&t1, NULL); > > - > > - dt = (t1.tv_sec - t0.tv_sec) * 1000000; > > - if (t1.tv_usec > t0.tv_usec) > > - dt += (t1.tv_usec - t0.tv_usec); > > - else > > - dt -= t0.tv_usec - t1.tv_usec; > > - dt /= 1000; > > - > > - if (dt > _eina_threads_debug) abort(); > > - } > > + if (_eina_threads_debug) > > + { > > + struct timeval t0, t1; > > + int dt; > > + > > + gettimeofday(&t0, NULL); > > + pthread_mutex_lock(&(x)); > > + gettimeofday(&t1, NULL); > > + > > + dt = (t1.tv_sec - t0.tv_sec) * 1000000; > > + if (t1.tv_usec > t0.tv_usec) > > + dt += (t1.tv_usec - t0.tv_usec); > > + else > > + dt -= t0.tv_usec - t1.tv_usec; > > + dt /= 1000; > > + > > + if (dt > _eina_threads_debug) abort(); > > + } > > #endif > > - return (pthread_mutex_lock(mutex) == 0) ? EINA_TRUE : EINA_FALSE; > > - } > > - return EINA_FALSE; > > + ret = (pthread_mutex_lock(&(mutex->mutex)) == 0) ? > > + EINA_TRUE : EINA_FALSE; > > +#ifdef EINA_LOCK_DEBUG > > + mutex->locked = 1; > > + mutex->lock_thread_id = pthread_self(); > > + mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), > > EINA_LOCK_DEBUG_BT_NUM); +#endif > > + return ret; > > } > > > > static inline Eina_Bool > > eina_lock_take_try(Eina_Lock *mutex) > > { > > - if (_eina_threads_activated) > > - return (pthread_mutex_trylock(mutex) == 0) ? EINA_TRUE : EINA_FALSE; > > - return EINA_FALSE; > > + Eina_Bool ret = EINA_FALSE; > > + int ok; > > + > > + ok = pthread_mutex_trylock(&(mutex->mutex)); > > + if (ok == 0) ret = EINA_TRUE; > > + else if (ok == EDEADLK) > > + { > > + printf("ERROR ERROR: DEADLOCK on lock %p\n", mutex); > > + ret = 2; // magic > > + } > > +#ifdef EINA_LOCK_DEBUG > > + if (ret == EINA_TRUE) > > + { > > + mutex->locked = 1; > > + mutex->lock_thread_id = pthread_self(); > > + mutex->lock_bt_num = backtrace((void **)(mutex->lock_bt), > > EINA_LOCK_DEBUG_BT_NUM); > > + } > > +#endif > > + return ret; > > } > > > > static inline Eina_Bool > > eina_lock_release(Eina_Lock *mutex) > > { > > - if (_eina_threads_activated) > > - return (pthread_mutex_unlock(mutex) == 0) ? EINA_TRUE : EINA_FALSE; > > - return EINA_FALSE; > > + Eina_Bool ret; > > +#ifdef EINA_LOCK_DEBUG > > + mutex->locked = 0; > > + mutex->lock_thread_id = 0; > > + memset(mutex->lock_bt, 0, EINA_LOCK_DEBUG_BT_NUM * sizeof > > (Eina_Lock_Bt_Func)); > > + mutex->lock_bt_num = 0; > > +#endif > > + ret = (pthread_mutex_unlock(&(mutex->mutex)) == 0) ? > > + EINA_TRUE : EINA_FALSE; > > + return ret; > > } > > > > +static inline void > > +eina_lock_debug(Eina_Lock *mutex) > > +{ > > +#ifdef EINA_LOCK_DEBUG > > + printf("lock %p, locked: %i, by %i\n", > > + mutex, (int)mutex->locked, (int)mutex->lock_thread_id); > > + backtrace_symbols_fd((void **)mutex->lock_bt, mutex->lock_bt_num, 1); > > +#else > > + mutex = 0; > > #endif > > +} > > + > > +#endif > > > > > > ------------------------------------------------------------------------------ > > WhatsUp Gold - Download Free Network Management Software > > The most intuitive, comprehensive, and cost-effective network > > management toolset available today. Delivers lowest initial > > acquisition cost and overall TCO of any competing solution. > > http://p.sf.net/sfu/whatsupgold-sd > > _______________________________________________ > > enlightenment-svn mailing list > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > > > > > ------------------------------------------------------------------------------ > WhatsUp Gold - Download Free Network Management Software > The most intuitive, comprehensive, and cost-effective network > management toolset available today. Delivers lowest initial > acquisition cost and overall TCO of any competing solution. > http://p.sf.net/sfu/whatsupgold-sd > _______________________________________________ > enlightenment-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) [email protected] ------------------------------------------------------------------------------ WhatsUp Gold - Download Free Network Management Software The most intuitive, comprehensive, and cost-effective network management toolset available today. Delivers lowest initial acquisition cost and overall TCO of any competing solution. http://p.sf.net/sfu/whatsupgold-sd _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
