]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapadd.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / slapadd.c
index 5261f409c7915f03a9286039cd85b6ee094aaa16..58041d3026fea10c2b7d4665a42263a12a174253 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * 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;