History

20110104-1043

forsyth committed 15 years ago

Commit ce0a4511 parent 5d565f21 file · +45 −112Browse files

Unified · Split

emu/MacOSX/os.c+45−112
@@ -47,6 +47,13 @@ enum · 46 unmodified lines
47char *hosttype = "MacOSX";47char *hosttype = "MacOSX";
48char *cputype = OBJTYPE;48char *cputype = OBJTYPE;
49 49
50typedef struct Sem Sem;
51struct Sem {
52 pthread_cond_t c;
53 pthread_mutex_t m;
54 int v;
55};
56
50static pthread_key_t prdakey;57static pthread_key_t prdakey;
51 58
52extern int dflag;59extern int dflag;
@@ -60,8 +67,9 @@ getup(void) · 7 unmodified lines
60void67void
61pexit(char *msg, int t)68pexit(char *msg, int t)
62{69{
63 Osenv * e;70 Osenv *e;
64 Proc * p;71 Proc *p;
72 Sem *sem;
65 73
66 USED(t);74 USED(t);
67 USED(msg);75 USED(msg);
@@ -91,6 +99,12 @@ pexit(char *msg, int t) · 23 unmodified lines
91 }99 }
92 free(e->user);100 free(e->user);
93 free(p->prog);101 free(p->prog);
102 sem = p->os;
103 if(sem != nil){
104 pthread_cond_destroy(&sem->c);
105 pthread_mutex_destroy(&sem->m);
106 }
107 free(p->os);
94 free(p);108 free(p);
95 pthread_exit(0);109 pthread_exit(0);
96}110}
@@ -223,16 +237,23 @@ int · 126 unmodified lines
223kproc(char *name, void (*func)(void*), void *arg, int flags)237kproc(char *name, void (*func)(void*), void *arg, int flags)
224{238{
225 pthread_t thread;239 pthread_t thread;
226 Proc * p;240 Proc *p;
227 Pgrp * pg;241 Pgrp *pg;
228 Fgrp * fg;242 Fgrp *fg;
229 Egrp * eg;243 Egrp *eg;
230
231 pthread_attr_t attr;244 pthread_attr_t attr;
245 Sem *sem;
232 246
233 p = newproc();247 p = newproc();
234 if(p == nil)248 if(p == nil)
235 panic("kproc: no memory");249 panic("kproc: no memory");
250 sem = malloc(sizeof(*sem));
251 if(sem == nil)
252 panic("can't allocate semaphore");
253 pthread_cond_init(&sem->c, NULL);
254 pthread_mutex_init(&sem->m, NULL);
255 sem->v = 0;
256 p->os = sem;
236 257
237 if(flags & KPDUPPG) {258 if(flags & KPDUPPG) {
238 pg = up->env->pgrp;259 pg = up->env->pgrp;
@@ -309,21 +330,33 @@ segflush(void *va, ulong len) · 70 unmodified lines
309void330void
310oshostintr(Proc *p)331oshostintr(Proc *p)
311{332{
333fprint(2, "oshostintr %p\n", p);
312 pthread_kill((pthread_t)p->sigid, SIGUSR1);334 pthread_kill((pthread_t)p->sigid, SIGUSR1);
313}335}
314 336
315static ulong erendezvous(void*, ulong);
316
317void337void
318osblock(void)338osblock(void)
319{339{
320 erendezvous(up, 0);340 Sem *sem;
341
342 sem = up->os;
343 pthread_mutex_lock(&sem->m);
344 while(sem->v == 0)
345 pthread_cond_wait(&sem->c, &sem->m);
346 sem->v--;
347 pthread_mutex_unlock(&sem->m);
321}348}
322 349
323void350void
324osready(Proc *p)351osready(Proc *p)
325{352{
326 erendezvous(p, 0);353 Sem *sem;
354
355 sem = p->os;
356 pthread_mutex_lock(&sem->m);
357 sem->v++;
358 pthread_cond_signal(&sem->c);
359 pthread_mutex_unlock(&sem->m);
327}360}
328 361
329void362void
@@ -397,14 +430,11 @@ getnobody() · 67 unmodified lines
397 }430 }
398}431}
399 432
400static pthread_mutex_t rendezvouslock;
401static pthread_mutexattr_t *pthread_mutexattr_default = NULL;
402
403void433void
404libinit(char *imod)434libinit(char *imod)
405{435{
406 struct passwd *pw;436 struct passwd *pw;
407 Proc * p;437 Proc *p;
408 char sys[64];438 char sys[64];
409 439
410 setsid();440 setsid();
@@ -419,9 +449,6 @@ libinit(char *imod) · 8 unmodified lines
419 449
420 setsigs();450 setsigs();
421 451
422 if(pthread_mutex_init(&rendezvouslock, pthread_mutexattr_default))
423 panic("pthread_mutex_init");
424
425 if(pthread_key_create(&prdakey, NULL))452 if(pthread_key_create(&prdakey, NULL))
426 print("key_create failed\n");453 print("key_create failed\n");
427 454
@@ -466,92 +493,6 @@ readkbd(void) · 38 unmodified lines
466 return buf[0];493 return buf[0];
467}494}
468 495
469
470
471enum
472{
473 NHLOG = 7,
474 NHASH = (1<<NHLOG)
475};
476
477typedef struct Tag Tag;
478struct Tag
479{
480 void* tag;
481 ulong val;
482 pthread_cond_t cv;
483 Tag* next;
484};
485
486static Tag* ht[NHASH];
487static Tag* ft;
488//static Lock hlock;
489
490static ulong
491erendezvous(void *tag, ulong value)
492{
493 int h;
494 ulong rval;
495 Tag * t, **l, *f;
496
497 h = (ulong)tag & (NHASH - 1);
498
499 // lock(&hlock);
500 pthread_mutex_lock(&rendezvouslock);
501 l = &ht[h];
502 for(t = ht[h]; t; t = t->next) {
503 if(t->tag == tag) {
504 rval = t->val;
505 t->val = value;
506 t->tag = 0;
507 pthread_mutex_unlock(&rendezvouslock);
508 // unlock(&hlock);
509 if(pthread_cond_signal(&(t->cv)))
510 panic("pthread_cond_signal");
511 return rval;
512 }
513 }
514
515 t = ft;
516 if(t == 0) {
517 t = malloc(sizeof(Tag));
518 if(t == nil)
519 panic("rendezvous: no memory");
520 if(pthread_cond_init(&(t->cv), NULL)) {
521 print("pthread_cond_init (errno: %s) \n", strerror(errno));
522 panic("pthread_cond_init");
523 }
524 } else
525 ft = t->next;
526
527 t->tag = tag;
528 t->val = value;
529 t->next = *l;
530 *l = t;
531 // pthread_mutex_unlock(&rendezvouslock);
532 // unlock(&hlock);
533
534 while(t->tag != nil)
535 pthread_cond_wait(&(t->cv), &rendezvouslock);
536
537 // pthread_mutex_lock(&rendezvouslock);
538 // lock(&hlock);
539 rval = t->val;
540 for(f = *l; f; f = f->next) {
541 if(f == t) {
542 *l = f->next;
543 break;
544 }
545 l = &f->next;
546 }
547 t->next = ft;
548 ft = t;
549 pthread_mutex_unlock(&rendezvouslock);
550 // unlock(&hlock);
551
552 return rval;
553}
554
555/*496/*
556 * Return an abitrary millisecond clock time497 * Return an abitrary millisecond clock time
557 */498 */
@@ -570,8 +511,6 @@ osmillisec(void) · 12 unmodified lines
570 return((t.tv_sec - sec0) * 1000 + (t.tv_usec - usec0 + 500) / 1000);511 return((t.tv_sec - sec0) * 1000 + (t.tv_usec - usec0 + 500) / 1000);
571}512}
572 513
573
574
575/*514/*
576 * Return the time since the epoch in nanoseconds and microseconds515 * Return the time since the epoch in nanoseconds and microseconds
577 * The epoch is defined at 1 Jan 1970516 * The epoch is defined at 1 Jan 1970
@@ -593,10 +532,6 @@ osusectime(void) · 15 unmodified lines
593 gettimeofday(&t, nil);532 gettimeofday(&t, nil);
594 return (vlong)t.tv_sec * 1000000 + t.tv_usec;533 return (vlong)t.tv_sec * 1000000 + t.tv_usec;
595}534}
596
597
598
599
600int535int
601osmillisleep(ulong milsec)536osmillisleep(ulong milsec)
602{537{
@@ -607,8 +542,6 @@ osmillisleep(ulong milsec) · 4 unmodified lines
607 return 0;542 return 0;
608}543}
609 544
610
611
612int545int
613limbosleep(ulong milsec)546limbosleep(ulong milsec)
614{547{