From 42c7ff94a135b46e28ed99369440c5bcd2b77ef9 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Fri, 27 Oct 2023 03:31:27 +0200 Subject: [PATCH] Missing files, and fix make distcheck --- MANIFEST.in | 7 ++- examples/sthread/pthread-mutex-recursive.c | 65 ++++++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 examples/sthread/pthread-mutex-recursive.c diff --git a/MANIFEST.in b/MANIFEST.in index 1b8ad273d6..610932ba7d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -348,8 +348,6 @@ include examples/cpp/network-ns3/s4u-network-ns3-timed.tesh include examples/cpp/network-ns3/s4u-network-ns3.cpp include examples/cpp/network-wifi/s4u-network-wifi.cpp include examples/cpp/network-wifi/s4u-network-wifi.tesh -include examples/cpp/solar-panel-simple/s4u-solar-panel-simple.cpp -include examples/cpp/solar-panel-simple/s4u-solar-panel-simple.tesh include examples/cpp/platform-comm-serialize/s4u-platform-comm-serialize.cpp include examples/cpp/platform-comm-serialize/s4u-platform-comm-serialize.tesh include examples/cpp/platform-failures/s4u-platform-failures.cpp @@ -380,6 +378,8 @@ include examples/cpp/replay-io/s4u-replay-io.txt include examples/cpp/replay-io/s4u-replay-io_d.xml include examples/cpp/routing-get-clusters/s4u-routing-get-clusters.cpp include examples/cpp/routing-get-clusters/s4u-routing-get-clusters.tesh +include examples/cpp/solar-panel-simple/s4u-solar-panel-simple.cpp +include examples/cpp/solar-panel-simple/s4u-solar-panel-simple.tesh include examples/cpp/synchro-barrier/s4u-mc-synchro-barrier.tesh include examples/cpp/synchro-barrier/s4u-synchro-barrier.cpp include examples/cpp/synchro-barrier/s4u-synchro-barrier.tesh @@ -643,9 +643,12 @@ include examples/smpi/trace_call_location/trace_call_location.c include examples/smpi/trace_call_location/trace_call_location.tesh include examples/smpi/trace_simple/trace_simple.c include examples/smpi/trace_simple/trace_simple.tesh +include examples/sthread/pthread-mc-mutex-recursive.tesh include examples/sthread/pthread-mc-mutex-simple.tesh include examples/sthread/pthread-mc-mutex-simpledeadlock.tesh include examples/sthread/pthread-mc-producer-consumer.tesh +include examples/sthread/pthread-mutex-recursive.c +include examples/sthread/pthread-mutex-recursive.tesh include examples/sthread/pthread-mutex-simple.c include examples/sthread/pthread-mutex-simple.tesh include examples/sthread/pthread-mutex-simpledeadlock.c diff --git a/examples/sthread/pthread-mutex-recursive.c b/examples/sthread/pthread-mutex-recursive.c new file mode 100644 index 0000000000..482cf3ee7f --- /dev/null +++ b/examples/sthread/pthread-mutex-recursive.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2002-2023. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +/* Code with both recursive and non-recursive mutexes */ + +#include +#include +#include + +// Structure to hold the mutex's name and pointer to the actual mutex +typedef struct { + const char* name; + pthread_mutex_t* mutex; +} ThreadData; + +static void* thread_function(void* arg) +{ + ThreadData* data = (ThreadData*)arg; + pthread_mutex_t* mutex = data->mutex; + const char* name = data->name; + + pthread_mutex_lock(mutex); + fprintf(stderr, "Got the lock on the %s mutex.\n", name); + + // Attempt to relock the mutex - This behavior depends on the mutex type + if (pthread_mutex_trylock(mutex) == 0) { + fprintf(stderr, "Got the lock again on the %s mutex.\n", name); + pthread_mutex_unlock(mutex); + } else { + fprintf(stderr, "Failed to relock the %s mutex.\n", name); + } + + pthread_mutex_unlock(mutex); + + // pthread_exit(NULL); TODO: segfaulting + return NULL; +} + +int main() +{ + pthread_t thread1, thread2; + pthread_mutex_t mutex_dflt = PTHREAD_MUTEX_INITIALIZER; // Non-recursive mutex + + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_t mutex_rec; + pthread_mutex_init(&mutex_rec, &attr); + + ThreadData data1 = {"default", &mutex_dflt}; + ThreadData data2 = {"recursive", &mutex_rec}; + + pthread_create(&thread1, NULL, thread_function, &data1); + pthread_create(&thread2, NULL, thread_function, &data2); + + pthread_join(thread1, NULL); + pthread_join(thread2, NULL); + + pthread_mutex_destroy(&mutex_dflt); + pthread_mutex_destroy(&mutex_rec); + + return 0; +} -- 2.20.1