]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/cache.c
ITS#4088 force cursors to use same locker
[openldap] / servers / slapd / back-bdb / cache.c
index efd963a82fd209292ad9bae3ffbc310d910d4adb..eb894b2757826c30f62aca6b2800e53dbf7e4b38 100644 (file)
@@ -384,10 +384,11 @@ bdb_cache_find_ndn(
 /* Walk up the tree from a child node, looking for an ID that's already
  * been linked into the cache.
  */
-static int
+int
 hdb_cache_find_parent(
        Operation *op,
        DB_TXN *txn,
+       u_int32_t       locker,
        ID id,
        EntryInfo **res )
 {
@@ -401,7 +402,7 @@ hdb_cache_find_parent(
        ei.bei_ckids = 0;
 
        for (;;) {
-               rc = hdb_dn2id_parent( op, txn, &ei, &eip.bei_id );
+               rc = hdb_dn2id_parent( op, txn, locker, &ei, &eip.bei_id );
                if ( rc ) break;
 
                /* Save the previous node, if any */
@@ -718,7 +719,7 @@ again:      ldap_pvt_thread_rdwr_rlock( &bdb->bi_cache.c_rwlock );
                        }
                }
 #else
-               rc = hdb_cache_find_parent(op, tid, id, eip );
+               rc = hdb_cache_find_parent(op, tid, locker, id, eip );
                if ( rc == 0 && *eip ) islocked = 1;
 #endif
        }
@@ -1357,7 +1358,7 @@ static void
 bdb_locker_id_free( void *key, void *data )
 {
        DB_ENV *env = key;
-       u_int32_t lockid = (u_int32_t) data;
+       u_int32_t lockid = (long)data;
        int rc;
 
        rc = XLOCK_ID_FREE( env, lockid );
@@ -1405,7 +1406,7 @@ bdb_locker_id( Operation *op, DB_ENV *env, u_int32_t *locker )
                if ( rc != 0) {
                        return rc;
                }
-               data = (void *)lockid;
+               data = (void *)((long)lockid);
                if ( ( rc = ldap_pvt_thread_pool_setkey( ctx, env,
                        data, bdb_locker_id_free ) ) ) {
                        XLOCK_ID_FREE( env, lockid );
@@ -1415,7 +1416,7 @@ bdb_locker_id( Operation *op, DB_ENV *env, u_int32_t *locker )
                        return rc;
                }
        } else {
-               lockid = (u_int32_t) data;
+               lockid = (long)data;
        }
        *locker = lockid;
        return 0;