blob: 23272c844975b9ff70d337bed2bcb6e95f8936fe [file] [log] [blame]
/*
** 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
/*
** The default xBenignCtrl function is a no-op
*/
static void sqlite3BenignCtrlNoop(int eOp){
(void)eOp;
}
/*
** Global variable: Pointer to the benign malloc control interface.
*/
static void (*sqlite3xBenignCtrl)(int) = sqlite3BenignCtrlNoop;
/*
** Register a pointer to the benign-malloc control interface function.
** If the argument is a NULL pointer, register the default no-op controller.
*/
void sqlite3BenignMallocHooks(void (*xBenignCtrl)(int)){
sqlite3xBenignCtrl = xBenignCtrl ? xBenignCtrl : sqlite3BenignCtrlNoop;
}
/*
** The sqlite3BeginBenignMalloc() and sqlite3EndBenignMalloc() calls bracket
** sections of code for which malloc failures are non-fatal.
*/
void sqlite3BeginBenignMalloc(void){
sqlite3xBenignCtrl(1);
}
void sqlite3EndBenignMalloc(void){
sqlite3xBenignCtrl(0);
}
/*
** The sqlite3PreviousBenignMalloc() call indicates that the previous
** malloc call (which must have failed) was a benign failure.
*/
void sqlite3PreviousBenignMalloc(void){
sqlite3xBenignCtrl(2);
}
#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */