Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Oct 98 08:30:30 -0500
From:      "Richard Seaman, Jr." <lists@tar.com>
To:        "HighWind Software Information" <info@highwind.com>
Cc:        "current@freebsd.org" <current@FreeBSD.ORG>
Subject:   Re: Another Serious libc_r problem
Message-ID:  <199810201330.IAA09508@ns.tar.com>

next in thread | raw e-mail | index | archive | help
On Tue, 20 Oct 98 08:01:12 -0500, Richard Seaman, Jr. wrote:

>I will try to look at this later, if I have time.  However, there are
>others who know a lot more about this than I do who could probably
>do a better fix.

You could try the following patch.  However, someone else should look at
it too before its committed.

*** uthread_cond.c.orig	Tue Oct 20 08:13:58 1998
--- uthread_cond.c	Tue Oct 20 08:21:31 1998
***************
*** 137,144 ****
  	 */
  	else if (*cond != NULL ||
  	    (rval = pthread_cond_init(cond,NULL)) == 0) {
- 		/* Lock the condition variable structure: */
- 		_SPINLOCK(&(*cond)->lock);
  
  		/* Process according to condition variable type: */
  		switch ((*cond)->c_type) {
--- 137,142 ----
***************
*** 148,154 ****
--- 146,156 ----
  			 * Queue the running thread for the condition
  			 * variable:
  			 */
+ 
+    		        /* Lock the condition variable structure: */
+ 		        _SPINLOCK(&(*cond)->lock);
  			_thread_queue_enq(&(*cond)->c_queue, _thread_run);
+ 			_SPINUNLOCK(&(*cond)->lock);
  
  			/* Unlock the mutex: */
  			pthread_mutex_unlock(mutex);
***************
*** 156,171 ****
  			/* Wait forever: */
  			_thread_run->wakeup_time.tv_sec = -1;
  
- 			/* Unlock the condition variable structure: */
- 			_SPINUNLOCK(&(*cond)->lock);
  
  			/* Schedule the next thread: */
  			_thread_kern_sched_state(PS_COND_WAIT,
  			    __FILE__, __LINE__);
  
- 			/* Lock the condition variable structure: */
- 			_SPINLOCK(&(*cond)->lock);
- 
  			/* Lock the mutex: */
  			rval = pthread_mutex_lock(mutex);
  			break;
--- 158,168 ----
***************
*** 177,184 ****
  			break;
  		}
  
- 	/* Unlock the condition variable structure: */
- 	_SPINUNLOCK(&(*cond)->lock);
  	}
  
  	/* Return the completion status: */
--- 174,179 ----
***************
*** 201,208 ****
  	 */
  	else if (*cond != NULL ||
  	    (rval = pthread_cond_init(cond,NULL)) == 0) {
- 		/* Lock the condition variable structure: */
- 		_SPINLOCK(&(*cond)->lock);
  
  		/* Process according to condition variable type: */
  		switch ((*cond)->c_type) {
--- 196,201 ----
***************
*** 219,225 ****
--- 212,221 ----
  			 * Queue the running thread for the condition
  			 * variable:
  			 */
+ 		        /* Lock the condition variable structure: */
+ 		        _SPINLOCK(&(*cond)->lock);
  			_thread_queue_enq(&(*cond)->c_queue, _thread_run);
+ 		       	_SPINUNLOCK(&(*cond)->lock);
  
  			/* Unlock the mutex: */
  			if ((rval = pthread_mutex_unlock(mutex)) != 0) {
***************
*** 228,245 ****
  				 * running thread from the condition
  				 * variable queue: 
  				 */
  				_thread_queue_deq(&(*cond)->c_queue);
  			} else {
- 				/* Unlock the condition variable structure: */
- 				_SPINUNLOCK(&(*cond)->lock);
  
  				/* Schedule the next thread: */
  				_thread_kern_sched_state(PS_COND_WAIT,
  				    __FILE__, __LINE__);
  
- 				/* Lock the condition variable structure: */
- 				_SPINLOCK(&(*cond)->lock);
- 
  				/* Lock the mutex: */
  				if ((rval = pthread_mutex_lock(mutex)) != 0) {
  				}
--- 224,238 ----
  				 * running thread from the condition
  				 * variable queue: 
  				 */
+ 			        _SPINLOCK(&(*cond)->lock);
  				_thread_queue_deq(&(*cond)->c_queue);
+ 		       	        _SPINUNLOCK(&(*cond)->lock);
  			} else {
  
  				/* Schedule the next thread: */
  				_thread_kern_sched_state(PS_COND_WAIT,
  				    __FILE__, __LINE__);
  
  				/* Lock the mutex: */
  				if ((rval = pthread_mutex_lock(mutex)) != 0) {
  				}
***************
*** 258,265 ****
  			break;
  		}
  
- 	/* Unlock the condition variable structure: */
- 	_SPINUNLOCK(&(*cond)->lock);
  	}
  
  	/* Return the completion status: */
--- 251,256 ----




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810201330.IAA09508>