blob: 36793c68120515374fd04345c13e0041acc02704 [file] [log] [blame]
sewardjaf44c822007-11-25 14:01:38 +00001
2/*--------------------------------------------------------------------*/
sewardj85642922008-01-14 11:54:56 +00003/*--- Client-space code for drd. drd_intercepts.c ---*/
sewardjaf44c822007-11-25 14:01:38 +00004/*--------------------------------------------------------------------*/
5
6/*
7 This file is part of drd, a data race detector.
8
sewardj85642922008-01-14 11:54:56 +00009 Copyright (C) 2006-2008 Bart Van Assche
sewardjaf44c822007-11-25 14:01:38 +000010 bart.vanassche@gmail.com
11
12 This program is free software; you can redistribute it and/or
13 modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation; either version 2 of the
15 License, or (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful, but
18 WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
25 02111-1307, USA.
26
27 The GNU General Public License is contained in the file COPYING.
28*/
29
30/* ---------------------------------------------------------------------
31 ALL THE CODE IN THIS FILE RUNS ON THE SIMULATED CPU.
32
33 These functions are not called directly - they're the targets of code
34 redirection or load notifications (see pub_core_redir.h for info).
35 They're named weirdly so that the intercept code can find them when the
36 shared object is initially loaded.
37
38 Note that this filename has the "drd_" prefix because it can appear
39 in stack traces, and the "drd_" makes it a little clearer that it
40 originates from Valgrind.
41 ------------------------------------------------------------------ */
42
bart5e85d262008-03-01 10:49:37 +000043// Make sure pthread_spinlock_t is available when compiling with older glibc
44// versions (2.3 or before).
sewardjaf44c822007-11-25 14:01:38 +000045#ifndef _GNU_SOURCE
46#define _GNU_SOURCE
47#endif
48
49#include <assert.h>
bart4501d5c2008-03-04 18:36:23 +000050#include <inttypes.h> // uintptr_t
sewardj85642922008-01-14 11:54:56 +000051#include <pthread.h>
52#include <semaphore.h>
sewardjaf44c822007-11-25 14:01:38 +000053#include <stdio.h>
bart0d063002008-03-01 07:25:13 +000054#include <stdlib.h>
bart4501d5c2008-03-04 18:36:23 +000055#include <unistd.h> // confstr()
bart5e389f12008-04-05 12:53:15 +000056#include "config.h"
sewardjaf44c822007-11-25 14:01:38 +000057#include "drd_clientreq.h"
sewardj85642922008-01-14 11:54:56 +000058#include "pub_tool_redir.h"
sewardjaf44c822007-11-25 14:01:38 +000059
60
61// Defines.
62
bart3772a982008-03-15 08:11:03 +000063#define PTH_FUNC(ret_ty, f, args...) \
64 ret_ty VG_WRAP_FUNCTION_ZZ(libpthreadZdsoZd0,f)(args); \
65 ret_ty VG_WRAP_FUNCTION_ZZ(libpthreadZdsoZd0,f)(args)
sewardjaf44c822007-11-25 14:01:38 +000066
67
bart6f07b252008-04-04 16:45:20 +000068/* Local data structures. */
sewardjaf44c822007-11-25 14:01:38 +000069
70typedef struct
71{
bart3772a982008-03-15 08:11:03 +000072 void* (*start)(void*);
73 void* arg;
74 int detachstate;
sewardjaf44c822007-11-25 14:01:38 +000075#if 0
bart3772a982008-03-15 08:11:03 +000076 pthread_mutex_t mutex;
77 pthread_cond_t cond;
sewardjaf44c822007-11-25 14:01:38 +000078#else
bart3772a982008-03-15 08:11:03 +000079 int wrapper_started;
sewardjaf44c822007-11-25 14:01:38 +000080#endif
81} VgPosixThreadArgs;
82
83
bart6f07b252008-04-04 16:45:20 +000084/* Function declarations. */
sewardjaf44c822007-11-25 14:01:38 +000085
bart6f07b252008-04-04 16:45:20 +000086void _init(void);
87static void check_threading_library(void);
88static void vg_set_main_thread_state(void);
sewardjaf44c822007-11-25 14:01:38 +000089
90
bart6f07b252008-04-04 16:45:20 +000091/* Function definitions. */
92
93/** Shared library initialization function: the _init() function is called
94 * after dlopen() has loaded the shared library. This function must not
95 * be declared static.
96 */
97void _init(void)
98{
99 check_threading_library();
100 vg_set_main_thread_state();
101}
sewardjaf44c822007-11-25 14:01:38 +0000102
bart5357fcb2008-02-27 15:46:00 +0000103static MutexT pthread_to_drd_mutex_type(const int kind)
104{
bart3772a982008-03-15 08:11:03 +0000105 switch (kind)
106 {
107 /* PTHREAD_MUTEX_RECURSIVE_NP */
108 case PTHREAD_MUTEX_RECURSIVE:
109 return mutex_type_recursive_mutex;
110 /* PTHREAD_MUTEX_ERRORCHECK_NP */
111 case PTHREAD_MUTEX_ERRORCHECK:
112 return mutex_type_errorcheck_mutex;
113 /* PTHREAD_MUTEX_TIMED_NP */
114 /* PTHREAD_MUTEX_NORMAL */
115 case PTHREAD_MUTEX_DEFAULT:
116 case PTHREAD_MUTEX_ADAPTIVE_NP:
117 return mutex_type_default_mutex;
118 }
119 return mutex_type_invalid_mutex;
bart5357fcb2008-02-27 15:46:00 +0000120}
121
122static MutexT mutex_type(pthread_mutex_t* mutex)
123{
bart5e389f12008-04-05 12:53:15 +0000124#if defined(HAVE_PTHREAD_MUTEX_T__M_KIND)
125 /* LinuxThreads. */
bart3772a982008-03-15 08:11:03 +0000126 const int kind = mutex->__m_kind;
bart5e389f12008-04-05 12:53:15 +0000127#elif defined(HAVE_PTHREAD_MUTEX_T__DATA__KIND)
128 /* NPTL. */
bart3772a982008-03-15 08:11:03 +0000129 const int kind = mutex->__data.__kind;
bartc9463c42008-02-28 07:36:04 +0000130#else
bart5e389f12008-04-05 12:53:15 +0000131 /* Another POSIX threads implementation. Regression tests will fail. */
bart3772a982008-03-15 08:11:03 +0000132 const int kind = PTHREAD_MUTEX_DEFAULT;
bart5e389f12008-04-05 12:53:15 +0000133 fprintf(stderr,
134 "Did not recognize your POSIX threads implementation. Giving up.\n");
135 assert(0);
bartc9463c42008-02-28 07:36:04 +0000136#endif
bart3772a982008-03-15 08:11:03 +0000137 return pthread_to_drd_mutex_type(kind);
bart5357fcb2008-02-27 15:46:00 +0000138}
139
sewardjaf44c822007-11-25 14:01:38 +0000140static void vg_start_suppression(const void* const p, size_t const size)
141{
bart3772a982008-03-15 08:11:03 +0000142 int res;
143 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_SUPPRESSION,
bartf5bb46a2008-03-29 13:18:02 +0000144 p, size, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000145}
146
147static void vg_set_joinable(const pthread_t tid, const int joinable)
148{
bart3772a982008-03-15 08:11:03 +0000149 int res;
150 assert(joinable == 0 || joinable == 1);
151 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__SET_JOINABLE,
152 tid, joinable, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000153}
154
155static void* vg_thread_wrapper(void* arg)
156{
bart3772a982008-03-15 08:11:03 +0000157 int res;
bart0d063002008-03-01 07:25:13 +0000158
bart3772a982008-03-15 08:11:03 +0000159 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK,
160 0, 0, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000161
bart3772a982008-03-15 08:11:03 +0000162 {
163 VgPosixThreadArgs* const arg_ptr = (VgPosixThreadArgs*)arg;
164 VgPosixThreadArgs const arg_copy = *arg_ptr;
165 void* result;
sewardjaf44c822007-11-25 14:01:38 +0000166
167#if 0
bart3772a982008-03-15 08:11:03 +0000168 pthread_mutex_lock(arg_ptr->mutex);
169 pthread_cond_signal(arg_ptr->cond);
170 pthread_mutex_unlock(arg_ptr->mutex);
sewardjaf44c822007-11-25 14:01:38 +0000171#else
bart3772a982008-03-15 08:11:03 +0000172 arg_ptr->wrapper_started = 1;
sewardjaf44c822007-11-25 14:01:38 +0000173#endif
174
bart3772a982008-03-15 08:11:03 +0000175 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SET_PTHREADID,
176 pthread_self(), 0, 0, 0, 0);
177 vg_set_joinable(pthread_self(),
178 arg_copy.detachstate == PTHREAD_CREATE_JOINABLE);
179 result = (arg_copy.start)(arg_copy.arg);
180 return result;
181 }
sewardjaf44c822007-11-25 14:01:38 +0000182}
183
bart6f07b252008-04-04 16:45:20 +0000184/** Return 1 if LinuxThread has been detected, and 0 otherwise. */
bart4501d5c2008-03-04 18:36:23 +0000185static int detected_linuxthreads(void)
186{
187#if defined(linux)
188#if defined(_CS_GNU_LIBPTHREAD_VERSION)
bart3772a982008-03-15 08:11:03 +0000189 /* Linux with a recent glibc. */
190 char buffer[256];
191 unsigned len;
192 len = confstr(_CS_GNU_LIBPTHREAD_VERSION, buffer, sizeof(buffer));
193 assert(len <= sizeof(buffer));
194 return len > 0 && buffer[0] == 'l';
bart4501d5c2008-03-04 18:36:23 +0000195#else
bart3772a982008-03-15 08:11:03 +0000196 /* Linux without _CS_GNU_LIBPTHREAD_VERSION: most likely LinuxThreads. */
197 return 1;
bart4501d5c2008-03-04 18:36:23 +0000198#endif
199#else
bart3772a982008-03-15 08:11:03 +0000200 /* Another OS than Linux, hence no LinuxThreads. */
201 return 0;
bart4501d5c2008-03-04 18:36:23 +0000202#endif
203}
204
bart6f07b252008-04-04 16:45:20 +0000205/** Stop and print an error message in case a non-supported threading
206 * library (LinuxThreads) has been detected.
207 */
208static void check_threading_library(void)
sewardjaf44c822007-11-25 14:01:38 +0000209{
bart3772a982008-03-15 08:11:03 +0000210 if (detected_linuxthreads())
211 {
212 if (getenv("LD_ASSUME_KERNEL"))
213 {
214 fprintf(stderr,
215 "Detected the LinuxThreads threading library. Sorry, but DRD only supports\n"
216 "the newer NPTL (Native POSIX Threads Library). Please try to rerun DRD\n"
217 "after having unset the environment variable LD_ASSUME_KERNEL. Giving up.\n"
218 );
219 }
220 else
221 {
222 fprintf(stderr,
223 "Detected the LinuxThreads threading library. Sorry, but DRD only supports\n"
224 "the newer NPTL (Native POSIX Threads Library). Please try to rerun DRD\n"
225 "after having upgraded to a newer version of your Linux distribution.\n"
226 "Giving up.\n"
227 );
228 }
229 abort();
230 }
bart6f07b252008-04-04 16:45:20 +0000231}
232
233static void vg_set_main_thread_state(void)
234{
235 int res;
bart0d063002008-03-01 07:25:13 +0000236
bart3772a982008-03-15 08:11:03 +0000237 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK,
238 0, 0, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000239
bart3772a982008-03-15 08:11:03 +0000240 // Make sure that DRD knows about the main thread's POSIX thread ID.
241 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SET_PTHREADID,
242 pthread_self(), 0, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000243
244}
245
246// pthread_create
sewardj347eeba2008-01-21 14:19:07 +0000247PTH_FUNC(int, pthreadZucreateZa, // pthread_create*
bart3772a982008-03-15 08:11:03 +0000248 pthread_t *thread, const pthread_attr_t *attr,
249 void *(*start) (void *), void *arg)
sewardjaf44c822007-11-25 14:01:38 +0000250{
bartbf3a60c2008-04-04 19:10:21 +0000251 int res;
bart3772a982008-03-15 08:11:03 +0000252 int ret;
253 OrigFn fn;
254 VgPosixThreadArgs vgargs;
sewardjaf44c822007-11-25 14:01:38 +0000255
bart3772a982008-03-15 08:11:03 +0000256 VALGRIND_GET_ORIG_FN(fn);
sewardjaf44c822007-11-25 14:01:38 +0000257
bart3772a982008-03-15 08:11:03 +0000258 vg_start_suppression(&vgargs.wrapper_started,
259 sizeof(vgargs.wrapper_started));
260 vgargs.start = start;
261 vgargs.arg = arg;
262 vgargs.wrapper_started = 0;
263 vgargs.detachstate = PTHREAD_CREATE_JOINABLE;
264 if (attr)
265 {
266 if (pthread_attr_getdetachstate(attr, &vgargs.detachstate) != 0)
267 {
268 assert(0);
269 }
270 }
271 assert(vgargs.detachstate == PTHREAD_CREATE_JOINABLE
272 || vgargs.detachstate == PTHREAD_CREATE_DETACHED);
sewardjaf44c822007-11-25 14:01:38 +0000273#if 0
bart3772a982008-03-15 08:11:03 +0000274 pthread_mutex_init(&vgargs.mutex, 0);
275 pthread_cond_init(&vgargs.cond, 0);
276 pthread_mutex_lock(&vgargs.mutex);
sewardjaf44c822007-11-25 14:01:38 +0000277#endif
bartbf3a60c2008-04-04 19:10:21 +0000278 /* Suppress NPTL-specific conflicts between creator and created thread. */
279 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__DRD_STOP_RECORDING,
280 0, 0, 0, 0, 0);
bart3772a982008-03-15 08:11:03 +0000281 CALL_FN_W_WWWW(ret, fn, thread, attr, vg_thread_wrapper, &vgargs);
bartbf3a60c2008-04-04 19:10:21 +0000282 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__DRD_START_RECORDING,
283 0, 0, 0, 0, 0);
sewardjaf44c822007-11-25 14:01:38 +0000284#if 0
bart3772a982008-03-15 08:11:03 +0000285 pthread_cond_wait(&vgargs.cond, &vgargs.mutex);
286 pthread_mutex_unlock(&vgargs.mutex);
287 pthread_cond_destroy(&vgargs.cond);
288 pthread_mutex_destroy(&vgargs.mutex);
sewardjaf44c822007-11-25 14:01:38 +0000289#else
bart3772a982008-03-15 08:11:03 +0000290 // Yes, you see it correctly, busy waiting ... The problem is that
291 // POSIX threads functions cannot be called here -- the functions defined
292 // in this file (drd_intercepts.c) would be called instead of those in
293 // libpthread.so. This loop is necessary because vgargs is allocated on the
294 // stack, and the created thread reads it.
295 if (ret == 0)
296 {
297 while (! vgargs.wrapper_started)
298 {
299 sched_yield();
300 }
301 }
sewardjaf44c822007-11-25 14:01:38 +0000302#endif
bart3772a982008-03-15 08:11:03 +0000303 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000304}
305
306// pthread_join
307PTH_FUNC(int, pthreadZujoin, // pthread_join
bart3772a982008-03-15 08:11:03 +0000308 pthread_t pt_joinee, void **thread_return)
sewardjaf44c822007-11-25 14:01:38 +0000309{
bart3772a982008-03-15 08:11:03 +0000310 int ret;
311 int res;
312 OrigFn fn;
sewardjaf44c822007-11-25 14:01:38 +0000313
bart3772a982008-03-15 08:11:03 +0000314 VALGRIND_GET_ORIG_FN(fn);
315 CALL_FN_W_WW(ret, fn, pt_joinee, thread_return);
316 if (ret == 0)
317 {
318 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_THREAD_JOIN,
319 pt_joinee, 0, 0, 0, 0);
320 }
321 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000322}
323
324// pthread_detach
325PTH_FUNC(int, pthreadZudetach, pthread_t pt_thread)
326{
bart3772a982008-03-15 08:11:03 +0000327 int ret;
328 OrigFn fn;
329 VALGRIND_GET_ORIG_FN(fn);
330 {
331 CALL_FN_W_W(ret, fn, pt_thread);
332 if (ret == 0)
333 {
334 vg_set_joinable(pt_thread, 0);
335 }
336 }
337 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000338}
339
340// pthread_mutex_init
341PTH_FUNC(int, pthreadZumutexZuinit,
bart3772a982008-03-15 08:11:03 +0000342 pthread_mutex_t *mutex,
343 const pthread_mutexattr_t* attr)
sewardjaf44c822007-11-25 14:01:38 +0000344{
bart3772a982008-03-15 08:11:03 +0000345 int ret;
346 int res;
347 OrigFn fn;
348 int mt;
349 VALGRIND_GET_ORIG_FN(fn);
350 mt = PTHREAD_MUTEX_DEFAULT;
351 if (attr)
352 pthread_mutexattr_gettype(attr, &mt);
353 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_INIT,
354 mutex, pthread_to_drd_mutex_type(mt), 0, 0, 0);
355 CALL_FN_W_WW(ret, fn, mutex, attr);
356 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_INIT,
357 mutex, 0, 0, 0, 0);
358 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000359}
360
361// pthread_mutex_destroy
362PTH_FUNC(int, pthreadZumutexZudestroy,
bart3772a982008-03-15 08:11:03 +0000363 pthread_mutex_t *mutex)
sewardjaf44c822007-11-25 14:01:38 +0000364{
bart3772a982008-03-15 08:11:03 +0000365 int ret;
366 int res;
367 OrigFn fn;
368 VALGRIND_GET_ORIG_FN(fn);
369 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_MUTEX_DESTROY,
370 mutex, 0, 0, 0, 0);
371 CALL_FN_W_W(ret, fn, mutex);
372 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_DESTROY,
373 mutex, mutex_type(mutex), 0, 0, 0);
374 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000375}
376
377// pthread_mutex_lock
378PTH_FUNC(int, pthreadZumutexZulock, // pthread_mutex_lock
bart3772a982008-03-15 08:11:03 +0000379 pthread_mutex_t *mutex)
sewardjaf44c822007-11-25 14:01:38 +0000380{
bart3772a982008-03-15 08:11:03 +0000381 int ret;
382 int res;
383 OrigFn fn;
384 VALGRIND_GET_ORIG_FN(fn);
385 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
386 mutex, mutex_type(mutex), 0, 0, 0);
387 CALL_FN_W_W(ret, fn, mutex);
388 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__POST_MUTEX_LOCK,
389 mutex, ret == 0, 0, 0, 0);
390 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000391}
392
393// pthread_mutex_trylock
394PTH_FUNC(int, pthreadZumutexZutrylock, // pthread_mutex_trylock
bart3772a982008-03-15 08:11:03 +0000395 pthread_mutex_t *mutex)
sewardjaf44c822007-11-25 14:01:38 +0000396{
bart3772a982008-03-15 08:11:03 +0000397 int ret;
398 int res;
399 OrigFn fn;
400 VALGRIND_GET_ORIG_FN(fn);
401 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
bart2e3a3c12008-03-24 08:33:47 +0000402 mutex, mutex_type(mutex), 1, 0, 0);
bart3772a982008-03-15 08:11:03 +0000403 CALL_FN_W_W(ret, fn, mutex);
404 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
405 mutex, ret == 0, 0, 0, 0);
406 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000407}
408
sewardj85642922008-01-14 11:54:56 +0000409// pthread_mutex_timedlock
410PTH_FUNC(int, pthreadZumutexZutimedlock, // pthread_mutex_timedlock
bart3772a982008-03-15 08:11:03 +0000411 pthread_mutex_t *mutex,
412 const struct timespec *abs_timeout)
sewardj85642922008-01-14 11:54:56 +0000413{
bart3772a982008-03-15 08:11:03 +0000414 int ret;
415 int res;
416 OrigFn fn;
417 VALGRIND_GET_ORIG_FN(fn);
418 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
419 mutex, mutex_type(mutex), 0, 0, 0);
420 CALL_FN_W_WW(ret, fn, mutex, abs_timeout);
421 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
422 mutex, ret == 0, 0, 0, 0);
423 return ret;
sewardj85642922008-01-14 11:54:56 +0000424}
425
sewardjaf44c822007-11-25 14:01:38 +0000426// pthread_mutex_unlock
427PTH_FUNC(int, pthreadZumutexZuunlock, // pthread_mutex_unlock
bart3772a982008-03-15 08:11:03 +0000428 pthread_mutex_t *mutex)
sewardjaf44c822007-11-25 14:01:38 +0000429{
bart3772a982008-03-15 08:11:03 +0000430 int ret;
431 int res;
432 OrigFn fn;
433 VALGRIND_GET_ORIG_FN(fn);
434 VALGRIND_DO_CLIENT_REQUEST(res, -1,
435 VG_USERREQ__PRE_MUTEX_UNLOCK,
436 mutex, mutex_type(mutex), 0, 0, 0);
437 CALL_FN_W_W(ret, fn, mutex);
438 VALGRIND_DO_CLIENT_REQUEST(res, -1,
439 VG_USERREQ__POST_MUTEX_UNLOCK,
440 mutex, 0, 0, 0, 0);
441 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000442}
443
444// pthread_cond_init
sewardj347eeba2008-01-21 14:19:07 +0000445PTH_FUNC(int, pthreadZucondZuinitZa, // pthread_cond_init*
bart3772a982008-03-15 08:11:03 +0000446 pthread_cond_t* cond,
447 const pthread_condattr_t* attr)
sewardjaf44c822007-11-25 14:01:38 +0000448{
bart3772a982008-03-15 08:11:03 +0000449 int ret;
450 int res;
451 OrigFn fn;
452 VALGRIND_GET_ORIG_FN(fn);
453 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_INIT,
454 cond, 0, 0, 0, 0);
455 CALL_FN_W_WW(ret, fn, cond, attr);
456 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000457}
458
459// pthread_cond_destroy
sewardj347eeba2008-01-21 14:19:07 +0000460PTH_FUNC(int, pthreadZucondZudestroyZa, // pthread_cond_destroy*
bart3772a982008-03-15 08:11:03 +0000461 pthread_cond_t* cond)
sewardjaf44c822007-11-25 14:01:38 +0000462{
bart3772a982008-03-15 08:11:03 +0000463 int ret;
464 int res;
465 OrigFn fn;
466 VALGRIND_GET_ORIG_FN(fn);
467 CALL_FN_W_W(ret, fn, cond);
468 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_DESTROY,
469 cond, 0, 0, 0, 0);
470 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000471}
472
473// pthread_cond_wait
sewardj347eeba2008-01-21 14:19:07 +0000474PTH_FUNC(int, pthreadZucondZuwaitZa, // pthread_cond_wait*
bart3772a982008-03-15 08:11:03 +0000475 pthread_cond_t *cond,
476 pthread_mutex_t *mutex)
sewardjaf44c822007-11-25 14:01:38 +0000477{
bart3772a982008-03-15 08:11:03 +0000478 int ret;
479 int res;
480 OrigFn fn;
481 VALGRIND_GET_ORIG_FN(fn);
482 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_WAIT,
483 cond, mutex, mutex_type(mutex), 0, 0);
484 CALL_FN_W_WW(ret, fn, cond, mutex);
485 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_WAIT,
bart1b7a8302008-03-30 08:39:51 +0000486 cond, mutex, 1, 0, 0);
bart3772a982008-03-15 08:11:03 +0000487 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000488}
489
490// pthread_cond_timedwait
sewardj347eeba2008-01-21 14:19:07 +0000491PTH_FUNC(int, pthreadZucondZutimedwaitZa, // pthread_cond_timedwait*
bart3772a982008-03-15 08:11:03 +0000492 pthread_cond_t *cond,
493 pthread_mutex_t *mutex,
494 const struct timespec* abstime)
sewardjaf44c822007-11-25 14:01:38 +0000495{
bart3772a982008-03-15 08:11:03 +0000496 int ret;
497 int res;
498 OrigFn fn;
499 VALGRIND_GET_ORIG_FN(fn);
500 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_WAIT,
501 cond, mutex, mutex_type(mutex), 0, 0);
502 CALL_FN_W_WWW(ret, fn, cond, mutex, abstime);
503 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_COND_WAIT,
bart1b7a8302008-03-30 08:39:51 +0000504 cond, mutex, 1, 0, 0);
bart3772a982008-03-15 08:11:03 +0000505 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000506}
507
508// pthread_cond_signal
sewardj347eeba2008-01-21 14:19:07 +0000509PTH_FUNC(int, pthreadZucondZusignalZa, // pthread_cond_signal*
bart3772a982008-03-15 08:11:03 +0000510 pthread_cond_t* cond)
sewardjaf44c822007-11-25 14:01:38 +0000511{
bart3772a982008-03-15 08:11:03 +0000512 int ret;
513 int res;
514 OrigFn fn;
515 VALGRIND_GET_ORIG_FN(fn);
516 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_SIGNAL,
517 cond, 0, 0, 0, 0);
518 CALL_FN_W_W(ret, fn, cond);
519 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000520}
521
522// pthread_cond_broadcast
sewardj347eeba2008-01-21 14:19:07 +0000523PTH_FUNC(int, pthreadZucondZubroadcastZa, // pthread_cond_broadcast*
bart3772a982008-03-15 08:11:03 +0000524 pthread_cond_t* cond)
sewardjaf44c822007-11-25 14:01:38 +0000525{
bart3772a982008-03-15 08:11:03 +0000526 int ret;
527 int res;
528 OrigFn fn;
529 VALGRIND_GET_ORIG_FN(fn);
530 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_COND_BROADCAST,
531 cond, 0, 0, 0, 0);
532 CALL_FN_W_W(ret, fn, cond);
533 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000534}
535
536
537// pthread_spin_init
538PTH_FUNC(int, pthreadZuspinZuinit, // pthread_spin_init
bart3772a982008-03-15 08:11:03 +0000539 pthread_spinlock_t *spinlock,
540 int pshared)
sewardjaf44c822007-11-25 14:01:38 +0000541{
bart3772a982008-03-15 08:11:03 +0000542 int ret;
543 int res;
544 OrigFn fn;
545 VALGRIND_GET_ORIG_FN(fn);
546 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SPIN_INIT_OR_UNLOCK,
547 spinlock, mutex_type_spinlock, 0, 0, 0);
548 CALL_FN_W_WW(ret, fn, spinlock, pshared);
549 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000550}
551
552// pthread_spin_destroy
553PTH_FUNC(int, pthreadZuspinZudestroy, // pthread_spin_destroy
bart3772a982008-03-15 08:11:03 +0000554 pthread_spinlock_t *spinlock)
sewardjaf44c822007-11-25 14:01:38 +0000555{
bart3772a982008-03-15 08:11:03 +0000556 int ret;
557 int res;
558 OrigFn fn;
559 VALGRIND_GET_ORIG_FN(fn);
560 CALL_FN_W_W(ret, fn, spinlock);
561 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_DESTROY,
562 spinlock, mutex_type_spinlock, 0, 0, 0);
563 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000564}
565
566// pthread_spin_lock
567PTH_FUNC(int, pthreadZuspinZulock, // pthread_spin_lock
bart3772a982008-03-15 08:11:03 +0000568 pthread_spinlock_t *spinlock)
sewardjaf44c822007-11-25 14:01:38 +0000569{
bart3772a982008-03-15 08:11:03 +0000570 int ret;
571 int res;
572 OrigFn fn;
573 VALGRIND_GET_ORIG_FN(fn);
574 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
575 spinlock, mutex_type_spinlock, 0, 0, 0);
576 CALL_FN_W_W(ret, fn, spinlock);
577 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
578 spinlock, ret == 0, 0, 0, 0);
579 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000580}
581
582// pthread_spin_trylock
583PTH_FUNC(int, pthreadZuspinZutrylock, // pthread_spin_trylock
bart3772a982008-03-15 08:11:03 +0000584 pthread_spinlock_t *spinlock)
sewardjaf44c822007-11-25 14:01:38 +0000585{
bart3772a982008-03-15 08:11:03 +0000586 int ret;
587 int res;
588 OrigFn fn;
589 VALGRIND_GET_ORIG_FN(fn);
590 VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__PRE_MUTEX_LOCK,
591 spinlock, mutex_type_spinlock, 0, 0, 0);
592 CALL_FN_W_W(ret, fn, spinlock);
593 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_MUTEX_LOCK,
594 spinlock, ret == 0, 0, 0, 0);
595 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000596}
597
598// pthread_spin_unlock
599PTH_FUNC(int, pthreadZuspinZuunlock, // pthread_spin_unlock
bart3772a982008-03-15 08:11:03 +0000600 pthread_spinlock_t *spinlock)
sewardjaf44c822007-11-25 14:01:38 +0000601{
bart3772a982008-03-15 08:11:03 +0000602 int ret;
603 int res;
604 OrigFn fn;
605 VALGRIND_GET_ORIG_FN(fn);
606 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SPIN_INIT_OR_UNLOCK,
607 spinlock, mutex_type_spinlock, 0, 0, 0);
608 CALL_FN_W_W(ret, fn, spinlock);
609 return ret;
sewardjaf44c822007-11-25 14:01:38 +0000610}
611
sewardj85642922008-01-14 11:54:56 +0000612// pthread_barrier_init
613PTH_FUNC(int, pthreadZubarrierZuinit, // pthread_barrier_init
bart3772a982008-03-15 08:11:03 +0000614 pthread_barrier_t* barrier,
615 const pthread_barrierattr_t* attr,
616 unsigned count)
sewardj85642922008-01-14 11:54:56 +0000617{
bart3772a982008-03-15 08:11:03 +0000618 int ret;
619 int res;
620 OrigFn fn;
621 VALGRIND_GET_ORIG_FN(fn);
622 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_BARRIER_INIT,
623 barrier, pthread_barrier, count, 0, 0);
624 CALL_FN_W_WWW(ret, fn, barrier, attr, count);
625 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_BARRIER_INIT,
626 barrier, pthread_barrier, 0, 0, 0);
627 return ret;
sewardj85642922008-01-14 11:54:56 +0000628}
629
630// pthread_barrier_destroy
631PTH_FUNC(int, pthreadZubarrierZudestroy, // pthread_barrier_destroy
bart3772a982008-03-15 08:11:03 +0000632 pthread_barrier_t* barrier)
sewardj85642922008-01-14 11:54:56 +0000633{
bart3772a982008-03-15 08:11:03 +0000634 int ret;
635 int res;
636 OrigFn fn;
637 VALGRIND_GET_ORIG_FN(fn);
638 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_BARRIER_DESTROY,
639 barrier, pthread_barrier, 0, 0, 0);
640 CALL_FN_W_W(ret, fn, barrier);
641 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_BARRIER_DESTROY,
642 barrier, pthread_barrier, 0, 0, 0);
643 return ret;
sewardj85642922008-01-14 11:54:56 +0000644}
645
646// pthread_barrier_wait
647PTH_FUNC(int, pthreadZubarrierZuwait, // pthread_barrier_wait
bart3772a982008-03-15 08:11:03 +0000648 pthread_barrier_t* barrier)
sewardj85642922008-01-14 11:54:56 +0000649{
bart3772a982008-03-15 08:11:03 +0000650 int ret;
651 int res;
652 OrigFn fn;
653 VALGRIND_GET_ORIG_FN(fn);
654 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_BARRIER_WAIT,
655 barrier, pthread_barrier, 0, 0, 0);
656 CALL_FN_W_W(ret, fn, barrier);
657 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_BARRIER_WAIT,
658 barrier, pthread_barrier,
659 ret == 0 || ret == PTHREAD_BARRIER_SERIAL_THREAD,
660 0, 0);
661 return ret;
sewardj85642922008-01-14 11:54:56 +0000662}
663
664
sewardj85642922008-01-14 11:54:56 +0000665// sem_init
bart368ec982008-03-11 20:39:01 +0000666PTH_FUNC(int, semZuinitZa, // sem_init*
bart3772a982008-03-15 08:11:03 +0000667 sem_t *sem,
668 int pshared,
669 unsigned int value)
sewardj85642922008-01-14 11:54:56 +0000670{
bart3772a982008-03-15 08:11:03 +0000671 int ret;
672 int res;
673 OrigFn fn;
674 VALGRIND_GET_ORIG_FN(fn);
675 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_INIT,
676 sem, pshared, value, 0, 0);
677 CALL_FN_W_WWW(ret, fn, sem, pshared, value);
678 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_INIT,
679 sem, 0, 0, 0, 0);
680 return ret;
sewardj85642922008-01-14 11:54:56 +0000681}
682
683// sem_destroy
bart00344642008-03-01 15:27:41 +0000684PTH_FUNC(int, semZudestroyZa, // sem_destroy*
bart3772a982008-03-15 08:11:03 +0000685 sem_t *sem)
sewardj85642922008-01-14 11:54:56 +0000686{
bart3772a982008-03-15 08:11:03 +0000687 int ret;
688 int res;
689 OrigFn fn;
690 VALGRIND_GET_ORIG_FN(fn);
691 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_DESTROY,
692 sem, 0, 0, 0, 0);
693 CALL_FN_W_W(ret, fn, sem);
694 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_DESTROY,
695 sem, 0, 0, 0, 0);
696 return ret;
sewardj85642922008-01-14 11:54:56 +0000697}
698
699// sem_wait
bart368ec982008-03-11 20:39:01 +0000700PTH_FUNC(int, semZuwaitZa, // sem_wait*
bart3772a982008-03-15 08:11:03 +0000701 sem_t *sem)
sewardj85642922008-01-14 11:54:56 +0000702{
bart3772a982008-03-15 08:11:03 +0000703 int ret;
704 int res;
705 OrigFn fn;
706 VALGRIND_GET_ORIG_FN(fn);
707 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
708 sem, 0, 0, 0, 0);
709 CALL_FN_W_W(ret, fn, sem);
710 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
711 sem, ret == 0, 0, 0, 0);
712 return ret;
sewardj85642922008-01-14 11:54:56 +0000713}
714
715// sem_trywait
bart00344642008-03-01 15:27:41 +0000716PTH_FUNC(int, semZutrywaitZa, // sem_trywait*
bart3772a982008-03-15 08:11:03 +0000717 sem_t *sem)
sewardj85642922008-01-14 11:54:56 +0000718{
bart3772a982008-03-15 08:11:03 +0000719 int ret;
720 int res;
721 OrigFn fn;
722 VALGRIND_GET_ORIG_FN(fn);
723 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
724 sem, 0, 0, 0, 0);
725 CALL_FN_W_W(ret, fn, sem);
726 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
727 sem, ret == 0, 0, 0, 0);
728 return ret;
sewardj85642922008-01-14 11:54:56 +0000729}
730
731// sem_timedwait
bart00344642008-03-01 15:27:41 +0000732PTH_FUNC(int, semZutimedwait, // sem_timedwait
bart3772a982008-03-15 08:11:03 +0000733 sem_t *sem, const struct timespec *abs_timeout)
sewardj85642922008-01-14 11:54:56 +0000734{
bart3772a982008-03-15 08:11:03 +0000735 int ret;
736 int res;
737 OrigFn fn;
738 VALGRIND_GET_ORIG_FN(fn);
739 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_WAIT,
740 sem, 0, 0, 0, 0);
741 CALL_FN_W_WW(ret, fn, sem, abs_timeout);
742 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_WAIT,
743 sem, ret == 0, 0, 0, 0);
744 return ret;
sewardj85642922008-01-14 11:54:56 +0000745}
746
747// sem_post
bart368ec982008-03-11 20:39:01 +0000748PTH_FUNC(int, semZupostZa, // sem_post*
bart3772a982008-03-15 08:11:03 +0000749 sem_t *sem)
sewardj85642922008-01-14 11:54:56 +0000750{
bart3772a982008-03-15 08:11:03 +0000751 int ret;
752 int res;
753 OrigFn fn;
754 VALGRIND_GET_ORIG_FN(fn);
755 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_SEM_POST,
756 sem, 0, 0, 0, 0);
757 CALL_FN_W_W(ret, fn, sem);
758 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_SEM_POST,
759 sem, ret == 0, 0, 0, 0);
760 return ret;
sewardj85642922008-01-14 11:54:56 +0000761}
762
bart00344642008-03-01 15:27:41 +0000763// pthread_rwlock_init
764PTH_FUNC(int,
765 pthreadZurwlockZuinitZa, // pthread_rwlock_init*
766 pthread_rwlock_t* rwlock,
767 const pthread_rwlockattr_t* attr)
768{
bart3772a982008-03-15 08:11:03 +0000769 int ret;
770 int res;
771 OrigFn fn;
772 VALGRIND_GET_ORIG_FN(fn);
773 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_INIT,
774 rwlock, 0, 0, 0, 0);
775 CALL_FN_W_WW(ret, fn, rwlock, attr);
776 return ret;
bart00344642008-03-01 15:27:41 +0000777}
778
779// pthread_rwlock_destroy
780PTH_FUNC(int,
781 pthreadZurwlockZudestroyZa, // pthread_rwlock_destroy*
782 pthread_rwlock_t* rwlock)
783{
bart3772a982008-03-15 08:11:03 +0000784 int ret;
785 int res;
786 OrigFn fn;
787 VALGRIND_GET_ORIG_FN(fn);
788 CALL_FN_W_W(ret, fn, rwlock);
789 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_DESTROY,
790 rwlock, 0, 0, 0, 0);
791 return ret;
bart00344642008-03-01 15:27:41 +0000792}
793
794// pthread_rwlock_rdlock
795PTH_FUNC(int,
796 pthreadZurwlockZurdlockZa, // pthread_rwlock_rdlock*
797 pthread_rwlock_t* rwlock)
798{
bart3772a982008-03-15 08:11:03 +0000799 int ret;
800 int res;
801 OrigFn fn;
802 VALGRIND_GET_ORIG_FN(fn);
803 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_RDLOCK,
804 rwlock, 0, 0, 0, 0);
805 CALL_FN_W_W(ret, fn, rwlock);
806 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_RDLOCK,
807 rwlock, ret == 0, 0, 0, 0);
808 return ret;
bart00344642008-03-01 15:27:41 +0000809}
810
811// pthread_rwlock_wrlock
812PTH_FUNC(int,
813 pthreadZurwlockZuwrlockZa, // pthread_rwlock_wrlock*
814 pthread_rwlock_t* rwlock)
815{
bart3772a982008-03-15 08:11:03 +0000816 int ret;
817 int res;
818 OrigFn fn;
819 VALGRIND_GET_ORIG_FN(fn);
820 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_WRLOCK,
821 rwlock, 0, 0, 0, 0);
822 CALL_FN_W_W(ret, fn, rwlock);
823 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_WRLOCK,
824 rwlock, ret == 0, 0, 0, 0);
825 return ret;
bart00344642008-03-01 15:27:41 +0000826}
827
828// pthread_rwlock_timedrdlock
829PTH_FUNC(int,
830 pthreadZurwlockZutimedrdlockZa, // pthread_rwlock_timedrdlock*
831 pthread_rwlock_t* rwlock)
832{
bart3772a982008-03-15 08:11:03 +0000833 int ret;
834 int res;
835 OrigFn fn;
836 VALGRIND_GET_ORIG_FN(fn);
837 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_RDLOCK,
838 rwlock, 0, 0, 0, 0);
839 CALL_FN_W_W(ret, fn, rwlock);
840 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_RDLOCK,
841 rwlock, ret == 0, 0, 0, 0);
842 return ret;
bart00344642008-03-01 15:27:41 +0000843}
844
845// pthread_rwlock_timedwrlock
846PTH_FUNC(int,
847 pthreadZurwlockZutimedwrlockZa, // pthread_rwlock_timedwrlock*
848 pthread_rwlock_t* rwlock)
849{
bart3772a982008-03-15 08:11:03 +0000850 int ret;
851 int res;
852 OrigFn fn;
853 VALGRIND_GET_ORIG_FN(fn);
854 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_WRLOCK,
855 rwlock, 0, 0, 0, 0);
856 CALL_FN_W_W(ret, fn, rwlock);
857 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_WRLOCK,
858 rwlock, ret == 0, 0, 0, 0);
859 return ret;
bart00344642008-03-01 15:27:41 +0000860}
861
862// pthread_rwlock_tryrdlock
863PTH_FUNC(int,
864 pthreadZurwlockZutryrdlockZa, // pthread_rwlock_tryrdlock*
865 pthread_rwlock_t* rwlock)
866{
bart3772a982008-03-15 08:11:03 +0000867 int ret;
868 int res;
869 OrigFn fn;
870 VALGRIND_GET_ORIG_FN(fn);
871 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_RDLOCK,
872 rwlock, 0, 0, 0, 0);
873 CALL_FN_W_W(ret, fn, rwlock);
874 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_RDLOCK,
875 rwlock, ret == 0, 0, 0, 0);
876 return ret;
bart00344642008-03-01 15:27:41 +0000877}
878
879// pthread_rwlock_trywrlock
880PTH_FUNC(int,
881 pthreadZurwlockZutrywrlockZa, // pthread_rwlock_trywrlock*
882 pthread_rwlock_t* rwlock)
883{
bart3772a982008-03-15 08:11:03 +0000884 int ret;
885 int res;
886 OrigFn fn;
887 VALGRIND_GET_ORIG_FN(fn);
888 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_WRLOCK,
889 rwlock, 0, 0, 0, 0);
890 CALL_FN_W_W(ret, fn, rwlock);
891 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_WRLOCK,
892 rwlock, ret == 0, 0, 0, 0);
893 return ret;
bart00344642008-03-01 15:27:41 +0000894}
895
896// pthread_rwlock_unlock
897PTH_FUNC(int,
898 pthreadZurwlockZuunlockZa, // pthread_rwlock_unlock*
899 pthread_rwlock_t* rwlock)
900{
bart3772a982008-03-15 08:11:03 +0000901 int ret;
902 int res;
903 OrigFn fn;
904 VALGRIND_GET_ORIG_FN(fn);
905 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__PRE_RWLOCK_UNLOCK,
906 rwlock, 0, 0, 0, 0);
907 CALL_FN_W_W(ret, fn, rwlock);
908 VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__POST_RWLOCK_UNLOCK,
909 rwlock, ret == 0, 0, 0, 0);
910 return ret;
bart00344642008-03-01 15:27:41 +0000911}