| /* |
| ** 2004 May 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 macros and a little bit of code that is common to |
| ** all of the platform-specific files (os_*.c) and is #included into those |
| ** files. |
| ** |
| ** This file should be #included by the os_*.c files only. It is not a |
| ** general purpose header file. |
| */ |
| #ifndef _OS_COMMON_H_ |
| #define _OS_COMMON_H_ |
| |
| /* |
| ** At least two bugs have slipped in because we changed the MEMORY_DEBUG |
| ** macro to SQLITE_DEBUG and some older makefiles have not yet made the |
| ** switch. The following code should catch this problem at compile-time. |
| */ |
| #ifdef MEMORY_DEBUG |
| # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." |
| #endif |
| |
| #ifdef SQLITE_DEBUG |
| int sqlite3OSTrace = 0; |
| #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X |
| #else |
| #define OSTRACE(X) |
| #endif |
| |
| /* |
| ** Macros for performance tracing. Normally turned off. Only works |
| ** on i486 hardware. |
| */ |
| #ifdef SQLITE_PERFORMANCE_TRACE |
| |
| /* |
| ** hwtime.h contains inline assembler code for implementing |
| ** high-performance timing routines. |
| */ |
| #include "hwtime.h" |
| |
| static sqlite_uint64 g_start; |
| static sqlite_uint64 g_elapsed; |
| #define TIMER_START g_start=sqlite3Hwtime() |
| #define TIMER_END g_elapsed=sqlite3Hwtime()-g_start |
| #define TIMER_ELAPSED g_elapsed |
| #else |
| #define TIMER_START |
| #define TIMER_END |
| #define TIMER_ELAPSED ((sqlite_uint64)0) |
| #endif |
| |
| /* |
| ** If we compile with the SQLITE_TEST macro set, then the following block |
| ** of code will give us the ability to simulate a disk I/O error. This |
| ** is used for testing the I/O recovery logic. |
| */ |
| #ifdef SQLITE_TEST |
| int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ |
| int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ |
| int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ |
| int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ |
| int sqlite3_io_error_benign = 0; /* True if errors are benign */ |
| int sqlite3_diskfull_pending = 0; |
| int sqlite3_diskfull = 0; |
| #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) |
| #define SimulateIOError(CODE) \ |
| if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ |
| || sqlite3_io_error_pending-- == 1 ) \ |
| { local_ioerr(); CODE; } |
| static void local_ioerr(){ |
| IOTRACE(("IOERR\n")); |
| sqlite3_io_error_hit++; |
| if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++; |
| } |
| #define SimulateDiskfullError(CODE) \ |
| if( sqlite3_diskfull_pending ){ \ |
| if( sqlite3_diskfull_pending == 1 ){ \ |
| local_ioerr(); \ |
| sqlite3_diskfull = 1; \ |
| sqlite3_io_error_hit = 1; \ |
| CODE; \ |
| }else{ \ |
| sqlite3_diskfull_pending--; \ |
| } \ |
| } |
| #else |
| #define SimulateIOErrorBenign(X) |
| #define SimulateIOError(A) |
| #define SimulateDiskfullError(A) |
| #endif |
| |
| /* |
| ** When testing, keep a count of the number of open files. |
| */ |
| #ifdef SQLITE_TEST |
| int sqlite3_open_file_count = 0; |
| #define OpenCounter(X) sqlite3_open_file_count+=(X) |
| #else |
| #define OpenCounter(X) |
| #endif |
| |
| #endif /* !defined(_OS_COMMON_H_) */ |