]> git.sur5r.net Git - openldap/commitdiff
Support double-buffering for threaded slapadd
authorHoward Chu <hyc@openldap.org>
Sat, 14 Apr 2012 14:54:26 +0000 (07:54 -0700)
committerHoward Chu <hyc@openldap.org>
Sat, 14 Apr 2012 14:54:26 +0000 (07:54 -0700)
servers/slapd/slapadd.c

index ec0eb011d23f88f040d640be15eea684debdf6ff..1cf5ceab482defd4925b399cc03e6c59cd9799dd 100644 (file)
@@ -331,6 +331,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;
@@ -431,8 +432,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,7 +448,8 @@ 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 ) {
@@ -455,6 +460,7 @@ slapadd( int argc, char **argv )
                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;