Merge branches 'master' and 'master' of 130.161.211.201:./swift
[swift-upb.git] / compat.cpp
1 /*
2  *  compat.cpp
3  *  swift
4  *
5  *  Created by Arno Bakker, Victor Grishchenko
6  *  Copyright 2009 Delft University of Technology. All rights reserved.
7  *
8  */
9
10 #include "compat.h"
11 #include <sys/stat.h>
12 #include <stdio.h>
13 #include <assert.h>
14 #ifdef _WIN32
15 #include <Tchar.h>
16 #include <io.h>
17 #include <sys/timeb.h>
18 #else
19 #include <unistd.h>
20 #include <sys/time.h>
21 #endif
22
23 namespace swift {
24
25 #ifdef _WIN32
26 static HANDLE map_handles[1024];
27 #endif
28
29 size_t file_size (int fd) {
30     struct stat st;
31     fstat(fd, &st);
32     return st.st_size;
33 }
34
35 int     file_seek (int fd, size_t offset) {
36 #ifndef _WIN32
37     return lseek(fd,offset,SEEK_SET);
38 #else
39     return _lseek(fd,offset,SEEK_SET);
40 #endif
41 }
42
43 int     file_resize (int fd, size_t new_size) {
44 #ifndef _WIN32
45     return ftruncate(fd, new_size);
46 #else
47     return _chsize(fd,new_size);
48 #endif
49 }
50
51 void print_error(const char* msg) {
52     perror(msg);
53 #ifdef _WIN32
54     int e = WSAGetLastError();
55     if (e)
56         fprintf(stderr,"network error #%u\n",e);
57 #endif
58 }
59
60 void*   memory_map (int fd, size_t size) {
61     if (!size)
62         size = file_size(fd);
63     void *mapping;
64 #ifndef _WIN32
65     mapping = mmap (NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
66     if (mapping==MAP_FAILED)
67         return NULL;
68     return mapping;
69 #else
70     HANDLE fhandle = (HANDLE)_get_osfhandle(fd);
71     assert(fd<1024);
72     HANDLE maphandle = CreateFileMapping(     fhandle,
73                                        NULL,
74                                        PAGE_READWRITE,
75                                        0,
76                                        0,
77                                        NULL    );
78     if (maphandle == NULL)
79         return NULL;
80     map_handles[fd] = maphandle;
81
82     mapping = MapViewOfFile         (  maphandle,
83                                        FILE_MAP_WRITE,
84                                        0,
85                                        0,
86                                        0  );
87
88     return mapping;
89 #endif
90 }
91
92 void    memory_unmap (int fd, void* mapping, size_t size) {
93 #ifndef _WIN32
94     munmap(mapping,size);
95     close(fd);
96 #else
97     UnmapViewOfFile(mapping);
98     CloseHandle(map_handles[fd]);
99 #endif
100 }
101
102 #ifdef _WIN32
103
104 size_t pread(int fildes, void *buf, size_t nbyte, long offset)
105 {
106     _lseek(fildes,offset,SEEK_SET);
107     return read(fildes,buf,nbyte);
108 }
109
110 size_t pwrite(int fildes, const void *buf, size_t nbyte, long offset)
111 {
112     _lseek(fildes,offset,SEEK_SET);
113     return write(fildes,buf,nbyte);
114 }
115
116
117 int inet_aton(const char *cp, struct in_addr *inp)
118 {
119     inp->S_un.S_addr = inet_addr(cp);
120     return 1;
121 }
122
123 #endif
124
125 #ifdef _WIN32
126
127 LARGE_INTEGER get_freq() {
128     LARGE_INTEGER proc_freq;
129     if (!::QueryPerformanceFrequency(&proc_freq))
130         print_error("HiResTimeOfDay: QueryPerformanceFrequency() failed");
131     return proc_freq;
132 }
133
134 tint usec_time(void)
135 {
136         static LARGE_INTEGER last_time;
137         LARGE_INTEGER cur_time;
138         QueryPerformanceCounter(&cur_time);
139         if (cur_time.QuadPart<last_time.QuadPart)
140                 print_error("QueryPerformanceCounter wrapped"); // does this happen?
141         last_time = cur_time;
142         static float freq = 1000000.0/get_freq().QuadPart;
143         tint usec = cur_time.QuadPart * freq;
144         return usec;
145 }
146
147
148 #else
149
150 tint usec_time(void)
151 {
152     struct timeval t;
153     gettimeofday(&t,NULL);
154     tint ret;
155     ret = t.tv_sec;
156     ret *= 1000000;
157     ret += t.tv_usec;
158     return ret;
159 }
160
161 #endif
162
163 void LibraryInit(void)
164 {
165 #ifdef _WIN32
166         static WSADATA _WSAData;
167         // win32 requires you to initialize the Winsock DLL with the desired
168         // specification version
169         WORD wVersionRequested;
170     wVersionRequested = MAKEWORD(2, 2);
171         WSAStartup(wVersionRequested, &_WSAData);
172 #endif
173 }
174
175 }