2003-07-01  Ulrich Drepper  <drepper@redhat.com>

	* libc-cancellation.c (__libc_cleanup_routine): Define.
	* sysdeps/pthread/bits/libc-lock.h (__pthread_cleanup_push): Define.
	(__pthread_cleanup_pop): Define.
This commit is contained in:
Ulrich Drepper 2003-07-02 05:13:15 +00:00
parent f036e569ac
commit ca2b4cd7b1
4 changed files with 37 additions and 1 deletions

View File

@ -1 +1 @@
NPTL 0.50 by Ulrich Drepper
NPTL 0.51 by Ulrich Drepper

View File

@ -1,3 +1,9 @@
2003-07-01 Ulrich Drepper <drepper@redhat.com>
* libc-cancellation.c (__libc_cleanup_routine): Define.
* sysdeps/pthread/bits/libc-lock.h (__pthread_cleanup_push): Define.
(__pthread_cleanup_pop): Define.
2003-07-01 Richard Henderson <rth@redhat.com>
* sysdeps/alpha/elf/pt-initfini.c: New file.

View File

@ -21,6 +21,7 @@
#include <stdlib.h>
#include "pthreadP.h"
#include "atomic.h"
#include <bits/libc-lock.h>
#ifndef NOT_IN_libc
@ -103,4 +104,12 @@ __libc_disable_asynccancel (int oldtype)
}
}
void
__libc_cleanup_routine (struct __pthread_cleanup_frame *f)
{
if (f->__do_it)
f->__cancel_routine (f->__cancel_arg);
}
#endif

View File

@ -389,6 +389,27 @@ extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer
} else if (DOIT) \
_buffer.__routine (_buffer.__arg)
/* Normal cleanup handling, based on C cleanup attribute. */
extern inline void
__libc_cleanup_routine (struct __pthread_cleanup_frame *f)
{
if (f->__do_it)
f->__cancel_routine (f->__cancel_arg);
}
#define __pthread_cleanup_push(fct, arg) \
do { \
struct __pthread_cleanup_frame __clframe \
__attribute__ ((__cleanup__ (__libc_cleanup_routine))) \
= { .__cancel_routine = (routine), .__cancel_arg = (arg), \
.__do_it = 1 };
#define __pthread_cleanup_pop(execute) \
__clframe.__do_it = (execute); \
} while (0)
/* Create thread-specific key. */
#define __libc_key_create(KEY, DESTRUCTOR) \
__libc_ptf_call (__pthread_key_create, (KEY, DESTRUCTOR), 1)