Diff for /servers/slapd/overlays/syncprov.c between versions 1.172 and 1.182

version 1.172, 2007/02/05 08:19:46 version 1.182, 2007/02/13 12:40:56
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.171 2007/02/05 03:50:07 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.181 2007/02/13 10:10:36 hyc Exp $ */
 /* syncprov.c - syncrepl provider */  /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
Line 59  typedef struct syncops { Line 59  typedef struct syncops {
         ID              s_eid;          /* entryID of search base */          ID              s_eid;          /* entryID of search base */
         Operation       *s_op;          /* search op */          Operation       *s_op;          /* search op */
         int             s_rid;          int             s_rid;
           int             s_sid;
         struct berval s_filterstr;          struct berval s_filterstr;
         int             s_flags;        /* search status */          int             s_flags;        /* search status */
 #define PS_IS_REFRESHING        0x01  #define PS_IS_REFRESHING        0x01
Line 130  typedef struct syncprov_info_t { Line 131  typedef struct syncprov_info_t {
         time_t  si_chklast;     /* time of last checkpoint */          time_t  si_chklast;     /* time of last checkpoint */
         Avlnode *si_mods;       /* entries being modified */          Avlnode *si_mods;       /* entries being modified */
         sessionlog      *si_logs;          sessionlog      *si_logs;
         ldap_pvt_thread_mutex_t si_csn_mutex;          ldap_pvt_thread_rdwr_t  si_csn_rwlock;
         ldap_pvt_thread_mutex_t si_ops_mutex;          ldap_pvt_thread_mutex_t si_ops_mutex;
         ldap_pvt_thread_mutex_t si_mods_mutex;          ldap_pvt_thread_mutex_t si_mods_mutex;
 } syncprov_info_t;  } syncprov_info_t;
Line 403  syncprov_findbase( Operation *op, fbase_ Line 404  syncprov_findbase( Operation *op, fbase_
                 slap_callback cb = {0};                  slap_callback cb = {0};
                 Operation fop;                  Operation fop;
                 SlapReply frs = { REP_RESULT };                  SlapReply frs = { REP_RESULT };
                   BackendInfo *bi;
                 int rc;                  int rc;
   
                 fc->fss->s_flags ^= PS_FIND_BASE;                  fc->fss->s_flags ^= PS_FIND_BASE;
Line 414  syncprov_findbase( Operation *op, fbase_ Line 416  syncprov_findbase( Operation *op, fbase_
                 fop.o_bd = op->o_bd;                  fop.o_bd = op->o_bd;
                 fop.o_time = op->o_time;                  fop.o_time = op->o_time;
                 fop.o_tincr = op->o_tincr;                  fop.o_tincr = op->o_tincr;
                   bi = op->o_bd->bd_info;
   
                 cb.sc_response = findbase_cb;                  cb.sc_response = findbase_cb;
                 cb.sc_private = fc;                  cb.sc_private = fc;
Line 431  syncprov_findbase( Operation *op, fbase_ Line 434  syncprov_findbase( Operation *op, fbase_
                 fop.ors_filter = &generic_filter;                  fop.ors_filter = &generic_filter;
                 fop.ors_filterstr = generic_filterstr;                  fop.ors_filterstr = generic_filterstr;
   
                 fop.o_bd->bd_info = on->on_info->oi_orig;                  rc = overlay_op_walk( &fop, &frs, op_search, on->on_info, on );
                 rc = fop.o_bd->be_search( &fop, &frs );                  op->o_bd->bd_info = bi;
                 fop.o_bd->bd_info = (BackendInfo *)on;  
         } else {          } else {
                 ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );                  ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );
                 fc->fbase = 1;                  fc->fbase = 1;
Line 769  syncprov_sendresp( Operation *op, opcook Line 771  syncprov_sendresp( Operation *op, opcook
         ctrls[1] = NULL;          ctrls[1] = NULL;
         csns[0] = opc->sctxcsn;          csns[0] = opc->sctxcsn;
         BER_BVZERO( &csns[1] );          BER_BVZERO( &csns[1] );
         slap_compose_sync_cookie( op, &cookie, csns, so->s_rid );          slap_compose_sync_cookie( op, &cookie, csns, so->s_rid, so->s_sid );
   
         e_uuid.e_attrs = &a_uuid;          e_uuid.e_attrs = &a_uuid;
         a_uuid.a_desc = slap_schema.si_ad_entryUUID;          a_uuid.a_desc = slap_schema.si_ad_entryUUID;
Line 838  syncprov_qplay( Operation *op, slap_over Line 840  syncprov_qplay( Operation *op, slap_over
         int rc = 0;          int rc = 0;
   
         opc.son = on;          opc.son = on;
         op->o_bd->bd_info = (BackendInfo *)on->on_info;  
   
         for (;;) {          for (;;) {
                 ldap_pvt_thread_mutex_lock( &so->s_mutex );                  ldap_pvt_thread_mutex_lock( &so->s_mutex );
Line 860  syncprov_qplay( Operation *op, slap_over Line 861  syncprov_qplay( Operation *op, slap_over
                 e = NULL;                  e = NULL;
   
                 if ( sr->s_mode != LDAP_SYNC_DELETE ) {                  if ( sr->s_mode != LDAP_SYNC_DELETE ) {
                         rc = be_entry_get_rw( op, &opc.sndn, NULL, NULL, 0, &e );                          rc = overlay_entry_get_ov( op, &opc.sndn, NULL, NULL, 0, &e, on );
                         if ( rc ) {                          if ( rc ) {
                                 Debug( LDAP_DEBUG_SYNC, "syncprov_qplay: failed to get %s, "                                  Debug( LDAP_DEBUG_SYNC, "syncprov_qplay: failed to get %s, "
                                         "error (%d), ignoring...\n", opc.sndn.bv_val, rc, 0 );                                          "error (%d), ignoring...\n", opc.sndn.bv_val, rc, 0 );
Line 872  syncprov_qplay( Operation *op, slap_over Line 873  syncprov_qplay( Operation *op, slap_over
                 rc = syncprov_sendresp( op, &opc, so, &e, sr->s_mode );                  rc = syncprov_sendresp( op, &opc, so, &e, sr->s_mode );
   
                 if ( e ) {                  if ( e ) {
                         be_entry_release_rw( op, e, 0 );                          overlay_entry_release_ov( op, e, 0, on );
                 }                  }
   
                 ch_free( sr );                  ch_free( sr );
Line 880  syncprov_qplay( Operation *op, slap_over Line 881  syncprov_qplay( Operation *op, slap_over
                 if ( rc )                  if ( rc )
                         break;                          break;
         }          }
         op->o_bd->bd_info = (BackendInfo *)on;  
         return rc;          return rc;
 }  }
   
Line 977  static int Line 977  static int
 syncprov_qresp( opcookie *opc, syncops *so, int mode )  syncprov_qresp( opcookie *opc, syncops *so, int mode )
 {  {
         syncres *sr;          syncres *sr;
           int sid;
   
           /* Don't send changes back to their originator */
           sid = slap_parse_csn_sid( &opc->sctxcsn );
           if ( sid >= 0 && sid == so->s_sid )
                   return LDAP_SUCCESS;
   
         sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +          sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +
                 opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );                  opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );
Line 1091  syncprov_matchops( Operation *op, opcook Line 1097  syncprov_matchops( Operation *op, opcook
   
         fbase_cookie fc;          fbase_cookie fc;
         syncops *ss, *sprev, *snext;          syncops *ss, *sprev, *snext;
         Entry *e;          Entry *e = NULL;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
         struct berval newdn;          struct berval newdn;
Line 1113  syncprov_matchops( Operation *op, opcook Line 1119  syncprov_matchops( Operation *op, opcook
                         db = *op->o_bd;                          db = *op->o_bd;
                         op->o_bd = &db;                          op->o_bd = &db;
                 }                  }
                 op->o_bd->bd_info = (BackendInfo *)on->on_info;                  rc = overlay_entry_get_ov( op, fc.fdn, NULL, NULL, 0, &e, on );
                 rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e );  
                 /* If we're sending responses now, make a copy and unlock the DB */                  /* If we're sending responses now, make a copy and unlock the DB */
                 if ( e && !saveit ) {                  if ( e && !saveit ) {
                         Entry *e2 = entry_dup( e );                          Entry *e2 = entry_dup( e );
                         be_entry_release_rw( op, e, 0 );                          overlay_entry_release_ov( op, e, 0, on );
                         e = e2;                          e = e2;
                 }                  }
                 op->o_bd->bd_info = (BackendInfo *)on;  
                 if ( rc ) {                  if ( rc ) {
                         op->o_bd = b0;                          op->o_bd = b0;
                         return;                          return;
Line 1523  syncprov_playlog( Operation *op, SlapRep Line 1527  syncprov_playlog( Operation *op, SlapRep
         if ( ndel ) {          if ( ndel ) {
                 struct berval cookie;                  struct berval cookie;
   
                 slap_compose_sync_cookie( op, &cookie, delcsn, srs->sr_state.rid );                  slap_compose_sync_cookie( op, &cookie, delcsn, srs->sr_state.rid,
                           srs->sr_state.sid );
                 uuids[ndel].bv_val = NULL;                  uuids[ndel].bv_val = NULL;
                 syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 );                  syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 );
                 op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );                  op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
Line 1547  syncprov_op_response( Operation *op, Sla Line 1552  syncprov_op_response( Operation *op, Sla
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
                 ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
                 slap_get_commit_csn( op, &maxcsn );                  slap_get_commit_csn( op, &maxcsn );
                 if ( !BER_BVISNULL( &maxcsn ) ) {                  if ( !BER_BVISNULL( &maxcsn ) ) {
                         int i, sid;                          int i, sid;
Line 1574  syncprov_op_response( Operation *op, Sla Line 1579  syncprov_op_response( Operation *op, Sla
                 /* Don't do any processing for consumer contextCSN updates */                  /* Don't do any processing for consumer contextCSN updates */
                 if ( SLAP_SYNC_SHADOW( op->o_bd ) &&                   if ( SLAP_SYNC_SHADOW( op->o_bd ) && 
                         op->o_msgid == SLAP_SYNC_UPDATE_MSGID ) {                          op->o_msgid == SLAP_SYNC_UPDATE_MSGID ) {
                         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
                         return SLAP_CB_CONTINUE;                          return SLAP_CB_CONTINUE;
                 }                  }
   
Line 1590  syncprov_op_response( Operation *op, Sla Line 1595  syncprov_op_response( Operation *op, Sla
                                 si->si_chklast = op->o_time;                                  si->si_chklast = op->o_time;
                         }                          }
                 }                  }
                 ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
   
                 opc->sctxcsn.bv_len = maxcsn.bv_len;  
                 opc->sctxcsn.bv_val = cbuf;  
   
                 if ( do_check ) {                  if ( do_check ) {
                           ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                         syncprov_checkpoint( op, rs, on );                          syncprov_checkpoint( op, rs, on );
                           ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
   
                   opc->sctxcsn.bv_len = maxcsn.bv_len;
                   opc->sctxcsn.bv_val = cbuf;
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
                 if ( si->si_ops ) {                  if ( si->si_ops ) {
                         switch(op->o_tag) {                          switch(op->o_tag) {
Line 1653  syncprov_op_compare( Operation *op, Slap Line 1660  syncprov_op_compare( Operation *op, Slap
   
                 a.a_desc = slap_schema.si_ad_contextCSN;                  a.a_desc = slap_schema.si_ad_contextCSN;
   
                 ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
   
                 a.a_vals = si->si_ctxcsn;                  a.a_vals = si->si_ctxcsn;
                 a.a_nvals = a.a_vals;                  a.a_nvals = a.a_vals;
Line 1685  syncprov_op_compare( Operation *op, Slap Line 1692  syncprov_op_compare( Operation *op, Slap
   
 return_results:;  return_results:;
   
                 ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
   
                 send_ldap_result( op, rs );                  send_ldap_result( op, rs );
   
Line 1919  syncprov_search_response( Operation *op, Line 1926  syncprov_search_response( Operation *op,
                         int i, sid;                          int i, sid;
                         sid = slap_parse_csn_sid( &a->a_nvals[0] );                          sid = slap_parse_csn_sid( &a->a_nvals[0] );
   
                           /* Don't send changed entries back to the originator */
                           if ( sid == srs->sr_state.sid && srs->sr_state.numcsns ) {
                                   Debug( LDAP_DEBUG_SYNC,
                                           "Entry %s changed by peer, ignored\n",
                                           rs->sr_entry->e_name.bv_val, 0, 0 );
                                   return LDAP_SUCCESS;
                           }
                         /* Make sure entry is less than the snapshot'd contextCSN */                          /* Make sure entry is less than the snapshot'd contextCSN */
                         for ( i=0; i<ss->ss_numcsns; i++ ) {                          for ( i=0; i<ss->ss_numcsns; i++ ) {
                                 if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],                                  if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],
Line 1957  syncprov_search_response( Operation *op, Line 1971  syncprov_search_response( Operation *op,
                 struct berval cookie;                  struct berval cookie;
   
                 slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,                  slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,
                         srs->sr_state.rid );                          srs->sr_state.rid, srs->sr_state.sid );
   
                 /* Is this a regular refresh? */                  /* Is this a regular refresh? */
                 if ( !ss->ss_so ) {                  if ( !ss->ss_so ) {
Line 2051  syncprov_op_search( Operation *op, SlapR Line 2065  syncprov_op_search( Operation *op, SlapR
                 *sop = so;                  *sop = so;
                 ldap_pvt_thread_mutex_init( &sop->s_mutex );                  ldap_pvt_thread_mutex_init( &sop->s_mutex );
                 sop->s_rid = srs->sr_state.rid;                  sop->s_rid = srs->sr_state.rid;
                   sop->s_sid = srs->sr_state.sid;
                 sop->s_inuse = 1;                  sop->s_inuse = 1;
   
                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
Line 2060  syncprov_op_search( Operation *op, SlapR Line 2075  syncprov_op_search( Operation *op, SlapR
         }          }
   
         /* snapshot the ctxcsn */          /* snapshot the ctxcsn */
         ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
         numcsns = si->si_numcsns;          numcsns = si->si_numcsns;
         if ( numcsns ) {          if ( numcsns ) {
                 ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx );                  ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx );
Line 2071  syncprov_op_search( Operation *op, SlapR Line 2086  syncprov_op_search( Operation *op, SlapR
                 ctxcsn = NULL;                  ctxcsn = NULL;
                 sids = NULL;                  sids = NULL;
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                   
         /* If we have a cookie, handle the PRESENT lookups */          /* If we have a cookie, handle the PRESENT lookups */
         if ( srs->sr_state.ctxcsn ) {          if ( srs->sr_state.ctxcsn ) {
Line 2164  no_change:  nochange = 1; Line 2179  no_change:  nochange = 1;
                         /* No, so a reload is required */                          /* No, so a reload is required */
                         /* the 2.2 consumer doesn't send this hint */                          /* the 2.2 consumer doesn't send this hint */
                         if ( si->si_usehint && srs->sr_rhint == 0 ) {                          if ( si->si_usehint && srs->sr_rhint == 0 ) {
                                   if ( ctxcsn )
                                           ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );                                  send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
Line 2172  no_change:  nochange = 1; Line 2189  no_change:  nochange = 1;
                         /* If changed and doing Present lookup, send Present UUIDs */                          /* If changed and doing Present lookup, send Present UUIDs */
                         if ( do_present && syncprov_findcsn( op, FIND_PRESENT ) !=                          if ( do_present && syncprov_findcsn( op, FIND_PRESENT ) !=
                                 LDAP_SUCCESS ) {                                  LDAP_SUCCESS ) {
                                   if ( ctxcsn )
                                           ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 send_ldap_result( op, rs );                                  send_ldap_result( op, rs );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
Line 2257  syncprov_operational( Line 2276  syncprov_operational(
                                         break;                                          break;
                         }                          }
   
                         ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                         if ( si->si_ctxcsn ) {                          if ( si->si_ctxcsn ) {
                                 if ( !a ) {                                  if ( !a ) {
                                         for ( ap = &rs->sr_operational_attrs; *ap;                                          for ( ap = &rs->sr_operational_attrs; *ap;
Line 2280  syncprov_operational( Line 2299  syncprov_operational(
                                 ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL );                                  ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL );
                                 a->a_nvals = a->a_vals;                                  a->a_nvals = a->a_vals;
                         }                          }
                         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
         }          }
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
Line 2488  syncprov_db_open( Line 2507  syncprov_db_open(
         Connection conn = { 0 };          Connection conn = { 0 };
         OperationBuffer opbuf = { 0 };          OperationBuffer opbuf = { 0 };
         Operation *op = (Operation *) &opbuf;          Operation *op = (Operation *) &opbuf;
         Entry *e;          Entry *e = NULL;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
         void *thrctx = NULL;          void *thrctx = NULL;
Line 2514  syncprov_db_open( Line 2533  syncprov_db_open(
         op->o_dn = be->be_rootdn;          op->o_dn = be->be_rootdn;
         op->o_ndn = be->be_rootndn;          op->o_ndn = be->be_rootndn;
   
         op->o_bd->bd_info = on->on_info->oi_orig;          rc = overlay_entry_get_ov( op, be->be_nsuffix, NULL,
         rc = be_entry_get_rw( op, be->be_nsuffix, NULL,                  slap_schema.si_ad_contextCSN, 0, &e, on );
                 slap_schema.si_ad_contextCSN, 0, &e );  
   
         if ( e ) {          if ( e ) {
                 ldap_pvt_thread_t tid;                  ldap_pvt_thread_t tid;
Line 2525  syncprov_db_open( Line 2543  syncprov_db_open(
                 if ( a ) {                  if ( a ) {
                         int i;                          int i;
                         ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );                          ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );
                         for ( i=0; !BER_BVISEMPTY( &a->a_vals[i] ); i++ );                          for ( i = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ );
                         si->si_numcsns = i;                          si->si_numcsns = i;
                         si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i );                          si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i );
                 }                  }
                 be_entry_release_rw( op, e, 0 );                  overlay_entry_release_ov( op, e, 0, on );
                 if ( si->si_ctxcsn ) {                  if ( si->si_ctxcsn ) {
                         op->o_bd->bd_info = (BackendInfo *)on;  
                         op->o_req_dn = be->be_suffix[0];                          op->o_req_dn = be->be_suffix[0];
                         op->o_req_ndn = be->be_nsuffix[0];                          op->o_req_ndn = be->be_nsuffix[0];
                         op->ors_scope = LDAP_SCOPE_SUBTREE;                          op->ors_scope = LDAP_SCOPE_SUBTREE;
Line 2617  syncprov_db_init( Line 2634  syncprov_db_init(
   
         si = ch_calloc(1, sizeof(syncprov_info_t));          si = ch_calloc(1, sizeof(syncprov_info_t));
         on->on_bi.bi_private = si;          on->on_bi.bi_private = si;
         ldap_pvt_thread_mutex_init( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_init( &si->si_csn_rwlock );
         ldap_pvt_thread_mutex_init( &si->si_ops_mutex );          ldap_pvt_thread_mutex_init( &si->si_ops_mutex );
         ldap_pvt_thread_mutex_init( &si->si_mods_mutex );          ldap_pvt_thread_mutex_init( &si->si_mods_mutex );
   
Line 2652  syncprov_db_destroy( Line 2669  syncprov_db_destroy(
                                                                   
                         ch_free( si->si_logs );                          ch_free( si->si_logs );
                 }                  }
                   if ( si->si_ctxcsn )
                           ber_bvarray_free( si->si_ctxcsn );
                   if ( si->si_sids )
                           ch_free( si->si_sids );
                 ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex );                  ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex );
                 ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex );
                 ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_destroy( &si->si_csn_rwlock );
                 ch_free( si );                  ch_free( si );
         }          }
   

Removed from v.1.172  
changed lines
  Added in v.1.182


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org