#include <assert.h>
#include <sys/syscall.h>
+#include "arch.h"
+
#if defined(_syscall0)
_syscall0(pid_t, gettid)
#elif defined(__NR_gettid)
int a;
};
-static volatile int test_go;
+static volatile int test_go, test_stop;
static int wdelay;
static struct test_array *test_rcu_pointer;
static unsigned long duration;
-static time_t start_time;
-static unsigned long __thread duration_interval;
-#define DURATION_TEST_DELAY_WRITE 4
-#define DURATION_TEST_DELAY_READ 100
/*
* returns 0 if test should end.
*/
static int test_duration_write(void)
{
- if (duration_interval++ >= DURATION_TEST_DELAY_WRITE) {
- duration_interval = 0;
- if (time(NULL) - start_time >= duration)
- return 0;
- }
- return 1;
+ return !test_stop;
}
static int test_duration_read(void)
{
- if (duration_interval++ >= DURATION_TEST_DELAY_READ) {
- duration_interval = 0;
- if (time(NULL) - start_time >= duration)
- return 0;
- }
- return 1;
+ return !test_stop;
}
static unsigned long long __thread nr_writes;
while (!test_go)
{
}
+ smp_mb();
for (;;) {
rcu_read_lock();
while (!test_go)
{
}
+ smp_mb();
for (;;) {
new = test_array_alloc();
#ifdef DEBUG_YIELD
printf(" [-r] [-w] (yield reader and/or writer)");
#endif
- printf(" [-d delay] (writer period)");
+ printf(" [-d delay] (writer period (us))");
printf("\n");
}
break;
#endif
case 'd':
- if (argc < i + 1) {
+ if (argc < i + 2) {
show_usage(argc, argv);
return -1;
}
printf("running test for %lu seconds, %u readers, %u writers.\n",
duration, nr_readers, nr_writers);
printf("Writer delay : %u us.\n", wdelay);
- start_time = time(NULL);
printf("thread %-6s, thread id : %lx, tid %lu\n",
"main", pthread_self(), (unsigned long)gettid());
exit(1);
}
+ smp_mb();
+
test_go = 1;
+ sleep(duration);
+
+ test_stop = 1;
+
for (i = 0; i < nr_readers; i++) {
err = pthread_join(tid_reader[i], &tret);
if (err != 0)