diff options
Diffstat (limited to 'emu')
| -rw-r--r-- | emu/MacOSX/os.c | 157 |
1 files changed, 45 insertions, 112 deletions
diff --git a/emu/MacOSX/os.c b/emu/MacOSX/os.c index 379cfac7..10a3cf0f 100644 --- a/emu/MacOSX/os.c +++ b/emu/MacOSX/os.c @@ -47,6 +47,13 @@ enum char *hosttype = "MacOSX"; char *cputype = OBJTYPE; +typedef struct Sem Sem; +struct Sem { + pthread_cond_t c; + pthread_mutex_t m; + int v; +}; + static pthread_key_t prdakey; extern int dflag; @@ -60,8 +67,9 @@ getup(void) void pexit(char *msg, int t) { - Osenv * e; - Proc * p; + Osenv *e; + Proc *p; + Sem *sem; USED(t); USED(msg); @@ -91,6 +99,12 @@ pexit(char *msg, int t) } free(e->user); free(p->prog); + sem = p->os; + if(sem != nil){ + pthread_cond_destroy(&sem->c); + pthread_mutex_destroy(&sem->m); + } + free(p->os); free(p); pthread_exit(0); } @@ -223,16 +237,23 @@ int kproc(char *name, void (*func)(void*), void *arg, int flags) { pthread_t thread; - Proc * p; - Pgrp * pg; - Fgrp * fg; - Egrp * eg; - + Proc *p; + Pgrp *pg; + Fgrp *fg; + Egrp *eg; pthread_attr_t attr; + Sem *sem; p = newproc(); if(p == nil) panic("kproc: no memory"); + sem = malloc(sizeof(*sem)); + if(sem == nil) + panic("can't allocate semaphore"); + pthread_cond_init(&sem->c, NULL); + pthread_mutex_init(&sem->m, NULL); + sem->v = 0; + p->os = sem; if(flags & KPDUPPG) { pg = up->env->pgrp; @@ -309,21 +330,33 @@ segflush(void *va, ulong len) void oshostintr(Proc *p) { +fprint(2, "oshostintr %p\n", p); pthread_kill((pthread_t)p->sigid, SIGUSR1); } -static ulong erendezvous(void*, ulong); - void osblock(void) { - erendezvous(up, 0); + Sem *sem; + + sem = up->os; + pthread_mutex_lock(&sem->m); + while(sem->v == 0) + pthread_cond_wait(&sem->c, &sem->m); + sem->v--; + pthread_mutex_unlock(&sem->m); } void osready(Proc *p) { - erendezvous(p, 0); + Sem *sem; + + sem = p->os; + pthread_mutex_lock(&sem->m); + sem->v++; + pthread_cond_signal(&sem->c); + pthread_mutex_unlock(&sem->m); } void @@ -397,14 +430,11 @@ getnobody() } } -static pthread_mutex_t rendezvouslock; -static pthread_mutexattr_t *pthread_mutexattr_default = NULL; - void libinit(char *imod) { struct passwd *pw; - Proc * p; + Proc *p; char sys[64]; setsid(); @@ -419,9 +449,6 @@ libinit(char *imod) setsigs(); - if(pthread_mutex_init(&rendezvouslock, pthread_mutexattr_default)) - panic("pthread_mutex_init"); - if(pthread_key_create(&prdakey, NULL)) print("key_create failed\n"); @@ -466,92 +493,6 @@ readkbd(void) return buf[0]; } - - -enum -{ - NHLOG = 7, - NHASH = (1<<NHLOG) -}; - -typedef struct Tag Tag; -struct Tag -{ - void* tag; - ulong val; - pthread_cond_t cv; - Tag* next; -}; - -static Tag* ht[NHASH]; -static Tag* ft; -//static Lock hlock; - -static ulong -erendezvous(void *tag, ulong value) -{ - int h; - ulong rval; - Tag * t, **l, *f; - - h = (ulong)tag & (NHASH - 1); - - // lock(&hlock); - pthread_mutex_lock(&rendezvouslock); - l = &ht[h]; - for(t = ht[h]; t; t = t->next) { - if(t->tag == tag) { - rval = t->val; - t->val = value; - t->tag = 0; - pthread_mutex_unlock(&rendezvouslock); - // unlock(&hlock); - if(pthread_cond_signal(&(t->cv))) - panic("pthread_cond_signal"); - return rval; - } - } - - t = ft; - if(t == 0) { - t = malloc(sizeof(Tag)); - if(t == nil) - panic("rendezvous: no memory"); - if(pthread_cond_init(&(t->cv), NULL)) { - print("pthread_cond_init (errno: %s) \n", strerror(errno)); - panic("pthread_cond_init"); - } - } else - ft = t->next; - - t->tag = tag; - t->val = value; - t->next = *l; - *l = t; - // pthread_mutex_unlock(&rendezvouslock); - // unlock(&hlock); - - while(t->tag != nil) - pthread_cond_wait(&(t->cv), &rendezvouslock); - - // pthread_mutex_lock(&rendezvouslock); - // lock(&hlock); - rval = t->val; - for(f = *l; f; f = f->next) { - if(f == t) { - *l = f->next; - break; - } - l = &f->next; - } - t->next = ft; - ft = t; - pthread_mutex_unlock(&rendezvouslock); - // unlock(&hlock); - - return rval; -} - /* * Return an abitrary millisecond clock time */ @@ -570,8 +511,6 @@ osmillisec(void) return((t.tv_sec - sec0) * 1000 + (t.tv_usec - usec0 + 500) / 1000); } - - /* * Return the time since the epoch in nanoseconds and microseconds * The epoch is defined at 1 Jan 1970 @@ -593,10 +532,6 @@ osusectime(void) gettimeofday(&t, nil); return (vlong)t.tv_sec * 1000000 + t.tv_usec; } - - - - int osmillisleep(ulong milsec) { @@ -607,8 +542,6 @@ osmillisleep(ulong milsec) return 0; } - - int limbosleep(ulong milsec) { |
