1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
$NetBSD: patch-ah,v 1.11 2010/10/16 04:32:18 kefren Exp $
--- mono/utils/mono-semaphore.c.orig 2010-10-07 23:41:21.000000000 +0300
+++ mono/utils/mono-semaphore.c 2010-10-07 23:44:31.000000000 +0300
@@ -22,7 +22,7 @@
# ifdef USE_MACH_SEMA
# define TIMESPEC mach_timespec_t
# define WAIT_BLOCK(a,b) semaphore_timedwait (*(a), *(b))
-# elif defined(__OpenBSD__)
+# elif (defined(__OpenBSD__) || defined(__NetBSD__))
# define TIMESPEC struct timespec
# define WAIT_BLOCK(a) sem_trywait(a)
# else
@@ -34,20 +34,34 @@
int
mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms, gboolean alertable)
{
+#if (defined(__NetBSD__) || defined(__OpenBSD__))
+ uint32_t timeout = timeout_ms;
+#else
TIMESPEC ts, copy;
struct timeval t;
- int res = 0;
-#if defined(__OpenBSD__)
- int timeout;
#endif
+ int res = 0;
#ifndef USE_MACH_SEMA
if (timeout_ms == 0)
return (!sem_trywait (sem));
#endif
+
if (timeout_ms == (guint32) 0xFFFFFFFF)
return mono_sem_wait (sem, alertable);
+#if (defined(__NetBSD__) || defined(__OpenBSD__))
+ if (timeout < 50)
+ timeout += 50;
+ do {
+ if ((res = WAIT_BLOCK(sem)) == 0)
+ break;
+ usleep(50000);
+ timeout -= 50;
+ if (alertable) /* XXX: Not on EINTR */
+ return -1;
+ } while (timeout > 50);
+#else
gettimeofday (&t, NULL);
ts.tv_sec = timeout_ms / 1000 + t.tv_sec;
ts.tv_nsec = (timeout_ms % 1000) * 1000000 + t.tv_usec * 1000;
@@ -55,19 +69,6 @@ mono_sem_timedwait (MonoSemType *sem, gu
ts.tv_nsec -= NSEC_PER_SEC;
ts.tv_sec++;
}
-#if defined(__OpenBSD__)
- timeout = ts.tv_sec;
- while (timeout) {
- if ((res = WAIT_BLOCK (sem)) == 0)
- return res;
-
- if (alertable)
- return -1;
-
- usleep (ts.tv_nsec / 1000);
- timeout--;
- }
-#else
copy = ts;
while ((res = WAIT_BLOCK (sem, &ts)) == -1 && errno == EINTR) {
struct timeval current;
|