1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-14 00:22:38 +03:00

Modify the sqlite3_log() interface and implementation so that it never

uses dynamic memory allocation - to avoid deadlocking when called while
holding the memory allocator mutex.

FossilOrigin-Name: 28d1bc98d60319b10af427072037a0121bc76259
This commit is contained in:
drh
2010-03-03 22:25:18 +00:00
parent 3bbe761c9b
commit 7c0c460fff
4 changed files with 51 additions and 21 deletions

View File

@@ -1,5 +1,8 @@
C Fix\ssome\sextra\sinstances\sof\sthe\sconstants\saddressed\sby\s[83e47ca006].
D 2010-03-03T16:02:06
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
C Modify\sthe\ssqlite3_log()\sinterface\sand\simplementation\sso\sthat\sit\snever\nuses\sdynamic\smemory\sallocation\s-\sto\savoid\sdeadlocking\swhen\scalled\swhile\nholding\sthe\smemory\sallocator\smutex.
D 2010-03-03T22:25:18
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in 4f2f967b7e58a35bb74fb7ec8ae90e0f4ca7868b
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -160,13 +163,13 @@ F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
F src/pcache1.c 2bb2261190b42a348038f5b1c285c8cef415fcc8
F src/pragma.c 56d95f76154a5f873c32eae485bb625f3c70be46
F src/prepare.c c80630169d82945070a50ebf298611fd9f1485f1
F src/printf.c aa793722d793520fa31c54d81ddab26b0b410562
F src/printf.c e2b8c9c8d34583dbda4a09fbcb95c522e8467344
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c a1648d98e869937b29f4f697461fe4d60f220a7b
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
F src/select.c 4113ef360430ed4e7533690ef46d06c20204adce
F src/shell.c c40427c7245535a04a9cb4a417b6cc05c022e6a4
F src/sqlite.h.in 8793d52e7d4e1124dc3cc94ff56376a97b67965f
F src/sqlite.h.in 08a2d9a278ff0dfd65055a7ec9c599f7ae1a3c18
F src/sqlite3ext.h 69dfb8116af51b84a029cddb3b35062354270c89
F src/sqliteInt.h 32e6eb47d2f6fad587e16b0abbbfe3f7d55f2ec0
F src/sqliteLimit.h 3afab2291762b5d09ae20c18feb8e9fa935a60a6
@@ -792,7 +795,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 83e47ca0069de259e98798d84d88301a5b4b6d2e
R b254a895c1aed55531168a2f7a11c1dc
U dan
Z f02550fa435e14ac73a675de6c737016
P 0354ab279f0ea9915a14d1ed972b4aa6b5a27fd1
R 926156f9ae585a784895773b700799f0
U drh
Z a5e3e8dcfa2c5ad6badf36c518ae99a7
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFLjuHSoxKgR168RlERAu2uAJ9FMiE/PiQGTF1xE6N9Vhp5wtfQGgCgiZmk
jbyYImM3VWOBm37tm51Ua0M=
=bI8b
-----END PGP SIGNATURE-----

View File

@@ -1 +1 @@
0354ab279f0ea9915a14d1ed972b4aa6b5a27fd1
28d1bc98d60319b10af427072037a0121bc76259

View File

@@ -939,25 +939,39 @@ char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){
return z;
}
/*
** This is the routine that actually formats the sqlite3_log() message.
** We house it in a separate routine from sqlite3_log() to avoid using
** stack space on small-stack systems when logging is disabled.
**
** sqlite3_log() must render into a static buffer. It cannot dynamically
** allocate memory because it might be called while the memory allocator
** mutex is held.
*/
static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){
StrAccum acc; /* String accumulator */
#ifdef SQLITE_SMALL_STACK
char zMsg[150]; /* Complete log message */
#else
char zMsg[400]; /* Complete log message */
#endif
sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0);
acc.useMalloc = 0;
sqlite3VXPrintf(&acc, 0, zFormat, ap);
sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode,
sqlite3StrAccumFinish(&acc));
}
/*
** Format and write a message to the log if logging is enabled.
*/
void sqlite3_log(int iErrCode, const char *zFormat, ...){
void (*xLog)(void*, int, const char*); /* The global logger function */
void *pLogArg; /* First argument to the logger */
va_list ap; /* Vararg list */
char *zMsg; /* Complete log message */
xLog = sqlite3GlobalConfig.xLog;
if( xLog ){
if( sqlite3GlobalConfig.xLog ){
va_start(ap, zFormat);
sqlite3BeginBenignMalloc();
zMsg = sqlite3_vmprintf(zFormat, ap);
sqlite3EndBenignMalloc();
renderLogMsg(iErrCode, zFormat, ap);
va_end(ap);
pLogArg = sqlite3GlobalConfig.pLogArg;
xLog(pLogArg, iErrCode, zMsg ? zMsg : zFormat);
sqlite3_free(zMsg);
}
}

View File

@@ -5705,6 +5705,12 @@ int sqlite3_strnicmp(const char *, const char *, int);
** is considered bad form.
**
** The zFormat string must not be NULL.
**
** To avoid deadlocks and other threading problems, the sqlite3_log() routine
** will not use dynamically allocated memory. The log message is stored in
** a fixed-length buffer on the stack. If the log message is longer than
** a few hundred characters, it will be truncated to the length of the
** buffer.
*/
void sqlite3_log(int iErrCode, const char *zFormat, ...);