From 5e3334057abf40371f770858ecc3d9a760e857ad Mon Sep 17 00:00:00 2001 From: Yihong Chen Date: Mon, 1 Feb 2016 10:40:24 -0500 Subject: [PATCH] change synchprobs codes for reliable test. --- kern/include/test.h | 28 +++++++------- kern/synchprobs/stoplight.c | 9 +++-- kern/synchprobs/whalemating.c | 9 +++-- kern/test/synchprobs.c | 71 ++++++++++++++++++----------------- 4 files changed, 62 insertions(+), 55 deletions(-) diff --git a/kern/include/test.h b/kern/include/test.h index f9041e8..af274b3 100644 --- a/kern/include/test.h +++ b/kern/include/test.h @@ -117,16 +117,16 @@ void kmain(char *bootstring); * Synchronization driver primitives. */ -void male_start(void); -void male_end(void); -void female_start(void); -void female_end(void); -void matchmaker_start(void); -void matchmaker_end(void); +void male_start(uint32_t); +void male_end(uint32_t); +void female_start(uint32_t); +void female_end(uint32_t); +void matchmaker_start(uint32_t); +void matchmaker_end(uint32_t); int whalemating(int, char **); -void inQuadrant(int); -void leaveIntersection(void); +void inQuadrant(int, uint32_t); +void leaveIntersection(uint32_t); int stoplight(int, char **); /* @@ -139,17 +139,17 @@ int stoplight(int, char **); void whalemating_init(void); void whalemating_cleanup(void); -void male(void); -void female(void); -void matchmaker(void); +void male(uint32_t); +void female(uint32_t); +void matchmaker(uint32_t); /* * stoplight.c. */ -void gostraight(uint32_t); -void turnleft(uint32_t); -void turnright(uint32_t); +void gostraight(uint32_t, uint32_t); +void turnleft(uint32_t, uint32_t); +void turnright(uint32_t, uint32_t); void stoplight_init(void); void stoplight_cleanup(void); diff --git a/kern/synchprobs/stoplight.c b/kern/synchprobs/stoplight.c index 2247b9a..f278c27 100644 --- a/kern/synchprobs/stoplight.c +++ b/kern/synchprobs/stoplight.c @@ -87,27 +87,30 @@ void stoplight_cleanup() { } void -turnright(uint32_t direction) +turnright(uint32_t direction, uint32_t index) { (void)direction; + (void)index; /* * Implement this function. */ return; } void -gostraight(uint32_t direction) +gostraight(uint32_t direction, uint32_t index) { (void)direction; + (void)index; /* * Implement this function. */ return; } void -turnleft(uint32_t direction) +turnleft(uint32_t direction, uint32_t index) { (void)direction; + (void)index; /* * Implement this function. */ diff --git a/kern/synchprobs/whalemating.c b/kern/synchprobs/whalemating.c index 54f65af..e3dde6e 100644 --- a/kern/synchprobs/whalemating.c +++ b/kern/synchprobs/whalemating.c @@ -58,8 +58,9 @@ whalemating_cleanup() { } void -male() +male(uint32_t index) { + (void)index; /* * Implement this function by calling male_start and male_end when * appropriate. @@ -68,8 +69,9 @@ male() } void -female() +female(uint32_t index) { + (void)index; /* * Implement this function by calling female_start and female_end when * appropriate. @@ -78,8 +80,9 @@ female() } void -matchmaker() +matchmaker(uint32_t index) { + (void)index; /* * Implement this function by calling matchmaker_start and matchmaker_end * when appropriate. diff --git a/kern/test/synchprobs.c b/kern/test/synchprobs.c index b6ac2bf..fe8bf2c 100644 --- a/kern/test/synchprobs.c +++ b/kern/test/synchprobs.c @@ -56,9 +56,8 @@ inititems(uint32_t count) static void -male_wrapper(void * unused1, unsigned long unused2) { +male_wrapper(void * unused1, unsigned long index) { (void)unused1; - (void)unused2; random_yielder(4); lock_acquire(startlock); @@ -69,19 +68,21 @@ male_wrapper(void * unused1, unsigned long unused2) { cv_wait(startcv, startlock); } lock_release(startlock); - male(); + male((uint32_t)index); V(endsem); return; } void -male_start(void) { +male_start(uint32_t index) { + (void)index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s starting\n", curthread->t_name); } void -male_end(void) { +male_end(uint32_t index) { + (void)index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s ending\n", curthread->t_name); @@ -89,9 +90,8 @@ male_end(void) { static void -female_wrapper(void * unused1, unsigned long unused2) { +female_wrapper(void * unused1, unsigned long index) { (void)unused1; - (void)unused2; random_yielder(4); lock_acquire(startlock); @@ -102,19 +102,21 @@ female_wrapper(void * unused1, unsigned long unused2) { cv_wait(startcv, startlock); } lock_release(startlock); - female(); + female((uint32_t)index); V(endsem); return; } void -female_start(void) { +female_start(uint32_t index) { + (void) index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s starting\n", curthread->t_name); } void -female_end(void) { +female_end(uint32_t index) { + (void) index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s ending\n", curthread->t_name); @@ -122,9 +124,8 @@ female_end(void) { static void -matchmaker_wrapper(void * unused1, unsigned long unused2) { +matchmaker_wrapper(void * unused1, unsigned long index) { (void)unused1; - (void)unused2; random_yielder(4); lock_acquire(startlock); @@ -135,19 +136,21 @@ matchmaker_wrapper(void * unused1, unsigned long unused2) { cv_wait(startcv, startlock); } lock_release(startlock); - matchmaker(); + matchmaker((uint32_t)index); V(endsem); return; } void -matchmaker_start(void) { +matchmaker_start(uint32_t index) { + (void)index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s starting\n", curthread->t_name); } void -matchmaker_end(void) { +matchmaker_end(uint32_t index) { + (void)index; random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s ending\n", curthread->t_name); @@ -171,15 +174,15 @@ whalemating(int nargs, char **args) { switch (i) { case 0: snprintf(name, sizeof(name), "Male Whale Thread %d", (i * 3) + j); - err = thread_fork(name, NULL, male_wrapper, NULL, 0); + err = thread_fork(name, NULL, male_wrapper, NULL, j); break; case 1: snprintf(name, sizeof(name), "Female Whale Thread %d", (i * 3) + j); - err = thread_fork(name, NULL, female_wrapper, NULL, 0); + err = thread_fork(name, NULL, female_wrapper, NULL, j); break; case 2: snprintf(name, sizeof(name), "Matchmaker Whale Thread %d", (i * 3) + j); - err = thread_fork(name, NULL, matchmaker_wrapper, NULL, 0); + err = thread_fork(name, NULL, matchmaker_wrapper, NULL, j); break; } if (err) { @@ -205,10 +208,8 @@ whalemating(int nargs, char **args) { static void -turnright_wrapper(void *unused, unsigned long direction) +turnright_wrapper(void *index, unsigned long direction) { - (void)unused; - random_yielder(4); lock_acquire(startlock); startcount--; @@ -218,17 +219,15 @@ turnright_wrapper(void *unused, unsigned long direction) cv_wait(startcv, startlock); } lock_release(startlock); - turnright((uint32_t)direction); + turnright((uint32_t)direction, (uint32_t)index); V(endsem); return; } static void -gostraight_wrapper(void *unused, unsigned long direction) +gostraight_wrapper(void *index, unsigned long direction) { - (void)unused; - random_yielder(4); lock_acquire(startlock); startcount--; @@ -238,17 +237,15 @@ gostraight_wrapper(void *unused, unsigned long direction) cv_wait(startcv, startlock); } lock_release(startlock); - gostraight((uint32_t)direction); + gostraight((uint32_t)direction, (uint32_t)index); V(endsem); return; } static void -turnleft_wrapper(void *unused, unsigned long direction) +turnleft_wrapper(void *index, unsigned long direction) { - (void)unused; - random_yielder(4); lock_acquire(startlock); startcount--; @@ -258,21 +255,25 @@ turnleft_wrapper(void *unused, unsigned long direction) cv_wait(startcv, startlock); } lock_release(startlock); - turnleft((uint32_t)direction); + turnleft((uint32_t)direction, (uint32_t)index); V(endsem); return; } void -inQuadrant(int quadrant) { +inQuadrant(int quadrant, uint32_t index) { + (void)index; + random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s in quadrant %d\n", curthread->t_name, quadrant); } void -leaveIntersection() { +leaveIntersection(uint32_t index) { + (void)index; + random_yielder(PROBLEMS_MAX_YIELDER); random_spinner(PROBLEMS_MAX_SPINNER); tkprintf("%s left the intersection\n", curthread->t_name); @@ -300,13 +301,13 @@ int stoplight(int nargs, char **args) { switch (turn) { case 0: - err = thread_fork(name, NULL, gostraight_wrapper, NULL, direction); + err = thread_fork(name, NULL, gostraight_wrapper, (void *)i, direction); break; case 1: - err = thread_fork(name, NULL, turnleft_wrapper, NULL, direction); + err = thread_fork(name, NULL, turnleft_wrapper, (void *)i, direction); break; case 2: - err = thread_fork(name, NULL, turnright_wrapper, NULL, direction); + err = thread_fork(name, NULL, turnright_wrapper, (void *)i, direction); break; } if (err) {