From 8ca960fa0274018cb4f94a1826029d74e6f762e0 Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Mon, 21 Jun 2021 20:24:03 +0200 Subject: lib, ipcpd, irmd: Wrap pthread unlocks for cleanup This add an ouroboros/pthread.h header that wraps the pthread_..._unlock() functions for cleanup using pthread_cleanup_push() as this casting is not safe (and there were definitely bad casts in the code). The close() function is now also wrapped for cleanup in ouroboros/sockets.h. This allows enabling more compiler checks. Signed-off-by: Dimitri Staessens Signed-off-by: Sander Vrijders --- include/ouroboros/pthread.h | 39 +++++++++++++++++++++++++++++++++++++++ include/ouroboros/sockets.h.in | 3 +++ 2 files changed, 42 insertions(+) create mode 100644 include/ouroboros/pthread.h (limited to 'include') diff --git a/include/ouroboros/pthread.h b/include/ouroboros/pthread.h new file mode 100644 index 00000000..735557d2 --- /dev/null +++ b/include/ouroboros/pthread.h @@ -0,0 +1,39 @@ +/* + * Ouroboros - Copyright (C) 2016 - 2021 + * + * Useful cleanup functions for pthreads + * + * Dimitri Staessens + * Sander Vrijders + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., http://www.fsf.org/about/contact/. + */ + +#ifndef OUROBOROS_PTHREAD_H +#define OUROBOROS_PTHREAD_H + +#include + +/* various cleanup functions for pthread_cleanup_push */ +static void __attribute__((unused)) __cleanup_rwlock_unlock(void * rwlock) +{ + pthread_rwlock_unlock((pthread_rwlock_t *) rwlock); +} + +static void __attribute__((unused)) __cleanup_mutex_unlock(void * mutex) +{ + pthread_mutex_unlock((pthread_mutex_t *) mutex); +} + +#endif /* OUROBOROS_PTHREAD_H */ diff --git a/include/ouroboros/sockets.h.in b/include/ouroboros/sockets.h.in index 857b1353..f1162163 100644 --- a/include/ouroboros/sockets.h.in +++ b/include/ouroboros/sockets.h.in @@ -65,4 +65,7 @@ qosspec_msg_t spec_to_msg(const qosspec_t * qs); qosspec_t msg_to_spec(const qosspec_msg_t * msg); +/* cleanup socket when cancelling thread */ +void __cleanup_close_ptr(void * o); + #endif -- cgit v1.2.3