Unified · Split
| @@ -47,6 +47,13 @@ enum · 46 unmodified lines | |||
| 47 | char *hosttype = "MacOSX"; | 47 | char *hosttype = "MacOSX"; |
| 48 | char *cputype = OBJTYPE; | 48 | char *cputype = OBJTYPE; |
| 49 | 49 | ||
| 50 | typedef struct Sem Sem; | ||
| 51 | struct Sem { | ||
| 52 | pthread_cond_t c; | ||
| 53 | pthread_mutex_t m; | ||
| 54 | int v; | ||
| 55 | }; | ||
| 56 | |||
| 50 | static pthread_key_t prdakey; | 57 | static pthread_key_t prdakey; |
| 51 | 58 | ||
| 52 | extern int dflag; | 59 | extern int dflag; |
| @@ -60,8 +67,9 @@ getup(void) · 7 unmodified lines | |||
| 60 | void | 67 | void |
| 61 | pexit(char *msg, int t) | 68 | pexit(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 | |||
| 223 | kproc(char *name, void (*func)(void*), void *arg, int flags) | 237 | kproc(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 | |||
| 309 | void | 330 | void |
| 310 | oshostintr(Proc *p) | 331 | oshostintr(Proc *p) |
| 311 | { | 332 | { |
| 333 | fprint(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 | ||
| 315 | static ulong erendezvous(void*, ulong); | ||
| 316 | |||
| 317 | void | 337 | void |
| 318 | osblock(void) | 338 | osblock(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 | ||
| 323 | void | 350 | void |
| 324 | osready(Proc *p) | 351 | osready(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 | ||
| 329 | void | 362 | void |
| @@ -397,14 +430,11 @@ getnobody() · 67 unmodified lines | |||
| 397 | } | 430 | } |
| 398 | } | 431 | } |
| 399 | 432 | ||
| 400 | static pthread_mutex_t rendezvouslock; | ||
| 401 | static pthread_mutexattr_t *pthread_mutexattr_default = NULL; | ||
| 402 | |||
| 403 | void | 433 | void |
| 404 | libinit(char *imod) | 434 | libinit(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 | |||
| 471 | enum | ||
| 472 | { | ||
| 473 | NHLOG = 7, | ||
| 474 | NHASH = (1<<NHLOG) | ||
| 475 | }; | ||
| 476 | |||
| 477 | typedef struct Tag Tag; | ||
| 478 | struct Tag | ||
| 479 | { | ||
| 480 | void* tag; | ||
| 481 | ulong val; | ||
| 482 | pthread_cond_t cv; | ||
| 483 | Tag* next; | ||
| 484 | }; | ||
| 485 | |||
| 486 | static Tag* ht[NHASH]; | ||
| 487 | static Tag* ft; | ||
| 488 | //static Lock hlock; | ||
| 489 | |||
| 490 | static ulong | ||
| 491 | erendezvous(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 time | 497 | * 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 microseconds | 515 | * Return the time since the epoch in nanoseconds and microseconds |
| 577 | * The epoch is defined at 1 Jan 1970 | 516 | * 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 | |||
| 600 | int | 535 | int |
| 601 | osmillisleep(ulong milsec) | 536 | osmillisleep(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 | |||
| 612 | int | 545 | int |
| 613 | limbosleep(ulong milsec) | 546 | limbosleep(ulong milsec) |
| 614 | { | 547 | { |