]> git.pond.sub.org Git - empserver/blob - src/lib/lwp/sem.c
Remove a bunch of redundant casts.
[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(char *name, int count)
42 {
43     struct lwpSem *new;
44
45     if (!(new = malloc(sizeof(struct lwpSem))))
46         return (0);
47     new->name = strdup(name);
48     new->count = count;
49     new->q.head = new->q.tail = 0;
50     return (new);
51 }
52
53 /*
54  * signal a lwpSemaphore.  We only yield here if
55  * the blocked process has a higher priority than ours'.
56  */
57 void
58 lwpSignal(struct lwpSem *s)
59 {
60     lwpStatus(LwpCurrent, "done with semaphore %s", s->name);
61     if (s->count++ < 0) {
62         struct lwpProc *p = lwpGetFirst(&s->q);
63         lwpStatus(LwpCurrent, "activating first waiter");
64         lwpReady(p);
65         if (LwpCurrent->pri < p->pri) {
66             lwpStatus(p, "priority is higher");
67             lwpYield();
68         }
69     }
70 }
71
72 /*
73  * wait on a lwpSemaphore
74  */
75 void
76 lwpWait(struct lwpSem *s)
77 {
78     lwpStatus(LwpCurrent, "checking semaphore %s", s->name);
79     if (--s->count < 0) {
80         lwpStatus(LwpCurrent, "blocking");
81         lwpAddTail(&s->q, LwpCurrent);
82         lwpReschedule();
83     }
84 }
85 #endif