359 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			359 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	BSDI osd_util.h,v 1.8 1998/06/03 19:14:58 karels Exp	*/
 | |
| 
 | |
| /*
 | |
|  * Copyright (c) 1996-1999 Distributed Processing Technology Corporation
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * Redistribution and use in source form, with or without modification, are
 | |
|  * permitted provided that redistributions of source code must retain the
 | |
|  * above copyright notice, this list of conditions and the following disclaimer.
 | |
|  *
 | |
|  * This software is provided `as is' by Distributed Processing Technology and
 | |
|  * any express or implied warranties, including, but not limited to, the
 | |
|  * implied warranties of merchantability and fitness for a particular purpose,
 | |
|  * are disclaimed. In no event shall Distributed Processing Technology be
 | |
|  * liable for any direct, indirect, incidental, special, exemplary or
 | |
|  * consequential damages (including, but not limited to, procurement of
 | |
|  * substitute goods or services; loss of use, data, or profits; or business
 | |
|  * interruptions) however caused and on any theory of liability, whether in
 | |
|  * contract, strict liability, or tort (including negligence or otherwise)
 | |
|  * arising in any way out of the use of this driver software, even if advised
 | |
|  * of the possibility of such damage.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef         __OSD_UTIL_H
 | |
| #define         __OSD_UTIL_H
 | |
| 
 | |
| /*File - OSD_UTIL.H
 | |
|  ****************************************************************************
 | |
|  *
 | |
|  *Description:
 | |
|  *
 | |
|  *      This file contains defines and function prototypes that are
 | |
|  *operating system dependent.  The resources defined in this file
 | |
|  *are not specific to any particular application.
 | |
|  *
 | |
|  *Copyright Distributed Processing Technology, Corp.
 | |
|  *        140 Candace Dr.
 | |
|  *        Maitland, Fl. 32751   USA
 | |
|  *        Phone: (407) 830-5522  Fax: (407) 260-5366
 | |
|  *        All Rights Reserved
 | |
|  *
 | |
|  *Author:       Doug Anderson
 | |
|  *Date:         1/7/94
 | |
|  *
 | |
|  *Editors:
 | |
|  *
 | |
|  *Remarks:
 | |
|  *
 | |
|  *
 | |
|  *****************************************************************************/
 | |
| 
 | |
| 
 | |
| /*Definitions - Defines & Constants ----------------------------------------- */
 | |
| 
 | |
| /*----------------------------- */
 | |
| /* Operating system selections: */
 | |
| /*----------------------------- */
 | |
| 
 | |
| /*#define               _DPT_MSDOS      */
 | |
| /*#define               _DPT_WIN_3X     */
 | |
| /*#define               _DPT_WIN_4X     */
 | |
| /*#define               _DPT_WIN_NT     */
 | |
| /*#define               _DPT_NETWARE    */
 | |
| /*#define               _DPT_OS2        */
 | |
| /*#define               _DPT_SCO        */
 | |
| /*#define               _DPT_UNIXWARE   */
 | |
| /*#define               _DPT_SOLARIS    */
 | |
| /*#define               _DPT_NEXTSTEP   */
 | |
| /*#define               _DPT_BANYAN     */
 | |
| 
 | |
| /*-------------------------------- */
 | |
| /* Include the OS specific defines */
 | |
| /*-------------------------------- */
 | |
| 
 | |
| /*#define       OS_SELECTION    From Above List */
 | |
| /*#define       SEMAPHORE_T     ??? */
 | |
| /*#define       DLL_HANDLE_T    ??? */
 | |
| 
 | |
| #if (defined(KERNEL) && (defined(__FreeBSD__) || defined(__bsdi__)))
 | |
| # include        "i386/isa/dpt_osd_defs.h"
 | |
| #else
 | |
| # include        "osd_defs.h"
 | |
| #endif
 | |
| 
 | |
| #ifndef DPT_UNALIGNED
 | |
|    #define      DPT_UNALIGNED
 | |
| #endif
 | |
| 
 | |
| #ifndef DPT_EXPORT
 | |
