]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap_r/rdwr.c
Comment fixes.
[openldap] / libraries / libldap_r / rdwr.c
index b0613c07514a0f1bca8442007bdd3fe9d40790e8..47ed08f8242276e45144269d857ca839ff9a15b0 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2004 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,7 +40,9 @@
 #include <ac/time.h>
 
 #include "ldap-int.h"
-#include "ldap_pvt_thread.h"
+#include "ldap_pvt_thread.h" /* Get the thread interface */
+#define LDAP_THREAD_RDWR_IMPLEMENTATION
+#include "ldap_thr_debug.h"  /* May rename the symbols defined below */
 
 /*
  * implementations that provide their own compatible 
@@ -62,6 +64,7 @@ struct ldap_int_thread_rdwr_s {
 #ifdef LDAP_RDWR_DEBUG
        /* keep track of who has these locks */
 #define        MAX_READERS     32
+       int ltrw_more_readers; /* Set if ltrw_readers[] is incomplete */
        ldap_pvt_thread_t ltrw_readers[MAX_READERS];
        ldap_pvt_thread_t ltrw_writer;
 #endif
@@ -76,6 +79,8 @@ ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rwlock )
 
        rw = (struct ldap_int_thread_rdwr_s *) LDAP_CALLOC( 1,
                sizeof( struct ldap_int_thread_rdwr_s ) );
+       if ( !rw )
+               return LDAP_NO_MEMORY;
 
        /* we should check return results */
        ldap_pvt_thread_mutex_init( &rw->ltrw_mutex );
@@ -169,7 +174,10 @@ int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rwlock )
        }
 
 #ifdef LDAP_RDWR_DEBUG
-       rw->ltrw_readers[rw->ltrw_r_active] = ldap_pvt_thread_self();
+       if( rw->ltrw_r_active < MAX_READERS )
+               rw->ltrw_readers[rw->ltrw_r_active] = ldap_pvt_thread_self();
+       else
+               rw->ltrw_more_readers = 1;
 #endif
        rw->ltrw_r_active++;
 
@@ -205,7 +213,10 @@ int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rwlock )
        }
 
 #ifdef LDAP_RDWR_DEBUG
-       rw->ltrw_readers[rw->ltrw_r_active] = ldap_pvt_thread_self();
+       if( rw->ltrw_r_active < MAX_READERS )
+               rw->ltrw_readers[rw->ltrw_r_active] = ldap_pvt_thread_self();
+       else
+               rw->ltrw_more_readers = 1;
 #endif
        rw->ltrw_r_active++;
 
@@ -229,23 +240,25 @@ int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rwlock )
 
        ldap_pvt_thread_mutex_lock( &rw->ltrw_mutex );
 
+       rw->ltrw_r_active--;
 #ifdef LDAP_RDWR_DEBUG
        /* Remove us from the list of readers */
-       { int i, j;
-       ldap_pvt_thread_t self = ldap_pvt_thread_self();
-
-       for (i=0; i<rw->ltrw_r_active;i++)
        {
-               if (rw->ltrw_readers[i] == self) {
-                       for (j=i; j<rw->ltrw_r_active-1; j++)
-                               rw->ltrw_readers[j] = rw->ltrw_readers[j+1];
-                       rw->ltrw_readers[j] = 0;
-                       break;
+               ldap_pvt_thread_t self = ldap_pvt_thread_self();
+               int i, j;
+               for( i = j = rw->ltrw_r_active; i >= 0; i--) {
+                       if (rw->ltrw_readers[i] == self) {
+                               rw->ltrw_readers[i] = rw->ltrw_readers[j];
+                               rw->ltrw_readers[j] = 0;
+                               break;
+                       }
                }
-       }
+               if( !rw->ltrw_more_readers )
+                       assert( i >= 0 );
+               else if( j == 0 )
+                       rw->ltrw_more_readers = 0;
        }
 #endif
-       rw->ltrw_r_active--;
 
        assert( rw->ltrw_w_active >= 0 ); 
        assert( rw->ltrw_w_wait >= 0 ); 
@@ -368,6 +381,7 @@ int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rwlock )
        }
 
 #ifdef LDAP_RDWR_DEBUG
+       assert( rw->ltrw_writer == ldap_pvt_thread_self() );
        rw->ltrw_writer = 0;
 #endif
        ldap_pvt_thread_mutex_unlock( &rw->ltrw_mutex );
@@ -439,6 +453,6 @@ int ldap_pvt_thread_rdwr_active(ldap_pvt_thread_rdwr_t *rwlock)
               ldap_pvt_thread_rdwr_writers(rwlock));
 }
 
-#endif /* LDAP_DEBUG */
+#endif /* LDAP_RDWR_DEBUG */
 
 #endif /* LDAP_THREAD_HAVE_RDWR */