Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/dad0d225ec5117b715efc0c44c4fa0d606660381

>---------------------------------------------------------------

commit dad0d225ec5117b715efc0c44c4fa0d606660381
Author: Simon Marlow <marlo...@gmail.com>
Date:   Tue Nov 8 16:28:57 2011 +0000

    Close some handle leaks (#5604)
    
    Also, use the Win32 API (CreateThread) instead of the CRT API
    (_beginthreadex) for thread creation.

>---------------------------------------------------------------

 rts/win32/OSThreads.c |   30 +++++++++++++++++++++---------
 1 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c
index 44db42f..c85dd2f 100644
--- a/rts/win32/OSThreads.c
+++ b/rts/win32/OSThreads.c
@@ -93,20 +93,30 @@ yieldThread()
 void
 shutdownThread()
 {
-  _endthreadex(0);
-  barf("_endthreadex returned"); // avoid gcc warning
+    ExitThread(0);
+    barf("ExitThread() returned"); // avoid gcc warning
 }
 
 int
 createOSThread (OSThreadId* pId, OSThreadProc *startProc, void *param)
 {
-  
-  return (_beginthreadex ( NULL,  /* default security attributes */
-                          0,
-                          (unsigned (__stdcall *)(void *)) startProc,
-                          param,
-                          0,
-                          (unsigned*)pId) == 0);
+    HANDLE h;
+    h = CreateThread ( NULL,  /* default security attributes */
+                       0,
+                       (LPTHREAD_START_ROUTINE)startProc,
+                       param,
+                       0,
+                       pId);
+
+    if (h == 0) {
+        return 1;
+    } else {
+        // This handle leaks if we don't close it here.  Perhaps we
+        // should try to keep it around to avoid needing OpenThread()
+        // later.
+        CloseHandle(h);
+        return 0;
+    }
 }
 
 OSThreadId
@@ -128,6 +138,7 @@ osThreadIsAlive(OSThreadId id)
         sysErrorBelch("osThreadIsAlive: GetExitCodeThread");
         stg_exit(EXIT_FAILURE);
     }
+    CloseHandle(hdl);
     return (exit_code == STILL_ACTIVE);
 }
 
@@ -286,6 +297,7 @@ interruptOSThread (OSThreadId id)
     } else {
         // Nothing to do, unfortunately
     }
+    CloseHandle(hdl);
 }
 
 #else /* !defined(THREADED_RTS) */



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to