|    #define      DPT_EXPORT
 | |
| #endif
 | |
| 
 | |
| #ifndef DPT_IMPORT
 | |
|    #define      DPT_IMPORT
 | |
| #endif
 | |
| 
 | |
| #ifndef DPT_RUNTIME_IMPORT
 | |
|    #define      DPT_RUNTIME_IMPORT  DPT_IMPORT
 | |
| #endif
 | |
| 
 | |
| /*--------------------- */
 | |
| /* OS dependent defines */
 | |
| /*--------------------- */
 | |
| 
 | |
| #if defined (_DPT_MSDOS) || defined (_DPT_WIN_3X)
 | |
|    #define      _DPT_16_BIT
 | |
| #else
 | |
|    #define      _DPT_32_BIT
 | |
| #endif
 | |
| 
 | |
| #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)
 | |
|    #define      _DPT_UNIX
 | |
| #endif
 | |
| 
 | |
| #if defined (_DPT_WIN_3x) || defined (_DPT_WIN_4X) || defined (_DPT_WIN_NT) \
 | |
| 	    || defined (_DPT_OS2)
 | |
|    #define      _DPT_DLL_SUPPORT
 | |
| #endif
 | |
| 
 | |
| #if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X) && !defined (_DPT_NETWARE)
 | |
|    #define      _DPT_PREEMPTIVE
 | |
| #endif
 | |
| 
 | |
| #if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X)
 | |
|    #define      _DPT_MULTI_THREADED
 | |
| #endif
 | |
| 
 | |
| #if !defined (_DPT_MSDOS)
 | |
|    #define      _DPT_MULTI_TASKING
 | |
| #endif
 | |
| 
 | |
|   /* These exist for platforms that   */
 | |
|   /* chunk when accessing mis-aligned */
 | |
|   /* data                             */
 | |
| #if defined (SNI_MIPS) || defined (_DPT_SOLARIS)
 | |
|    #if defined (_DPT_BIG_ENDIAN)
 | |
| 	#if !defined (_DPT_STRICT_ALIGN)
 | |
|             #define _DPT_STRICT_ALIGN
 | |
| 	#endif
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
|   /* Determine if in C or C++ mode */
 | |
| #ifdef  __cplusplus
 | |
|    #define      _DPT_CPP
 | |
| #else
 | |
|    #define      _DPT_C
 | |
| #endif
 | |
| 
 | |
| /*-------------------------------------------------------------------*/
 | |
| /* Under Solaris the compiler refuses to accept code like:           */
 | |
| /*   { {"DPT"}, 0, NULL .... },                                      */
 | |
| /* and complains about the {"DPT"} part by saying "cannot use { }    */
 | |
| /* to initialize char*".                                             */
 | |
| /*                                                                   */
 | |
| /* By defining these ugly macros we can get around this and also     */
 | |
| /* not have to copy and #ifdef large sections of code.  I know that  */
 | |
| /* these macros are *really* ugly, but they should help reduce       */
 | |
| /* maintenance in the long run.                                      */
 | |
| /*                                                                   */
 | |
| /*-------------------------------------------------------------------*/
 | |
| #if !defined (DPTSQO)
 | |
|    #if defined (_DPT_SOLARIS)
 | |
|       #define DPTSQO
 | |
|       #define DPTSQC
 | |
|    #else
 | |
|       #define DPTSQO {
 | |
|       #define DPTSQC }
 | |
|    #endif  /* solaris */
 | |
| #endif  /* DPTSQO */
 | |
| 
 | |
| 
 | |
| /*---------------------- */
 | |
| /* OS dependent typedefs */
 | |
| /*---------------------- */
 | |
| 
 | |
| #if defined (_DPT_MSDOS) || defined (_DPT_SCO)
 | |
|    #define BYTE unsigned char
 | |
|    #define WORD unsigned short
 | |
| #endif
 | |
| 
 | |
| #ifndef _DPT_TYPEDEFS
 | |
|    #define _DPT_TYPEDEFS
 | |
