From: Kang K. <Kai...@wi...> - 2012-07-25 03:07:57
|
On 2012年07月19日 11:07, Kang Kai wrote: > This case fails on mips board routerstation randomly. The root cause is > that when main thread call usleep(100) after signal the child threads, > no child thread is scheduled to run. So the case fails. > > I update it to set main thread with a lower priority and child threads > with a higher one, then call sched_yield and usleep in main thread will > make sure that one of the child threads will be scheduled. Hi Cyril, Would you like to help me to review this patch? Thanks a lot. Kai > > Signed-off-by: Kang Kai<kai...@wi...> > --- > .../interfaces/pthread_cond_signal/1-1.c | 44 +++++++++++++++++++- > 1 files changed, 42 insertions(+), 2 deletions(-) > > diff --git a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_signal/1-1.c b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_signal/1-1.c > index bf55b31..77374bf 100644 > --- a/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_signal/1-1.c > +++ b/testcases/open_posix_testsuite/conformance/interfaces/pthread_cond_signal/1-1.c > @@ -12,6 +12,7 @@ > > #define _XOPEN_SOURCE 600 > > +#include<errno.h> > #include<pthread.h> > #include<stdio.h> > #include<stdlib.h> > @@ -20,6 +21,7 @@ > #include "posixtest.h" > > #define THREAD_NUM 3 > +#define SCHED_POLICY SCHED_FIFO > > struct testdata > { > @@ -77,6 +79,10 @@ int main() > { > int i, rc; > struct sigaction act; > + int pid; > + int policy; > + struct sched_param param; > + pthread_attr_t attr; > > if (pthread_mutex_init(&td.mutex, NULL) != 0) { > fprintf(stderr,"Fail to initialize mutex\n"); > @@ -87,8 +93,35 @@ int main() > return PTS_UNRESOLVED; > } > > + pid = getpid(); > + param.sched_priority = sched_get_priority_min(SCHED_POLICY); > + if (sched_setscheduler(pid, SCHED_POLICY,¶m) != 0) { > + fprintf(stderr, "Fail to set main thread scheduler.\n"); > + if (errno == EPERM) > + fprintf(stderr, "Failed with EPERM: are you root?\n"); > + return PTS_UNRESOLVED; > + } > + > + if (pthread_attr_init(&attr) != 0) { > + fprintf(stderr, "Fail to init child thread attribute.\n"); > + return PTS_UNRESOLVED; > + } > + if (pthread_attr_setschedpolicy(&attr, SCHED_POLICY) != 0) { > + fprintf(stderr, "Fail to set child thread schedule policy attribute.\n"); > + return PTS_UNRESOLVED; > + } > + param.sched_priority += 10; > + if (pthread_attr_setschedparam(&attr,¶m) != 0) { > + fprintf(stderr, "Fail to set child thread schedule priority attribute.\n"); > + return PTS_UNRESOLVED; > + } > + if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) { > + fprintf(stderr, "Fail to set child thread inheritace attribute.\n"); > + return PTS_UNRESOLVED; > + } > + > for (i=0; i<THREAD_NUM; i++) { /* create THREAD_NUM threads */ > - if (pthread_create(&thread[i], NULL, thr_func, NULL) != 0) { > + if (pthread_create(&thread[i],&attr, thr_func, NULL) != 0) { > fprintf(stderr,"Fail to create thread[%d]\n", i); > exit(PTS_UNRESOLVED); > } > @@ -96,6 +129,8 @@ int main() > while (start_num< THREAD_NUM) /* waiting for all threads started */ > usleep(100); > > + pthread_attr_destroy(&attr); > + > /* Acquire the mutex to make sure that all waiters are currently > blocked on pthread_cond_wait */ > if (pthread_mutex_lock(&td.mutex) != 0) { > @@ -142,6 +177,7 @@ int main() > fprintf(stderr,"Main failed to signal the condition\n"); > exit(PTS_UNRESOLVED); > } > + sched_yield(); > usleep(100); > } > > @@ -158,6 +194,10 @@ int main() > exit(PTS_UNRESOLVED); > } > } > + > + pthread_mutex_destroy(&td.mutex); > + pthread_cond_destroy(&td.cond); > + > printf("Test PASSED\n"); > return PTS_PASS; > -} > \ No newline at end of file > +} |