Changeset 320


Ignore:
Timestamp:
Mar 15, 2011, 8:59:48 PM (14 years ago)
Author:
katerina
Message:

Fix for ticket #237: Potential deadlock in sh_hash_hashdelete()

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/sh_pthread.h

    r315 r320  
    2323        do {                                                               \
    2424                int oldtype;                                               \
     25                int executeStack = 1;                                      \
    2526                pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);  \
    2627                pthread_cleanup_push(sh_pthread_mutex_unlock, (void*)&(M));\
    2728                pthread_mutex_lock(&(M))
    2829
     30#define SH_MUTEX_TRYLOCK(M)                                                \
     31        do {                                                               \
     32                int oldtype;                                               \
     33                int executeStack = 0;                                      \
     34                pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);  \
     35                pthread_cleanup_push(sh_pthread_mutex_unlock, (void*)&(M));\
     36                pthread_mutex_trylock(&(M));                               \
     37                executeStack = 1
    2938
    3039#define SH_MUTEX_UNLOCK(M)                                                 \
    31                 pthread_cleanup_pop(1);                                    \
     40                pthread_cleanup_pop(executeStack);                         \
    3241                pthread_setcanceltype(oldtype, NULL);                      \
    3342        } while (0)
     
    147156#define SH_MUTEX_EXTERN(M)                      extern void *SH_MUTEX_DUMMY_ ## M
    148157#define SH_MUTEX_LOCK(M)                        ((void)0)
     158#define SH_MUTEX_TRYLOCK(M)                     ((void)0)
    149159#define SH_MUTEX_UNLOCK(M)                      ((void)0)
    150160#define SH_MUTEX_LOCK_UNSAFE(M)                 ((void)0)
  • trunk/src/sh_hash.c

    r307 r320  
    15541554
    15551555  SL_ENTER(_("sh_hash_hashdelete"));
    1556   SH_MUTEX_LOCK(mutex_hash);
     1556
     1557  /* need deadlock detection here if called from exit handler
     1558   */
     1559  SH_MUTEX_TRYLOCK(mutex_hash);
    15571560
    15581561  if (IsInit == 0)
     
    15701573  ; /* 'label at end of compound statement */
    15711574  SH_MUTEX_UNLOCK(mutex_hash);
     1575
    15721576  SL_RET0(_("sh_hash_hashdelete"));
    15731577}
Note: See TracChangeset for help on using the changeset viewer.