summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/openbsd/thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/openbsd/thread.c')
-rw-r--r--src/pkg/runtime/openbsd/thread.c156
1 files changed, 0 insertions, 156 deletions
diff --git a/src/pkg/runtime/openbsd/thread.c b/src/pkg/runtime/openbsd/thread.c
deleted file mode 100644
index 7e9ba5d67..000000000
--- a/src/pkg/runtime/openbsd/thread.c
+++ /dev/null
@@ -1,156 +0,0 @@
-// Use of this source file is governed by a BSD-style
-// license that can be found in the LICENSE file.`
-
-#include "runtime.h"
-#include "defs.h"
-#include "os.h"
-#include "stack.h"
-
-extern SigTab runtime·sigtab[];
-
-extern int64 runtime·rfork_thread(int32 flags, void *stack, M *m, G *g, void (*fn)(void));
-extern void runtime·sys_sched_yield(void);
-
-// Basic spinlocks using CAS. We can improve on these later.
-static void
-lock(Lock *l)
-{
- uint32 v;
- int32 ret;
-
- for(;;) {
- if(runtime·cas(&l->key, 0, 1))
- return;
- runtime·sys_sched_yield();
- }
-}
-
-static void
-unlock(Lock *l)
-{
- uint32 v;
- int32 ret;
-
- for (;;) {
- v = l->key;
- if((v&1) == 0)
- runtime·throw("unlock of unlocked lock");
- if(runtime·cas(&l->key, v, 0))
- break;
- }
-}
-
-void
-runtime·lock(Lock *l)
-{
- if(m->locks < 0)
- runtime·throw("lock count");
- m->locks++;
- lock(l);
-}
-
-void
-runtime·unlock(Lock *l)
-{
- m->locks--;
- if(m->locks < 0)
- runtime·throw("lock count");
- unlock(l);
-}
-
-// Event notifications.
-void
-runtime·noteclear(Note *n)
-{
- n->lock.key = 0;
- lock(&n->lock);
-}
-
-void
-runtime·notesleep(Note *n)
-{
- lock(&n->lock);
- unlock(&n->lock);
-}
-
-void
-runtime·notewakeup(Note *n)
-{
- unlock(&n->lock);
-}
-
-// From OpenBSD's sys/param.h
-#define RFPROC (1<<4) /* change child (else changes curproc) */
-#define RFMEM (1<<5) /* share `address space' */
-#define RFNOWAIT (1<<6) /* parent need not wait() on child */
-#define RFTHREAD (1<<13) /* create a thread, not a process */
-
-void
-runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
-{
- int32 flags;
- int32 ret;
-
- flags = RFPROC | RFTHREAD | RFMEM | RFNOWAIT;
-
- if (0) {
- runtime·printf(
- "newosproc stk=%p m=%p g=%p fn=%p id=%d/%d ostk=%p\n",
- stk, m, g, fn, m->id, m->tls[0], &m);
- }
-
- m->tls[0] = m->id; // so 386 asm can find it
-
- if((ret = runtime·rfork_thread(flags, stk, m, g, fn)) < 0) {
- runtime·printf("runtime: failed to create new OS thread (have %d already; errno=%d)\n", runtime·mcount() - 1, -ret);
- runtime·printf("runtime: is kern.rthreads disabled?\n");
-
- runtime·throw("runtime.newosproc");
- }
-}
-
-void
-runtime·osinit(void)
-{
-}
-
-void
-runtime·goenvs(void)
-{
- runtime·goenvs_unix();
-}
-
-// Called to initialize a new m (including the bootstrap m).
-void
-runtime·minit(void)
-{
- // Initialize signal handling
- m->gsignal = runtime·malg(32*1024);
- runtime·signalstack(m->gsignal->stackguard - StackGuard, 32*1024);
-}
-
-void
-runtime·sigpanic(void)
-{
- switch(g->sig) {
- case SIGBUS:
- if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
- runtime·panicstring("invalid memory address or nil pointer dereference");
- runtime·printf("unexpected fault address %p\n", g->sigcode1);
- runtime·throw("fault");
- case SIGSEGV:
- if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR || g->sigcode0 == SEGV_ACCERR) && g->sigcode1 < 0x1000)
- runtime·panicstring("invalid memory address or nil pointer dereference");
- runtime·printf("unexpected fault address %p\n", g->sigcode1);
- runtime·throw("fault");
- case SIGFPE:
- switch(g->sigcode0) {
- case FPE_INTDIV:
- runtime·panicstring("integer divide by zero");
- case FPE_INTOVF:
- runtime·panicstring("integer overflow");
- }
- runtime·panicstring("floating point error");
- }
- runtime·panicstring(runtime·sigtab[g->sig].name);
-}