From: gowrishankar <[email protected]>

In a scenario where high priority noise thread is not scheduled after the
barrier but some other real-time thread, the test intention gets broken by
the test code, as priority inversion will never happen. We need to tightly
synchronize the threads so the noise thread always begins the test so that
it gets preempted by low prio thread through PI logic and is done with
conditional variables.

This change is applied on both the tests testpi-1 and testpi-2.
Signed-off-by: Gowrishankar<[email protected]>
Tested-by: Gowrishankar<[email protected]>
Acked-by: Darren Hart <[email protected]>
---
 testcases/realtime/func/pi-tests/testpi-1.c |   23 +++++++++++++++++++++--
 testcases/realtime/func/pi-tests/testpi-2.c |   24 ++++++++++++++++++++++--
 2 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/testcases/realtime/func/pi-tests/testpi-1.c 
b/testcases/realtime/func/pi-tests/testpi-1.c
index 3e05e56..5d18f29 100644
--- a/testcases/realtime/func/pi-tests/testpi-1.c
+++ b/testcases/realtime/func/pi-tests/testpi-1.c
@@ -30,8 +30,9 @@
  *
  *
  * HISTORY
- *      2010-04-22 Code cleanup by Gowrishankar
- *
+ *      2010-04-22 Code cleanup and thread synchronization changes by using
+ *                 conditional variables,
+ *                 by Gowrishankar([email protected]).
  *
  *****************************************************************************/
 
@@ -74,6 +75,8 @@ int gettid(void)
 
 typedef void *(*entrypoint_t)(void *);
 pthread_mutex_t glob_mutex;
+static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
 
 void *func_nonrt(void *arg)
 {
@@ -88,6 +91,11 @@ void *func_nonrt(void *arg)
        /* Wait for other RT threads to start up */
        pthread_barrier_wait(&barrier);
 
+       /* Wait for the high priority noise thread to start and signal us */
+       pthread_mutex_lock(&cond_mutex);
+       pthread_cond_wait(&cond_var, &cond_mutex);
+       pthread_mutex_unlock(&cond_mutex);
+
        for (i = 0; i < 10000; i++) {
                if (i%100 == 0) {
                        printf("Thread %d loop %d pthread pol %d pri %d\n",\
@@ -137,6 +145,14 @@ void *func_noise(void *arg)
                pthr->priority);
        pthread_barrier_wait(&barrier);
 
+       /* Let others wait at conditional variable */
+       usleep(1000);
+
+       /* Noise thread begins the test */
+       pthread_mutex_lock(&cond_mutex);
+       pthread_cond_broadcast(&cond_var);
+       pthread_mutex_unlock(&cond_mutex);
+
        for (i = 0; i < 10000; i++) {
                if (i%100 == 0) {
                        printf("Noise Thread %d loop %d pthread pol %d "\
@@ -197,5 +213,8 @@ int main(int argc, char *argv[])
        printf("Criteria:Low Priority Thread should Preempt Higher Priority "\
                "Noise Thread\n");
 
+       pthread_mutex_destroy(&glob_mutex);
+       pthread_mutex_destroy(&cond_mutex);
+       pthread_cond_destroy(&cond_var);
        return 0;
 }
diff --git a/testcases/realtime/func/pi-tests/testpi-2.c 
b/testcases/realtime/func/pi-tests/testpi-2.c
index f0e86ea..55b391b 100644
--- a/testcases/realtime/func/pi-tests/testpi-2.c
+++ b/testcases/realtime/func/pi-tests/testpi-2.c
@@ -31,8 +31,9 @@
  *
  *
  * HISTORY
- *      2010-04-22 Code cleanup by Gowrishankar
- *
+ *      2010-04-22 Code cleanup and thread synchronization changes by using
+ *                 conditional variables,
+ *                 by Gowrishankar([email protected]).
  *
  *****************************************************************************/
 
@@ -76,6 +77,8 @@ int gettid(void)
 
 typedef void *(*entrypoint_t)(void *);
 pthread_mutex_t glob_mutex;
+static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
 
 void *func_lowrt(void *arg)
 {
@@ -90,6 +93,11 @@ void *func_lowrt(void *arg)
        /* Wait for other RT threads to start up */
        pthread_barrier_wait(&barrier);
 
+       /* Wait for the high priority noise thread to start and signal us */
+       pthread_mutex_lock(&cond_mutex);
+       pthread_cond_wait(&cond_var, &cond_mutex);
+       pthread_mutex_unlock(&cond_mutex);
+
        for (i = 0; i < 10000; i++) {
                if (i%100 == 0) {
                        printf("Thread %d loop %d pthread pol %d pri %d\n",\
@@ -139,6 +147,14 @@ void *func_noise(void *arg)
                pthr->priority);
        pthread_barrier_wait(&barrier);
 
+       /* Let others wait at conditional variable */
+       usleep(1000);
+
+       /* Noise thread begins the test */
+       pthread_mutex_lock(&cond_mutex);
+       pthread_cond_broadcast(&cond_var);
+       pthread_mutex_unlock(&cond_mutex);
+
        for (i = 0; i < 10000; i++) {
                if (i%100 == 0) {
                        printf("Noise Thread %d loop %d pthread pol %d "\
@@ -197,5 +213,9 @@ int main(int argc, char *argv[])
        printf("Done\n");
        printf("Criteria: Low Priority Thread and High Priority Thread "\
                "should prempt each other multiple times\n");
+
+       pthread_mutex_destroy(&glob_mutex);
+       pthread_mutex_destroy(&cond_mutex);
+       pthread_cond_destroy(&cond_var);
        return 0;
 }
-- 
1.7.1


------------------------------------------------------------------------------

_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to