macos-use-platform-copy-of-afssettings-20060802
[openafs.git] / src / WINNT / client_osi / osithrd95.h
1 #ifndef THRD95_H
2 #define THRD95_H
3
4 #include <lwp.h>
5 #include <lock.h>
6 #include <assert.h>
7 #include <stdio.h>
8
9 /* Since we don't have windows.h to define booleans, we do it ourselves */
10 #ifndef TRUE
11  #define TRUE (1)
12 #endif
13 #ifndef FALSE
14  #define FALSE (0)
15 #endif
16
17 #define osi_rwlock_t struct Lock
18 #define osi_mutex_t struct Lock
19
20 #define osi_Init() { PROCESS pid; LWP_InitializeProcessSupport(1,&pid); IOMGR_Initialize(); }
21
22 /*
23 #define lock_InitializeMutex(a, b) Lock_Init(a)
24 #define lock_InitializeRWLock(a, b) Lock_Init(a)
25 */
26
27 #define lock_InitializeRWLock(a, b) Lock_Init(a)
28 #define lock_InitializeMutex(a, b) lock_InitializeRWLock(a,b)
29
30 #define lock_ObtainWrite(a) ObtainWriteLock(a)
31 #define lock_ObtainRead(a) ObtainReadLock(a)
32 #define lock_ObtainMutex(a) lock_ObtainWrite(a)
33 #define lock_ReleaseRead(a) ReleaseReadLock(a)
34 #define lock_ReleaseWrite(a) ReleaseWriteLock(a)
35 #define lock_ReleaseMutex(a) lock_ReleaseWrite(a)
36
37 #define lock_FinalizeRWLock(a) /* */
38 #define lock_FinalizeMutex(a) lock_FinalizeRWLock(a)
39
40 /*
41 #define lock_TryWrite(a) if (!WriteLocked(a)) ObtainWriteLock(a)
42 #define lock_TryRead(a) if (!WriteLocked(a)) ObtainReadLock(a)
43 #define lock_TryMutex(a) if (!WriteLocked(a)) ObtainWriteLock(a)
44 */
45 #define lock_TryWrite(a) ( ((CheckLock(a)) == 0) ? (({ObtainWriteLock(a);}), 1) : 0 )
46 #define lock_TryRead(a) ( ((CheckLock(a)) > -1) ? (({ObtainReadLock(a);}), 1) : 0 )
47 #define lock_TryMutex(a) lock_TryWrite(a)
48 #define lock_GetMutexState(a) CheckLock(a)
49 #define lock_AssertMutex(a) assert(lock_GetMutexState(a) == -1)
50 #define lock_AssertWrite(a) assert(lock_GetMutexState(a) == -1)
51
52 #define Crit_Sec osi_mutex_t
53 #define thrd_InitCrit(a) lock_InitializeMutex(a, "cs")
54 #define thrd_EnterCrit lock_ObtainMutex
55 #define thrd_LeaveCrit lock_ReleaseMutex
56 #define thrd_DeleteCrit(a)
57
58 // Does LWP take a char* and read it as ASCIIZ, or as a pointer?
59 // ASCIIZ, perhaps?
60 /*
61 #define osi_Sleep(a) { char buf[sizeof(long)+1]; memcpy(buf,&a,sizeof(long)); buf[sizeof(long)]='\0'; LWP_WaitProcess(buf); }
62 */
63 // Actually, pointer (from reading LWP source)
64 #define osi_Sleep(a) LWP_WaitProcess(a);
65
66 #define __do_LWP_sleep(v,l,f) { f(l); osi_Sleep(v); }
67 #define osi_SleepM(a,b) __do_LWP_sleep(a,b,lock_ReleaseMutex)
68 #define osi_SleepR(a,b) __do_LWP_sleep(a,b,lock_ReleaseRead)
69 #define osi_SleepW(a,b) __do_LWP_sleep(a,b,lock_ReleaseWrite)
70
71 /*
72 #define osi_Wakeup(a) { char buf[sizeof(long)+1]; memcpy(buf,&a,sizeof(long)); buf[sizeof(long)]='\0'; LWP_SignalProcess(buf); }
73 */
74 #define osi_Wakeup(a) LWP_SignalProcess(a)
75
76 /*
77 #define thrd_Sleep(a) IOMGR_Select(0, 0, 0, 0, a)
78 */
79 #define thrd_Sleep(a) IOMGR_Sleep((a)/1000)
80
81 #define thrd_Yield LWP_DispatchProcess
82
83 /* For thread95.c */
84 #define __EVENT_NAME_LENGTH 10
85 typedef struct __event {
86   enum { manualunsig = 0, autounsig = 2, 
87                  autosignal = 3, manualsignal = 1 } state;
88   char *name; // "Name" of corresponding LWP events
89   //  char name[__EVENT_NAME_LENGTH+1];  // Name of corresponding LWP events
90 } EVENT;
91 #define SIGNALED(event) (event->state & 0x01)
92 #define AUTOMATIC(event) (event->state & 0x02)
93
94 typedef PROCESS thread_t;
95 typedef int (*ThreadFunc)(void *);
96 typedef int SecurityAttrib;
97
98 thread_t thrd_Create(int attributes, int stacksize, ThreadFunc func,
99                      void *parm, int flags, int *thread_id, char *name);
100 #define thrd_Exit(rc) return(rc)
101 thread_t thrd_Current(void);
102 int thrd_Close(thread_t thrd);
103 #define thrd_CloseHandle(h)
104
105 typedef long int LONG;
106 typedef LONG *LPLONG;
107 LONG thrd_Increment(LPLONG number);
108 LONG thrd_Decrement(LPLONG number);
109 LONG thrd_Exchange(LPLONG number, LONG value);
110
111 typedef enum { False=0, True=1 } BOOL;
112 typedef EVENT *EVENT_HANDLE;  /* Absorbs Win32 type HANDLE when used for synch */
113 EVENT *thrd_CreateEvent(void *f, BOOL manual, BOOL startsignaled, void *g);
114 BOOL thrd_SetEvent(EVENT *event);
115 BOOL thrd_ResetEvent(EVENT *event);
116
117 typedef unsigned long DWORD;
118 #define INFINITE (0xFFFFFFFF)  // infinite timeout for waits
119 #define WAIT_FAILED (0xFFFFFFFF)
120 #define WAIT_OBJECT_0 (0L)
121 #define CONST const
122 DWORD thrd_WaitForSingleObject_Event(EVENT *event, DWORD timeoutms);
123 DWORD thrd_WaitForMultipleObjects_Event(DWORD count, EVENT* events[],
124                                         BOOL waitforall, DWORD timeoutms);
125
126 #define osi_Time gettime_ms
127
128 typedef FILE *FILE_HANDLE;
129
130 #endif  /* #ifndef THRD95_H */