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
2001-10-31 19:58:02 +00:00
committed by Michael Zucci
parent 72ab189eac
commit b40eb5b8a4
3 changed files with 22 additions and 20 deletions

View File

@ -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

View File

@ -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);

View File

@ -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