pkgsrc/lang/mono/patches/patch-ah
kefren a7f016eb96 Update mono to 2.8.2
* Security fix for ASP.NET (XSP / mod_mono) source code disclosure
   (CVE-2010-4225)
 * Backport ParallelFx improvements from master (jlaval)
 * Fix state check for short-circuiting with SupportRecursion in
   ReaderWriterLockSlim #655361 (jlaval)
 * Increment Count even on single-processor in SpinWait.
   Fix #624849. (jlaval)
 * Update ThreadLocal to use default(T) for initialization with
   parameterless ctor. Fix #658689. (jlaval)
2011-01-08 18:06:00 +00:00

69 lines
1.8 KiB
Text

$NetBSD: patch-ah,v 1.13 2011/01/08 18:06:00 kefren Exp $
--- mono/utils/mono-semaphore.c.orig 2011-01-04 19:39:55.000000000 +0200
+++ mono/utils/mono-semaphore.c 2011-01-08 18:52:28.000000000 +0200
@@ -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__) || defined(__DragonFly__))
# define TIMESPEC struct timespec
# define WAIT_BLOCK(a) sem_trywait(a)
# else
@@ -34,12 +34,13 @@
int
mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms, gboolean alertable)
{
+#if (defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
+ 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)
@@ -48,6 +49,19 @@
if (timeout_ms == (guint32) 0xFFFFFFFF)
return mono_sem_wait (sem, alertable);
+#if (defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
+ 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
+
#ifdef USE_MACH_SEMA
memset (&t, 0, sizeof (TIMESPEC));
#else
@@ -59,19 +73,6 @@
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;