static void readerthread(void *junk, unsigned long num) { (void)junk; if(num < 80) { //kprintf_n("Thread %lu trying to acquire read lock\n", num); random_yielder(4); rwlock_acquire_read(testrwlock); random_yielder(4); kprintf_n("Thread %lu: Reader val:%lu\n", num, testval1); for(int i=0; i<40000; i++); random_yielder(4); rwlock_release_read(testrwlock); random_yielder(4); //kprintf_n("Thread %lu released read lock\n", num); V(donesem); } else { //kprintf_n("Thread %lu trying to acquire write lock\n", num); random_yielder(4); rwlock_acquire_write(testrwlock); random_yielder(4); testval1++; kprintf_n("Thread %lu: Writer val:%lu\n", num, testval1); for(int i=0; i<40000; i++); random_yielder(4); rwlock_release_write(testrwlock); random_yielder(4); //kprintf_n("Thread %lu released write lock\n", num); V(donesem); } return; }
int whalemating(int nargs, char **args) { (void) nargs; (void) args; int i, j, err = 0; char name[32]; whalematingMenuSemaphore = sem_create("Whalemating Driver Semaphore", 0); if (whalematingMenuSemaphore == NULL ) { panic("whalemating: sem_create failed.\n"); } whalemating_init(); for (i = 0; i < 3; i++) { for (j = 0; j < NMATING; j++) { random_yielder(PROBLEMS_MAX_YIELDER); switch (i) { case 0: snprintf(name, sizeof(name), "Male Whale Thread %d", (i * 3) + j); err = thread_fork(name, male, whalematingMenuSemaphore, j, NULL); break; case 1: snprintf(name, sizeof(name), "Female Whale Thread %d", (i * 3) + j); err = thread_fork(name, female, whalematingMenuSemaphore, j, NULL); break; case 2: snprintf(name, sizeof(name), "Matchmaker Whale Thread %d", (i * 3) + j); err = thread_fork(name, matchmaker, whalematingMenuSemaphore, j, NULL); break; } if (err) { panic("whalemating: thread_fork failed: (%s)\n", strerror(err)); } } } for (i = 0; i < 3; i++) { for (j = 0; j < NMATING; j++) { P(whalematingMenuSemaphore); } } sem_destroy(whalematingMenuSemaphore); whalemating_cleanup(); return 0; }
int stoplight(int nargs, char **args) { (void) nargs; (void) args; int i, direction, turn, err = 0; char name[32]; stoplightMenuSemaphore = sem_create("Stoplight Driver Semaphore", 0); if (stoplightMenuSemaphore == NULL ) { panic("stoplight: sem_create failed.\n"); } stoplight_init(); for (i = 0; i < NCARS; i++) { direction = random() % 4; turn = random() % 3; snprintf(name, sizeof(name), "Car Thread %d", i); switch (turn) { random_yielder(PROBLEMS_MAX_YIELDER); case 0: err = thread_fork(name, gostraight, stoplightMenuSemaphore, direction, NULL ); break; case 1: err = thread_fork(name, turnleft, stoplightMenuSemaphore, direction, NULL ); break; case 2: err = thread_fork(name, turnright, stoplightMenuSemaphore, direction, NULL ); break; } } for (i = 0; i < NCARS; i++) { P(stoplightMenuSemaphore); } sem_destroy(stoplightMenuSemaphore); stoplight_cleanup(); return 0; }
static void kmalloctest4thread(void *sm, unsigned long num) { #define NUM_KM4_SIZES 5 #define ITERATIONS 50 static const unsigned sizes[NUM_KM4_SIZES] = { 1, 3, 5, 2, 4 }; struct semaphore *sem = sm; void *ptrs[NUM_KM4_SIZES]; unsigned p, q; unsigned i, j, k; uint32_t magic; for (i=0; i<NUM_KM4_SIZES; i++) { ptrs[i] = NULL; } p = 0; q = NUM_KM4_SIZES / 2; magic = random(); for (i=0; i<NTRIES; i++) { PROGRESS(i); if (ptrs[q] != NULL) { kfree(ptrs[q]); ptrs[q] = NULL; } ptrs[p] = kmalloc(sizes[p] * PAGE_SIZE); if (ptrs[p] == NULL) { panic("kmalloctest4: thread %lu: " "allocating %u pages failed\n", num, sizes[p]); } // Write to each page of the allocated memory and make sure nothing // overwrites it. for (k = 0; k < sizes[p]; k++) { *((uint32_t *)ptrs[p] + k*PAGE_SIZE/sizeof(uint32_t)) = magic; } for (j = 0; j < ITERATIONS; j++) { random_yielder(4); for (k = 0; k < sizes[p]; k++) { uint32_t actual = *((uint32_t *)ptrs[p] + k*PAGE_SIZE/sizeof(uint32_t)); if (actual != magic) { panic("km4: expected %u got %u. Your VM is broken!", magic, actual); } } } magic++; p = (p + 1) % NUM_KM4_SIZES; q = (q + 1) % NUM_KM4_SIZES; } for (i=0; i<NUM_KM4_SIZES; i++) { if (ptrs[i] != NULL) { kfree(ptrs[i]); } } V(sem); }
inline void matchmaker_start(void) { random_yielder(PROBLEMS_MAX_YIELDER); kprintf("%s starting\n", curthread->t_name); }