X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fnextid.c;h=25841ca86d9fdef58247e9c85c8095ef987619c7;hb=2c87d24f31d29bed606b443ef2d8e881b87207c7;hp=594e542a21778ce8930bddb46519519e73518998;hpb=bc74d3f82f4db4868502eeb2ca1d27587d203d4f;p=openldap diff --git a/servers/slapd/back-ldbm/nextid.c b/servers/slapd/back-ldbm/nextid.c index 594e542a21..25841ca86d 100644 --- a/servers/slapd/back-ldbm/nextid.c +++ b/servers/slapd/back-ldbm/nextid.c @@ -82,13 +82,27 @@ next_id_write( Backend *be, ID id ) return rc; } +int +next_id_save( Backend *be ) +{ + struct ldbminfo *li = (struct ldbminfo *) be->be_private; + ID id = next_id_get( be ); + int rc = next_id_write( be, id ); + + if (rc == 0) { + li->li_nextid_wrote = id; + } + + return rc; +} + ID next_id( Backend *be ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; ID id; - pthread_mutex_lock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ if ( li->li_nextid == NOID ) { @@ -97,31 +111,48 @@ next_id( Backend *be ) if ( li->li_nextid == NOID ) { li->li_nextid = 1; } + +#if SLAPD_NEXTID_CHUNK > 1 + li->li_nextid_wrote = li->li_nextid; +#endif } id = li->li_nextid++; + +#if SLAPD_NEXTID_CHUNK > 1 + if ( li->li_nextid > li->li_nextid_wrote ) { + li->li_nextid_wrote += SLAPD_NEXTID_CHUNK; + (void) next_id_write( be, li->li_nextid_wrote ); + } +#else (void) next_id_write( be, li->li_nextid ); +#endif - pthread_mutex_unlock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); return( id ); } void next_id_return( Backend *be, ID id ) { +#ifdef SLAPD_NEXTID_RETURN struct ldbminfo *li = (struct ldbminfo *) be->be_private; - pthread_mutex_lock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex ); if ( id != li->li_nextid - 1 ) { - pthread_mutex_unlock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); return; } li->li_nextid--; + +#if !( SLAPD_NEXTID_CHUCK > 1 ) (void) next_id_write( be, li->li_nextid ); +#endif - pthread_mutex_unlock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); +#endif } ID @@ -130,7 +161,7 @@ next_id_get( Backend *be ) struct ldbminfo *li = (struct ldbminfo *) be->be_private; ID id; - pthread_mutex_lock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex ); /* first time in here since startup - try to read the nexid */ if ( li->li_nextid == NOID ) { @@ -139,11 +170,15 @@ next_id_get( Backend *be ) if ( li->li_nextid == NOID ) { li->li_nextid = 1; } + +#if SLAPD_NEXTID_CHUNK > 1 + li->li_nextid_wrote = li->li_nextid; +#endif } id = li->li_nextid; - pthread_mutex_unlock( &li->li_nextid_mutex ); + ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); return( id ); }