1115396Skan/*- 2115396Skan * Copyright 2003 Alexander Kabaev. 3115396Skan * All rights reserved. 4115396Skan * 5115396Skan * Redistribution and use in source and binary forms, with or without 6115396Skan * modification, are permitted provided that the following conditions 7115396Skan * are met: 8115396Skan * 1. Redistributions of source code must retain the above copyright 9115396Skan * notice, this list of conditions and the following disclaimer. 10115396Skan * 2. Redistributions in binary form must reproduce the above copyright 11115396Skan * notice, this list of conditions and the following disclaimer in the 12115396Skan * documentation and/or other materials provided with the distribution. 13115396Skan * 14115396Skan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15115396Skan * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16115396Skan * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17115396Skan * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18115396Skan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19115396Skan * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20115396Skan * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21115396Skan * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22115396Skan * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23115396Skan * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24115396Skan * 25115396Skan * $FreeBSD$ 26115396Skan */ 27115396Skan 28115396Skan#ifndef _RTLD_LOCK_H_ 29115396Skan#define _RTLD_LOCK_H_ 30115396Skan 31115396Skan#define RTLI_VERSION 0x01 32185558Skib#define MAX_RTLD_LOCKS 8 33115396Skan 34115396Skanstruct RtldLockInfo 35115396Skan{ 36115396Skan unsigned int rtli_version; 37116557Smdodd void *(*lock_create)(void); 38115396Skan void (*lock_destroy)(void *); 39115396Skan void (*rlock_acquire)(void *); 40115396Skan void (*wlock_acquire)(void *); 41115396Skan void (*lock_release)(void *); 42115396Skan int (*thread_set_flag)(int); 43115396Skan int (*thread_clr_flag)(int); 44116557Smdodd void (*at_fork)(void); 45115396Skan}; 46115396Skan 47115396Skanextern void _rtld_thread_init(struct RtldLockInfo *); 48185369Skibextern void _rtld_atfork_pre(int *); 49185369Skibextern void _rtld_atfork_post(int *); 50115396Skan 51115396Skan#ifdef IN_RTLD 52115396Skan 53115396Skanstruct rtld_lock; 54115396Skantypedef struct rtld_lock *rtld_lock_t; 55115396Skan 56115396Skanextern rtld_lock_t rtld_bind_lock; 57115396Skanextern rtld_lock_t rtld_libc_lock; 58178807Skibextern rtld_lock_t rtld_phdr_lock; 59115396Skan 60216695Skib#define RTLD_LOCK_UNLOCKED 0 61216695Skib#define RTLD_LOCK_RLOCKED 1 62216695Skib#define RTLD_LOCK_WLOCKED 2 63115396Skan 64216695Skibstruct Struct_RtldLockState; 65216695Skibtypedef struct Struct_RtldLockState RtldLockState; 66216695Skib 67216695Skibvoid rlock_acquire(rtld_lock_t, RtldLockState *); 68216695Skibvoid wlock_acquire(rtld_lock_t, RtldLockState *); 69216695Skibvoid lock_release(rtld_lock_t, RtldLockState *); 70216695Skibvoid lock_upgrade(rtld_lock_t, RtldLockState *); 71216695Skibvoid lock_restart_for_upgrade(RtldLockState *); 72216695Skib 73115396Skan#endif /* IN_RTLD */ 74115396Skan 75115396Skan#endif 76