From 394bfc89632881e72feeccf7e7e5815afc4a88ae Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 12 Nov 2024 14:38:25 +0900 Subject: [PATCH] Use std::recursive_mutex instead of pthread_mutex --- src/another_memcheck.cc | 39 ++++++++++++++++----------------------- src/another_memcheck.h | 6 +----- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/another_memcheck.cc b/src/another_memcheck.cc index be81c14..a5120a9 100644 --- a/src/another_memcheck.cc +++ b/src/another_memcheck.cc @@ -3,6 +3,7 @@ #include #include #include +#include // Local includes. #include "another_memcheck.h" @@ -75,7 +76,7 @@ namespace SC_AM_Internal { return false; } - Stats::Stats() : malloced_list_head(nullptr), malloced_list_tail(nullptr), deferred_node(nullptr), pthread_mutex{.__align=0} { + Stats::Stats() : malloced_list_head(nullptr), malloced_list_tail(nullptr), recursive_mutex(nullptr) { } void Stats::initialize() { @@ -90,7 +91,9 @@ namespace SC_AM_Internal { deferred_node = nullptr; - pthread_mutex_init(&pthread_mutex, nullptr); + recursive_mutex = real_malloc(sizeof(std::recursive_mutex)); + void *unused = new(recursive_mutex) std::recursive_mutex{}; + (void)unused; on_exit([] ([[maybe_unused]] int status, void *ptr) { Stats *stats = reinterpret_cast(ptr); @@ -100,15 +103,14 @@ namespace SC_AM_Internal { } void Stats::cleanup() { - pthread_mutex_destroy(&pthread_mutex); + using std_recursive_mutex = std::recursive_mutex; + ((std::recursive_mutex*)recursive_mutex)->~std_recursive_mutex(); + real_free(recursive_mutex); // TODO maybe cleanup list, but it is the end of the program. } void *Stats::do_malloc(std::size_t size) { - if(int ret = pthread_mutex_lock(&pthread_mutex); ret == EINVAL) { - std::clog << "ERROR: pthread mutex not properly initialized!\n"; - return nullptr; - } + ((std::recursive_mutex*)recursive_mutex)->lock(); void *address = real_malloc(size); if (address != nullptr) { @@ -122,15 +124,12 @@ namespace SC_AM_Internal { ListNode::add_to_list(malloced_list_tail, data); } - pthread_mutex_unlock(&pthread_mutex); + ((std::recursive_mutex*)recursive_mutex)->unlock(); return address; } void *Stats::do_calloc(std::size_t n, std::size_t size) { - if(int ret = pthread_mutex_lock(&pthread_mutex); ret == EINVAL) { - std::clog << "ERROR: pthread mutex not properly initialized!\n"; - return nullptr; - } + ((std::recursive_mutex*)recursive_mutex)->lock(); void *address = real_calloc(n, size); if (address != nullptr) { @@ -144,15 +143,12 @@ namespace SC_AM_Internal { ListNode::add_to_list(malloced_list_tail, data); } - pthread_mutex_unlock(&pthread_mutex); + ((std::recursive_mutex*)recursive_mutex)->unlock(); return address; } void *Stats::do_realloc(void *ptr, std::size_t size) { - if(int ret = pthread_mutex_lock(&pthread_mutex); ret == EINVAL) { - std::clog << "ERROR: pthread mutex not properly initialized!\n"; - return nullptr; - } + ((std::recursive_mutex*)recursive_mutex)->lock(); if (ptr) { if (!ListNode::remove_from_list(malloced_list_head, ptr, this)) { @@ -183,16 +179,13 @@ namespace SC_AM_Internal { } } - pthread_mutex_unlock(&pthread_mutex); + ((std::recursive_mutex*)recursive_mutex)->unlock(); return address; } bool Stats::do_free(void *ptr) { bool result = false; - if(int ret = pthread_mutex_lock(&pthread_mutex); ret == EINVAL) { - std::clog << "ERROR: pthread mutex not properly initialized!\n"; - return result; - } + ((std::recursive_mutex*)recursive_mutex)->lock(); if (ptr) { if (!ListNode::remove_from_list(malloced_list_head, ptr)) { @@ -203,7 +196,7 @@ namespace SC_AM_Internal { } } - pthread_mutex_unlock(&pthread_mutex); + ((std::recursive_mutex*)recursive_mutex)->unlock(); return result; } diff --git a/src/another_memcheck.h b/src/another_memcheck.h index 7b0c950..57c94a6 100644 --- a/src/another_memcheck.h +++ b/src/another_memcheck.h @@ -1,10 +1,6 @@ #ifndef SEODISPARATE_COM_ANOTHER_MEMCHECK_H #define SEODISPARATE_COM_ANOTHER_MEMCHECK_H -extern "C" { -#include -} - namespace SC_AM_Internal { // Forward declaration. struct Stats; @@ -56,7 +52,7 @@ namespace SC_AM_Internal { ListNode *malloced_list_head; ListNode *malloced_list_tail; ListNode *deferred_node; - pthread_mutex_t pthread_mutex; + void *recursive_mutex; void initialize(); void cleanup();