/* Copyright (C) 2015 Free Software Foundation, Inc. This file is part of the GNU C Library. 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, see . */ #ifdef HAVE_ASM_SECONDARY_DIRECTIVE # define pthread_mutex_lock __rename_pthread_mutex_lock # define pthread_mutex_unlock __rename_pthread_mutex_unlock # include # include # undef pthread_mutex_lock # undef pthread_mutex_unlock static void __attribute__ ((unused)) pthread_secondary_void (void) { } static int __attribute__ ((unused)) pthread_secondary_zero (void) { return 0; } static int __attribute__ ((unused)) pthread_secondary_einval (void) { return EINVAL; } /* Use STB_SECONDARY on pthread functions in libc so that they are used only when libpthread is not used. */ asm (".secondary _pthread_cleanup_push_defer"); strong_alias (pthread_secondary_void, _pthread_cleanup_push_defer) asm (".secondary _pthread_cleanup_pop_restore"); void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer, int execute) { if (execute) buffer->__routine (buffer->__arg); } asm (".secondary __pthread_cleanup_upto"); strong_alias (pthread_secondary_void, __pthread_cleanup_upto) asm (".secondary __pthread_getspecific"); strong_alias (pthread_secondary_zero, __pthread_getspecific) asm (".secondary __pthread_setspecific"); strong_alias (pthread_secondary_einval, __pthread_setspecific) asm (".secondary __pthread_key_create"); strong_alias (pthread_secondary_einval, __pthread_key_create) asm (".secondary __pthread_mutex_lock"); strong_alias (pthread_secondary_zero, __pthread_mutex_lock) asm (".secondary __pthread_mutex_unlock"); strong_alias (pthread_secondary_zero, __pthread_mutex_unlock) asm (".secondary __pthread_once"); asm (".secondary pthread_once"); int __pthread_once (pthread_once_t *once_control, void (*init_routine) (void)) { if (*once_control == PTHREAD_ONCE_INIT) { init_routine (); *once_control |= 2; } return 0; } strong_alias (__pthread_once, pthread_once) asm (".secondary __pthread_rwlock_rdlock"); strong_alias (pthread_secondary_zero, __pthread_rwlock_rdlock) asm (".secondary __pthread_rwlock_unlock"); strong_alias (pthread_secondary_zero, __pthread_rwlock_unlock) asm (".secondary __pthread_rwlock_wrlock"); strong_alias (pthread_secondary_zero, __pthread_rwlock_wrlock) asm (".secondary __pthread_unwind"); void __attribute ((noreturn)) __cleanup_fct_attribute attribute_compat_text_section __pthread_unwind (__pthread_unwind_buf_t *buf) { /* We cannot call abort() here. */ typedef __typeof (__safe_fatal) *fn_noreturn __attribute ((noreturn)); fn_noreturn fn = (fn_noreturn) __safe_fatal; fn (); } # ifndef SHARED asm (".secondary __pthread_setcancelstate"); strong_alias (pthread_secondary_zero, __pthread_setcancelstate) asm (".secondary pthread_mutex_lock"); strong_alias (__pthread_mutex_lock, pthread_mutex_lock) asm (".secondary pthread_mutex_unlock"); strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock) asm (".secondary __pthread_rwlock_destroy"); strong_alias (pthread_secondary_zero, __pthread_rwlock_destroy) asm (".secondary __pthread_rwlock_init"); strong_alias (pthread_secondary_zero, __pthread_rwlock_init) # endif #endif