int
createOSThread ( OSThreadId* pId, void (*startProc)(void))
{
- return pthread_create(pId, NULL, startProcWrapper, (void*)startProc);
+ int result = pthread_create(pId, NULL, startProcWrapper, (void*)startProc);
+ if(!result)
+ pthread_detach(*pId);
+ return result;
}
OSThreadId
return;
}
+static void *
+forkOS_createThreadWrapper ( void * entry )
+{
+ rts_lock();
+ rts_evalStableIO((HsStablePtr) entry, NULL);
+ rts_unlock();
+ return NULL;
+}
+
+int
+forkOS_createThread ( HsStablePtr entry )
+{
+ pthread_t tid;
+ int result = pthread_create(&tid, NULL,
+ forkOS_createThreadWrapper, (void*)entry);
+ if(!result)
+ pthread_detach(tid);
+ return result;
+}
+
#elif defined(HAVE_WINDOWS_H)
+/* For reasons not yet clear, the entire contents of process.h is protected
+ * by __STRICT_ANSI__ not being defined.
+ */
+#undef __STRICT_ANSI__
#include <process.h>
/* Win32 threads and synchronisation objects */
NULL); /* unnamed => process-local. */
if ( h == NULL ) {
- belch("initCondition: unable to create");
+ errorBelch("initCondition: unable to create");
}
*pCond = h;
return;
closeCondition( Condition* pCond )
{
if ( CloseHandle(*pCond) == 0 ) {
- belch("closeCondition: failed to close");
+ errorBelch("closeCondition: failed to close");
}
return;
}
rtsBool
signalCondition ( Condition* pCond )
{
- SetEvent(*pCond);
- return rtsTrue;
+ if (SetEvent(*pCond) == 0) {
+ barf("SetEvent: %d", GetLastError());
+ }
+ return rtsTrue;
}
rtsBool
waitCondition ( Condition* pCond, Mutex* pMut )
{
- ReleaseMutex(*pMut);
+ RELEASE_LOCK(pMut);
WaitForSingleObject(*pCond, INFINITE);
/* Hmm..use WaitForMultipleObjects() ? */
- WaitForSingleObject(*pMut, INFINITE);
+ ACQUIRE_LOCK(pMut);
return rtsTrue;
}
return;
}
+static unsigned __stdcall
+forkOS_createThreadWrapper ( void * entry )
+{
+ rts_lock();
+ rts_evalStableIO((HsStablePtr) entry, NULL);
+ rts_unlock();
+ return 0;
+}
+
+int
+forkOS_createThread ( HsStablePtr entry )
+{
+ unsigned long pId;
+ return (_beginthreadex ( NULL, /* default security attributes */
+ 0,
+ forkOS_createThreadWrapper,
+ (void*)entry,
+ 0,
+ (unsigned*)&pId) == 0);
+}
+
#endif /* defined(HAVE_PTHREAD_H) */
-#endif /* defined(RTS_SUPPORTS_THREADS) */
+#else /* !defined(RTS_SUPPORTS_THREADS) */
+
+int
+forkOS_createThread ( HsStablePtr entry STG_UNUSED )
+{
+ return -1;
+}
+
+#endif /* !defined(RTS_SUPPORTS_THREADS) */
+