[Date Prev][Date Next] [Chronological] [Thread] [Top]

Locks are not always released



Please review this patch.

Locks are not always released when something goes wrong; this is an
attempted fix.  But I don't feel too safe about meddling with locks.
Note that locks in slapd backends were harder to figure out; I have not
looked at them closely.  I don't *think* there is any bad interaction
with them, but God knows...

A few notes:

- 2nd hunk of the replog.c patch just swaps the order of closing
  two locks, so the last acquired lock is unlocked first.
  I'm not sure this is necessary, and it may slow down things a little
  (since a program attempting to acquire the lock must wait a little
  longer), but it feels cleaner this way.

- fm.c must be reindented after patching.

--- ldap/servers/slapd/lock.c~	Fri Nov  6 22:13:26 1998
+++ ldap/servers/slapd/lock.c	Sat Nov  7 16:35:44 1998
@@ -45,4 +45,6 @@ lock_fopen( char *fname, char *type, FIL
 		lockf( fileno( *lfp ), F_ULOCK, 0 );
 #endif
+		fclose( *lfp );
+		*lfp = NULL;
 		return( NULL );
 	}
--- ldap/servers/slurpd/lock.c~	Thu Nov  5 07:08:48 1998
+++ ldap/servers/slurpd/lock.c	Sat Nov  7 16:36:01 1998
@@ -69,4 +69,6 @@ lock_fopen(
 		lockf( fileno( *lfp ), F_ULOCK, 0 );
 #endif
+		fclose( *lfp );
+		*lfp = NULL;
 		return( NULL );
 	}
--- ldap/servers/slurpd/replog.c~	Sat Nov  7 13:27:34 1998
+++ ldap/servers/slurpd/replog.c	Sat Nov  7 17:11:32 1998
@@ -112,5 +112,5 @@ copy_replog(
 		"Error: copy_replog: Can't lock replog \"%s\" for write: %s\n",
 		src, sys_errlist[ errno ], 0 );
-	lock_fclose( rfp );
+	lock_fclose( rfp, lfp );
 	return( 1 );
     }
@@ -128,10 +128,10 @@ copy_replog(
     }
 
-    if ( lock_fclose( rfp, lfp ) == EOF ) {
+    if ( lock_fclose( dfp, dlfp ) == EOF ) {
 	Debug( LDAP_DEBUG_ANY,
 		"Error: copy_replog: Error closing \"%s\"\n",
 		src, 0, 0 );
     }
-    if ( lock_fclose( dfp, dlfp ) == EOF ) {
+    if ( lock_fclose( rfp, lfp ) == EOF ) {
 	Debug( LDAP_DEBUG_ANY,
 		"Error: copy_replog: Error closing \"%s\"\n",
--- ldap/servers/slurpd/fm.c~	Fri Nov  6 22:16:54 1998
+++ ldap/servers/slurpd/fm.c	Sat Nov  7 16:15:52 1998
@@ -212,6 +212,5 @@ populate_queue(
 		"error: can't seek to offset %ld in file \"%s\"\n",
 		sglob->srpos, f, 0 );
-	return;
-    }
+    } else {
     while (( p = get_record( fp )) != NULL ) {
 	if ( sglob->rq->rq_add( sglob->rq, p ) < 0 ) {
@@ -229,4 +228,5 @@ populate_queue(
     }
     sglob->srpos = ftell( fp );
+    }
     (void) relinquish_lock( f, fp, lfp );
 }
--- ldap/servers/slurpd/st.c~	Fri Nov  6 16:15:50 1998
+++ ldap/servers/slurpd/st.c	Sat Nov  7 16:22:48 1998
@@ -183,4 +183,5 @@ St_read(
     }
     if (( rc = acquire_lock( sglob->slurpd_status_file, &fp, &lfp)) < 0 ) {
+	pthread_mutex_unlock( &(st->st_mutex ));
 	return 0;
     }
--- ldap/servers/slurpd/ri.c~	Thu Nov  5 07:17:33 1998
+++ ldap/servers/slurpd/ri.c	Sat Nov  7 17:12:16 1998
@@ -125,4 +125,5 @@ Ri_process(
 		((new_re = re->re_getnext( re )) == NULL )) {
 	    if ( sglob->one_shot_mode ) {
+		rq->rq_unlock( rq );
 		return 0;
 	    }

-- 
Hallvard