[IOMultiplexerV2] alpha
[NextIRCd.git] / src / IOHandler / compat / utime.c
1 /* utime.c - IOMultiplexer
2  * Copyright (C) 2014  Philipp Kreil (pk910)
3  * 
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  * 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  * 
14  * You should have received a copy of the GNU General Public License 
15  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
16  */
17 #include "../IOHandler_config.h"
18 #include "utime.h"
19 #ifndef HAVE_USLEEP
20
21 #ifdef HAVE_SELECT
22
23 #ifdef HAVE_SYS_SELECT_H
24 # include <sys/select.h>
25 #else
26 # include <sys/time.h>
27 # include <sys/types.h>
28 # include <unistd.h>
29 #endif
30
31 void usleep_tv(struct timeval tv) {
32         select(0, NULL, NULL, NULL, &tv);
33 }
34
35 void usleep(long usec)
36 {
37         struct timeval tv;
38
39         tv.tv_sec = usec / 1000000;
40         tv.tv_usec = usec % 1000000;
41         usleep_tv(tv);
42 }
43
44 #elif defined WIN32
45
46 /* usleep implementation from FreeSCI */
47
48 #include <windows.h>
49
50 void usleep_tv(struct timeval tv) {
51         usleep(tv.tv_sec * 1000000 + tv.tv_usec);
52 }
53
54 void usleep (long usec)
55 {
56         LARGE_INTEGER lFrequency;
57         LARGE_INTEGER lEndTime;
58         LARGE_INTEGER lCurTime;
59
60         QueryPerformanceFrequency (&lFrequency);
61         if (lFrequency.QuadPart) {
62                 QueryPerformanceCounter (&lEndTime);
63                 lEndTime.QuadPart += (LONGLONG) usec *
64                                         lFrequency.QuadPart / 1000000;
65                 do {
66                         QueryPerformanceCounter (&lCurTime);
67                         Sleep(0);
68                 } while (lCurTime.QuadPart < lEndTime.QuadPart);
69         }
70 }
71
72 #endif
73
74 #else
75 #include <sys/time.h>
76 #ifdef HAVE_UNISTD_H
77 #include <unistd.h>
78 #endif
79
80 void usleep_tv(struct timeval tv) {
81         usleep(tv.tv_sec * 1000000 + tv.tv_usec);
82 }
83
84 #endif /* !HAVE_USLEEP */