*
* Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
*
- * Distributed under GPLv2
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <stdio.h>
}
#endif
+#ifndef DYNAMIC_LINK_TEST
+#define _LGPL_SOURCE
+#else
+#define debug_yield_read()
+#endif
#include "urcu.h"
struct test_array {
static unsigned long duration;
static time_t start_time;
static unsigned long __thread duration_interval;
-#define DURATION_TEST_DELAY 100
+#define DURATION_TEST_DELAY_WRITE 4
+#define DURATION_TEST_DELAY_READ 100
/*
* returns 0 if test should end.
*/
-static int test_duration(void)
+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;
+}
+
+static int test_duration_read(void)
{
- if (duration_interval++ >= DURATION_TEST_DELAY) {
+ if (duration_interval++ >= DURATION_TEST_DELAY_READ) {
duration_interval = 0;
if (time(NULL) - start_time >= duration)
return 0;
printf("thread_begin %s, thread id : %lx, tid %lu\n",
"reader", pthread_self(), (unsigned long)gettid());
- urcu_register_thread();
+ rcu_register_thread();
for (;;) {
rcu_read_lock();
assert(local_ptr->a == 8);
rcu_read_unlock();
nr_reads++;
- if (!test_duration())
+ if (!test_duration_read())
break;
}
- urcu_unregister_thread();
+ rcu_unregister_thread();
*count = nr_reads;
printf("thread_end %s, thread id : %lx, tid %lu\n",
if (old)
assert(old->a == 8);
new->a = 8;
- old = urcu_publish_content(&test_rcu_pointer, new);
+ old = rcu_publish_content(&test_rcu_pointer, new);
rcu_copy_mutex_unlock();
/* can be done after unlock */
if (old)
old->a = 0;
test_array_free(old);
nr_writes++;
- if (!test_duration())
+ if (!test_duration_write())
break;
if (!no_writer_delay)
usleep(1);
exit(1);
tot_writes += count_writer[i];
}
+
printf("total number of reads : %llu, writes %llu\n", tot_reads,
tot_writes);
test_array_free(test_rcu_pointer);