Patch: slapd's o_abandonmutex is unnecessary (ITS#1733) ================ Written by Hallvard B. Furuseth and placed into the public domain. This software is not subject to any license of the University of Oslo. ================ o_abandonmutex is only used to protect the single operation of (re)setting or testing o_abandon. For such simple operations, you can get the same effect just by declaring o_abandon as `volatile sig_atomic_t'. Here is a patch. rc is LDAP_SUCCESS (0) when I skip the assignment to rc in back-ldbm/modify.c. Except for that, the patch is readable without referring to the source. Hallvard B. Furuseth , April 2002. diff -u2 -r servers/slapd/slap.h~ servers/slapd/slap.h --- servers/slapd/slap.h~ Thu Apr 4 11:15:41 2002 +++ servers/slapd/slap.h Mon Apr 8 18:38:44 2002 @@ -17,4 +17,5 @@ #include #include +#include #include #include @@ -1443,6 +1444,5 @@ ldap_pvt_thread_t o_tid; /* thread handling this op */ - ldap_pvt_thread_mutex_t o_abandonmutex; /* protects o_abandon */ - char o_abandon; /* abandon flag */ + volatile sig_atomic_t o_abandon; /* abandon flag */ #define SLAP_NO_CONTROL 0 diff -u2 -r servers/slapd/back-shell/abandon.c~ servers/slapd/back-shell/abandon.c --- servers/slapd/back-shell/abandon.c~ Fri Jan 4 21:17:54 2002 +++ servers/slapd/back-shell/abandon.c Mon Apr 8 18:36:44 2002 @@ -10,5 +10,4 @@ #include -#include #include #include diff -u2 -r servers/slapd/daemon.c~ servers/slapd/daemon.c --- servers/slapd/daemon.c~ Thu Apr 4 11:15:41 2002 +++ servers/slapd/daemon.c Mon Apr 8 18:36:44 2002 @@ -11,5 +11,4 @@ #include #include -#include #include #include diff -u2 -r servers/slapd/main.c~ servers/slapd/main.c --- servers/slapd/main.c~ Mon Mar 25 16:30:06 2002 +++ servers/slapd/main.c Mon Apr 8 18:36:44 2002 @@ -8,5 +8,4 @@ #include -#include #include #include diff -u2 -r servers/slapd/referral.c~ servers/slapd/referral.c --- servers/slapd/referral.c~ Wed Jan 16 03:01:19 2002 +++ servers/slapd/referral.c Mon Apr 8 18:36:44 2002 @@ -12,5 +12,4 @@ #include #include -#include #include #include diff -u2 -r servers/slapd/result.c~ servers/slapd/result.c --- servers/slapd/result.c~ Sat Feb 9 05:14:17 2002 +++ servers/slapd/result.c Mon Apr 8 18:36:44 2002 @@ -12,5 +12,4 @@ #include #include -#include #include #include diff -u2 -r servers/slapd/connection.c~ servers/slapd/connection.c --- servers/slapd/connection.c~ Sat Apr 6 10:53:59 2002 +++ servers/slapd/connection.c Mon Apr 8 18:36:44 2002 @@ -12,5 +12,4 @@ #include #include -#include #include #include @@ -742,7 +741,5 @@ LDAP_STAILQ_FOREACH(o, &c->c_ops, o_next) { - ldap_pvt_thread_mutex_lock( &o->o_abandonmutex ); o->o_abandon = 1; - ldap_pvt_thread_mutex_unlock( &o->o_abandonmutex ); } diff -u2 -r servers/slapd/abandon.c~ servers/slapd/abandon.c --- servers/slapd/abandon.c~ Fri Jan 4 21:17:44 2002 +++ servers/slapd/abandon.c Mon Apr 8 18:36:44 2002 @@ -93,7 +93,5 @@ LDAP_STAILQ_FOREACH( o, &conn->c_ops, o_next ) { if ( o->o_msgid == id ) { - ldap_pvt_thread_mutex_lock( &o->o_abandonmutex ); o->o_abandon = 1; - ldap_pvt_thread_mutex_unlock( &o->o_abandonmutex ); goto done; } diff -u2 -r servers/slapd/back-bdb/search.c~ servers/slapd/back-bdb/search.c --- servers/slapd/back-bdb/search.c~ Mon Apr 8 10:56:00 2002 +++ servers/slapd/back-bdb/search.c Mon Apr 8 18:36:44 2002 @@ -45,5 +45,4 @@ { struct bdb_info *bdb = (struct bdb_info *) be->be_private; - int abandon; int rc; const char *text = NULL; @@ -300,9 +299,5 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); - abandon = op->o_abandon; - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - - if ( abandon ) { + if ( op->o_abandon ) { rc = 0; goto done; diff -u2 -r servers/slapd/back-ldap/search.c~ servers/slapd/back-ldap/search.c --- servers/slapd/back-ldap/search.c~ Mon Feb 11 09:38:49 2002 +++ servers/slapd/back-ldap/search.c Mon Apr 8 18:36:44 2002 @@ -261,12 +261,6 @@ rc = ldap_result(lc->ld, LDAP_RES_ANY, 0, &tv, &res)) { - int ab; - /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); - ab = op->o_abandon; - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - - if (ab) { + if (op->o_abandon) { ldap_abandon(lc->ld, msgid); rc = 0; diff -u2 -r servers/slapd/back-ldbm/modify.c~ servers/slapd/back-ldbm/modify.c --- servers/slapd/back-ldbm/modify.c~ Tue Jan 29 17:58:36 2002 +++ servers/slapd/back-ldbm/modify.c Mon Apr 8 18:36:44 2002 @@ -208,8 +208,5 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); - rc = op->o_abandon; - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - if ( rc ) { + if ( op->o_abandon ) { rc = SLAPD_ABANDON; goto exit; diff -u2 -r servers/slapd/back-ldbm/modrdn.c~ servers/slapd/back-ldbm/modrdn.c --- servers/slapd/back-ldbm/modrdn.c~ Mon Apr 8 10:56:01 2002 +++ servers/slapd/back-ldbm/modrdn.c Mon Apr 8 18:36:44 2002 @@ -469,11 +469,8 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); if ( op->o_abandon ) { - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); goto return_results; } - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); if ( ( rc_id = dn2id ( be, &new_ndn, &id ) ) || id != NOID ) { /* if (rc_id) something bad happened to ldbm cache */ @@ -709,10 +706,7 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); if ( op->o_abandon ) { - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); goto return_results; } - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); /* delete old one */ diff -u2 -r servers/slapd/back-ldbm/search.c~ servers/slapd/back-ldbm/search.c --- servers/slapd/back-ldbm/search.c~ Tue Jan 29 17:58:36 2002 +++ servers/slapd/back-ldbm/search.c Mon Apr 8 18:36:44 2002 @@ -296,13 +296,8 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); - if ( op->o_abandon ) { - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); rc = 0; goto done; } - - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); /* check time limit */ diff -u2 -r servers/slapd/back-meta/search.c~ servers/slapd/back-meta/search.c --- servers/slapd/back-meta/search.c~ Mon Apr 8 11:51:45 2002 +++ servers/slapd/back-meta/search.c Mon Apr 8 18:36:44 2002 @@ -407,7 +407,5 @@ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); ab = op->o_abandon; - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); for ( i = 0, lsc = lc->conns; lsc[ 0 ] != NULL; lsc++, i++ ) { diff -u2 -r servers/slapd/back-monitor/log.c~ servers/slapd/back-monitor/log.c --- servers/slapd/back-monitor/log.c~ Tue Apr 2 14:38:57 2002 +++ servers/slapd/back-monitor/log.c Mon Apr 8 18:44:09 2002 @@ -197,12 +197,9 @@ #if 0 /* need op */ /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); if ( op->o_abandon ) { - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); rc = SLAPD_ABANDON; goto cleanup; } - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); #endif diff -u2 -r servers/slapd/back-passwd/search.c~ servers/slapd/back-passwd/search.c --- servers/slapd/back-passwd/search.c~ Wed Feb 13 11:46:35 2002 +++ servers/slapd/back-passwd/search.c Mon Apr 8 18:36:44 2002 @@ -133,11 +133,8 @@ for ( pw = getpwent(); pw != NULL; pw = getpwent() ) { /* check for abandon */ - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); if ( op->o_abandon ) { - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); endpwent(); return( -1 ); } - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); /* check time limit */ diff -u2 -r servers/slapd/back-sql/search.c~ servers/slapd/back-sql/search.c --- servers/slapd/back-sql/search.c~ Thu Jan 3 05:41:51 2002 +++ servers/slapd/back-sql/search.c Mon Apr 8 18:36:44 2002 @@ -585,11 +585,8 @@ { /* check for abandon */ - ldap_pvt_thread_mutex_lock(&op->o_abandonmutex); if (op->o_abandon) { - ldap_pvt_thread_mutex_unlock(&op->o_abandonmutex); break; } - ldap_pvt_thread_mutex_unlock(&op->o_abandonmutex); /* check time limit */ diff -u2 -r servers/slapd/backend.c~ servers/slapd/backend.c --- servers/slapd/backend.c~ Mon Apr 8 10:55:59 2002 +++ servers/slapd/backend.c Mon Apr 8 18:36:44 2002 @@ -994,10 +994,7 @@ { GroupAssertion *g; - int i; - ldap_pvt_thread_mutex_lock( &op->o_abandonmutex ); - i = op->o_abandon; - ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - if (i) return SLAPD_ABANDON; + if ( op->o_abandon ) + return SLAPD_ABANDON; if ( !dn_match( &target->e_nname, gr_ndn ) ) { diff -u2 -r servers/slapd/backglue.c~ servers/slapd/backglue.c --- servers/slapd/backglue.c~ Sat Mar 30 08:47:13 2002 +++ servers/slapd/backglue.c Mon Apr 8 18:36:44 2002 @@ -350,12 +350,9 @@ } } + rc = 0; /* * check for abandon */ - ldap_pvt_thread_mutex_lock (&op->o_abandonmutex); - rc = op->o_abandon; - ldap_pvt_thread_mutex_unlock (&op->o_abandonmutex); - if (rc) { - rc = 0; + if (op->o_abandon) { goto done; } diff -u2 -r servers/slapd/operation.c~ servers/slapd/operation.c --- servers/slapd/operation.c~ Sun Mar 24 02:17:21 2002 +++ servers/slapd/operation.c Mon Apr 8 18:36:44 2002 @@ -37,6 +37,4 @@ } - ldap_pvt_thread_mutex_destroy( &op->o_abandonmutex ); - free( (char *) op ); } @@ -53,6 +51,4 @@ op = (Operation *) ch_calloc( 1, sizeof(Operation) ); - - ldap_pvt_thread_mutex_init( &op->o_abandonmutex ); op->o_ber = ber; diff -u2 -r servers/slapd/saslauthz.c~ servers/slapd/saslauthz.c --- servers/slapd/saslauthz.c~ Sat Apr 6 10:53:59 2002 +++ servers/slapd/saslauthz.c Mon Apr 8 18:36:44 2002 @@ -391,5 +391,4 @@ suffix_alias( be, &searchbase ); - ldap_pvt_thread_mutex_init( &op.o_abandonmutex ); op.o_tag = LDAP_REQ_SEARCH; op.o_protocol = LDAP_VERSION3; @@ -402,6 +401,4 @@ /*attrs=*/NULL, /*attrsonly=*/0 ); - ldap_pvt_thread_mutex_destroy( &op.o_abandonmutex ); - FINISHED: if( searchbase.bv_len ) ch_free( searchbase.bv_val ); @@ -510,5 +507,4 @@ cb.sc_private = &sm; - ldap_pvt_thread_mutex_init( &op.o_abandonmutex ); op.o_tag = LDAP_REQ_SEARCH; op.o_protocol = LDAP_VERSION3; @@ -520,6 +516,4 @@ scope, /*deref=*/1, /*sizelimit=*/0, /*time=*/0, filter, /*fstr=*/NULL, /*attrs=*/NULL, /*attrsonly=*/0 ); - - ldap_pvt_thread_mutex_destroy( &op.o_abandonmutex ); if (sm.match)