|
From: <sv...@va...> - 2008-03-08 13:14:59
|
Author: bart
Date: 2008-03-08 13:15:03 +0000 (Sat, 08 Mar 2008)
New Revision: 7598
Log:
Reintroduced setting thread names (conditionally), such that the races triggered by snprintf() can be debugged.
Modified:
trunk/exp-drd/tests/pth_detached.c
Modified: trunk/exp-drd/tests/pth_detached.c
===================================================================
--- trunk/exp-drd/tests/pth_detached.c 2008-03-08 10:44:39 UTC (rev 7597)
+++ trunk/exp-drd/tests/pth_detached.c 2008-03-08 13:15:03 UTC (rev 7598)
@@ -1,7 +1,8 @@
-/* Test whether detached threads are handled properly.
- Contributed by Bart Van Assche (bar...@gm...).
-*/
+/** Test whether detached threads are handled properly.
+ * Copyright (c) 2006-2008 by Bart Van Assche (bar...@gm...).
+ */
+
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
@@ -9,9 +10,25 @@
#include <unistd.h>
#include "../drd_clientreq.h"
+
static int s_finished_count;
+static int s_set_thread_name;
static pthread_mutex_t s_mutex;
+
+static void set_thread_name(const char* const fmt, const int arg)
+{
+ if (s_set_thread_name)
+ {
+ int res;
+ char name[32];
+ snprintf(name, sizeof(name), fmt, arg);
+ name[sizeof(name) - 1] = 0;
+ VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_THREAD_NAME,
+ name, 0, 0, 0, 0);
+ }
+}
+
void increment_finished_count()
{
pthread_mutex_lock(&s_mutex);
@@ -30,6 +47,7 @@
static void* thread_func1(void* arg)
{
+ set_thread_name("thread_func1[%d]", *(int*)arg);
write(STDOUT_FILENO, ".\n", 2);
increment_finished_count();
return 0;
@@ -37,6 +55,7 @@
static void* thread_func2(void* arg)
{
+ set_thread_name("thread_func2[%d]", *(int*)arg);
pthread_detach(pthread_self());
write(STDOUT_FILENO, ".\n", 2);
increment_finished_count();
@@ -47,11 +66,16 @@
{
const int count1 = argc > 1 ? atoi(argv[1]) : 100;
const int count2 = argc > 2 ? atoi(argv[2]) : 100;
+ const int do_set_thread_name = argc > 3 ? atoi(argv[3]) != 0 : 0;
int thread_arg[count1 > count2 ? count1 : count2];
int i;
int detachstate;
pthread_attr_t attr;
+ s_set_thread_name = do_set_thread_name;
+
+ set_thread_name("main", 0);
+
for (i = 0; i < count1 || i < count2; i++)
thread_arg[i] = i;
|