/*
- * lwpint.h -- lwp internal structures
+ * Empire - A multi-player, client/server Internet based war game.
+ * Copyright (C) 1994-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure
+ * Copyright (C) 1991-3 Stephen Crane
*
- * Copyright (C) 1991-3 Stephen Crane.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * ---
+ *
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
- * author: Stephen Crane, (jsc@doc.ic.ac.uk), Department of Computing,
- * Imperial College of Science, Technology and Medicine, 180 Queen's
- * Gate, London SW7 2BZ, England.
+ * ---
+ *
+ * lwpint.h: lwp internal structures
+ *
+ * Known contributors to this file:
+ * Markus Armbruster, 2004-2006
*/
-#ifndef _LWPINT_H
-#define _LWPINT_H
-/* `liveness' counter: check signals every `n' visits to the scheduler */
-/* note: the lower this value, the more responsive the system but the */
-/* more inefficient the context switch time */
-#define LCOUNT -1
+#ifndef LWPINT_H
+#define LWPINT_H
-#ifdef hpc
-extern struct lwpProc *initcontext;
-extern int startpoint;
-#endif
+#ifdef UCONTEXT
+#include <ucontext.h>
+#else /* !UCONTEXT */
+#include <setjmp.h>
+#endif /* !UCONTEXT */
-#ifdef hpux
-int lwpSave(jmp_buf);
-void lwpRestore(jmp_buf);
-#endif
+/* process control block. do *not* change the position of context */
+struct lwpProc {
+#ifdef UCONTEXT
+ ucontext_t context; /* context structure */
+#else /* !UCONTEXT */
+ jmp_buf context; /* processor context area */
+#endif /* !UCONTEXT */
+ void *sbtm; /* stack buffer attached to it */
+ int size; /* size of stack buffer */
+ char *ustack; /* lowest usable stack address */
+ int usize; /* size of usable stack */
+ void (*entry)(void *); /* entry point */
+ int dead; /* whether the process can be rescheduled */
+ int pri; /* which scheduling queue we're on */
+ long runtime; /* time at which process is restarted */
+ int fd; /* fd we're blocking on */
+ int argc; /* initial arguments */
+ char **argv;
+ void *ud; /* user data */
+ char *name; /* process name and description */
+ char *desc;
+ int flags;
+ struct lwpProc *next;
+};
-#if defined(MIPS) || defined(AIX32) || defined(ALPHA) || defined(__vax)
-int lwpSave(jmp_buf);
-void lwpRestore(jmp_buf);
-#elif defined(SUN4)
-#define lwpSave(x) _setjmp(x)
-#define lwpRestore(x) _longjmp(x, 1)
-#elif defined (UCONTEXT)
-#define lwpSave(x) getcontext(&(x))
-#define lwpRestore(x) setcontext(&(x))
-#else
-#ifdef hpc
-#define lwpSave(x) setjmp(x)
-#define lwpRestore(x) longjmp(x, 1)
-#else
-#ifndef hpux
-#define lwpSave(x) setjmp(x)
-#define lwpRestore(x) longjmp(x, 1)
-#endif /* hpux */
-#endif /* hpc */
-#endif
+/* queue */
+struct lwpQueue {
+ struct lwpProc *head;
+ struct lwpProc *tail;
+};
-#ifdef AIX32
-/* AIX needs 12 extra bytes above the stack; we add it here */
-#define LWP_EXTRASTACK 3*sizeof(long)
-#else
-#define LWP_EXTRASTACK 0
-#endif
+/* semaphore */
+struct lwpSem {
+ int count;
+ struct lwpQueue q;
+ char *name;
+};
#define LWP_REDZONE 1024 /* make this a multiple of 1024 */
/* XXX Note that this assumes sizeof(long) == 4 */
#define LWP_CHECKMARK 0x5a5a5a5aL
-#define SIGNALS sigmask(SIGALRM)
-
-#ifndef hpux
-typedef double stkalign_t;
-#else
-typedef struct {
- char x[64];
-} stkalign_t;
-#endif
+extern int LwpStackGrowsDown;
-/* internal routines */
+int lwpNewContext(struct lwpProc *, int);
+void lwpSwitchContext(struct lwpProc *, struct lwpProc *);
void lwpAddTail(struct lwpQueue *, struct lwpProc *);
struct lwpProc *lwpGetFirst(struct lwpQueue *);
-void lwpReschedule(void);
void lwpReady(struct lwpProc *);
-void lwpOnalarm(void);
-
-#ifdef UCONTEXT
-void lwpInitContext(struct lwpProc *, stack_t *);
-#else /* GETCONTEXT */
-#ifdef hpc
-void lwpInitContext(struct lwpProc *, void *);
-#else
-#ifdef hpux
-void lwpInitContext(volatile struct lwpProc * volatile, void *);
-#else
-void lwpInitContext(struct lwpProc *, void *);
-#endif /* hpux */
-#endif /* hpc */
-#endif /* GETCONTEXT */
+void lwpReschedule(void);
void lwpEntryPoint(void);
-void lwpInitSelect(struct lwpProc * self);
-void lwpDestroy(struct lwpProc * proc);
+void lwpInitSelect(struct lwpProc *);
+void lwpSelect(void *);
+void lwpInitSigWait(sigset_t *);
+void lwpSigWakeup(void);
+void lwpStatus(struct lwpProc *, char *, ...)
+ ATTRIBUTE((format (printf, 2, 3)));
-#endif /* _LWP_H */
+#endif