1 /***************************************************************************
2 * Copyright (C) 2006 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2008 by Spencer Oliver *
9 * spen@spen-soft.co.uk *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program; if not, write to the *
23 * Free Software Foundation, Inc., *
24 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 ***************************************************************************/
26 /* DANGER!!!! These must be defined *BEFORE* replacements.h and the malloc() macro!!!! */
33 * will alloc memory and clear it
35 void *clear_malloc(size_t size
)
37 void *t
= malloc(size
);
39 memset(t
, 0x00, size
);
43 void *fill_malloc(size_t size
)
45 void *t
= malloc(size
);
47 /* We want to initialize memory to some known bad state.
48 * 0 and 0xff yields 0 and -1 as integers, which often
49 * have meaningful values. 0x5555... is not often a valid
50 * integer and is quite easily spotted in the debugger
51 * also it is almost certainly an invalid address */
52 memset(t
, 0x55, size
);
57 #define IN_REPLACEMENTS_C
69 /* replacements for gettimeofday */
70 #ifndef HAVE_GETTIMEOFDAY
76 #define EPOCHFILETIME (116444736000000000i64)
78 #define EPOCHFILETIME (116444736000000000LL)
81 int gettimeofday(struct timeval
*tv
, struct timezone
*tz
)
89 GetSystemTimeAsFileTime(&ft
);
90 li
.LowPart
= ft
.dwLowDateTime
;
91 li
.HighPart
= ft
.dwHighDateTime
;
92 t
= li
.QuadPart
; /* In 100-nanosecond intervals */
93 t
-= EPOCHFILETIME
; /* Offset to the Epoch time */
94 t
/= 10; /* In microseconds */
95 tv
->tv_sec
= (long)(t
/ 1000000);
96 tv
->tv_usec
= (long)(t
% 1000000);
104 tz
->tz_minuteswest
= _timezone
/ 60;
105 tz
->tz_dsttime
= _daylight
;
112 #endif /* HAVE_GETTIMEOFDAY */
115 size_t strnlen(const char *s
, size_t maxlen
)
117 const char *end
= (const char *)memchr(s
, '\0', maxlen
);
118 return end
? (size_t) (end
- s
) : maxlen
;
123 char *strndup(const char *s
, size_t n
)
125 size_t len
= strnlen(s
, n
);
126 char *new = (char *) malloc(len
+ 1);
132 return (char *) memcpy(new, s
, len
);
137 int win_select(int max_fd
, fd_set
*rfds
, fd_set
*wfds
, fd_set
*efds
, struct timeval
*tv
)
139 DWORD ms_total
, limit
;
140 HANDLE handles
[MAXIMUM_WAIT_OBJECTS
];
141 int handle_slot_to_fd
[MAXIMUM_WAIT_OBJECTS
];
142 int n_handles
= 0, i
;
143 fd_set sock_read
, sock_write
, sock_except
;
144 fd_set aread
, awrite
, aexcept
;
145 int sock_max_fd
= -1;
146 struct timeval tvslice
;
149 #define SAFE_FD_ISSET(fd, set) (set != NULL && FD_ISSET(fd, set))
151 /* calculate how long we need to wait in milliseconds */
155 ms_total
= tv
->tv_sec
* 1000;
156 ms_total
+= tv
->tv_usec
/ 1000;
160 FD_ZERO(&sock_write
);
161 FD_ZERO(&sock_except
);
163 /* build an array of handles for non-sockets */
164 for (i
= 0; i
< max_fd
; i
++) {
165 if (SAFE_FD_ISSET(i
, rfds
) || SAFE_FD_ISSET(i
, wfds
) || SAFE_FD_ISSET(i
, efds
)) {
166 intptr_t handle
= (intptr_t) _get_osfhandle(i
);
167 handles
[n_handles
] = (HANDLE
)handle
;
168 if (handles
[n_handles
] == INVALID_HANDLE_VALUE
) {
170 if (SAFE_FD_ISSET(i
, rfds
))
171 FD_SET(i
, &sock_read
);
172 if (SAFE_FD_ISSET(i
, wfds
))
173 FD_SET(i
, &sock_write
);
174 if (SAFE_FD_ISSET(i
, efds
))
175 FD_SET(i
, &sock_except
);
179 handle_slot_to_fd
[n_handles
] = i
;
185 if (n_handles
== 0) {
186 /* plain sockets only - let winsock handle the whole thing */
187 return select(max_fd
, rfds
, wfds
, efds
, tv
);
190 /* mixture of handles and sockets; lets multiplex between
191 * winsock and waiting on the handles */
197 limit
= GetTickCount() + ms_total
;
201 if (sock_max_fd
>= 0) {
202 /* overwrite the zero'd sets here; the select call
203 * will clear those that are not active */
206 aexcept
= sock_except
;
209 tvslice
.tv_usec
= 1000;
211 retcode
= select(sock_max_fd
+ 1, &aread
, &awrite
, &aexcept
, &tvslice
);
218 wret
= MsgWaitForMultipleObjects(n_handles
,
224 if (wret
== WAIT_TIMEOUT
) {
225 /* set retcode to 0; this is the default.
226 * select() may have set it to something else,
227 * in which case we leave it alone, so this branch
230 } else if (wret
== WAIT_FAILED
) {
236 for (i
= 0; i
< n_handles
; i
++) {
237 if (WAIT_OBJECT_0
== WaitForSingleObject(handles
[i
], 0)) {
238 if (SAFE_FD_ISSET(handle_slot_to_fd
[i
], rfds
)) {
240 intptr_t handle
= (intptr_t) _get_osfhandle(
241 handle_slot_to_fd
[i
]);
243 if (PeekNamedPipe((HANDLE
)handle
, NULL
, 0,
244 NULL
, &dwBytes
, NULL
)) {
245 /* check to see if gdb pipe has data available */
247 FD_SET(handle_slot_to_fd
[i
], &aread
);
251 FD_SET(handle_slot_to_fd
[i
], &aread
);
255 if (SAFE_FD_ISSET(handle_slot_to_fd
[i
], wfds
)) {
256 FD_SET(handle_slot_to_fd
[i
], &awrite
);
259 if (SAFE_FD_ISSET(handle_slot_to_fd
[i
], efds
)) {
260 FD_SET(handle_slot_to_fd
[i
], &aexcept
);
267 } while (retcode
== 0 && (ms_total
== INFINITE
|| GetTickCount() < limit
));