1184610Salfred/*- 2184610Salfred * Copyright 2003 Alexander Kabaev. 3184610Salfred * All rights reserved. 4184610Salfred * 5184610Salfred * Redistribution and use in source and binary forms, with or without 6184610Salfred * modification, are permitted provided that the following conditions 7184610Salfred * are met: 8184610Salfred * 1. Redistributions of source code must retain the above copyright 9184610Salfred * notice, this list of conditions and the following disclaimer. 10184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 11184610Salfred * notice, this list of conditions and the following disclaimer in the 12184610Salfred * documentation and/or other materials provided with the distribution. 13184610Salfred * 14184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15184610Salfred * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16184610Salfred * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17184610Salfred * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18184610Salfred * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19184610Salfred * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20184610Salfred * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21184610Salfred * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22184610Salfred * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23184610Salfred * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24184610Salfred * 25184610Salfred * $FreeBSD$ 26184610Salfred */ 27184610Salfred 28184610Salfred#ifndef _RTLD_LOCK_H_ 29184610Salfred#define _RTLD_LOCK_H_ 30184610Salfred 31184610Salfred#define RTLI_VERSION 0x01 32184610Salfred#define MAX_RTLD_LOCKS 8 33184610Salfred 34184610Salfredstruct RtldLockInfo 35184610Salfred{ 36184610Salfred unsigned int rtli_version; 37188412Sthompsa void *(*lock_create)(void); 38188412Sthompsa void (*lock_destroy)(void *); 39184610Salfred void (*rlock_acquire)(void *); 40184610Salfred void (*wlock_acquire)(void *); 41184610Salfred void (*lock_release)(void *); 42184610Salfred int (*thread_set_flag)(int); 43184610Salfred int (*thread_clr_flag)(int); 44184610Salfred void (*at_fork)(void); 45184610Salfred}; 46184610Salfred 47184610Salfredextern void _rtld_thread_init(struct RtldLockInfo *); 48184610Salfredextern void _rtld_atfork_pre(int *); 49184610Salfredextern void _rtld_atfork_post(int *); 50184610Salfred 51184610Salfred#ifdef IN_RTLD 52184610Salfred 53184610Salfredstruct rtld_lock; 54184610Salfredtypedef struct rtld_lock *rtld_lock_t; 55184610Salfred 56184610Salfredextern rtld_lock_t rtld_bind_lock; 57184610Salfredextern rtld_lock_t rtld_libc_lock; 58184610Salfredextern rtld_lock_t rtld_phdr_lock; 59184610Salfred 60184610Salfred#define RTLD_LOCK_UNLOCKED 0 61184610Salfred#define RTLD_LOCK_RLOCKED 1 62184610Salfred#define RTLD_LOCK_WLOCKED 2 63184610Salfred 64184610Salfredstruct Struct_RtldLockState; 65184610Salfredtypedef struct Struct_RtldLockState RtldLockState; 66184610Salfred 67184610Salfredvoid rlock_acquire(rtld_lock_t, RtldLockState *); 68184610Salfredvoid wlock_acquire(rtld_lock_t, RtldLockState *); 69184610Salfredvoid lock_release(rtld_lock_t, RtldLockState *); 70184610Salfredvoid lock_upgrade(rtld_lock_t, RtldLockState *); 71184610Salfredvoid lock_restart_for_upgrade(RtldLockState *); 72184610Salfred 73184610Salfred#endif /* IN_RTLD */ 74184610Salfred 75184610Salfred#endif 76184610Salfred