glibc/nptl/cleanup.c
Ulrich Drepper da0c02eee1 Update.
2003-07-08  Jakub Jelinek  <jakub@redhat.com>

	* pthreadP.h (__pthread_unwind_next, __pthread_register_cancel,
	__pthread_unregister_cancel): Add prototypes and hidden_proto.
	* unwind.c (__pthread_unwind_next): Add hidden_def.
	* cleanup.c (__pthread_register_cancel, __pthread_unregister_cancel):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/i486/sem_wait.S (__new_sem_wait):
	Use HIDDEN_JUMPTARGET to jump to __pthread_unwind.
	* sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S (sem_timedwait):
	Likewise.
	* sysdeps/unix/sysv/linux/x86_64/sem_wait.S (sem_wait): Likewise.
	* sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S (sem_timedwait):
	Likewise.
	* sysdeps/unix/sysv/linux/i386/pthread_once.S (__pthread_once): Use
	HIDDEN_JUMPTARGET to call __pthread_register_cancel,
	__pthread_unregister_cancel and __pthread_unwind_next.
2003-07-08 21:08:13 +00:00

50 lines
1.7 KiB
C

/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C 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 the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <stdlib.h>
#include "pthreadP.h"
void
__cleanup_fct_attribute
__pthread_register_cancel (__pthread_unwind_buf_t *buf)
{
struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf;
struct pthread *self = THREAD_SELF;
/* Store old info. */
ibuf->priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf);
ibuf->priv.data.cleanup = THREAD_GETMEM (self, cleanup);
/* Store the new cleanup handler info. */
THREAD_SETMEM (self, cleanup_jmp_buf, (struct pthread_unwind_buf *) buf);
}
hidden_def (__pthread_register_cancel)
void
__cleanup_fct_attribute
__pthread_unregister_cancel (__pthread_unwind_buf_t *buf)
{
struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf;
THREAD_SETMEM (THREAD_SELF, cleanup_jmp_buf, ibuf->priv.data.prev);
}
hidden_def (__pthread_unregister_cancel)