patch-2.4.4 linux/arch/sparc/kernel/semaphore.c
Next file: linux/arch/sparc/kernel/setup.c
Previous file: linux/arch/sparc/kernel/irq.c
Back to the patch index
Back to the overall index
- Lines: 127
- Date:
Thu Apr 19 08:38:48 2001
- Orig file:
v2.4.3/linux/arch/sparc/kernel/semaphore.c
- Orig date:
Mon Jan 22 13:30:20 2001
diff -u --recursive --new-file v2.4.3/linux/arch/sparc/kernel/semaphore.c linux/arch/sparc/kernel/semaphore.c
@@ -1,4 +1,4 @@
-/* $Id: semaphore.c,v 1.6 2001/01/05 04:40:07 davem Exp $ */
+/* $Id: semaphore.c,v 1.7 2001/04/18 21:06:05 davem Exp $ */
/* sparc32 semaphore implementation, based on i386 version */
@@ -150,120 +150,4 @@
spin_unlock_irqrestore(&semaphore_lock, flags);
return 1;
-}
-
-/* rw mutexes
- * Implemented by Jakub Jelinek (jakub@redhat.com) based on
- * i386 implementation by Ben LaHaise (bcrl@redhat.com).
- */
-
-extern inline int ldstub(unsigned char *p)
-{
- int ret;
- asm volatile("ldstub %1, %0" : "=r" (ret) : "m" (*p) : "memory");
- return ret;
-}
-
-#define DOWN_VAR \
- struct task_struct *tsk = current; \
- DECLARE_WAITQUEUE(wait, tsk);
-
-void down_read_failed_biased(struct rw_semaphore *sem)
-{
- DOWN_VAR
-
- add_wait_queue(&sem->wait, &wait); /* put ourselves at the head of the list */
-
- for (;;) {
- if (!ldstub(&sem->read_not_granted))
- break;
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (sem->read_not_granted)
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-}
-
-void down_write_failed_biased(struct rw_semaphore *sem)
-{
- DOWN_VAR
-
- add_wait_queue_exclusive(&sem->write_bias_wait, &wait); /* put ourselves at the end of the list */
-
- for (;;) {
- if (!ldstub(&sem->write_not_granted))
- break;
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (sem->write_not_granted)
- schedule();
- }
-
- remove_wait_queue(&sem->write_bias_wait, &wait);
- tsk->state = TASK_RUNNING;
-
- /* if the lock is currently unbiased, awaken the sleepers
- * FIXME: this wakes up the readers early in a bit of a
- * stampede -> bad!
- */
- if (sem->count >= 0)
- wake_up(&sem->wait);
-}
-
-/* Wait for the lock to become unbiased. Readers
- * are non-exclusive. =)
- */
-void down_read_failed(struct rw_semaphore *sem)
-{
- DOWN_VAR
-
- __up_read(sem); /* this takes care of granting the lock */
-
- add_wait_queue(&sem->wait, &wait);
-
- while (sem->count < 0) {
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (sem->count >= 0)
- break;
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-}
-
-/* Wait for the lock to become unbiased. Since we're
- * a writer, we'll make ourselves exclusive.
- */
-void down_write_failed(struct rw_semaphore *sem)
-{
- DOWN_VAR
-
- __up_write(sem); /* this takes care of granting the lock */
-
- add_wait_queue_exclusive(&sem->wait, &wait);
-
- while (sem->count < 0) {
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (sem->count >= 0)
- break; /* we must attempt to acquire or bias the lock */
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-}
-
-void __rwsem_wake(struct rw_semaphore *sem, unsigned long readers)
-{
- if (readers) {
- /* Due to lame ldstub we don't do here
- a BUG() consistency check */
- sem->read_not_granted = 0;
- wake_up(&sem->wait);
- } else {
- sem->write_not_granted = 0;
- wake_up(&sem->write_bias_wait);
- }
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)