[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#6164) send_ldap_ber() spins holding c_write1_mutex
- To: openldap-its@OpenLDAP.org
- Subject: Re: (ITS#6164) send_ldap_ber() spins holding c_write1_mutex
- From: hyc@symas.com
- Date: Tue, 7 Jul 2009 02:23:58 GMT
- Auto-submitted: auto-generated (OpenLDAP-ITS)
h.b.furuseth@usit.uio.no wrote:
> Full_Name: Hallvard B Furuseth
> Version: HEAD
> OS:
> URL:
> Submission from: (NULL) (129.240.6.233)
> Submitted by: hallvard
>
>
> send_ldap_ber() has a suspicious-looking waitloop doing this:
>
> if ( ldap_pvt_thread_mutex_trylock(&conn->c_mutex )) {
> ldap_pvt_thread_mutex_unlock(&conn->c_write1_mutex );
> ldap_pvt_thread_mutex_lock(&conn->c_write1_mutex );
>
> Unlock does not mean a thread waiting for c_write1_mutex will acquire
> it immediately. Such a thread may have to wait until it is scheduled,
> at which time the looping thread has locked the mutex again.
This code has changed in HEAD. Closing this ITS.
>
> On the Linux box on my desk, a pure unlock-lock loop goes through
> 50000-100000 iterations before another thread waiting for the lock
> acquires it. OTOH, on a heavily used box it takes ~50 iterations.
>
> A sched_yield() between the unlock and lock reduces #iterations to 1.
> No idea if that is the right solution, nor how serious the problem is.
>
> The lock/unlock statements themselves are from result.c rev 1.323,
> but then with some more locking between them which disappeared in
> later revisions.
>
> My lock-unlock test program:
>
> #include<pthread.h>
> #include<sched.h>
> #include<stdio.h>
> #include<stdlib.h>
> #include<sys/select.h>
>
> static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
> static unsigned count;
>
> static void *waiter(void *arg) {
> pthread_mutex_lock(&m);
> printf("Locked after %u iterations.\n", count);
> exit(0);
> }
>
> int main() {
> pthread_t t;
> pthread_mutex_lock(&m);
> pthread_create(&t, NULL, waiter, NULL);
> select(0, NULL, NULL, NULL,&(struct timeval){0, 100000});
> for (count = 1 ;; ++count) {
> pthread_mutex_unlock(&m);
> pthread_mutex_lock(&m);
> }
> }
>
>
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/