summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-10-31 07:53:17 +0000
committerBenny Prijono <bennylp@teluu.com>2007-10-31 07:53:17 +0000
commite18d0df84bf1c68fb0cd42ec33b567f37b11d986 (patch)
tree8d737862dd7ed0f520fcdf9372048ab2eef39deb
parentc12a8688e01bbb4a3b4f881695f52a183f063b43 (diff)
Fixed deadlock in increment_counter() and decrement_counter() caused by different lock order (thanks Phil Torre)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1531 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjlib/src/pj/ioqueue_select.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/pjlib/src/pj/ioqueue_select.c b/pjlib/src/pj/ioqueue_select.c
index 1fb3660b..4bf11471 100644
--- a/pjlib/src/pj/ioqueue_select.c
+++ b/pjlib/src/pj/ioqueue_select.c
@@ -392,6 +392,7 @@ static void increment_counter(pj_ioqueue_key_t *key)
*/
static void decrement_counter(pj_ioqueue_key_t *key)
{
+ pj_lock_acquire(key->ioqueue->lock);
pj_mutex_lock(key->ioqueue->ref_cnt_mutex);
--key->ref_count;
if (key->ref_count == 0) {
@@ -401,14 +402,13 @@ static void decrement_counter(pj_ioqueue_key_t *key)
key->free_time.msec += PJ_IOQUEUE_KEY_FREE_DELAY;
pj_time_val_normalize(&key->free_time);
- pj_lock_acquire(key->ioqueue->lock);
pj_list_erase(key);
pj_list_push_back(&key->ioqueue->closing_list, key);
/* Rescan fdset to get max descriptor */
rescan_fdset(key->ioqueue);
- pj_lock_release(key->ioqueue->lock);
}
pj_mutex_unlock(key->ioqueue->ref_cnt_mutex);
+ pj_lock_release(key->ioqueue->lock);
}
#endif