|    typedef unsigned char   uCHAR;
 | |
|    typedef unsigned short  uSHORT;
 | |
|    typedef unsigned int    uINT;
 | |
|    typedef unsigned long   uLONG;
 | |
| 
 | |
|    typedef union {
 | |
| 	 uCHAR        u8[4];
 | |
| 	 uSHORT       u16[2];
 | |
| 	 uLONG        u32;
 | |
|    } access_U;
 | |
| #endif
 | |
| 
 | |
| #if !defined (NULL)
 | |
|    #define      NULL    0
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /*Prototypes - function ----------------------------------------------------- */
 | |
| 
 | |
| #ifdef  __cplusplus
 | |
|    extern "C" {         /* Declare all these functions as "C" functions */
 | |
| #endif
 | |
| 
 | |
| /*------------------------ */
 | |
| /* Byte reversal functions */
 | |
| /*------------------------ */
 | |
| 
 | |
|   /* Reverses the byte ordering of a 2 byte variable */
 | |
| #if (!defined(osdSwap2))
 | |
|  uSHORT       osdSwap2(DPT_UNALIGNED uSHORT *);
 | |
| #endif  // !osdSwap2
 | |
| 
 | |
|   /* Reverses the byte ordering of a 4 byte variable and shifts left 8 bits */
 | |
| #if (!defined(osdSwap3))
 | |
|  uLONG        osdSwap3(DPT_UNALIGNED uLONG *);
 | |
| #endif  // !osdSwap3
 | |
| 
 | |
| 
 | |
| #ifdef  _DPT_NETWARE
 | |
|    #include "novpass.h" /* For DPT_Bswapl() prototype */
 | |
| 	/* Inline the byte swap */
 | |
|    #ifdef __cplusplus
 | |
| 	 inline uLONG osdSwap4(uLONG *inLong) {
 | |
| 	 return *inLong = DPT_Bswapl(*inLong);
 | |
| 	 }
 | |
|    #else
 | |
| 	 #define osdSwap4(inLong)       DPT_Bswapl(inLong)
 | |
|    #endif  // cplusplus
 | |
| #else
 | |
| 	/* Reverses the byte ordering of a 4 byte variable */
 | |
| # if (!defined(osdSwap4))
 | |
|    uLONG        osdSwap4(DPT_UNALIGNED uLONG *);
 | |
| # endif  // !osdSwap4
 | |
| 
 | |
|   /* The following functions ALWAYS swap regardless of the *
 | |
|    * presence of DPT_BIG_ENDIAN                            */
 | |
| 
 | |
|    uSHORT       trueSwap2(DPT_UNALIGNED uSHORT *);
 | |
|    uLONG        trueSwap4(DPT_UNALIGNED uLONG *);
 | |
| 
 | |
| #endif  // netware
 | |
| 
 | |
| 
 | |
| /*-------------------------------------*
 | |
|  * Network order swap functions        *
 | |
|  *                                     *
 | |
|  * These functions/macros will be used *
 | |
|  * by the structure insert()/extract() *
 | |
|  * functions.                          *
 | |
|  *
 | |
|  * We will enclose all structure       *
 | |
|  * portability modifications inside    *
 | |
|  * #ifdefs.  When we are ready, we     *
 | |
|  * will #define DPT_PORTABLE to begin  *
 | |
|  * using the modifications.            *
 | |
|  *-------------------------------------*/
 | |
| uLONG	netSwap4(uLONG val);
 | |
| 
 | |
| #if defined (_DPT_BIG_ENDIAN)
 | |
| 
 | |
| // for big-endian we need to swap
 | |
| 
 | |
| #ifndef NET_SWAP_2
 | |
| #define NET_SWAP_2(x) (((x) >> 8) | ((x) << 8))
 | |
| #endif  // NET_SWAP_2
 | |
| 
 | |
| #ifndef NET_SWAP_4
 | |
| #define NET_SWAP_4(x) netSwap4((x))
 | |
| #endif  // NET_SWAP_4
 | |
| 
 | |
| #else
 | |
| 
 | |
| // for little-endian we don't need to do anything
 | |
| 
 | |
| #ifndef NET_SWAP_2
 | |
| #define NET_SWAP_2(x) (x)
 | |
| #endif  // NET_SWAP_2
 | |
| 
 | |
| #ifndef NET_SWAP_4
 | |
| #define NET_SWAP_4(x) (x)
 | |
| #endif  // NET_SWAP_4
 | |
| 
 | |
| #endif  // big endian
 | |
| 
 | |
| 
 | |
| 
 | |
| /*----------------------------------- */
 | |
| /* Run-time loadable module functions */
 | |
| /*----------------------------------- */
 | |
| 
 | |
|   /* Loads the specified run-time loadable DLL */
 | |
| DLL_HANDLE_T    osdLoadModule(uCHAR *);
 | |
|   /* Unloads the specified run-time loadable DLL */
 | |
| uSHORT          osdUnloadModule(DLL_HANDLE_T);
 | |
|   /* Returns a pointer to a function inside a run-time loadable DLL */
 | |
| void *          osdGetFnAddr(DLL_HANDLE_T,uCHAR *);
 | |
| 
 | |
| /*--------------------------------------- */
 | |
| /* Mutually exclusive semaphore functions */
 | |
| /*--------------------------------------- */
 | |
| 
 | |
|   /* Create a named semaphore */
 | |
| SEMAPHORE_T     osdCreateNamedSemaphore(char *);
 | |
|   /* Create a mutually exlusive semaphore */
 | |
| SEMAPHORE_T     osdCreateSemaphore(void);
 | |
| 	/* create an event semaphore */
 | |
| SEMAPHORE_T              osdCreateEventSemaphore(void);
 | |
| 	/* create a named event semaphore */
 | |
| SEMAPHORE_T             osdCreateNamedEventSemaphore(char *);
 | |
| 
 | |
|   /* Destroy the specified mutually exclusive semaphore object */
 | |
| uSHORT          osdDestroySemaphore(SEMAPHORE_T);
 | |
|   /* Request access to the specified mutually exclusive semaphore */
 | |
| uLONG           osdRequestSemaphore(SEMAPHORE_T,uLONG);
 | |
|   /* Release access to the specified mutually exclusive semaphore */
 | |
| uSHORT          osdReleaseSemaphore(SEMAPHORE_T);
 | |
| 	/* wait for a event to happen */
 | |
| uLONG                            osdWaitForEventSemaphore(SEMAPHORE_T, uLONG);
 | |
| 	/* signal an event */
 | |
| uLONG                            osdSignalEventSemaphore(SEMAPHORE_T);
 | |
| 	/* reset the event */
 | |
| uLONG                            osdResetEventSemaphore(SEMAPHORE_T);
 | |
| 
 | |
| /*----------------- */
 | |
| /* Thread functions */
 | |
| /*----------------- */
 | |
| 
 | |
|   /* Releases control to the task switcher in non-preemptive */
 | |
|   /* multitasking operating systems. */
 | |
| void            osdSwitchThreads(void);
 | |
| 
 | |
|   /* Starts a thread function */
 | |
| uLONG   osdStartThread(void *,void *);
 | |
| 
 | |
| /* what is my thread id */
 | |
| uLONG osdGetThreadID(void);
 | |
| 
 | |
| /* wakes up the specifed thread */
 | |
| void osdWakeThread(uLONG);
 | |
| 
 | |
| /* osd sleep for x milliseconds */
 | |
| void osdSleep(uLONG);
 | |
| 
 | |
| #define DPT_THREAD_PRIORITY_LOWEST 0x00
 | |
| #define DPT_THREAD_PRIORITY_NORMAL 0x01
 | |
| #define DPT_THREAD_PRIORITY_HIGHEST 0x02
 | |
| 
 | |
| uCHAR osdSetThreadPriority(uLONG tid, uCHAR priority);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
|    }    /* end the xtern "C" declaration */
 | |
| #endif
 | |
| 
 | |
| #endif  /* osd_util_h */
 |