From: drh Date: Fri, 6 Jan 2006 00:36:00 +0000 (+0000) Subject: Windows implementation of the thread-specific data interface. (CVS 2864) X-Git-Tag: version-3.6.10~3303 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3fbb0b1a3b371e8ea5110d9fe6845e15897f5bb1;p=thirdparty%2Fsqlite.git Windows implementation of the thread-specific data interface. (CVS 2864) FossilOrigin-Name: 3aa8befedf4534cd100a7309997a4ad2ba08af20 --- diff --git a/manifest b/manifest index 90d461343b..dba2ea7bec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\supdate\shook\sfor\sthe\struncation\soptimization\sused\sby\sDELETE.\s(CVS\s2863) -D 2006-01-05T23:42:51 +C Windows\simplementation\sof\sthe\sthread-specific\sdata\sinterface.\s(CVS\s2864) +D 2006-01-06T00:36:01 F Makefile.in e3c6b3a38d734d41574c04f2fc90d18de2b87102 F Makefile.linux-gcc aee18d8a05546dcf1888bd4547e442008a49a092 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -55,9 +55,9 @@ F src/os.h cc99e1515696728ba64c77fffa781ebadea34619 F src/os_common.h d0b1f2f32926e9b6db7886a7f43008b596a9e926 F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 -F src/os_unix.c d52d87a06ce62c7c6b9f7dcb7da1248737397765 +F src/os_unix.c d99158f78926e9cc6a9b3e1a96fd6bf6d4205bfa F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e -F src/os_win.c 7e2d09f81cb83709b9774ac6be80fa3cb08ac86d +F src/os_win.c c774f888088ad8fa80e501feeaa083dc467eed78 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b F src/pager.c 07509ddb478f5a70f9ff53607ab8a44456c22811 F src/pager.h e0acb095b3ad0bca48f2ab00c87346665643f64f @@ -336,7 +336,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 98194a45cc60cb9942847f773bc797fb5463bd10 -R 07be59db7afabb7b45cf412f124e62ed +P 448b3b9dede724749df0004ca39c649951f1f2ca +R dcf7542b8c94e9c5f5cab045190921be U drh -Z a5d8489d544088bc2e3c77613dd41537 +Z 83024d815993803987e6aa0634273fc2 diff --git a/manifest.uuid b/manifest.uuid index 6fab3dccc7..fa106c3744 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -448b3b9dede724749df0004ca39c649951f1f2ca \ No newline at end of file +3aa8befedf4534cd100a7309997a4ad2ba08af20 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index f2ac94e126..2f90e3d47b 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1663,24 +1663,24 @@ static void *unixThreadSpecificData(int nByte){ sqlite3Os.xLeaveMutex(); } - pTsd = (SqliteTsd *)pthread_getspecific(key); + pTsd = pthread_getspecific(key); if( !pTsd ){ - pTsd = sqlite3Os.xMalloc(sizeof(SqliteTsd)); + pTsd = sqlite3Os.xMalloc(nByte); if( pTsd ){ - memset(pTsd, 0, sizeof(SqliteTsd)); + memset(pTsd, 0, nByte); pthread_setspecific(key, pTsd); } } return pTsd; #else - static char tsd[sizeof(SqliteTsd)]; - static int isInit = 0; - assert( nByte==sizeof(SqliteTsd) ); - if( !isInit ){ - memset(tsd, 0, sizeof(SqliteTsd)); - isInit = 1; + static void *pTsd = 0; + if( !pTsd ){ + pTsd = sqlite3Os.xMalloc(nByte); + if( pTsd ){ + memset(pTsd, 0, nByte); + } } - return (void *)tsd; + return pTsd; #endif } diff --git a/src/os_win.c b/src/os_win.c index 3ecacb9c85..108315ed58 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -1031,19 +1031,40 @@ static int winCurrentTime(double *prNow){ return 0; } - -/* -** Todo: This is a place-holder only +/* +** The first time this function is called from a specific thread, nByte +** bytes of data area are allocated and zeroed. A pointer to the new +** allocation is returned to the caller. +** +** Each subsequent call to this function from the thread returns the same +** pointer. The argument is ignored in this case. */ static void *winThreadSpecificData(int nByte){ - static char tsd[sizeof(SqliteTsd)]; - static isInit = 0; - assert( nByte==sizeof(SqliteTsd) ); - if( !isInit ){ - memset(tsd, 0, sizeof(SqliteTsd)); - isInit = 1; + static void *pTsd = 0; + static int key; + static int keyInit = 0; + + if( !keyInit ){ + sqlite3Os.xEnterMutex(); + if( !keyInit ){ + key = TlsAlloc(); + if( key==0xffffffff ){ + sqlite3Os.xLeaveMutex(); + return 0; + } + keyInit = 1; + } + sqlite3Os.xLeaveMutex(); + } + pTsd = TlsGetValue(key); + if( !pTsd ){ + pTsd = sqlite3Os.xMalloc(nByte); + if( pTsd ){ + memset(pTsd, 0, nByte); + TlsSetValue(key, pTsd); + } } - return (void *)tsd; + return pTsd; } /* Macro used to comment out routines that do not exists when there is