mirror of git://sourceware.org/git/glibc.git
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>
|
2018-03-18 Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||||
|
|
||||||
* sysdeps/mach/hurd/cthreads.c: Include <cthreads.h>.
|
* 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_trywrlock __libc_lock_trylock
|
||||||
#define __libc_rwlock_unlock __libc_lock_unlock
|
#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 */
|
__extern_inline void
|
||||||
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
|
__libc_cleanup_fct (struct __libc_cleanup_frame *framep)
|
||||||
{ \
|
{
|
||||||
typeof (***(FCT)) *__save_FCT = (DOIT) ? (FCT) : 0; \
|
if (framep->__doit)
|
||||||
typeof (ARG) __save_ARG = ARG; \
|
framep->__fct (framep->__argp);
|
||||||
/* 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); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sometimes we have to exit the block in the middle. */
|
/* Start a critical region with a cleanup function */
|
||||||
#define __libc_cleanup_end(DOIT) \
|
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
|
||||||
if ((DOIT) && __save_FCT != 0) \
|
do \
|
||||||
(*__save_FCT)(__save_ARG); \
|
{ \
|
||||||
|
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. */
|
/* Use mutexes as once control variables. */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue