Warning, cross-references for /kernel/smp/semaphore.c need to be fixed.
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include "kernel.h"
0019 #include "smp/spinlock.h"
0020 #include "sched/sched.h"
0021
0022 int
0023 semaphore_init (semaphore * sem, int max, int init)
0024 {
0025 sem->s = init;
0026 sem->max = max;
0027 sem->waitqueue = 0;
0028 spinlock_init (&sem->lock);
0029 return 0;
0030 }
0031
0032 int
0033 semaphore_signal (semaphore * sem, int s)
0034 {
0035 int status = 0;
0036 spinlock_lock (&sem->lock);
0037 sem->s += s;
0038 if (sem->s > sem->max) {
0039 sem->s = sem->max;
0040 status = -1;
0041 }
0042
0043 wakeup_queue (&sem->waitqueue);
0044 spinlock_unlock (&sem->lock);
0045 return status;
0046 }
0047
0048
0049 int
0050 semaphore_wait (semaphore * sem, int s, s16 timeout)
0051 {
0052 for (;;) {
0053 spinlock_lock (&sem->lock);
0054 if (sem->s >= s) {
0055 sem->s -= s;
0056 spinlock_unlock (&sem->lock);
0057 return 0;
0058 } else {
0059 queue_append (&sem->waitqueue, str ());
0060 spinlock_unlock (&sem->lock);
0061 schedule ();
0062 }
0063 }
0064 }
0065
0066 int
0067 semaphore_destroy (semaphore * sem)
0068 {
0069 return 0;
0070 }
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081