diff options
-rw-r--r-- | libibex/ChangeLog | 8 | ||||
-rw-r--r-- | libibex/ibex_block.c | 32 | ||||
-rw-r--r-- | libibex/ibex_internal.h | 2 |
3 files changed, 22 insertions, 20 deletions
diff --git a/libibex/ChangeLog b/libibex/ChangeLog index 9d679743aa..46c89323ed 100644 --- a/libibex/ChangeLog +++ b/libibex/ChangeLog @@ -1,3 +1,11 @@ +2001-10-31 <NotZed@Ximian.com> + + * ibex_internal.h (IBEX_TRYLOCK): Added a trylock, used by ibex_use. + + * ibex_block.c (ibex_use): Do to a trylock on the ibex we're + checking to close, as it might be locked elsewhere in an obivously + simple deadlock. + 2001-10-30 <NotZed@Ximian.com> * ibex_internal.h (IBEX_OPEN_THRESHOLD): Bump this to 15, 5 seems diff --git a/libibex/ibex_block.c b/libibex/ibex_block.c index d8dade7986..a6f810d4ae 100644 --- a/libibex/ibex_block.c +++ b/libibex/ibex_block.c @@ -35,7 +35,7 @@ static int ibex_open_threshold = IBEX_OPEN_THRESHOLD; #ifdef ENABLE_THREADS #include <pthread.h> static pthread_mutex_t ibex_list_lock = PTHREAD_MUTEX_INITIALIZER; -int ibex_opened; /* count of actually opened ibexe's */ +static int ibex_opened; /* count of actually opened ibexe's */ #define IBEX_LIST_LOCK(ib) (pthread_mutex_lock(&ibex_list_lock)) #define IBEX_LIST_UNLOCK(ib) (pthread_mutex_unlock(&ibex_list_lock)) #else @@ -89,27 +89,19 @@ static void ibex_use(ibex *ib) /* check for other ibex's we can close now to not over-use fd's. we can't do this first for locking issues */ - if (ibex_opened > ibex_open_threshold) { - wb = (ibex *)ibex_list.head; - wn = wb->next; - while (wn) { - if (wb != ib) { - IBEX_LOCK(wb); - if (wb->usecount == 0 && wb->blocks != NULL) { - o(printf("Forcing close of obex '%s', total = %d\n", wb->name, ibex_opened-1)); - close_backend(wb); - IBEX_UNLOCK(wb); - /* optimise the next scan? */ - /*ibex_list_remove((struct _listnode *)wb); - ibex_list_addtail(&ibex_list, (struct _listnode *)wb);*/ - ibex_opened--; - break; - } - IBEX_UNLOCK(wb); + wb = (ibex *)ibex_list.head; + wn = wb->next; + while (wn && ibex_opened > ibex_open_threshold) { + if (wb != ib && IBEX_TRYLOCK(wb) == 0) { + if (wb->usecount == 0 && wb->blocks != NULL) { + o(printf("Forcing close of obex '%s', total = %d\n", wb->name, ibex_opened-1)); + close_backend(wb); + ibex_opened--; } - wb = wn; - wn = wn->next; + IBEX_UNLOCK(wb); } + wb = wn; + wn = wn->next; } IBEX_LIST_UNLOCK(ib); diff --git a/libibex/ibex_internal.h b/libibex/ibex_internal.h index 1ae2b66146..321b596f2a 100644 --- a/libibex/ibex_internal.h +++ b/libibex/ibex_internal.h @@ -52,8 +52,10 @@ struct ibex { #define IBEX_UNLOCK(ib) (printf(__FILE__ "%d: %s: unlocking ibex\n", __LINE__, __FUNCTION__), g_mutex_unlock(ib->lock))*/ #define IBEX_LOCK(ib) (g_mutex_lock(ib->lock)) #define IBEX_UNLOCK(ib) (g_mutex_unlock(ib->lock)) +#define IBEX_TRYLOCK(ib) (g_mutex_trylock(ib->lock)) #else #define IBEX_LOCK(ib) #define IBEX_UNLOCK(ib) +#define IBEX_TRYLOCK(ib) (0) #endif |