version 1.38, 2004/12/05 19:57:34
|
version 1.39, 2004/12/06 19:32:53
|
Line 1
|
Line 1
|
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/ppolicy.c,v 1.31 2004/12/05 01:00:19 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.38 2004/12/05 19:57:34 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 102 typedef struct syncprov_info_t {
|
Line 102 typedef struct syncprov_info_t {
|
Avlnode *si_mods; /* entries being modified */ |
Avlnode *si_mods; /* entries being modified */ |
ldap_pvt_thread_mutex_t si_csn_mutex; |
ldap_pvt_thread_mutex_t si_csn_mutex; |
ldap_pvt_thread_mutex_t si_ops_mutex; |
ldap_pvt_thread_mutex_t si_ops_mutex; |
ldap_pvt_thread_rdwr_t si_mods_rwlock; |
ldap_pvt_thread_mutex_t si_mods_mutex; |
char si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
char si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; |
} syncprov_info_t; |
} syncprov_info_t; |
|
|
Line 971 syncprov_op_cleanup( Operation *op, Slap
|
Line 971 syncprov_op_cleanup( Operation *op, Slap
|
|
|
/* Remove op from lock table */ |
/* Remove op from lock table */ |
mtdummy.mt_op = op; |
mtdummy.mt_op = op; |
ldap_pvt_thread_rdwr_rlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex ); |
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp ); |
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp ); |
ldap_pvt_thread_rdwr_runlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); |
if ( mt ) { |
if ( mt ) { |
modinst *mi = mt->mt_mods; |
modinst *mi = mt->mt_mods; |
|
|
Line 984 syncprov_op_cleanup( Operation *op, Slap
|
Line 984 syncprov_op_cleanup( Operation *op, Slap
|
mt->mt_op = mt->mt_mods->mi_op; |
mt->mt_op = mt->mt_mods->mi_op; |
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); |
} else { |
} else { |
ldap_pvt_thread_rdwr_wlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex ); |
avl_delete( &si->si_mods, mt, sp_avl_cmp ); |
avl_delete( &si->si_mods, mt, sp_avl_cmp ); |
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); |
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_destroy( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_destroy( &mt->mt_mutex ); |
ch_free( mt ); |
ch_free( mt ); |
Line 1207 syncprov_op_mod( Operation *op, SlapRepl
|
Line 1207 syncprov_op_mod( Operation *op, SlapRepl
|
|
|
/* See if we're already modifying this entry... */ |
/* See if we're already modifying this entry... */ |
mtdummy.mt_op = op; |
mtdummy.mt_op = op; |
ldap_pvt_thread_rdwr_wlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex ); |
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp ); |
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp ); |
if ( mt ) { |
if ( mt ) { |
ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); |
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); |
mt->mt_tail->mi_next = mi; |
mt->mt_tail->mi_next = mi; |
mt->mt_tail = mi; |
mt->mt_tail = mi; |
/* wait for this op to get to head of list */ |
/* wait for this op to get to head of list */ |
Line 1220 syncprov_op_mod( Operation *op, SlapRepl
|
Line 1220 syncprov_op_mod( Operation *op, SlapRepl
|
ldap_pvt_thread_yield(); |
ldap_pvt_thread_yield(); |
ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); |
} |
} |
|
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); |
} else { |
} else { |
/* Record that we're modifying this entry now */ |
/* Record that we're modifying this entry now */ |
mt = ch_malloc( sizeof(modtarget) ); |
mt = ch_malloc( sizeof(modtarget) ); |
Line 1228 syncprov_op_mod( Operation *op, SlapRepl
|
Line 1229 syncprov_op_mod( Operation *op, SlapRepl
|
mt->mt_op = mi->mi_op; |
mt->mt_op = mi->mi_op; |
ldap_pvt_thread_mutex_init( &mt->mt_mutex ); |
ldap_pvt_thread_mutex_init( &mt->mt_mutex ); |
avl_insert( &si->si_mods, mt, sp_avl_cmp, avl_dup_error ); |
avl_insert( &si->si_mods, mt, sp_avl_cmp, avl_dup_error ); |
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex ); |
} |
} |
|
|
if ( op->o_tag != LDAP_REQ_ADD ) |
if ( op->o_tag != LDAP_REQ_ADD ) |
Line 1773 syncprov_db_init(
|
Line 1774 syncprov_db_init(
|
on->on_bi.bi_private = si; |
on->on_bi.bi_private = si; |
ldap_pvt_thread_mutex_init( &si->si_csn_mutex ); |
ldap_pvt_thread_mutex_init( &si->si_csn_mutex ); |
ldap_pvt_thread_mutex_init( &si->si_ops_mutex ); |
ldap_pvt_thread_mutex_init( &si->si_ops_mutex ); |
ldap_pvt_thread_rdwr_init( &si->si_mods_rwlock ); |
ldap_pvt_thread_mutex_init( &si->si_mods_mutex ); |
si->si_ctxcsn.bv_val = si->si_ctxcsnbuf; |
si->si_ctxcsn.bv_val = si->si_ctxcsnbuf; |
|
|
csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN; |
csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN; |
Line 1794 syncprov_db_destroy(
|
Line 1795 syncprov_db_destroy(
|
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private; |
|
|
if ( si ) { |
if ( si ) { |
ldap_pvt_thread_rdwr_destroy( &si->si_mods_rwlock ); |
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_mutex_destroy( &si->si_csn_mutex ); |
ch_free( si ); |
ch_free( si ); |