summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--linuxthreads/ChangeLog13
-rw-r--r--linuxthreads/spinlock.c6
2 files changed, 17 insertions, 2 deletions
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index f14cf0d4a5..92328f923f 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,16 @@
+2000-07-19  Kaz Kylheku  <kaz@ashi.footprints.net>
+
+	Bugfixes to the variant of the code for machines with no compare
+	and swap.
+
+	* spinlock.c (__pthread_alt_lock, __pthread_alt_timedlock): Wait
+	node was not being properly enqueued, due to failing to update
+	the lock->__status field.
+
+	* spinlock.c (__pthread_alt_timedlock): The oldstatus variable was
+	being set inappropriately, causing the suspend function to be called
+	with a null self pointer and crash.
+
 2000-07-18  Ulrich Drepper  <drepper@redhat.com>
 
 	* spinlock.h (__pthread_alt_trylock): Fix code used if no
diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c
index 6cd2679d98..102b1be5f7 100644
--- a/linuxthreads/spinlock.c
+++ b/linuxthreads/spinlock.c
@@ -389,6 +389,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock,
       wait_node.abandoned = 0;
       wait_node.next = (struct wait_node *) lock->__status;
       wait_node.thr = self;
+      lock->__status = (long) &wait_node;
       suspend_needed = 1;
     }
 
@@ -434,7 +435,7 @@ void __pthread_alt_lock(struct _pthread_fastlock * lock,
 int __pthread_alt_timedlock(struct _pthread_fastlock * lock,
 			    pthread_descr self, const struct timespec *abstime)
 {
-  long oldstatus;
+  long oldstatus = 0;
 #if defined HAS_COMPARE_AND_SWAP
   long newstatus;
 #endif
@@ -462,11 +463,12 @@ int __pthread_alt_timedlock(struct _pthread_fastlock * lock,
       p_wait_node->abandoned = 0;
       p_wait_node->next = (struct wait_node *) lock->__status;
       p_wait_node->thr = self;
+      lock->__status = (long) p_wait_node;
+      oldstatus = 1; /* force suspend */
     }
 
     WRITE_MEMORY_BARRIER();
     lock->__spinlock = 0;
-    oldstatus = 1; /* force suspend */
     goto suspend;
   }
 #endif