19e39c5baSBill Taylor /*
29e39c5baSBill Taylor  * CDDL HEADER START
39e39c5baSBill Taylor  *
49e39c5baSBill Taylor  * The contents of this file are subject to the terms of the
59e39c5baSBill Taylor  * Common Development and Distribution License (the "License").
69e39c5baSBill Taylor  * You may not use this file except in compliance with the License.
79e39c5baSBill Taylor  *
89e39c5baSBill Taylor  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e39c5baSBill Taylor  * or http://www.opensolaris.org/os/licensing.
109e39c5baSBill Taylor  * See the License for the specific language governing permissions
119e39c5baSBill Taylor  * and limitations under the License.
129e39c5baSBill Taylor  *
139e39c5baSBill Taylor  * When distributing Covered Code, include this CDDL HEADER in each
149e39c5baSBill Taylor  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e39c5baSBill Taylor  * If applicable, add the following below this CDDL HEADER, with the
169e39c5baSBill Taylor  * fields enclosed by brackets "[]" replaced with your own identifying
179e39c5baSBill Taylor  * information: Portions Copyright [yyyy] [name of copyright owner]
189e39c5baSBill Taylor  *
199e39c5baSBill Taylor  * CDDL HEADER END
209e39c5baSBill Taylor  */
219e39c5baSBill Taylor 
229e39c5baSBill Taylor /*
239e39c5baSBill Taylor  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
249e39c5baSBill Taylor  */
259e39c5baSBill Taylor 
269e39c5baSBill Taylor /*
279e39c5baSBill Taylor  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
289e39c5baSBill Taylor  * Use is subject to license terms.
299e39c5baSBill Taylor  */
309e39c5baSBill Taylor 
319e39c5baSBill Taylor /*
329e39c5baSBill Taylor  *
339e39c5baSBill Taylor  * HEADER: dapl_osd.h
349e39c5baSBill Taylor  *
359e39c5baSBill Taylor  * PURPOSE: Operating System Dependent layer
369e39c5baSBill Taylor  * Description:
379e39c5baSBill Taylor  *	Provide OS dependent data structures & functions with
389e39c5baSBill Taylor  *	a canonical DAPL interface. Designed to be portable
399e39c5baSBill Taylor  *	and hide OS specific quirks of common functions.
409e39c5baSBill Taylor  *
419e39c5baSBill Taylor  * $Id: dapl_osd.h,v 1.38 2003/08/20 14:08:57 sjs2 Exp $
429e39c5baSBill Taylor  */
439e39c5baSBill Taylor 
449e39c5baSBill Taylor #ifndef _DAPL_OSD_H_
459e39c5baSBill Taylor #define	_DAPL_OSD_H_
469e39c5baSBill Taylor 
479e39c5baSBill Taylor #ifdef __cplusplus
489e39c5baSBill Taylor extern "C" {
499e39c5baSBill Taylor #endif
509e39c5baSBill Taylor 
519e39c5baSBill Taylor /*
529e39c5baSBill Taylor  * <assert.h> keys off of NDEBUG
539e39c5baSBill Taylor  */
549e39c5baSBill Taylor #ifdef	DAPL_DBG
559e39c5baSBill Taylor #undef	NDEBUG
569e39c5baSBill Taylor #else
579e39c5baSBill Taylor #define	NDEBUG
589e39c5baSBill Taylor #endif
599e39c5baSBill Taylor 
609e39c5baSBill Taylor #include <dat/udat.h>
619e39c5baSBill Taylor #include <assert.h>
629e39c5baSBill Taylor #include <errno.h>
639e39c5baSBill Taylor #include <pthread.h>
649e39c5baSBill Taylor #include <semaphore.h>
659e39c5baSBill Taylor #include <stdio.h>
669e39c5baSBill Taylor #include <stdlib.h>
679e39c5baSBill Taylor #include <string.h>
689e39c5baSBill Taylor #include <stdarg.h>
699e39c5baSBill Taylor #include <time.h>
709e39c5baSBill Taylor #include <syslog.h>
719e39c5baSBill Taylor #include <netdb.h>
729e39c5baSBill Taylor #include <atomic.h>
739e39c5baSBill Taylor #include "dapl_debug.h"
749e39c5baSBill Taylor 
759e39c5baSBill Taylor /*
769e39c5baSBill Taylor  * networking related headers
779e39c5baSBill Taylor  */
789e39c5baSBill Taylor #include <unistd.h>
799e39c5baSBill Taylor #include <fcntl.h>
809e39c5baSBill Taylor #include <sys/types.h>
819e39c5baSBill Taylor #include <sys/socket.h>
829e39c5baSBill Taylor #include <ctype.h>
839e39c5baSBill Taylor #include <arpa/inet.h>
849e39c5baSBill Taylor 
859e39c5baSBill Taylor #ifndef _INLINE_
869e39c5baSBill Taylor #define	_INLINE_
879e39c5baSBill Taylor #endif /* _INLINE_ */
889e39c5baSBill Taylor 
899e39c5baSBill Taylor /*
909e39c5baSBill Taylor  * initialization function
919e39c5baSBill Taylor  */
929e39c5baSBill Taylor void dapl_os_init(void);
939e39c5baSBill Taylor 
949e39c5baSBill Taylor #define	dapl_os_panic(args) 			\
959e39c5baSBill Taylor {					\
969e39c5baSBill Taylor 	fprintf(stderr, "PANIC in %s:%i:\n", __FILE__, __LINE__); \
979e39c5baSBill Taylor 	fprintf(stderr, args);			\
989e39c5baSBill Taylor 	exit(1);				\
999e39c5baSBill Taylor }
1009e39c5baSBill Taylor 
1019e39c5baSBill Taylor int dapl_os_get_env_bool(
1029e39c5baSBill Taylor 	char		*env_str);
1039e39c5baSBill Taylor 
1049e39c5baSBill Taylor int dapl_os_get_env_val(
1059e39c5baSBill Taylor 	char		*env_str,
1069e39c5baSBill Taylor 	int		def_val);
1079e39c5baSBill Taylor 
1089e39c5baSBill Taylor /*
1099e39c5baSBill Taylor  * Atomic operations
1109e39c5baSBill Taylor  */
1119e39c5baSBill Taylor typedef volatile DAT_COUNT DAPL_ATOMIC;
1129e39c5baSBill Taylor 
1139e39c5baSBill Taylor /*
1149e39c5baSBill Taylor  * dapl_os_atomic_inc
1159e39c5baSBill Taylor  *
1169e39c5baSBill Taylor  * get the current value of '*v', and then increment it.
1179e39c5baSBill Taylor  *
1189e39c5baSBill Taylor  * This is equivalent to an IB atomic fetch and add of 1,
1199e39c5baSBill Taylor  * except that a DAT_COUNT might be 32 bits, rather than 64
1209e39c5baSBill Taylor  * and it occurs in local memory.
1219e39c5baSBill Taylor  *
122*fb4cdc19SToomas Soome  * void dapl_os_atomic_inc(INOUT	DAPL_ATOMIC *v)
1239e39c5baSBill Taylor  */
124*fb4cdc19SToomas Soome #define	dapl_os_atomic_inc(v)	atomic_add_32((uint32_t *)(v), 1)
1259e39c5baSBill Taylor 
1269e39c5baSBill Taylor /*
1279e39c5baSBill Taylor  * dapl_os_atomic_dec
1289e39c5baSBill Taylor  *
1299e39c5baSBill Taylor  * decrement the current value of '*v'. No return value is required.
1309e39c5baSBill Taylor  *
131*fb4cdc19SToomas Soome  * void dapl_os_atomic_dec(INOUT	DAPL_ATOMIC *v)
1329e39c5baSBill Taylor  */
1339e39c5baSBill Taylor #define	dapl_os_atomic_dec(v)	assert(*v != 0);		\
134*fb4cdc19SToomas Soome 				atomic_add_32((uint32_t *)(v), -1)
1359e39c5baSBill Taylor 
1369e39c5baSBill Taylor /*
1379e39c5baSBill Taylor  * dapl_os_atomic_assign
1389e39c5baSBill Taylor  *
1399e39c5baSBill Taylor  * assign 'new_value' to '*v' if the current value
1409e39c5baSBill Taylor  * matches the provided 'match_value'.
1419e39c5baSBill Taylor  *
1429e39c5baSBill Taylor  * Make no assignment if there is no match.
1439e39c5baSBill Taylor  *
1449e39c5baSBill Taylor  * Return the current value in any case.
1459e39c5baSBill Taylor  *
1469e39c5baSBill Taylor  * This matches the IBTA atomic operation compare & swap
1479e39c5baSBill Taylor  * except that it is for local memory and a DAT_COUNT may
1489e39c5baSBill Taylor  * be only 32 bits, rather than 64.
1499e39c5baSBill Taylor  *
1509e39c5baSBill Taylor  * DAT_COUNT dapl_os_atomic_assign(INOUT DAPL_ATOMIC *v,
1519e39c5baSBill Taylor  *	IN DAT_COUNT match_value, IN DAT_COUNT new_value)
1529e39c5baSBill Taylor  */
1539e39c5baSBill Taylor #define	dapl_os_atomic_assign(v, match_value, new_value)		\
1549e39c5baSBill Taylor 		atomic_cas_32((uint32_t *)(v), (uint32_t)(match_value),	\
1559e39c5baSBill Taylor 		    (uint32_t)(new_value))
1569e39c5baSBill Taylor 
1579e39c5baSBill Taylor /*
1589e39c5baSBill Taylor  * Thread Functions
1599e39c5baSBill Taylor  */
1609e39c5baSBill Taylor typedef pthread_t		DAPL_OS_THREAD;
1619e39c5baSBill Taylor 
1629e39c5baSBill Taylor DAT_RETURN
1639e39c5baSBill Taylor dapl_os_thread_create(
1649e39c5baSBill Taylor 	IN  void			(*func)	(void *),
1659e39c5baSBill Taylor 	IN  void			*data,
1669e39c5baSBill Taylor 	OUT DAPL_OS_THREAD		*thread_id);
1679e39c5baSBill Taylor 
1689e39c5baSBill Taylor 
1699e39c5baSBill Taylor /*
1709e39c5baSBill Taylor  * Lock Functions
1719e39c5baSBill Taylor  */
1729e39c5baSBill Taylor 
1739e39c5baSBill Taylor typedef pthread_mutex_t 	DAPL_OS_LOCK;
1749e39c5baSBill Taylor 
1759e39c5baSBill Taylor /*
1769e39c5baSBill Taylor  * DAT_RETURN dapl_os_lock_init(IN DAPL_OS_LOCK *m)
1779e39c5baSBill Taylor  */
1789e39c5baSBill Taylor #define	dapl_os_lock_init(m)	(void)					\
1799e39c5baSBill Taylor 				((0 == pthread_mutex_init((m), NULL)) ?	\
1809e39c5baSBill Taylor 					DAT_SUCCESS :			\
1819e39c5baSBill Taylor 					(DAT_CLASS_ERROR | DAT_INTERNAL_ERROR))
1829e39c5baSBill Taylor 
1839e39c5baSBill Taylor /* DAT_RETURN dapl_os_lock(IN DAPL_OS_LOCK *m) */
1849e39c5baSBill Taylor #define	dapl_os_lock(m)		((DAT_RETURN)(				\
1859e39c5baSBill Taylor 				(0 == pthread_mutex_lock((m))) ?	\
1869e39c5baSBill Taylor 					DAT_SUCCESS :			\
1879e39c5baSBill Taylor 					(DAT_CLASS_ERROR | DAT_INTERNAL_ERROR)))
1889e39c5baSBill Taylor 
1899e39c5baSBill Taylor /* DAT_RETURN dapl_os_unlock(IN DAPL_OS_LOCK *m) */
1909e39c5baSBill Taylor #define	dapl_os_unlock(m)	((DAT_RETURN)(				\
1919e39c5baSBill Taylor 				(0 == pthread_mutex_unlock((m))) ?	\
1929e39c5baSBill Taylor 					DAT_SUCCESS :			\
1939e39c5baSBill Taylor 					(DAT_CLASS_ERROR | DAT_INTERNAL_ERROR)))
1949e39c5baSBill Taylor 
1959e39c5baSBill Taylor /* DAT_RETURN dapl_os_lock_destroy(IN DAPL_OS_LOCK *m) */
1969e39c5baSBill Taylor #define	dapl_os_lock_destroy(m)	((DAT_RETURN)(				\
1979e39c5baSBill Taylor 				(0 == pthread_mutex_destroy((m))) ?	\
1989e39c5baSBill Taylor 					DAT_SUCCESS :			\
1999e39c5baSBill Taylor 					(DAT_CLASS_ERROR | DAT_INTERNAL_ERROR)))
2009e39c5baSBill Taylor /*
2019e39c5baSBill Taylor  * Wait Objects
2029e39c5baSBill Taylor  */
2039e39c5baSBill Taylor 
2049e39c5baSBill Taylor /*
2059e39c5baSBill Taylor  * The wait object invariant: Presuming a call to dapl_os_wait_object_wait
2069e39c5baSBill Taylor  * occurs at some point, there will be at least one wakeup after each call
2079e39c5baSBill Taylor  * to dapl_os_wait_object_signal.  I.e. Signals are not ignored, though
2089e39c5baSBill Taylor  * they may be coallesced.
2099e39c5baSBill Taylor  */
2109e39c5baSBill Taylor 
2119e39c5baSBill Taylor typedef struct
2129e39c5baSBill Taylor {
2139e39c5baSBill Taylor     DAT_BOOLEAN		signaled;
2149e39c5baSBill Taylor     pthread_cond_t	cv;
2159e39c5baSBill Taylor     pthread_mutex_t	lock;
2169e39c5baSBill Taylor } DAPL_OS_WAIT_OBJECT;
2179e39c5baSBill Taylor 
2189e39c5baSBill Taylor /* function prototypes */
2199e39c5baSBill Taylor DAT_RETURN
2209e39c5baSBill Taylor dapl_os_wait_object_init(
2219e39c5baSBill Taylor     IN DAPL_OS_WAIT_OBJECT *wait_obj);
2229e39c5baSBill Taylor 
2239e39c5baSBill Taylor DAT_RETURN
2249e39c5baSBill Taylor dapl_os_wait_object_wait(
2259e39c5baSBill Taylor     IN	DAPL_OS_WAIT_OBJECT *wait_obj,
2269e39c5baSBill Taylor     IN  DAT_TIMEOUT timeout_val);
2279e39c5baSBill Taylor 
2289e39c5baSBill Taylor DAT_RETURN
2299e39c5baSBill Taylor dapl_os_wait_object_wakeup(
2309e39c5baSBill Taylor     IN	DAPL_OS_WAIT_OBJECT *wait_obj);
2319e39c5baSBill Taylor 
2329e39c5baSBill Taylor DAT_RETURN
2339e39c5baSBill Taylor dapl_os_wait_object_destroy(
2349e39c5baSBill Taylor     IN	DAPL_OS_WAIT_OBJECT *wait_obj);
2359e39c5baSBill Taylor 
2369e39c5baSBill Taylor /*
2379e39c5baSBill Taylor  * Memory Functions
2389e39c5baSBill Taylor  */
2399e39c5baSBill Taylor 
2409e39c5baSBill Taylor /* void *dapl_os_alloc(int size) */
2419e39c5baSBill Taylor #define	dapl_os_alloc(size)	malloc((size))
2429e39c5baSBill Taylor 
2439e39c5baSBill Taylor /* void *dapl_os_realloc(void *ptr, int size) */
2449e39c5baSBill Taylor #define	dapl_os_realloc(ptr, size) realloc((ptr), (size))
2459e39c5baSBill Taylor 
2469e39c5baSBill Taylor /* void dapl_os_free(void *ptr, int size) */
2479e39c5baSBill Taylor #define	dapl_os_free(ptr, size)	free((ptr))
2489e39c5baSBill Taylor 
2499e39c5baSBill Taylor /* void * dapl_os_memzero(void *loc, int size) */
2509e39c5baSBill Taylor #define	dapl_os_memzero(loc, size)	memset((loc), 0, (size))
2519e39c5baSBill Taylor 
2529e39c5baSBill Taylor /* void * dapl_os_memcpy(void *dest, const void *src, int len) */
2539e39c5baSBill Taylor #define	dapl_os_memcpy(dest, src, len)	memcpy((dest), (src), (len))
2549e39c5baSBill Taylor 
2559e39c5baSBill Taylor /* int dapl_os_memcmp(const void *mem1, const void *mem2, int len) */
2569e39c5baSBill Taylor #define	dapl_os_memcmp(mem1, mem2, len)	memcmp((mem1), (mem2), (len))
2579e39c5baSBill Taylor 
2589e39c5baSBill Taylor /*
2599e39c5baSBill Taylor  * String Functions
2609e39c5baSBill Taylor  */
2619e39c5baSBill Taylor 
2629e39c5baSBill Taylor /* unsigned int dapl_os_strlen(const char *str) */
2639e39c5baSBill Taylor #define	dapl_os_strlen(str)	strlen((str))
2649e39c5baSBill Taylor /* char * dapl_os_strdup(const char *str) */
2659e39c5baSBill Taylor #define	dapl_os_strdup(str)	strdup((str))
2669e39c5baSBill Taylor /* char *strcpy(char *dest, char *src) */
2679e39c5baSBill Taylor #define	dapl_os_strcpy(dest, src) 	strcpy((dest), (src))
2689e39c5baSBill Taylor /* char *strncpy(char *s1, const char *s2, size_t n) */
2699e39c5baSBill Taylor #define	dapl_os_strncpy(dest, src, len) strncpy((dest), (src), (len))
2709e39c5baSBill Taylor /* char *strcat(char *dest, char *src) */
2719e39c5baSBill Taylor #define	dapl_os_strcat(dest, src) 	strcat((dest), (src))
2729e39c5baSBill Taylor 
2739e39c5baSBill Taylor /*
2749e39c5baSBill Taylor  * Timer Functions
2759e39c5baSBill Taylor  */
2769e39c5baSBill Taylor 
2779e39c5baSBill Taylor typedef DAT_UINT64		DAPL_OS_TIMEVAL;
2789e39c5baSBill Taylor 
2799e39c5baSBill Taylor 
2809e39c5baSBill Taylor typedef unsigned long long int	DAPL_OS_TICKS;
2819e39c5baSBill Taylor 
2829e39c5baSBill Taylor /* function prototypes */
2839e39c5baSBill Taylor 
2849e39c5baSBill Taylor /*
2859e39c5baSBill Taylor  * Sleep for the number of micro seconds specified by the invoking
2869e39c5baSBill Taylor  * function
2879e39c5baSBill Taylor  *
2889e39c5baSBill Taylor  * void dapl_os_sleep_usec(int sleep_time)
2899e39c5baSBill Taylor  */
2909e39c5baSBill Taylor #define	dapl_os_sleep_usec(sleep_time)	{				\
2919e39c5baSBill Taylor 		struct timespec sleep_spec;				\
2929e39c5baSBill Taylor 		sleep_spec.tv_sec = (sleep_time) / 100000;		\
2939e39c5baSBill Taylor 		sleep_spec.tv_nsec = (sleep_time) % 100000 * 1000;	\
2949e39c5baSBill Taylor 		nanosleep(&sleep_spec, NULL);				\
2959e39c5baSBill Taylor 		}
2969e39c5baSBill Taylor 
2979e39c5baSBill Taylor DAT_RETURN dapl_os_get_time(DAPL_OS_TIMEVAL *);
2989e39c5baSBill Taylor 
2999e39c5baSBill Taylor /*
3009e39c5baSBill Taylor  *
3019e39c5baSBill Taylor  * Name Service Helper functions
3029e39c5baSBill Taylor  *
3039e39c5baSBill Taylor  */
3049e39c5baSBill Taylor #if defined(IBHOSTS_NAMING)
3059e39c5baSBill Taylor #define	dapls_osd_getaddrinfo(name, addr_ptr)		\
3069e39c5baSBill Taylor 				getaddrinfo((name), NULL, NULL, (addr_ptr))
3079e39c5baSBill Taylor #define	dapls_osd_freeaddrinfo(addr) freeaddrinfo((addr))
3089e39c5baSBill Taylor 
3099e39c5baSBill Taylor #endif /* IBHOSTS_NAMING */
3109e39c5baSBill Taylor 
3119e39c5baSBill Taylor /*
3129e39c5baSBill Taylor  * *printf format helpers. We use the C string constant concatenation
3139e39c5baSBill Taylor  * ability to define 64 bit formats, which unfortunatly are non standard
3149e39c5baSBill Taylor  * in the C compiler world. E.g. %llx for gcc, %I64x for Windows
3159e39c5baSBill Taylor  */
3169e39c5baSBill Taylor #define	F64d   "%lld"
3179e39c5baSBill Taylor #define	F64u   "%llu"
3189e39c5baSBill Taylor #define	F64x   "%llx"
3199e39c5baSBill Taylor #define	F64X   "%llX"
3209e39c5baSBill Taylor 
3219e39c5baSBill Taylor 
3229e39c5baSBill Taylor /*
3239e39c5baSBill Taylor  *  Conversion Functions
3249e39c5baSBill Taylor  */
3259e39c5baSBill Taylor 
3269e39c5baSBill Taylor /* long int dapl_os_strtol(const char *nptr, char **endptr, int base) */
3279e39c5baSBill Taylor #define	dapl_os_strtol(nptr, endptr, base)	strtol((nptr), (endptr), (base))
3289e39c5baSBill Taylor 
3299e39c5baSBill Taylor /*
3309e39c5baSBill Taylor  *  Helper Functions
3319e39c5baSBill Taylor  */
3329e39c5baSBill Taylor 
3339e39c5baSBill Taylor 
3349e39c5baSBill Taylor #define	dapl_os_assert(expression)	assert((expression))
3359e39c5baSBill Taylor #define	dapl_os_printf			printf
3369e39c5baSBill Taylor #define	dapl_os_vprintf(fmt, args)	vprintf((fmt), (args))
3379e39c5baSBill Taylor #define	dapl_os_syslog(fmt, args)	vsyslog(LOG_USER | LOG_DEBUG,	\
3389e39c5baSBill Taylor 						(fmt), (args))
3399e39c5baSBill Taylor #ifdef __cplusplus
3409e39c5baSBill Taylor }
3419e39c5baSBill Taylor #endif
3429e39c5baSBill Taylor 
3439e39c5baSBill Taylor #endif /* _DAPL_OSD_H_ */
344