"and gets locked up because the list's atomic lock is locked by B."

The lock is not held by B since the wait releases the lock (and reacquires
it before returning).

 

Do you have a logical explanation for the unlock/wait/lock approach?

 

 

 

 

I've seen this pattern in kannel sources: lock/set mutex owner to
-1/wait/set mutex owner to current thread/unlock

list->single_operation_lock->owner = -1;

 

Does anyone know its story?

 

 

 

  _____  

From: Andreas Fink [mailto:[EMAIL PROTECTED] 
Sent: 16 April 2007 16:44
To: devel Devel
Subject: Race condition in list_consume()

 

We found a severe bug in gwlib.

 

We have the following scenario:

 

A calls debug("xxx",0,"xxxx") which does :

 

gwlist_add_producer(writers);

 

        and continues but doesnt reach yet this line:

 

gwlist_remove_producer(writers);

 

 

at this point the list "writers" is empty but has writers->num_producers=1

 

B does:

            lock(list); /* atomic lock */

 

list->single_operation_lock->owner = -1;

pthread_cond_wait(&list->nonempty, &list->single_operation_lock->mutex);

 

so it waits until A is calling gwlist_remove_producer()

 

and wait until A completes.

 

 

Now A is calling this:

 

void gwlist_remove_producer(List *list)

{

lock(list);

gw_assert(list->num_producers > 0);

--list->num_producers;

pthread_cond_broadcast(&list->nonempty);

unlock(list);

}

 

and gets locked up because the list's atomic lock is locked by B.

 

 

C now has a new debug message and gets stopped at gwlist_produce().

 

 

In other words, every process who wants to write to debug log gets stuck.

 

Now there is different solutions to this.

Our approach would be to do in gwlist_consume() to do this:

 

 

                        unlock(list);

pthread_cond_wait(&list->nonempty, &list->single_operation_lock->mutex);

lock(list);

 

 

Any other ideas?

maybe no atomic lock around gwlist_remove_producer() ?

 

 

Andreas Fink

 

Fink Consulting GmbH

Global Networks Schweiz AG

BebbiCell AG

 

---------------------------------------------------------------

Tel: +41-61-6666330 Fax: +41-61-6666331 Mobile: +41-79-2457333

Address: Clarastrasse 3, 4058 Basel, Switzerland

E-Mail: [EMAIL PROTECTED]

www.finkconsulting.com www.global-networks.ch www.bebbicell.ch

---------------------------------------------------------------

ICQ: 8239353 MSN: [EMAIL PROTECTED] AIM: smsrelay Skype: andreasfink

Yahoo: finkconsulting SMS: +41792457333

 

 

 





 

Reply via email to