Hi,
While the synchronization in the sched_football testcase under the
realtime test suite is not erroneous, it can be enahnced and made more
reliable by making use of pthread_barriers, like in other testcases.
This patch adds the same.
Testing done: Infinite iterations of the testcase run with this patch.
Signed-off-by: Ankita Garg <[EMAIL PROTECTED]>
Acked-by: Vernon Mauery <[EMAIL PROTECTED]>
Index: ltp-full-20080731/testcases/realtime/func/sched_football/sched_football.c
===================================================================
---
ltp-full-20080731.orig/testcases/realtime/func/sched_football/sched_football.c
2008-08-25 13:55:23.000000000 +0530
+++ ltp-full-20080731/testcases/realtime/func/sched_football/sched_football.c
2008-08-25 13:58:33.000000000 +0530
@@ -73,12 +73,8 @@
/* Here's the position of the ball */
volatile int the_ball;
-/* Keep track of who's on the field */
-volatile int offense_count;
-volatile int defense_count;
-
-/* simple mutex for our atomic increments */
-pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+/* pthread_barrier for synchronization */
+pthread_barrier_t barrier;
static int run_jvmsim=0;
static int players_per_team = 0;
@@ -121,9 +117,7 @@
/* This is the defensive team. They're trying to block the offense */
void *thread_defense(void* arg)
{
- pthread_mutex_lock(&mutex);
- defense_count++;
- pthread_mutex_unlock(&mutex);
+ pthread_barrier_wait(&barrier);
/*keep the ball from being moved */
while (1) {
@@ -136,9 +130,7 @@
/* This is the offensive team. They're trying to move the ball */
void *thread_offense(void* arg)
{
- pthread_mutex_lock(&mutex);
- offense_count++;
- pthread_mutex_unlock(&mutex);
+ pthread_barrier_wait(&barrier);
while (1) {
the_ball++; /* move the ball ahead one yard */
@@ -158,6 +150,8 @@
now = start;
the_ball = 0;
+ pthread_barrier_wait(&barrier);
+
/* Watch the game */
while ((now.tv_sec - start.tv_sec) < game_length) {
sleep(1);
@@ -189,6 +183,11 @@
printf("jvmsim disabled\n");
}
+ if ((i = pthread_barrier_init(&barrier, NULL, players_per_team*2 + 1)))
{
+ printf("pthread_barrier_init failed: %s\n", strerror(i));
+ exit(i);
+ }
+
printf("Running with: players_per_team=%d game_length=%d\n",
players_per_team, game_length);
@@ -202,8 +201,6 @@
players_per_team, priority);
for (i = 0; i < players_per_team; i++)
create_fifo_thread(thread_offense, NULL, priority);
- while (offense_count < players_per_team)
- usleep(100);
/* Start the defense */
priority = 30;
@@ -211,8 +208,6 @@
players_per_team, priority);
for (i = 0; i < players_per_team; i++)
create_fifo_thread(thread_defense, NULL, priority);
- while (defense_count < players_per_team)
- usleep(100);
/* Ok, everyone is on the field, bring out the ref */
printf("Starting referee thread\n");
--
Regards,
Ankita Garg ([EMAIL PROTECTED])
Linux Technology Center
IBM India Systems & Technology Labs,
Bangalore, India
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list