1/* BSDI osd_util.h,v 1.8 1998/06/03 19:14:58 karels Exp */
2
3/*
4 * Copyright (c) 1996-1999 Distributed Processing Technology Corporation
5 * All rights reserved.
6 *
7 * Redistribution and use in source form, with or without modification, are
8 * permitted provided that redistributions of source code must retain the
9 * above copyright notice, this list of conditions and the following disclaimer.
10 *
11 * This software is provided `as is' by Distributed Processing Technology and
12 * any express or implied warranties, including, but not limited to, the
13 * implied warranties of merchantability and fitness for a particular purpose,
14 * are disclaimed. In no event shall Distributed Processing Technology be
15 * liable for any direct, indirect, incidental, special, exemplary or
16 * consequential damages (including, but not limited to, procurement of
17 * substitute goods or services; loss of use, data, or profits; or business
18 * interruptions) however caused and on any theory of liability, whether in
19 * contract, strict liability, or tort (including negligence or otherwise)
20 * arising in any way out of the use of this driver software, even if advised
21 * of the possibility of such damage.
22 *
23 */
24
25#ifndef __OSD_UTIL_H
26#define __OSD_UTIL_H
27
28/*File - OSD_UTIL.H
29 ****************************************************************************
30 *
31 *Description:
32 *
33 * This file contains defines and function prototypes that are
34 *operating system dependent. The resources defined in this file
35 *are not specific to any particular application.
36 *
37 *Copyright Distributed Processing Technology, Corp.
38 * 140 Candace Dr.
39 * Maitland, Fl. 32751 USA
40 * Phone: (407) 830-5522 Fax: (407) 260-5366
41 * All Rights Reserved
42 *
43 *Author: Doug Anderson
44 *Date: 1/7/94
45 *
46 *Editors:
47 *
48 *Remarks:
49 *
50 *
51 *****************************************************************************/
52
53
54/*Definitions - Defines & Constants ----------------------------------------- */
55
56/*----------------------------- */
57/* Operating system selections: */
58/*----------------------------- */
59
60/*#define _DPT_MSDOS */
61/*#define _DPT_WIN_3X */
62/*#define _DPT_WIN_4X */
63/*#define _DPT_WIN_NT */
64/*#define _DPT_NETWARE */
65/*#define _DPT_OS2 */
66/*#define _DPT_SCO */
67/*#define _DPT_UNIXWARE */
68/*#define _DPT_SOLARIS */
69/*#define _DPT_NEXTSTEP */
70/*#define _DPT_BANYAN */
71
72/*-------------------------------- */
73/* Include the OS specific defines */
74/*-------------------------------- */
75
76/*#define OS_SELECTION From Above List */
77/*#define SEMAPHORE_T ??? */
78/*#define DLL_HANDLE_T ??? */
79
80#if (defined(KERNEL) && (defined(__FreeBSD__) || defined(__bsdi__)))
81# include "i386/isa/dpt_osd_defs.h"
82#else
83# include "osd_defs.h"
84#endif
85
86#ifndef DPT_UNALIGNED
87 #define DPT_UNALIGNED
88#endif
89
90#ifndef DPT_EXPORT
91 #define DPT_EXPORT
92#endif
93
94#ifndef DPT_IMPORT
95 #define DPT_IMPORT
96#endif
97
98#ifndef DPT_RUNTIME_IMPORT
99 #define DPT_RUNTIME_IMPORT DPT_IMPORT
100#endif
101
102/*--------------------- */
103/* OS dependent defines */
104/*--------------------- */
105
106#if defined (_DPT_MSDOS) || defined (_DPT_WIN_3X)
107 #define _DPT_16_BIT
108#else
109 #define _DPT_32_BIT
110#endif
111
112#if defined (_DPT_SCO) || defined (_DPT_UNIXWARE) || defined (_DPT_SOLARIS) || defined (_DPT_AIX) || defined (SNI_MIPS) || defined (_DPT_BSDI) || defined (_DPT_FREE_BSD) || defined(_DPT_LINUX)
113 #define _DPT_UNIX
114#endif
115
116#if defined (_DPT_WIN_3x) || defined (_DPT_WIN_4X) || defined (_DPT_WIN_NT) \
117 || defined (_DPT_OS2)
118 #define _DPT_DLL_SUPPORT
119#endif
120
121#if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X) && !defined (_DPT_NETWARE)
122 #define _DPT_PREEMPTIVE
123#endif
124
125#if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X)
126 #define _DPT_MULTI_THREADED
127#endif
128
129#if !defined (_DPT_MSDOS)
130 #define _DPT_MULTI_TASKING
131#endif
132
133 /* These exist for platforms that */
134 /* chunk when accessing mis-aligned */
135 /* data */
136#if defined (SNI_MIPS) || defined (_DPT_SOLARIS)
137 #if defined (_DPT_BIG_ENDIAN)
138 #if !defined (_DPT_STRICT_ALIGN)
139 #define _DPT_STRICT_ALIGN
140 #endif
141 #endif
142#endif
143
144 /* Determine if in C or C++ mode */
145#ifdef __cplusplus
146 #define _DPT_CPP
147#else
148 #define _DPT_C
149#endif
150
151/*-------------------------------------------------------------------*/
152/* Under Solaris the compiler refuses to accept code like: */
153/* { {"DPT"}, 0, NULL .... }, */
154/* and complains about the {"DPT"} part by saying "cannot use { } */
155/* to initialize char*". */
156/* */
157/* By defining these ugly macros we can get around this and also */
158/* not have to copy and #ifdef large sections of code. I know that */
159/* these macros are *really* ugly, but they should help reduce */
160/* maintenance in the long run. */
161/* */
162/*-------------------------------------------------------------------*/
163#if !defined (DPTSQO)
164 #if defined (_DPT_SOLARIS)
165 #define DPTSQO
166 #define DPTSQC
167 #else
168 #define DPTSQO {
169 #define DPTSQC }
170 #endif /* solaris */
171#endif /* DPTSQO */
172
173
174/*---------------------- */
175/* OS dependent typedefs */
176/*---------------------- */
177
178#if defined (_DPT_MSDOS) || defined (_DPT_SCO)
179 #define BYTE unsigned char
180 #define WORD unsigned short
181#endif
182
183#ifndef _DPT_TYPEDEFS
184 #define _DPT_TYPEDEFS
185 typedef unsigned char uCHAR;
186 typedef unsigned short uSHORT;
187 typedef unsigned int uINT;
188 typedef unsigned long uLONG;
189
190 typedef union {
191 uCHAR u8[4];
192 uSHORT u16[2];
193 uLONG u32;
194 } access_U;
195#endif
196
197#if !defined (NULL)
198 #define NULL 0
199#endif
200
201
202/*Prototypes - function ----------------------------------------------------- */
203
204#ifdef __cplusplus
205 extern "C" { /* Declare all these functions as "C" functions */
206#endif
207
208/*------------------------ */
209/* Byte reversal functions */
210/*------------------------ */
211
212 /* Reverses the byte ordering of a 2 byte variable */
213#if (!defined(osdSwap2))
214 uSHORT osdSwap2(DPT_UNALIGNED uSHORT *);
215#endif // !osdSwap2
216
217 /* Reverses the byte ordering of a 4 byte variable and shifts left 8 bits */
218#if (!defined(osdSwap3))
219 uLONG osdSwap3(DPT_UNALIGNED uLONG *);
220#endif // !osdSwap3
221
222
223#ifdef _DPT_NETWARE
224 #include "novpass.h" /* For DPT_Bswapl() prototype */
225 /* Inline the byte swap */
226 #ifdef __cplusplus
227 inline uLONG osdSwap4(uLONG *inLong) {
228 return *inLong = DPT_Bswapl(*inLong);
229 }
230 #else
231 #define osdSwap4(inLong) DPT_Bswapl(inLong)
232 #endif // cplusplus
233#else
234 /* Reverses the byte ordering of a 4 byte variable */
235# if (!defined(osdSwap4))
236 uLONG osdSwap4(DPT_UNALIGNED uLONG *);
237# endif // !osdSwap4
238
239 /* The following functions ALWAYS swap regardless of the *
240 * presence of DPT_BIG_ENDIAN */
241
242 uSHORT trueSwap2(DPT_UNALIGNED uSHORT *);
243 uLONG trueSwap4(DPT_UNALIGNED uLONG *);
244
245#endif // netware
246
247
248/*-------------------------------------*
249 * Network order swap functions *
250 * *
251 * These functions/macros will be used *
252 * by the structure insert()/extract() *
253 * functions. *
254 *
255 * We will enclose all structure *
256 * portability modifications inside *
257 * #ifdefs. When we are ready, we *
258 * will #define DPT_PORTABLE to begin *
259 * using the modifications. *
260 *-------------------------------------*/
261uLONG netSwap4(uLONG val);
262
263#if defined (_DPT_BIG_ENDIAN)
264
265// for big-endian we need to swap
266
267#ifndef NET_SWAP_2
268#define NET_SWAP_2(x) (((x) >> 8) | ((x) << 8))
269#endif // NET_SWAP_2
270
271#ifndef NET_SWAP_4
272#define NET_SWAP_4(x) netSwap4((x))
273#endif // NET_SWAP_4
274
275#else
276
277// for little-endian we don't need to do anything
278
279#ifndef NET_SWAP_2
280#define NET_SWAP_2(x) (x)
281#endif // NET_SWAP_2
282
283#ifndef NET_SWAP_4
284#define NET_SWAP_4(x) (x)
285#endif // NET_SWAP_4
286
287#endif // big endian
288
289
290
291/*----------------------------------- */
292/* Run-time loadable module functions */
293/*----------------------------------- */
294
295 /* Loads the specified run-time loadable DLL */
296DLL_HANDLE_T osdLoadModule(uCHAR *);
297 /* Unloads the specified run-time loadable DLL */
298uSHORT osdUnloadModule(DLL_HANDLE_T);
299 /* Returns a pointer to a function inside a run-time loadable DLL */
300void * osdGetFnAddr(DLL_HANDLE_T,uCHAR *);
301
302/*--------------------------------------- */
303/* Mutually exclusive semaphore functions */
304/*--------------------------------------- */
305
306 /* Create a named semaphore */
307SEMAPHORE_T osdCreateNamedSemaphore(char *);
308 /* Create a mutually exlusive semaphore */
309SEMAPHORE_T osdCreateSemaphore(void);
310 /* create an event semaphore */
311SEMAPHORE_T osdCreateEventSemaphore(void);
312 /* create a named event semaphore */
313SEMAPHORE_T osdCreateNamedEventSemaphore(char *);
314
315 /* Destroy the specified mutually exclusive semaphore object */
316uSHORT osdDestroySemaphore(SEMAPHORE_T);
317 /* Request access to the specified mutually exclusive semaphore */
318uLONG osdRequestSemaphore(SEMAPHORE_T,uLONG);
319 /* Release access to the specified mutually exclusive semaphore */
320uSHORT osdReleaseSemaphore(SEMAPHORE_T);
321 /* wait for a event to happen */
322uLONG osdWaitForEventSemaphore(SEMAPHORE_T, uLONG);
323 /* signal an event */
324uLONG osdSignalEventSemaphore(SEMAPHORE_T);
325 /* reset the event */
326uLONG osdResetEventSemaphore(SEMAPHORE_T);
327
328/*----------------- */
329/* Thread functions */
330/*----------------- */
331
332 /* Releases control to the task switcher in non-preemptive */
333 /* multitasking operating systems. */
334void osdSwitchThreads(void);
335
336 /* Starts a thread function */
337uLONG osdStartThread(void *,void *);
338
339/* what is my thread id */
340uLONG osdGetThreadID(void);
341
342/* wakes up the specifed thread */
343void osdWakeThread(uLONG);
344
345/* osd sleep for x milliseconds */
346void osdSleep(uLONG);
347
348#define DPT_THREAD_PRIORITY_LOWEST 0x00
349#define DPT_THREAD_PRIORITY_NORMAL 0x01
350#define DPT_THREAD_PRIORITY_HIGHEST 0x02
351
352uCHAR osdSetThreadPriority(uLONG tid, uCHAR priority);
353
354#ifdef __cplusplus
355 } /* end the xtern "C" declaration */
356#endif
357
358#endif /* osd_util_h */
359