1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _UTIL_H
28#define	_UTIL_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32/*
33 * Utility functions and macros
34 */
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40#include <stdio.h>
41#include <stdarg.h>
42#include <time.h>
43
44extern int _dm_assert(const char *assertion, const char *file, int line,
45    const char *func);
46
47#if defined(__STDC__)
48#if __STDC_VERSION__ - 0 >= 199901L
49#define	dm_assert(EX) (void)((EX) ? 0 : \
50	_dm_assert(#EX, __FILE__, __LINE__, __func__))
51#else
52#define	dm_assert(EX) (void)((EX) ? 0 : \
53	_dm_assert(#EX, __FILE__, __LINE__, NULL))
54#endif /* __STDC_VERSION__ - 0 >= 199901L */
55#else
56#define	dm_assert(EX) (void)((EX) ? 0 : \
57	_dm_assert("EX", __FILE__, __LINE__, NULL))
58#endif  /* __STDC__ */
59
60/*
61 * The following structures comprise the implementation of the
62 * queue structure that's used to construct the list of state
63 * changes.  Removals from the queue are blocking operations that
64 * cause the thread to wait until new entries are added.
65 */
66struct q_node {
67	void			*data;
68	struct q_node		*next;
69};
70
71typedef struct q_head {
72	/*
73	 * Block On Empty (when queue is empty, the calling thread will be
74	 * blocked until something is added)
75	 */
76	boolean_t		boe;
77	pthread_mutex_t		mutex;
78	pthread_cond_t		cvar;
79	void			*(*nalloc)(size_t);
80	void			(*nfree)(void *, size_t);
81	void			(*data_dealloc)(void *);
82	struct q_node		*nodep;
83} qu_t;
84
85typedef enum log_class {
86	MM_CONF		= 0x0001,
87	MM_HPMGR	= 0x0004,
88	MM_SCHGMGR	= 0x0008,
89	MM_MAIN		= 0x0040,
90	MM_TOPO 	= 0x0100,
91	MM_ERR		= 0x0200,
92	MM_WARN		= 0x0400,
93	MM_NOTE		= 0x0800,
94	MM_OTHER	= 0x1000
95} log_class_t;
96
97extern void queue_add(qu_t *qp, void *data);
98extern void *queue_remove(qu_t *qp);
99extern qu_t *new_queue(boolean_t block_on_empty, void *(*nodealloc)(size_t),
100    void (*nodefree)(void *, size_t), void (*deallocator)(void *));
101extern void queue_free(qu_t **qp);
102
103extern void *dmalloc(size_t sz);
104extern void *dzmalloc(size_t sz);
105extern char *dstrdup(const char *s);
106extern void dfree(void *p, size_t sz);
107extern void dstrfree(char *s);
108
109extern void log_msg(log_class_t cl, const char *fmt, ...);
110extern void log_err(const char *fmt, ...);
111extern void log_warn(const char *fmt, ...);
112extern void log_warn_e(const char *fmt, ...);
113extern void vcont(log_class_t cl, const char *fmt, va_list val);
114
115#ifdef	__cplusplus
116}
117#endif
118
119#endif /* _UTIL_H */
120