]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make the Win32 thread handles are available after the threads exit.
authormistachkin <mistachkin@noemail.net>
Tue, 29 Jul 2014 16:37:53 +0000 (16:37 +0000)
committermistachkin <mistachkin@noemail.net>
Tue, 29 Jul 2014 16:37:53 +0000 (16:37 +0000)
FossilOrigin-Name: 565c5af7a75ad5c759ce1a61dab3a61c42819644

manifest
manifest.uuid
src/os_win.c
src/threads.c

index 6f77fc7896b6dbcc1bcda8e1039ae0f45ef73f02..d98cd45916d0fa08b3fe48929c7886d16ef5506f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\sthreads\sbuild\son\sWindows\swhen\sSQLITE_MAX_WORKER_THREADS\sis\sgreater\nthan\s0.
-D 2014-07-29T15:18:00.197
+C Make\sthe\sWin32\sthread\shandles\sare\savailable\safter\sthe\sthreads\sexit.
+D 2014-07-29T16:37:53.918
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -208,7 +208,7 @@ F src/os.h 60d419395e32a8029fa380a80a3da2e9030f635e
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
 F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
 F src/os_unix.c a7baf1b30f3c58ba20b813e01aab23b18ae44f85
-F src/os_win.c 047e903174b018c50f425be793eafa8d849737a9
+F src/os_win.c 5f8c5568cc749d6ab44006124e7701f463559223
 F src/os_win.h 057344a6720b4c8405d9bd98f58cb37a6ee46c25
 F src/pager.c f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8
 F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
@@ -277,7 +277,7 @@ F src/test_thread.c 1e133a40b50e9c035b00174035b846e7eef481cb
 F src/test_vfs.c f84075a388527892ff184988f43b69ce69b8083c
 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
-F src/threads.c 28c72cb7818fea8df83116c54d774e9541e60121
+F src/threads.c dfc566f8b5744914bb3e6fe77b5ed63037b9b35d
 F src/tokenize.c ae45399d6252b4d736af43bee1576ce7bff86aec
 F src/trigger.c 66f3470b03b52b395e839155786966e3e037fddb
 F src/update.c 01564b3c430f6c7b0a35afaf7aba7987206fa3a5
@@ -1189,7 +1189,8 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P b2f7eb3cc27ecf9a6a88907991148bca1a7d54b3
-R d111ee75a275c87deb7a4599506773e2
-U drh
-Z e24fba9313c2b62a7de12b4c1acec1ff
+P f37db3a03d95b508066745613029b7dd1240b31c
+Q -2773a5f9879a106a89a3d0bc3c5bfdcb2fe43c7c
+R 3e55555e18d084a6f84ef756240b91ed
+U mistachkin
+Z e9ccfd5ccb7ae9590b75500531d4b897
index 9e436c5c79622b4df450807a1ec7c5a168bad14b..ed3eb9f7ffab560a4fa566c86210a54d8c12370b 100644 (file)
@@ -1 +1 @@
-f37db3a03d95b508066745613029b7dd1240b31c
\ No newline at end of file
+565c5af7a75ad5c759ce1a61dab3a61c42819644
\ No newline at end of file
index fa485978d357aa5dbf1b3300d95461da57e0afd3..5c246a858602e725f70d5f3569f9d97f5be77fb5 100644 (file)
@@ -1275,6 +1275,13 @@ void sqlite3_win32_sleep(DWORD milliseconds){
 #endif
 }
 
+DWORD sqlite3Win32Wait(HANDLE hObject){
+  DWORD rc;
+  while( (rc = osWaitForSingleObjectEx(hObject, INFINITE,
+                                       TRUE))==WAIT_IO_COMPLETION ){}
+  return rc;
+}
+
 /*
 ** Return true (non-zero) if we are running under WinNT, Win2K, WinXP,
 ** or WinCE.  Return false (zero) for Win95, Win98, or WinME.
index 0f7f8a83bf6e46197ce78aaa7aef8af32c11b52f..5813b34893273735d3f99dd964335b53e5b4776f 100644 (file)
@@ -100,21 +100,25 @@ int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){
 /* A running thread */
 struct SQLiteThread {
   uintptr_t tid;           /* The thread handle */
+  unsigned id;             /* The thread identifier */
   void *(*xTask)(void*);   /* The routine to run as a thread */
   void *pIn;               /* Argument to xTask */
   void *pResult;           /* Result of xTask */
 };
 
 /* Thread procedure Win32 compatibility shim */
-static void sqlite3ThreadProc(
+static unsigned __stdcall sqlite3ThreadProc(
   void *pArg  /* IN: Pointer to the SQLiteThread structure */
 ){
   SQLiteThread *p = (SQLiteThread *)pArg;
 
   assert( p!=0 );
+  assert( p->id==GetCurrentThreadId() );
   assert( p->xTask!=0 );
   p->pResult = p->xTask(p->pIn);
-  _endthread();
+
+  _endthreadex(0);
+  return 0; /* NOT REACHED */
 }
 
 /* Create a new thread */
@@ -135,37 +139,36 @@ int sqlite3ThreadCreate(
   }else{
     p->xTask = xTask;
     p->pIn = pIn;
-    p->tid = _beginthread(sqlite3ThreadProc, 0, p);
+    p->tid = _beginthreadex(0, 0, sqlite3ThreadProc, p, 0, &p->id);
     if( p->tid==(uintptr_t)-1 ){
       memset(p, 0, sizeof(*p));
     }
   }
   if( p->xTask==0 ){
+    p->id = GetCurrentThreadId();
     p->pResult = xTask(pIn);
   }
   *ppThread = p;
   return SQLITE_OK;
 }
 
-/* Wait on an object */
-DWORD sqlite3Win32Wait(HANDLE hObject){
-  DWORD rc;
-  while( (rc = WaitForSingleObjectEx(hObject, INFINITE,
-                                       TRUE))==WAIT_IO_COMPLETION ){}
-  return rc;
-}
+DWORD sqlite3Win32Wait(HANDLE hObject); /* os_win.c */
 
 /* Get the results of the thread */
 int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){
   DWORD rc;
+  BOOL bRc;
 
   assert( ppOut!=0 );
   if( p==0 ) return SQLITE_NOMEM;
   if( p->xTask==0 ){
     rc = WAIT_OBJECT_0;
   }else{
+    assert( p->id!=0 && p->id!=GetCurrentThreadId() );
     rc = sqlite3Win32Wait((HANDLE)p->tid);
     assert( rc!=WAIT_IO_COMPLETION );
+    bRc = CloseHandle((HANDLE)p->tid);
+    assert( bRc );
   }
   if( rc==WAIT_OBJECT_0 ) *ppOut = p->pResult;
   sqlite3_free(p);