diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-10-31 07:53:17 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-10-31 07:53:17 +0000 |
commit | e18d0df84bf1c68fb0cd42ec33b567f37b11d986 (patch) | |
tree | 8d737862dd7ed0f520fcdf9372048ab2eef39deb /pjlib/src/pj/ioqueue_select.c | |
parent | c12a8688e01bbb4a3b4f881695f52a183f063b43 (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
Diffstat (limited to 'pjlib/src/pj/ioqueue_select.c')
-rw-r--r-- | pjlib/src/pj/ioqueue_select.c | 4 |
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 |