mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 10:22:41 +08:00
hurd: Rewrite __libc_cleanup_*
This makes it notably safe against 'return' and such, and used for __libc_cleanup_push/pop. * sysdeps/mach/libc-lock.h (__libc_cleanup_frame): Define structure. (__libc_cleanup_fct): Define function. (__libc_cleanup_region_start, __libc_cleanup_region_end, __libc_cleanup_end): Rewrite implementation using __attribute__ ((__cleanup__)). (__libc_cleanup_push, __libc_cleanup_pop): New macros.
This commit is contained in:
parent
9a37922ee0
commit
542c20a171
@ -1,3 +1,12 @@
|
||||
2018-03-18 Agustina Arzille <avarzille@riseup.net>
|
||||
|
||||
* sysdeps/mach/libc-lock.h (__libc_cleanup_frame): Define structure.
|
||||
(__libc_cleanup_fct): Define function.
|
||||
(__libc_cleanup_region_start, __libc_cleanup_region_end,
|
||||
__libc_cleanup_end): Rewrite implementation using
|
||||
__attribute__ ((__cleanup__)).
|
||||
(__libc_cleanup_push, __libc_cleanup_pop): New macros.
|
||||
|
||||
2018-03-18 Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
|
||||
* sysdeps/mach/hurd/cthreads.c: Include <cthreads.h>.
|
||||
|
@ -73,25 +73,38 @@ typedef cthread_key_t __libc_key_t;
|
||||
#define __libc_rwlock_trywrlock __libc_lock_trylock
|
||||
#define __libc_rwlock_unlock __libc_lock_unlock
|
||||
|
||||
struct __libc_cleanup_frame
|
||||
{
|
||||
void (*__fct) (void *);
|
||||
void *__argp;
|
||||
int __doit;
|
||||
};
|
||||
|
||||
/* Start a critical region with a cleanup function */
|
||||
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
|
||||
{ \
|
||||
typeof (***(FCT)) *__save_FCT = (DOIT) ? (FCT) : 0; \
|
||||
typeof (ARG) __save_ARG = ARG; \
|
||||
/* close brace is in __libc_cleanup_region_end below. */
|
||||
|
||||
/* End a critical region started with __libc_cleanup_region_start. */
|
||||
#define __libc_cleanup_region_end(DOIT) \
|
||||
if ((DOIT) && __save_FCT != 0) \
|
||||
(*__save_FCT)(__save_ARG); \
|
||||
__extern_inline void
|
||||
__libc_cleanup_fct (struct __libc_cleanup_frame *framep)
|
||||
{
|
||||
if (framep->__doit)
|
||||
framep->__fct (framep->__argp);
|
||||
}
|
||||
|
||||
/* Sometimes we have to exit the block in the middle. */
|
||||
#define __libc_cleanup_end(DOIT) \
|
||||
if ((DOIT) && __save_FCT != 0) \
|
||||
(*__save_FCT)(__save_ARG); \
|
||||
/* Start a critical region with a cleanup function */
|
||||
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
|
||||
do \
|
||||
{ \
|
||||
struct __libc_cleanup_frame __cleanup \
|
||||
__attribute__ ((__cleanup__ (__libc_cleanup_fct))) = \
|
||||
{ .__fct = (FCT), .__argp = (ARG), .__doit = (DOIT) };
|
||||
|
||||
/* This one closes the brace above. */
|
||||
#define __libc_cleanup_region_end(DOIT) \
|
||||
__cleanup.__doit = (DOIT); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
#define __libc_cleanup_end(DOIT) __cleanup.__doit = (DOIT);
|
||||
|
||||
#define __libc_cleanup_push(fct, arg) __libc_cleanup_region_start (1, fct, arg)
|
||||
#define __libc_cleanup_pop(execute) __libc_cleanup_region_end (execute)
|
||||
|
||||
/* Use mutexes as once control variables. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user