]> git.pond.sub.org Git - empserver/blob - src/lib/lwp/sem.c
Indented with src/scripts/indent-emp.
[empserver] / src / lib / lwp / sem.c
1 /*
2  * lwpSem.c -- lwpSemaphore manipulation.
3  * Copyright (C) 1991-3 Stephen Crane.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  * 
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  * 
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the Free
17  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  * author: Stephen Crane, (jsc@doc.ic.ac.uk), Department of Computing,
20  * Imperial College of Science, Technology and Medicine, 180 Queen's
21  * Gate, London SW7 2BZ, England.
22  */
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include "lwp.h"
27 #include "lwpint.h"
28 #include "prototypes.h"
29
30 #if defined(_EMPTH_LWP)
31
32 /* for systems without strdup  */
33 #ifdef NOSTRDUP
34 extern char *strdup();
35 #endif /* NOSTRDUP */
36
37 /*
38  * create a lwpSemaphore.
39  */
40 struct lwpSem *
41 lwpCreateSem(name, count)
42 char *name;
43 int count;
44 {
45     struct lwpSem *new;
46
47     if (!(new = (struct lwpSem *)malloc(sizeof(struct lwpSem))))
48         return (0);
49     new->name = strdup(name);
50     new->count = count;
51     new->q.head = new->q.tail = 0;
52     return (new);
53 }
54
55 /*
56  * signal a lwpSemaphore.  We only yield here if
57  * the blocked process has a higher priority than ours'.
58  */
59 void
60 lwpSignal(s)
61 struct lwpSem *s;
62 {
63     extern struct lwpProc *LwpCurrent;
64
65     lwpStatus(LwpCurrent, "done with semaphore %s", s->name);
66     if (s->count++ < 0) {
67         struct lwpProc *p = lwpGetFirst(&s->q);
68         lwpStatus(LwpCurrent, "activating first waiter");
69         lwpReady(p);
70         if (LwpCurrent->pri < p->pri) {
71             lwpStatus(p, "priority is higher");
72             lwpYield();
73         }
74     }
75 }
76
77 /*
78  * wait on a lwpSemaphore
79  */
80 void
81 lwpWait(s)
82 struct lwpSem *s;
83 {
84     extern struct lwpProc *LwpCurrent;
85
86     lwpStatus(LwpCurrent, "checking semaphore %s", s->name);
87     if (--s->count < 0) {
88         lwpStatus(LwpCurrent, "blocking");
89         lwpAddTail(&s->q, LwpCurrent);
90         lwpReschedule();
91     }
92 }
93 #endif