Unified · Split
| @@ -47,6 +47,13 @@ enum · 46 unmodified lines | ||
| 47 | 47 | char *hosttype = "MacOSX"; |
| 48 | 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 | 57 | static pthread_key_t prdakey; |
| 51 | 58 | |
| 52 | 59 | extern int dflag; |
| @@ -60,8 +67,9 @@ getup(void) · 7 unmodified lines | ||
| 60 | 67 | void |
| 61 | 68 | pexit(char *msg, int t) |
| 62 | 69 | { |
| 63 | − Osenv * e; | |
| 64 | − Proc * p; | |
| 70 | + Osenv *e; | |
| 71 | + Proc *p; | |
| 72 | + Sem *sem; | |
| 65 | 73 | |
| 66 | 74 | USED(t); |
| 67 | 75 | USED(msg); |
| @@ -91,6 +99,12 @@ pexit(char *msg, int t) · 23 unmodified lines | ||
| 91 | 99 | } |
| 92 | 100 | free(e->user); |
| 93 | 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 | 108 | free(p); |
| 95 | 109 | pthread_exit(0); |
| 96 | 110 | } |
| @@ -223,16 +237,23 @@ int · 126 unmodified lines | ||
| 223 | 237 | kproc(char *name, void (*func)(void*), void *arg, int flags) |
| 224 | 238 | { |
| 225 | 239 | pthread_t thread; |
| 226 | − Proc * p; | |
| 227 | − Pgrp * pg; | |
| 228 | − Fgrp * fg; | |
| 229 | − Egrp * eg; | |
| 230 | − | |
| 240 | + Proc *p; | |
| 241 | + Pgrp *pg; | |
| 242 | + Fgrp *fg; | |
| 243 | + Egrp *eg; | |
| 231 | 244 | pthread_attr_t attr; |
| 245 | + Sem *sem; | |
| 232 | 246 | |
| 233 | 247 | p = newproc(); |
| 234 | 248 | if(p == nil) |
| 235 | 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 | 258 | if(flags & KPDUPPG) { |
| 238 | 259 | pg = up->env->pgrp; |
| @@ -309,21 +330,33 @@ segflush(void *va, ulong len) · 70 unmodified lines | ||
| 309 | 330 | void |
| 310 | 331 | oshostintr(Proc *p) |
| 311 | 332 | { |
| 333 | +fprint(2, "oshostintr %p\n", p); | |
| 312 | 334 | pthread_kill((pthread_t)p->sigid, SIGUSR1); |
| 313 | 335 | } |
| 314 | 336 | |
| 315 | −static ulong erendezvous(void*, ulong); | |
| 316 | − | |
| 317 | 337 | void |
| 318 | 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 | 350 | void |
| 324 | 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 | 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 | 433 | void |
| 404 | 434 | libinit(char *imod) |
| 405 | 435 | { |
| 406 | 436 | struct passwd *pw; |
| 407 | − Proc * p; | |
| 437 | + Proc *p; | |
| 408 | 438 | char sys[64]; |
| 409 | 439 | |
| 410 | 440 | setsid(); |
| @@ -419,9 +449,6 @@ libinit(char *imod) · 8 unmodified lines | ||
| 419 | 449 | |
| 420 | 450 | setsigs(); |
| 421 | 451 | |
| 422 | − if(pthread_mutex_init(&rendezvouslock, pthread_mutexattr_default)) | |
| 423 | − panic("pthread_mutex_init"); | |
| 424 | − | |
| 425 | 452 | if(pthread_key_create(&prdakey, NULL)) |
| 426 | 453 | print("key_create failed\n"); |
| 427 | 454 | |
| @@ -466,92 +493,6 @@ readkbd(void) · 38 unmodified lines | ||
| 466 | 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 | 497 | * Return an abitrary millisecond clock time |
| 557 | 498 | */ |
| @@ -570,8 +511,6 @@ osmillisec(void) · 12 unmodified lines | ||
| 570 | 511 | return((t.tv_sec - sec0) * 1000 + (t.tv_usec - usec0 + 500) / 1000); |
| 571 | 512 | } |
| 572 | 513 | |
| 573 | − | |
| 574 | − | |
| 575 | 514 | /* |
| 576 | 515 | * Return the time since the epoch in nanoseconds and microseconds |
| 577 | 516 | * The epoch is defined at 1 Jan 1970 |
| @@ -593,10 +532,6 @@ osusectime(void) · 15 unmodified lines | ||
| 593 | 532 | gettimeofday(&t, nil); |
| 594 | 533 | return (vlong)t.tv_sec * 1000000 + t.tv_usec; |
| 595 | 534 | } |
| 596 | − | |
| 597 | − | |
| 598 | − | |
| 599 | − | |
| 600 | 535 | int |
| 601 | 536 | osmillisleep(ulong milsec) |
| 602 | 537 | { |
| @@ -607,8 +542,6 @@ osmillisleep(ulong milsec) · 4 unmodified lines | ||
| 607 | 542 | return 0; |
| 608 | 543 | } |
| 609 | 544 | |
| 610 | − | |
| 611 | − | |
| 612 | 545 | int |
| 613 | 546 | limbosleep(ulong milsec) |
| 614 | 547 | { |