1/*	$NetBSD: rumpuser_int.h,v 1.3 2010/05/18 14:58:41 pooka Exp $	*/
2
3/*
4 * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <stdlib.h>
29
30#include <rump/rumpuser.h>
31
32extern kernel_lockfn rumpuser__klock;
33extern kernel_unlockfn rumpuser__kunlock;
34extern int rumpuser__wantthreads;
35
36#define seterror(value) do { if (error) *error = value;} while (/*CONSTCOND*/0)
37
38#define KLOCK_WRAP(a)							\
39do {									\
40	int nlocks;							\
41	rumpuser__kunlock(0, &nlocks, NULL);				\
42	a;								\
43	rumpuser__klock(nlocks, NULL);					\
44} while (/*CONSTCOND*/0)
45
46#define DOCALL(rvtype, call)						\
47{									\
48	rvtype rv;							\
49	rv = call;							\
50	if (rv == -1)							\
51		seterror(errno);					\
52	else								\
53		seterror(0);						\
54	return rv;							\
55}
56
57#define DOCALL_KLOCK(rvtype, call)					\
58{									\
59	rvtype rv;							\
60	int nlocks;							\
61	rumpuser__kunlock(0, &nlocks, NULL);				\
62	rv = call;							\
63	rumpuser__klock(nlocks, NULL);					\
64	if (rv == -1)							\
65		seterror(errno);					\
66	else								\
67		seterror(0);						\
68	return rv;							\
69}
70