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