1f0a75d27SPawel Jakub Dawidek /*
2f0a75d27SPawel Jakub Dawidek  * CDDL HEADER START
3f0a75d27SPawel Jakub Dawidek  *
4f0a75d27SPawel Jakub Dawidek  * The contents of this file are subject to the terms of the
510b9d77bSPawel Jakub Dawidek  * Common Development and Distribution License (the "License").
610b9d77bSPawel Jakub Dawidek  * You may not use this file except in compliance with the License.
7f0a75d27SPawel Jakub Dawidek  *
8f0a75d27SPawel Jakub Dawidek  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9f0a75d27SPawel Jakub Dawidek  * or http://www.opensolaris.org/os/licensing.
10f0a75d27SPawel Jakub Dawidek  * See the License for the specific language governing permissions
11f0a75d27SPawel Jakub Dawidek  * and limitations under the License.
12f0a75d27SPawel Jakub Dawidek  *
13f0a75d27SPawel Jakub Dawidek  * When distributing Covered Code, include this CDDL HEADER in each
14f0a75d27SPawel Jakub Dawidek  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15f0a75d27SPawel Jakub Dawidek  * If applicable, add the following below this CDDL HEADER, with the
16f0a75d27SPawel Jakub Dawidek  * fields enclosed by brackets "[]" replaced with your own identifying
17f0a75d27SPawel Jakub Dawidek  * information: Portions Copyright [yyyy] [name of copyright owner]
18f0a75d27SPawel Jakub Dawidek  *
19f0a75d27SPawel Jakub Dawidek  * CDDL HEADER END
20f0a75d27SPawel Jakub Dawidek  */
2110b9d77bSPawel Jakub Dawidek 
22f0a75d27SPawel Jakub Dawidek /*
2310b9d77bSPawel Jakub Dawidek  * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
24f0a75d27SPawel Jakub Dawidek  */
25f0a75d27SPawel Jakub Dawidek 
26f0a75d27SPawel Jakub Dawidek #ifndef	_SYS_SYSEVENT_H
27f0a75d27SPawel Jakub Dawidek #define	_SYS_SYSEVENT_H
28f0a75d27SPawel Jakub Dawidek 
29f0a75d27SPawel Jakub Dawidek #include <sys/nvpair.h>
30f0a75d27SPawel Jakub Dawidek 
31f0a75d27SPawel Jakub Dawidek #ifdef	__cplusplus
32f0a75d27SPawel Jakub Dawidek extern "C" {
33f0a75d27SPawel Jakub Dawidek #endif
34f0a75d27SPawel Jakub Dawidek 
35f0a75d27SPawel Jakub Dawidek #ifndef	NULL
36f0a75d27SPawel Jakub Dawidek #if defined(_LP64) && !defined(__cplusplus)
37f0a75d27SPawel Jakub Dawidek #define	NULL    0L
38f0a75d27SPawel Jakub Dawidek #else
39f0a75d27SPawel Jakub Dawidek #define	NULL	0
40f0a75d27SPawel Jakub Dawidek #endif
41f0a75d27SPawel Jakub Dawidek #endif
42f0a75d27SPawel Jakub Dawidek 
43f0a75d27SPawel Jakub Dawidek /* Internal registration class and subclass */
44f0a75d27SPawel Jakub Dawidek #define	EC_ALL		"register_all_classes"
45f0a75d27SPawel Jakub Dawidek #define	EC_SUB_ALL	"register_all_subclasses"
46f0a75d27SPawel Jakub Dawidek 
47f0a75d27SPawel Jakub Dawidek /*
48f0a75d27SPawel Jakub Dawidek  * Event allocation/enqueuing sleep/nosleep flags
49f0a75d27SPawel Jakub Dawidek  */
50f0a75d27SPawel Jakub Dawidek #define	SE_SLEEP		0
51f0a75d27SPawel Jakub Dawidek #define	SE_NOSLEEP		1
52f0a75d27SPawel Jakub Dawidek 
53f0a75d27SPawel Jakub Dawidek /* Framework error codes */
54f0a75d27SPawel Jakub Dawidek #define	SE_EINVAL		1	/* Invalid argument */
55f0a75d27SPawel Jakub Dawidek #define	SE_ENOMEM		2	/* Unable to allocate memory */
56f0a75d27SPawel Jakub Dawidek #define	SE_EQSIZE		3	/* Maximum event q size exceeded */
57f0a75d27SPawel Jakub Dawidek #define	SE_EFAULT		4	/* Copy fault */
58f0a75d27SPawel Jakub Dawidek #define	SE_NOTFOUND		5	/* Attribute not found */
59f0a75d27SPawel Jakub Dawidek #define	SE_NO_TRANSPORT		6	/* sysevent transport down */
60f0a75d27SPawel Jakub Dawidek 
61f0a75d27SPawel Jakub Dawidek /* Internal data types */
62f0a75d27SPawel Jakub Dawidek 
63f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_BYTE	DATA_TYPE_BYTE
64f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_INT16	DATA_TYPE_INT16
65f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_UINT16	DATA_TYPE_UINT16
66f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_INT32	DATA_TYPE_INT32
67f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_UINT32	DATA_TYPE_UINT32
68f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_INT64	DATA_TYPE_INT64
69f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_UINT64	DATA_TYPE_UINT64
70f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_STRING	DATA_TYPE_STRING
71f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_BYTES	DATA_TYPE_BYTE_ARRAY
72f0a75d27SPawel Jakub Dawidek #define	SE_DATA_TYPE_TIME	DATA_TYPE_HRTIME
73f0a75d27SPawel Jakub Dawidek 
74f0a75d27SPawel Jakub Dawidek #define	SE_KERN_PID	0
75f0a75d27SPawel Jakub Dawidek 
76f0a75d27SPawel Jakub Dawidek #define	SUNW_VENDOR	"SUNW"
77f0a75d27SPawel Jakub Dawidek #define	SE_USR_PUB	"usr:"
78f0a75d27SPawel Jakub Dawidek #define	SE_KERN_PUB	"kern:"
79f0a75d27SPawel Jakub Dawidek #define	SUNW_KERN_PUB	SUNW_VENDOR ":" SE_KERN_PUB
80f0a75d27SPawel Jakub Dawidek #define	SUNW_USR_PUB	SUNW_VENDOR ":" SE_USR_PUB
81f0a75d27SPawel Jakub Dawidek 
82f0a75d27SPawel Jakub Dawidek /*
83f0a75d27SPawel Jakub Dawidek  * Event header and attribute value limits
84f0a75d27SPawel Jakub Dawidek  */
85f0a75d27SPawel Jakub Dawidek #define	MAX_ATTR_NAME	1024
86f0a75d27SPawel Jakub Dawidek #define	MAX_STRING_SZ	1024
87f0a75d27SPawel Jakub Dawidek #define	MAX_BYTE_ARRAY	1024
88f0a75d27SPawel Jakub Dawidek 
89f0a75d27SPawel Jakub Dawidek #define	MAX_CLASS_LEN		64
90f0a75d27SPawel Jakub Dawidek #define	MAX_SUBCLASS_LEN	64
91f0a75d27SPawel Jakub Dawidek #define	MAX_PUB_LEN		128
92f0a75d27SPawel Jakub Dawidek #define	MAX_CHNAME_LEN		128
93f0a75d27SPawel Jakub Dawidek #define	MAX_SUBID_LEN		16
94f0a75d27SPawel Jakub Dawidek 
95f0a75d27SPawel Jakub Dawidek /*
96f0a75d27SPawel Jakub Dawidek  * Limit for the event payload size
97f0a75d27SPawel Jakub Dawidek  */
98f0a75d27SPawel Jakub Dawidek #define	MAX_EV_SIZE_LEN		(SHRT_MAX/4)
99f0a75d27SPawel Jakub Dawidek 
100f0a75d27SPawel Jakub Dawidek /* Opaque sysevent_t data type */
101f0a75d27SPawel Jakub Dawidek typedef void *sysevent_t;
102f0a75d27SPawel Jakub Dawidek 
103f0a75d27SPawel Jakub Dawidek /* Opaque channel bind data type */
104f0a75d27SPawel Jakub Dawidek typedef void evchan_t;
105f0a75d27SPawel Jakub Dawidek 
106f0a75d27SPawel Jakub Dawidek /* sysevent attribute list */
107f0a75d27SPawel Jakub Dawidek typedef nvlist_t sysevent_attr_list_t;
108f0a75d27SPawel Jakub Dawidek 
109f0a75d27SPawel Jakub Dawidek /* sysevent attribute name-value pair */
110f0a75d27SPawel Jakub Dawidek typedef nvpair_t sysevent_attr_t;
111f0a75d27SPawel Jakub Dawidek 
112f0a75d27SPawel Jakub Dawidek /* Unique event identifier */
113f0a75d27SPawel Jakub Dawidek typedef struct sysevent_id {
114f0a75d27SPawel Jakub Dawidek 	uint64_t eid_seq;
115f0a75d27SPawel Jakub Dawidek 	hrtime_t eid_ts;
116f0a75d27SPawel Jakub Dawidek } sysevent_id_t;
117f0a75d27SPawel Jakub Dawidek 
118f0a75d27SPawel Jakub Dawidek /* Event attribute value structures */
119f0a75d27SPawel Jakub Dawidek typedef struct sysevent_bytes {
120f0a75d27SPawel Jakub Dawidek 	int32_t	size;
121f0a75d27SPawel Jakub Dawidek 	uchar_t	*data;
122f0a75d27SPawel Jakub Dawidek } sysevent_bytes_t;
123f0a75d27SPawel Jakub Dawidek 
124f0a75d27SPawel Jakub Dawidek typedef struct sysevent_value {
125f0a75d27SPawel Jakub Dawidek 	int32_t		value_type;		/* data type */
126f0a75d27SPawel Jakub Dawidek 	union {
127f0a75d27SPawel Jakub Dawidek 		uchar_t		sv_byte;
128f0a75d27SPawel Jakub Dawidek 		int16_t		sv_int16;
129f0a75d27SPawel Jakub Dawidek 		uint16_t	sv_uint16;
130f0a75d27SPawel Jakub Dawidek 		int32_t		sv_int32;
131f0a75d27SPawel Jakub Dawidek 		uint32_t	sv_uint32;
132f0a75d27SPawel Jakub Dawidek 		int64_t		sv_int64;
133f0a75d27SPawel Jakub Dawidek 		uint64_t	sv_uint64;
134f0a75d27SPawel Jakub Dawidek 		hrtime_t	sv_time;
135f0a75d27SPawel Jakub Dawidek 		char		*sv_string;
136f0a75d27SPawel Jakub Dawidek 		sysevent_bytes_t	sv_bytes;
137f0a75d27SPawel Jakub Dawidek 	} value;
138f0a75d27SPawel Jakub Dawidek } sysevent_value_t;
139f0a75d27SPawel Jakub Dawidek 
140f0a75d27SPawel Jakub Dawidek /*
141f0a75d27SPawel Jakub Dawidek  * The following flags determine the memory allocation semantics to use for
142f0a75d27SPawel Jakub Dawidek  * kernel event buffer allocation by userland and kernel versions of
143f0a75d27SPawel Jakub Dawidek  * sysevent_evc_publish().
144f0a75d27SPawel Jakub Dawidek  *
145f0a75d27SPawel Jakub Dawidek  * EVCH_SLEEP and EVCH_NOSLEEP respectively map to KM_SLEEP and KM_NOSLEEP.
146f0a75d27SPawel Jakub Dawidek  * EVCH_TRYHARD is a kernel-only publish flag that allow event allocation
147f0a75d27SPawel Jakub Dawidek  * routines to use use alternate kmem caches in situations where free memory
148f0a75d27SPawel Jakub Dawidek  * may be low.  Kernel callers of sysevent_evc_publish() must set flags to
149f0a75d27SPawel Jakub Dawidek  * one of EVCH_SLEEP, EVCH_NOSLEEP or EVCH_TRYHARD.  Userland callers of
150f0a75d27SPawel Jakub Dawidek  * sysevent_evc_publish() must set flags to one of EVCH_SLEEP or EVCH_NOSLEEP.
151f0a75d27SPawel Jakub Dawidek  *
152f0a75d27SPawel Jakub Dawidek  * EVCH_QWAIT determines whether or not we should wait for slots in the event
153f0a75d27SPawel Jakub Dawidek  * queue at publication time.  EVCH_QWAIT may be used by kernel and userland
154f0a75d27SPawel Jakub Dawidek  * publishers and must be used in conjunction with any of one of EVCH_SLEEP,
155f0a75d27SPawel Jakub Dawidek  * EVCH_NOSLEEP or EVCH_TRYHARD (kernel-only).
156f0a75d27SPawel Jakub Dawidek  */
157f0a75d27SPawel Jakub Dawidek 
158f0a75d27SPawel Jakub Dawidek #define	EVCH_NOSLEEP	0x0001	/* No sleep on kmem_alloc() */
159f0a75d27SPawel Jakub Dawidek #define	EVCH_SLEEP	0x0002	/* Sleep on kmem_alloc() */
160f0a75d27SPawel Jakub Dawidek #define	EVCH_TRYHARD	0x0004	/* May use alternate kmem cache for alloc */
161f0a75d27SPawel Jakub Dawidek #define	EVCH_QWAIT	0x0008	/* Wait for slot in event queue */
162f0a75d27SPawel Jakub Dawidek 
163f0a75d27SPawel Jakub Dawidek /*
16410b9d77bSPawel Jakub Dawidek  * Meaning of flags for subscribe. Bits 8 to 15 are dedicated to
16510b9d77bSPawel Jakub Dawidek  * the consolidation private interface, so flags defined here are restricted
16610b9d77bSPawel Jakub Dawidek  * to the LSB.
16710b9d77bSPawel Jakub Dawidek  *
16810b9d77bSPawel Jakub Dawidek  * EVCH_SUB_KEEP indicates that this subscription should persist even if
16910b9d77bSPawel Jakub Dawidek  * this subscriber id should die unexpectedly; matching events will be
17010b9d77bSPawel Jakub Dawidek  * queued (up to a limit) and will be delivered if/when we restart again
17110b9d77bSPawel Jakub Dawidek  * with the same subscriber id.
172f0a75d27SPawel Jakub Dawidek  */
17310b9d77bSPawel Jakub Dawidek #define	EVCH_SUB_KEEP		0x01
17410b9d77bSPawel Jakub Dawidek 
17510b9d77bSPawel Jakub Dawidek /*
17610b9d77bSPawel Jakub Dawidek  * Subscriptions may be wildcarded, but we limit the number of
17710b9d77bSPawel Jakub Dawidek  * wildcards permitted.
17810b9d77bSPawel Jakub Dawidek  */
17910b9d77bSPawel Jakub Dawidek #define	EVCH_WILDCARD_MAX	10
18010b9d77bSPawel Jakub Dawidek 
18110b9d77bSPawel Jakub Dawidek /*
18210b9d77bSPawel Jakub Dawidek  * Used in unsubscribe to indicate all subscriber ids for a channel.
18310b9d77bSPawel Jakub Dawidek  */
184f0a75d27SPawel Jakub Dawidek #define	EVCH_ALLSUB		"all_subs"
185f0a75d27SPawel Jakub Dawidek 
186f0a75d27SPawel Jakub Dawidek /*
187f0a75d27SPawel Jakub Dawidek  * Meaning of flags parameter of channel bind function
18810b9d77bSPawel Jakub Dawidek  *
18910b9d77bSPawel Jakub Dawidek  * EVCH_CREAT indicates to create a channel if not already present.
19010b9d77bSPawel Jakub Dawidek  *
19110b9d77bSPawel Jakub Dawidek  * EVCH_HOLD_PEND indicates that events should be published to this
19210b9d77bSPawel Jakub Dawidek  * channel even if there are no matching subscribers present; when
19310b9d77bSPawel Jakub Dawidek  * a subscriber belatedly binds to the channel and registers their
19410b9d77bSPawel Jakub Dawidek  * subscriptions they will receive events that predate their bind.
19510b9d77bSPawel Jakub Dawidek  * If the channel is closed, however, with no remaining bindings then
19610b9d77bSPawel Jakub Dawidek  * the channel is destroyed.
19710b9d77bSPawel Jakub Dawidek  *
19810b9d77bSPawel Jakub Dawidek  * EVCH_HOLD_PEND_INDEF is a stronger version of EVCH_HOLD_PEND -
19910b9d77bSPawel Jakub Dawidek  * even if the channel has no remaining bindings it will not be
20010b9d77bSPawel Jakub Dawidek  * destroyed so long as events remain unconsumed.  This is suitable for
20110b9d77bSPawel Jakub Dawidek  * use with short-lived event producers that may bind to (create) the
20210b9d77bSPawel Jakub Dawidek  * channel and exit before the intended consumer has started.
203f0a75d27SPawel Jakub Dawidek  */
20410b9d77bSPawel Jakub Dawidek #define	EVCH_CREAT		0x0001
205f0a75d27SPawel Jakub Dawidek #define	EVCH_HOLD_PEND		0x0002
20610b9d77bSPawel Jakub Dawidek #define	EVCH_HOLD_PEND_INDEF	0x0004
20710b9d77bSPawel Jakub Dawidek #define	EVCH_B_FLAGS		0x0007	/* All valid bits */
208f0a75d27SPawel Jakub Dawidek 
209f0a75d27SPawel Jakub Dawidek /*
210f0a75d27SPawel Jakub Dawidek  * Meaning of commands of evc_control function
211f0a75d27SPawel Jakub Dawidek  */
212f0a75d27SPawel Jakub Dawidek #define	EVCH_GET_CHAN_LEN_MAX	 1	/* Get event queue length limit */
213f0a75d27SPawel Jakub Dawidek #define	EVCH_GET_CHAN_LEN	 2	/* Get event queue length */
214f0a75d27SPawel Jakub Dawidek #define	EVCH_SET_CHAN_LEN	 3	/* Set event queue length */
215f0a75d27SPawel Jakub Dawidek #define	EVCH_CMD_LAST		 EVCH_SET_CHAN_LEN	/* Last command */
216f0a75d27SPawel Jakub Dawidek 
217bc96366cSSteven Hartland #ifdef illumos
218f0a75d27SPawel Jakub Dawidek /*
21910b9d77bSPawel Jakub Dawidek  * Shared user/kernel event channel interface definitions
220f0a75d27SPawel Jakub Dawidek  */
22110b9d77bSPawel Jakub Dawidek extern int sysevent_evc_bind(const char *, evchan_t **, uint32_t);
22210b9d77bSPawel Jakub Dawidek extern int sysevent_evc_unbind(evchan_t *);
22310b9d77bSPawel Jakub Dawidek extern int sysevent_evc_subscribe(evchan_t *, const char *, const char *,
224f0a75d27SPawel Jakub Dawidek     int (*)(sysevent_t *, void *), void *, uint32_t);
22510b9d77bSPawel Jakub Dawidek extern int sysevent_evc_unsubscribe(evchan_t *, const char *);
22610b9d77bSPawel Jakub Dawidek extern int sysevent_evc_publish(evchan_t *, const char *, const char *,
227f0a75d27SPawel Jakub Dawidek     const char *, const char *, nvlist_t *, uint32_t);
22810b9d77bSPawel Jakub Dawidek extern int sysevent_evc_control(evchan_t *, int, ...);
22910b9d77bSPawel Jakub Dawidek extern int sysevent_evc_setpropnvl(evchan_t *, nvlist_t *);
23010b9d77bSPawel Jakub Dawidek extern int sysevent_evc_getpropnvl(evchan_t *, nvlist_t **);
231bc96366cSSteven Hartland #endif	/* illumos */
232f0a75d27SPawel Jakub Dawidek 
23310b9d77bSPawel Jakub Dawidek #ifndef	_KERNEL
23410b9d77bSPawel Jakub Dawidek 
235bc96366cSSteven Hartland #ifdef illumos
23610b9d77bSPawel Jakub Dawidek /*
23710b9d77bSPawel Jakub Dawidek  * Userland-only event channel interfaces
23810b9d77bSPawel Jakub Dawidek  */
23910b9d77bSPawel Jakub Dawidek 
24010b9d77bSPawel Jakub Dawidek #include <door.h>
24110b9d77bSPawel Jakub Dawidek 
24210b9d77bSPawel Jakub Dawidek typedef struct sysevent_subattr sysevent_subattr_t;
24310b9d77bSPawel Jakub Dawidek 
24410b9d77bSPawel Jakub Dawidek extern sysevent_subattr_t *sysevent_subattr_alloc(void);
24510b9d77bSPawel Jakub Dawidek extern void sysevent_subattr_free(sysevent_subattr_t *);
24610b9d77bSPawel Jakub Dawidek 
24710b9d77bSPawel Jakub Dawidek extern void sysevent_subattr_thrattr(sysevent_subattr_t *, pthread_attr_t *);
24810b9d77bSPawel Jakub Dawidek extern void sysevent_subattr_sigmask(sysevent_subattr_t *, sigset_t *);
24910b9d77bSPawel Jakub Dawidek 
25010b9d77bSPawel Jakub Dawidek extern void sysevent_subattr_thrcreate(sysevent_subattr_t *,
25110b9d77bSPawel Jakub Dawidek     door_xcreate_server_func_t *, void *);
25210b9d77bSPawel Jakub Dawidek extern void sysevent_subattr_thrsetup(sysevent_subattr_t *,
25310b9d77bSPawel Jakub Dawidek     door_xcreate_thrsetup_func_t *, void *);
25410b9d77bSPawel Jakub Dawidek 
25510b9d77bSPawel Jakub Dawidek extern int sysevent_evc_xsubscribe(evchan_t *, const char *, const char *,
25610b9d77bSPawel Jakub Dawidek     int (*)(sysevent_t *, void *), void *, uint32_t, sysevent_subattr_t *);
257bc96366cSSteven Hartland #endif	/* illumos */
25810b9d77bSPawel Jakub Dawidek 
25910b9d77bSPawel Jakub Dawidek #else
260f0a75d27SPawel Jakub Dawidek 
261f0a75d27SPawel Jakub Dawidek /*
262f0a75d27SPawel Jakub Dawidek  * Kernel log_event interfaces.
263f0a75d27SPawel Jakub Dawidek  */
26410b9d77bSPawel Jakub Dawidek extern int log_sysevent(sysevent_t *, int, sysevent_id_t *);
265f0a75d27SPawel Jakub Dawidek 
26610b9d77bSPawel Jakub Dawidek extern sysevent_t *sysevent_alloc(char *, char *, char *, int);
26710b9d77bSPawel Jakub Dawidek extern void sysevent_free(sysevent_t *);
26810b9d77bSPawel Jakub Dawidek extern int sysevent_add_attr(sysevent_attr_list_t **, char *,
26910b9d77bSPawel Jakub Dawidek     sysevent_value_t *, int);
27010b9d77bSPawel Jakub Dawidek extern void sysevent_free_attr(sysevent_attr_list_t *);
27110b9d77bSPawel Jakub Dawidek extern int sysevent_attach_attributes(sysevent_t *, sysevent_attr_list_t *);
27210b9d77bSPawel Jakub Dawidek extern void sysevent_detach_attributes(sysevent_t *);
273bc96366cSSteven Hartland #ifdef illumos
27410b9d77bSPawel Jakub Dawidek extern char *sysevent_get_class_name(sysevent_t *);
27510b9d77bSPawel Jakub Dawidek extern char *sysevent_get_subclass_name(sysevent_t *);
27610b9d77bSPawel Jakub Dawidek extern uint64_t sysevent_get_seq(sysevent_t *);
27710b9d77bSPawel Jakub Dawidek extern void sysevent_get_time(sysevent_t *, hrtime_t *);
27810b9d77bSPawel Jakub Dawidek extern size_t sysevent_get_size(sysevent_t *);
27910b9d77bSPawel Jakub Dawidek extern char *sysevent_get_pub(sysevent_t *);
28010b9d77bSPawel Jakub Dawidek extern int sysevent_get_attr_list(sysevent_t *, nvlist_t **);
281bc96366cSSteven Hartland #endif	/* illumos */
282f0a75d27SPawel Jakub Dawidek 
283f0a75d27SPawel Jakub Dawidek #endif	/* _KERNEL */
284f0a75d27SPawel Jakub Dawidek 
285f0a75d27SPawel Jakub Dawidek #ifdef	__cplusplus
286f0a75d27SPawel Jakub Dawidek }
287f0a75d27SPawel Jakub Dawidek #endif
288f0a75d27SPawel Jakub Dawidek 
289f0a75d27SPawel Jakub Dawidek #endif	/* _SYS_SYSEVENT_H */
290