1/* $NetBSD: ksem.h,v 1.14 2012/11/25 01:05:04 christos Exp $ */
2
3/*
4 * Copyright (c) 2002 Alfred Perlstein <alfred@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#ifndef _SYS_KSEM_H_
30#define _SYS_KSEM_H_
31
32#include <sys/cdefs.h>
33
34struct timespec;
35
36#ifdef _KERNEL
37#define KSEM_MAX 128
38
39typedef struct ksem {
40 LIST_ENTRY(ksem) ks_entry; /* global list entry */
41 kmutex_t ks_lock; /* lock on this ksem */
42 kcondvar_t ks_cv; /* condition variable */
43 u_int ks_ref; /* number of references */
44 u_int ks_value; /* current value */
45 u_int ks_waiters; /* number of waiters */
46 char * ks_name; /* name, if named */
47 size_t ks_namelen; /* length of name */
48 int ks_flags; /* for KS_UNLINKED */
49 mode_t ks_mode; /* protection bits */
50 uid_t ks_uid; /* creator uid */
51 gid_t ks_gid; /* creator gid */
52} ksem_t;
53
54int do_ksem_init(struct lwp *, unsigned int, intptr_t *, copyout_t);
55int do_ksem_open(struct lwp *, const char *, int, mode_t, unsigned int,
56 intptr_t *, copyout_t);
57int do_ksem_wait(struct lwp *, intptr_t, bool, struct timespec *);
58
59extern int ksem_max;
60#endif
61
62#ifdef _LIBC
63__BEGIN_DECLS
64int _ksem_close(intptr_t);
65int _ksem_destroy(intptr_t);
66int _ksem_getvalue(intptr_t, int *);
67int _ksem_init(unsigned int, intptr_t *);
68int _ksem_open(const char *, int, mode_t, unsigned int, intptr_t *);
69int _ksem_post(intptr_t);
70int _ksem_timedwait(intptr_t, const struct timespec * __restrict);
71int _ksem_trywait(intptr_t);
72int _ksem_unlink(const char *);
73int _ksem_wait(intptr_t);
74__END_DECLS
75#endif /* _LIBC */
76
77#endif /* _SYS_KSEM_H_ */
78