aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libibex/ChangeLog8
-rw-r--r--libibex/ibex_block.c32
-rw-r--r--libibex/ibex_internal.h2
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