[project @ 2005-03-02 11:06:58 by simonmar]
[ghc-hetmet.git] / ghc / rts / OSThreads.c
index 01e0a25..7ed6fd8 100644 (file)
@@ -78,7 +78,10 @@ startProcWrapper(void* pProc)
 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
@@ -94,7 +97,31 @@ initMutex(Mutex* pMut)
   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 */
@@ -117,7 +144,7 @@ initCondition( Condition* pCond )
                          NULL); /* unnamed => process-local. */
   
   if ( h == NULL ) {
-    belch("initCondition: unable to create");
+    errorBelch("initCondition: unable to create");
   }
   *pCond = h;
   return;
@@ -127,7 +154,7 @@ void
 closeCondition( Condition* pCond )
 {
   if ( CloseHandle(*pCond) == 0 ) {
-    belch("closeCondition: failed to close");
+    errorBelch("closeCondition: failed to close");
   }
   return;
 }
@@ -142,17 +169,19 @@ broadcastCondition ( Condition* pCond )
 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;
 }
 
@@ -206,6 +235,36 @@ initMutex (Mutex* pMut)
   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) */
+