summaryrefslogtreecommitdiffstats
path: root/contrib/ngatm/libngatm/unicust.h
blob: ff028a65a8e69f7f0dbbc3e0f90e4f2687b2d902 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Copyright (c) 2001-2003
 *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
 * 	All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * Author: Hartmut Brandt <harti@freebsd.org>
 *
 * $Begemot: libunimsg/libngatm/unicust.h,v 1.4 2003/09/19 13:10:35 hbb Exp $
 *
 * Customisation of signalling source to user space.
 */
#include <sys/types.h>
#include <sys/queue.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define ASSERT(E, M) assert(E)

static __inline__ void *
mzalloc(size_t s)
{
	void *ptr = malloc(s);

	if (ptr)
		bzero(ptr, s);
	return (ptr);
}

#define INS_ALLOC()	mzalloc(sizeof(struct uni))
#define INS_FREE(P)	free(P)

#define UNI_ALLOC()	mzalloc(sizeof(struct uni_all))
#define UNI_FREE(P)	free(P)

#define SIG_ALLOC()	mzalloc(sizeof(struct sig))
#define SIG_FREE(P)	free(P)

#define CALL_ALLOC()	mzalloc(sizeof(struct call))
#define CALL_FREE(P)	free(P)

#define PARTY_ALLOC()	mzalloc(sizeof(struct party))
#define PARTY_FREE(P)	free(P)

/*
 * Timers
 */
struct uni_timer {
	void *c;
};

#define _TIMER_INIT(X,T)	(X)->T.c = NULL
#define _TIMER_DESTROY(U,F)	_TIMER_STOP(U,F)
#define _TIMER_STOP(U,F)					\
    do {							\
	if (F.c != NULL) {					\
		(U)->funcs->stop_timer(U, U->arg, F.c);		\
		F.c = NULL;					\
	}							\
    } while(0)
#define _TIMER_START(UNI,ARG,FIELD,DUE,FUNC)			\
	(void)(FIELD.c = (UNI)->funcs->start_timer(UNI,		\
	    UNI->arg, DUE, FUNC, ARG))

#define TIMER_ISACT(X,T)	(X->T.c != NULL)

#define TIMER_FUNC_UNI(T,F)						\
static void F(struct uni *);						\
static void								\
_##T##_func(void *varg)							\
{									\
	struct uni *uni = (struct uni *)varg;				\
	uni->T.c = NULL;						\
	(F)(uni);							\
}

/*
 * Be careful: call may be invalid after the call to F
 */
#define TIMER_FUNC_CALL(T,F)						\
static void F(struct call *);						\
static void								\
_##T##_func(void *varg)							\
{									\
	struct call *call = (struct call *)varg;			\
	call->T.c = NULL;						\
	(F)(call);							\
}

/*
 * Be careful: call/party may be invalid after the call to F
 */
#define TIMER_FUNC_PARTY(T,F)						\
static void F(struct party *);						\
static void								\
_##T##_func(void *varg)							\
{									\
	struct party *party = (struct party *)varg;			\
	party->T.c = NULL;						\
	(F)(party);							\
}
OpenPOWER on IntegriCloud