2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1994-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
5 * Copyright (C) 1991-3 Stephen Crane
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * See files README, COPYING and CREDITS in the root of the source
24 * tree for related information and legal notices. It is expected
25 * that future projects/authors will amend these files as needed.
29 * lwpSem.c: lwpSemaphore manipulation
31 * Known contributors to this file:
44 * create a lwpSemaphore.
47 lwpCreateSem(char *name, int count)
51 if (!(new = malloc(sizeof(struct lwpSem))))
53 new->name = strdup(name);
55 new->q.head = new->q.tail = 0;
60 * signal a lwpSemaphore. We only yield here if
61 * the blocked process has a higher priority than ours'.
64 lwpSignal(struct lwpSem *s)
66 lwpStatus(LwpCurrent, "done with semaphore %s", s->name);
68 struct lwpProc *p = lwpGetFirst(&s->q);
69 lwpStatus(LwpCurrent, "activating first waiter");
71 if (LwpCurrent->pri < p->pri) {
72 lwpStatus(p, "priority is higher");
79 * wait on a lwpSemaphore
82 lwpWait(struct lwpSem *s)
84 lwpStatus(LwpCurrent, "checking semaphore %s", s->name);
86 lwpStatus(LwpCurrent, "blocking");
87 lwpAddTail(&s->q, LwpCurrent);