da538ce263b1b54634848c0f36db7471d389a991
[mirror/winof/.git] / ulp / opensm / user / include / vendor / winosm_common.h
1 #ifndef _OSM_COMMON_H_
2 #define _OSM_COMMON_H_
3
4 #include <winsock2.h>
5 #include <windows.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <stdarg.h>
10 #include <ctype.h>
11
12 #pragma warning(disable : 4996)
13 #pragma warning(disable : 4100)
14
15 struct timezone {
16         int     tz_minuteswest; /* minutes west of Greenwich */
17         int     tz_dsttime;     /* type of dst correction */
18 };
19
20
21 # define no_argument            0
22 # define required_argument      1
23 # define optional_argument      2
24 /* Global variables for getopt_long */
25 char *optarg;
26 /*
27 extern int optind;
28 extern int opterr;
29 extern int optopt;
30 extern int iArg;
31   */
32 struct option
33 {
34   const char *name;
35   int has_arg;
36   int *flag;
37   int val;
38 };
39
40
41 /************************************************************************/
42 static char* 
43 get_char_option(const char* optstring,
44                              char*const* argv,int argc, 
45                              int iArg, int* opt_ind,char* opt_p);   
46 int 
47 getopt_long_only(int argc, char *const*argv,
48                          const char *optstring,
49                          const struct option *longopts, int *longindex);
50 /**************************************************************************/
51 static __inline
52 void FileTimeToTimeval(LPFILETIME pft, struct timeval * ptv)
53 { /* Note that LONGLONG is a 64-bit value */
54 LONGLONG ll;
55
56 if(!pft || !ptv)
57 goto Exit;
58
59 ll = ((LONGLONG) pft->dwHighDateTime << 32);
60 ll += (LONGLONG) pft->dwLowDateTime;
61 #ifdef __GNUC__
62 ll -= 116444736000000000ll;
63 #else
64 ll -= 116444736000000000;
65 #endif
66
67 ptv->tv_sec = (long) (ll / 10000000);
68 ptv->tv_usec = (long) (ll - ((LONGLONG)(ptv->tv_sec) * 10000000)) / 10;
69
70 Exit:;
71 }/* FileTimeToTimeval */
72
73 /********************************************************************************/
74 static __inline
75 int gettimeofday(struct timeval *ptv, struct timezone *tzp)
76 {
77 static int QueryCounter = 2;
78 FILETIME CurrentTime;
79 /* TODO : We need to add it , since in DDK - compiler does not like vars that are not in use */
80 UNREFERENCED_PARAMETER(tzp);     
81 if(!ptv)
82 goto Exit;
83
84 if(QueryCounter)
85 {
86 static LARGE_INTEGER Frequency;
87 static LARGE_INTEGER Offset; /* counter offset for right time*/
88 static LARGE_INTEGER LastCounter;
89 LARGE_INTEGER Time;
90 LARGE_INTEGER Counter;
91 /* HANDLE hThread = GetCurrentThread();
92 int ThreadPrio = GetThreadPriority(hThread);
93
94 SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); */
95 GetSystemTimeAsFileTime(&CurrentTime);
96 QueryPerformanceCounter(&Counter);
97 /* SetThreadPriority(hThread, ThreadPrio); */
98
99 if(QueryCounter == 2)
100 {
101 QueryCounter = 1;
102 if(!QueryPerformanceFrequency(&Frequency))
103 {
104 QueryCounter = 0;
105 Frequency.QuadPart = 10000000; /* prevent division by 0 */
106 }
107
108 /* get time as a large integer */
109 Counter.HighPart &= 0x7fl; /* Clear the highest bits to prevent overflows */
110 Offset.LowPart = CurrentTime.dwLowDateTime;
111 Offset.HighPart = (LONG) CurrentTime.dwHighDateTime;
112 Offset.QuadPart -= Counter.QuadPart * 10000000 / Frequency.QuadPart;
113 }
114
115 /* Convert counter to a 100 nanoseconds resolution timer value. */
116
117 Counter.HighPart &= 0x7fl; /* Clear the highest bits to prevent overflows */
118 Counter.QuadPart *= 10000000; /* Because we need time stamp in units of 100 ns */
119 Counter.QuadPart /= Frequency.QuadPart; /* counter of 0.1 microseconds */
120
121 if(LastCounter.QuadPart > Counter.QuadPart)
122 { /* Counter value wrapped */
123 #ifdef __GNUC__
124 Offset.QuadPart += (0x7f00000000ll * 10000000ll) / Frequency.QuadPart;
125 #else
126 Offset.QuadPart += (0x7f00000000 * 10000000) / Frequency.QuadPart;
127 #endif
128 }
129 LastCounter = Counter;
130
131 /* Add the in previous call calculated offset */
132 Counter.QuadPart += Offset.QuadPart;
133
134 /* get time as a large integer */
135 Time.LowPart = CurrentTime.dwLowDateTime;
136 Time.HighPart = (LONG) CurrentTime.dwHighDateTime;
137
138 /* keep time difference within an interval of +- 0.1 seconds
139 relative to the time function by adjusting the counters offset */
140
141 if(((Time.QuadPart + 1000000) < Counter.QuadPart) ||
142 ((Time.QuadPart - 1000000) > Counter.QuadPart))
143 { /* Adjust the offset */
144 Offset.QuadPart += Time.QuadPart - Counter.QuadPart;
145 Counter.QuadPart = Time.QuadPart;
146 }
147
148 /* Now let's use the adjusted performance counter time for the time stamp */
149 CurrentTime.dwLowDateTime = Counter.LowPart;
150 CurrentTime.dwHighDateTime = Counter.HighPart;
151 }
152 else
153 {
154 GetSystemTimeAsFileTime(&CurrentTime);
155 }
156
157 FileTimeToTimeval(&CurrentTime,ptv);
158
159 Exit:;
160 return(0);
161 }/* int gettimeofday(struct timeval *ptv, void *tzp) */
162 /*****************************************************************************/
163
164
165
166
167 #define getpid() GetCurrentProcessId()
168 #define sleep(sec) SleepEx((sec)*1000,TRUE)
169 #define usleep(usec) SleepEx(usec/1000,TRUE)
170 //#define MT_ALIGN8     __declspec(align(8))
171 /* Verify the correct ETIMEDOUT value is defined in all compiled files */
172 #ifndef ETIMEDOUT
173 #define ETIMEDOUT               (10060)
174 #endif
175 #define strtoull _strtoui64
176 #define OSM_MAX_LOG_NAME_SIZE 2048
177 #define unlink(str) _unlink(str)
178 #define strnicmp _strnicmp
179
180 /* The following defines replace syslog.h */
181 #define openlog(a,b,c)
182
183 #define closelog()
184
185 static __inline void
186 syslog(int priority, ...) {}
187
188 #define LOG_ERR 0
189 #define LOG_WARNING 1
190 #define LOG_INFO 2
191 /*****************************************/
192
193 /****f* OpenSM: osm_common/GetOsmPath
194 * NAME
195 *       GetOsmPath
196 *
197 * DESCRIPTION
198 *       The function retrieve the temp path defined in Windows using its API
199 *
200 * SYNOPSIS
201 */
202 char*
203 GetOsmPath(void);
204 /*
205 * PARAMETERS
206 *       NONE
207 *
208 * RETURN VALUE
209 *       This function returns string containing the default temp path in windows
210 *
211 * NOTES
212 */
213
214 /* Implementation of strtok_r for windows: since strtok in windows is safe,
215    just ignore the last variable, and call strtok. */
216 static inline 
217 char *strtok_r(char *s1, const char *s2, char **lasts)
218 {
219   return strtok(s1, s2);
220 }
221 #endif          /* _OSM_COMMON_H_ */