]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-monitor/cache.c
Use fake_init2 in db_open/db_close since they can execute from a
[openldap] / servers / slapd / back-monitor / cache.c
index 3de1ce279a9a1fe5b581d18e32f83269f706ec44..deb16a9ef6a8ec747780accb5afdb7ae077148e0 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2001-2008 The OpenLDAP Foundation.
+ * Copyright 2001-2009 The OpenLDAP Foundation.
  * Portions Copyright 2001-2003 Pierangelo Masarati.
  * All rights reserved.
  *
@@ -154,13 +154,18 @@ monitor_cache_get(
        *ep = NULL;
 
        tmp_mc.mc_ndn = *ndn;
+retry:;
        ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
        mc = ( monitor_cache_t * )avl_find( mi->mi_cache,
                        ( caddr_t )&tmp_mc, monitor_cache_cmp );
 
        if ( mc != NULL ) {
                /* entry is returned with mutex locked */
-               monitor_cache_lock( mc->mc_e );
+               if ( monitor_cache_trylock( mc->mc_e ) ) {
+                       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+                       ldap_pvt_thread_yield();
+                       goto retry;
+               }
                *ep = mc->mc_e;
        }