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