| Index: third_party/sqlite/src/src/fault.c
|
| diff --git a/third_party/sqlite/src/src/fault.c b/third_party/sqlite/src/src/fault.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c3028c4f936edf96712dbe73a07662f0a26b1d0a
|
| --- /dev/null
|
| +++ b/third_party/sqlite/src/src/fault.c
|
| @@ -0,0 +1,87 @@
|
| +/*
|
| +** 2008 Jan 22
|
| +**
|
| +** The author disclaims copyright to this source code. In place of
|
| +** a legal notice, here is a blessing:
|
| +**
|
| +** May you do good and not evil.
|
| +** May you find forgiveness for yourself and forgive others.
|
| +** May you share freely, never taking more than you give.
|
| +**
|
| +*************************************************************************
|
| +**
|
| +** This file contains code to support the concept of "benign"
|
| +** malloc failures (when the xMalloc() or xRealloc() method of the
|
| +** sqlite3_mem_methods structure fails to allocate a block of memory
|
| +** and returns 0).
|
| +**
|
| +** Most malloc failures are non-benign. After they occur, SQLite
|
| +** abandons the current operation and returns an error code (usually
|
| +** SQLITE_NOMEM) to the user. However, sometimes a fault is not necessarily
|
| +** fatal. For example, if a malloc fails while resizing a hash table, this
|
| +** is completely recoverable simply by not carrying out the resize. The
|
| +** hash table will continue to function normally. So a malloc failure
|
| +** during a hash table resize is a benign fault.
|
| +*/
|
| +
|
| +#include "sqliteInt.h"
|
| +
|
| +#ifndef SQLITE_OMIT_BUILTIN_TEST
|
| +
|
| +/*
|
| +** Global variables.
|
| +*/
|
| +typedef struct BenignMallocHooks BenignMallocHooks;
|
| +static SQLITE_WSD struct BenignMallocHooks {
|
| + void (*xBenignBegin)(void);
|
| + void (*xBenignEnd)(void);
|
| +} sqlite3Hooks = { 0, 0 };
|
| +
|
| +/* The "wsdHooks" macro will resolve to the appropriate BenignMallocHooks
|
| +** structure. If writable static data is unsupported on the target,
|
| +** we have to locate the state vector at run-time. In the more common
|
| +** case where writable static data is supported, wsdHooks can refer directly
|
| +** to the "sqlite3Hooks" state vector declared above.
|
| +*/
|
| +#ifdef SQLITE_OMIT_WSD
|
| +# define wsdHooksInit \
|
| + BenignMallocHooks *x = &GLOBAL(BenignMallocHooks,sqlite3Hooks)
|
| +# define wsdHooks x[0]
|
| +#else
|
| +# define wsdHooksInit
|
| +# define wsdHooks sqlite3Hooks
|
| +#endif
|
| +
|
| +
|
| +/*
|
| +** Register hooks to call when sqlite3BeginBenignMalloc() and
|
| +** sqlite3EndBenignMalloc() are called, respectively.
|
| +*/
|
| +void sqlite3BenignMallocHooks(
|
| + void (*xBenignBegin)(void),
|
| + void (*xBenignEnd)(void)
|
| +){
|
| + wsdHooksInit;
|
| + wsdHooks.xBenignBegin = xBenignBegin;
|
| + wsdHooks.xBenignEnd = xBenignEnd;
|
| +}
|
| +
|
| +/*
|
| +** This (sqlite3EndBenignMalloc()) is called by SQLite code to indicate that
|
| +** subsequent malloc failures are benign. A call to sqlite3EndBenignMalloc()
|
| +** indicates that subsequent malloc failures are non-benign.
|
| +*/
|
| +void sqlite3BeginBenignMalloc(void){
|
| + wsdHooksInit;
|
| + if( wsdHooks.xBenignBegin ){
|
| + wsdHooks.xBenignBegin();
|
| + }
|
| +}
|
| +void sqlite3EndBenignMalloc(void){
|
| + wsdHooksInit;
|
| + if( wsdHooks.xBenignEnd ){
|
| + wsdHooks.xBenignEnd();
|
| + }
|
| +}
|
| +
|
| +#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */
|
|
|