Messages in this thread | | | Subject | [BUG -rt] -rt16 hang w/ realtime thread test | From | john stultz <> | Date | Fri, 10 Feb 2006 18:57:54 -0800 |
| |
Hey Ingo, I've been hunting a report that lower priority realtime threads are not preempting higher priority realtime threads. However, in generating test cases, I found I was locking the system quite frequently.
The attached test runs to completion on 2.6.15, but with 2.6.15-rt16, it hangs the box. It could very well be a test issue, but I'm not sure I see where the problem is.
thanks -john
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <time.h> #include <string.h> #include <pthread.h> #include <sched.h> #include <errno.h> #include <sys/syscall.h>
#define MAXTHREADS 256 #define TEST_LENGTH 5
volatile int test_finished; volatile int running_count;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *busy(void* arg) { struct timeval start, now;
pthread_mutex_lock(&mutex); running_count = running_count + 1; pthread_mutex_unlock(&mutex);
gettimeofday(&start,0); while (!test_finished){ gettimeofday(&now,0); if (now.tv_sec - start.tv_sec > 10) { printf("Something is broken\n"); break; } sched_yield(); } pthread_mutex_lock(&mutex); running_count--; pthread_mutex_unlock(&mutex);
}
void create_thread(pthread_t *thread, void*(*func)(void*), int prio) { pthread_attr_t attr; struct sched_param param;
param.sched_priority = sched_get_priority_min(SCHED_FIFO) + prio;
pthread_attr_init(&attr); pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedparam(&attr, ¶m); pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
if (pthread_create(thread, &attr, func, (void *)0)) { perror("pthread_create failed"); }
pthread_attr_destroy(&attr); }
int main(int argc, char* argv[]) { struct sched_param param; int num_threads; int priority; int thread_count = 0; pthread_t thread_id[MAXTHREADS]; int i;
if (argc != 2) { printf("Usage: %s num_threads\n", argv[0]); exit(1); }
num_threads = atoi(argv[1]);
param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 80; sched_setscheduler(0, SCHED_FIFO, ¶m);
priority = 30; for (i = 0; i < num_threads; i++) create_thread(&thread_id[thread_count++], busy, priority); while (running_count < num_threads) usleep(100);
sleep(TEST_LENGTH); test_finished = 1;
for (i = 0; i < thread_count; i++) pthread_join(thread_id[i], 0);
return 0; }
| |