summaryrefslogtreecommitdiff
path: root/lang/mono/patches/patch-ah
blob: 2f2b36abbdbbd1ab42cb14da029c7a2f09fc78bb (plain)
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;