X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapadd.c;h=58041d3026fea10c2b7d4665a42263a12a174253;hb=470b126e9f94d08b46765545fcaf8b623913bfa4;hp=5261f409c7915f03a9286039cd85b6ee094aaa16;hpb=40477fae4e034185a92f672c3b6a4ed217cfade0;p=openldap diff --git a/servers/slapd/slapadd.c b/servers/slapd/slapadd.c index 5261f409c7..58041d3026 100644 --- a/servers/slapd/slapadd.c +++ b/servers/slapd/slapadd.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2011 The OpenLDAP Foundation. + * Copyright 1998-2012 The OpenLDAP Foundation. * Portions Copyright 1998-2003 Kurt D. Zeilenga. * Portions Copyright 2003 IBM Corporation. * All rights reserved. @@ -302,11 +302,13 @@ getrec_thr(void *ctx) return NULL; } +static int ldif_threaded; + static int getrec(Erec *erec) { int rc; - if ( slap_tool_thread_max < 2 ) + if ( !ldif_threaded ) return getrec0(erec); while (!trec.ready) @@ -331,6 +333,7 @@ slapadd( int argc, char **argv ) struct berval bvtext; ldap_pvt_thread_t thr; ID id; + Entry *prev = NULL; int ldifrc; int rc = EXIT_SUCCESS; @@ -404,6 +407,7 @@ slapadd( int argc, char **argv ) ldap_pvt_thread_mutex_init( &add_mutex ); ldap_pvt_thread_cond_init( &add_cond ); ldap_pvt_thread_create( &thr, 0, getrec_thr, NULL ); + ldif_threaded = 1; } erec.nextline = 0; @@ -431,8 +435,11 @@ slapadd( int argc, char **argv ) "(line=%d): %s\n", progname, erec.e->e_dn, erec.lineno, bvtext.bv_val ); rc = EXIT_FAILURE; - entry_free( erec.e ); - if( continuemode ) continue; + if( continuemode ) { + if ( prev ) entry_free( prev ); + prev = erec.e; + continue; + } break; } if ( verbose ) @@ -444,15 +451,19 @@ slapadd( int argc, char **argv ) erec.e->e_dn ); } - entry_free( erec.e ); + if ( prev ) entry_free( prev ); + prev = erec.e; } - if ( slap_tool_thread_max > 1 ) { + if ( ldif_threaded ) { + ldap_pvt_thread_mutex_lock( &add_mutex ); add_stop = 1; trec.ready = 0; ldap_pvt_thread_cond_signal( &add_cond ); + ldap_pvt_thread_mutex_unlock( &add_mutex ); ldap_pvt_thread_join( thr, NULL ); } + if ( erec.e ) entry_free( erec.e ); if ( ldifrc < 0 ) rc = EXIT_FAILURE;