Added a trylock, used by ibex_use.
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. svn path=/trunk/; revision=14547
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user