Hi,

We have seen that prio_preempt testcase that is part of realtime tests 
occasionally hangs. This can be easily recreated on a 8-cpu system, but 
can be recreated on a 4-cpu system as well when run for a number of 
iterations.

The problem occurs because the first worker thread sometimes fails to 
call cond_wait on the condvar through which the master thread signals 
it to start. Since the first thread needs to start the chain of 
signalling from then on, all other threads just sit in a cond_wait 
without ever being woken up.

The fix is to have a barrier to ensure that the first worker thread 
doesn't miss the cond_signal.

I have tested this patch by running 10s of thousands of iterations of 
the testcase. Without the patch I can recreate the problem fairly
easily.

Thanks,
Sripathi.

Signed-off-by: Sripathi Kodi <[EMAIL PROTECTED]>

--- 
ltp-full-20080229/testcases/realtime/func/prio-preempt/prio-preempt.c.org       
2008-03-12 22:10:05.000000000 +0530
+++ 
ltp-full-20080229/testcases/realtime/func/prio-preempt/prio-preempt.c   
2008-03-12 22:14:02.000000000 +0530
@@ -90,6 +90,8 @@ static int t_after_wait[NUM_WORKERS];
 static int ret = 0;
 static int run_jvmsim=0;
 
+pthread_barrier_t barrier;
+
 void usage(void)
 {
        rt_help();
@@ -184,6 +186,8 @@ void *worker_thread(void* arg)
 
        /* block */
        rc = pthread_mutex_lock(&mutex[tid]);
+       if (tid == 0)
+               pthread_barrier_wait(&barrier);
        rc = pthread_cond_wait(&cond[tid], &mutex[tid]);
        rc = pthread_mutex_unlock(&mutex[tid]);
 
@@ -234,6 +238,8 @@ void *master_thread(void* arg)
 {
        int i, pri_boost;
 
+       pthread_barrier_init(&barrier, NULL, 2);
+
        /* start interrupter thread */
        if (int_threads) {
                pri_boost = 90;
@@ -270,6 +276,9 @@ void *master_thread(void* arg)
        while (threads_running < NUM_WORKERS)
                usleep(100);
 
+       /* Ensure the first worker has called cond_wait */
+       pthread_barrier_wait(&barrier);
+
        printf("Signaling first thread\n");
        pthread_mutex_lock(&mutex[0]);
        pthread_cond_signal(&cond[0]);


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to