--- /dev/null
+/*
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * Copyright (C) 2013 Mentor Graphics
+ */
+
+/*
+ * Do _not_ define _LGPL_SOURCE because we don't want to create a
+ * circular dependency loop between this malloc wrapper, liburcu and
+ * libc.
+ */
+
+/* Has to be included first to override dlfcn.h */
+#include <common/compat/dlfcn.h>
+
+#include "common/macros.h"
+#include <pthread.h>
+
+#define TRACEPOINT_DEFINE
+#define TRACEPOINT_CREATE_PROBES
+#define TP_IP_PARAM ip
+#include "ust_pthread.h"
+
+static __thread int thread_in_trace;
+
+int pthread_mutex_lock(pthread_mutex_t *mutex)
+{
+ static int (*mutex_lock)(pthread_mutex_t *);
+ int retval;
+
+ if (!mutex_lock) {
+ mutex_lock = dlsym(RTLD_NEXT, "pthread_mutex_lock");
+ if (!mutex_lock) {
+ if (thread_in_trace) {
+ abort();
+ }
+ fprintf(stderr, "unable to initialize pthread wrapper library.\n");
+ return EINVAL;
+ }
+ }
+ if (thread_in_trace) {
+ return mutex_lock(mutex);
+ }
+
+ thread_in_trace = 1;
+ tracepoint(lttng_ust_pthread, pthread_mutex_lock_req, mutex,
+ LTTNG_UST_CALLER_IP());
+ retval = mutex_lock(mutex);
+ tracepoint(lttng_ust_pthread, pthread_mutex_lock_acq, mutex,
+ retval, LTTNG_UST_CALLER_IP());
+ thread_in_trace = 0;
+ return retval;
+}
+
+int pthread_mutex_trylock(pthread_mutex_t *mutex)
+{
+ static int (*mutex_trylock)(pthread_mutex_t *);
+ int retval;
+
+ if (!mutex_trylock) {
+ mutex_trylock = dlsym(RTLD_NEXT, "pthread_mutex_trylock");
+ if (!mutex_trylock) {
+ if (thread_in_trace) {
+ abort();
+ }
+ fprintf(stderr, "unable to initialize pthread wrapper library.\n");
+ return EINVAL;
+ }
+ }
+ if (thread_in_trace) {
+ return mutex_trylock(mutex);
+ }
+
+ thread_in_trace = 1;
+ retval = mutex_trylock(mutex);
+ tracepoint(lttng_ust_pthread, pthread_mutex_trylock, mutex,
+ retval, LTTNG_UST_CALLER_IP());
+ thread_in_trace = 0;
+ return retval;
+}
+
+int pthread_mutex_unlock(pthread_mutex_t *mutex)
+{
+ static int (*mutex_unlock)(pthread_mutex_t *);
+ int retval;
+
+ if (!mutex_unlock) {
+ mutex_unlock = dlsym(RTLD_NEXT, "pthread_mutex_unlock");
+ if (!mutex_unlock) {
+ if (thread_in_trace) {
+ abort();
+ }
+ fprintf(stderr, "unable to initialize pthread wrapper library.\n");
+ return EINVAL;
+ }
+ }
+ if (thread_in_trace) {
+ return mutex_unlock(mutex);
+ }
+
+ thread_in_trace = 1;
+ retval = mutex_unlock(mutex);
+ tracepoint(lttng_ust_pthread, pthread_mutex_unlock, mutex,
+ retval, LTTNG_UST_CALLER_IP());
+ thread_in_trace = 0;
+ return retval;
+}