Snapshot of upstream SQLite 3.45.3
[sqlcipher.git] / src / os_common.h
blob5b532af0ac9ac8176608ef311aee9bb051e1c312
1 /*
2 ** 2004 May 22
3 **
4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
6 **
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 ******************************************************************************
13 ** This file contains macros and a little bit of code that is common to
14 ** all of the platform-specific files (os_*.c) and is #included into those
15 ** files.
17 ** This file should be #included by the os_*.c files only. It is not a
18 ** general purpose header file.
20 #ifndef _OS_COMMON_H_
21 #define _OS_COMMON_H_
24 ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
25 ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
26 ** switch. The following code should catch this problem at compile-time.
28 #ifdef MEMORY_DEBUG
29 # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
30 #endif
33 ** Macros for performance tracing. Normally turned off. Only works
34 ** on i486 hardware.
36 #ifdef SQLITE_PERFORMANCE_TRACE
38 static sqlite_uint64 g_start;
39 static sqlite_uint64 g_elapsed;
40 #define TIMER_START g_start=sqlite3Hwtime()
41 #define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
42 #define TIMER_ELAPSED g_elapsed
43 #else
44 #define TIMER_START
45 #define TIMER_END
46 #define TIMER_ELAPSED ((sqlite_uint64)0)
47 #endif
50 ** If we compile with the SQLITE_TEST macro set, then the following block
51 ** of code will give us the ability to simulate a disk I/O error. This
52 ** is used for testing the I/O recovery logic.
54 #if defined(SQLITE_TEST)
55 extern int sqlite3_io_error_hit;
56 extern int sqlite3_io_error_hardhit;
57 extern int sqlite3_io_error_pending;
58 extern int sqlite3_io_error_persist;
59 extern int sqlite3_io_error_benign;
60 extern int sqlite3_diskfull_pending;
61 extern int sqlite3_diskfull;
62 #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
63 #define SimulateIOError(CODE) \
64 if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
65 || sqlite3_io_error_pending-- == 1 ) \
66 { local_ioerr(); CODE; }
67 static void local_ioerr(){
68 IOTRACE(("IOERR\n"));
69 sqlite3_io_error_hit++;
70 if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
72 #define SimulateDiskfullError(CODE) \
73 if( sqlite3_diskfull_pending ){ \
74 if( sqlite3_diskfull_pending == 1 ){ \
75 local_ioerr(); \
76 sqlite3_diskfull = 1; \
77 sqlite3_io_error_hit = 1; \
78 CODE; \
79 }else{ \
80 sqlite3_diskfull_pending--; \
81 } \
83 #else
84 #define SimulateIOErrorBenign(X)
85 #define SimulateIOError(A)
86 #define SimulateDiskfullError(A)
87 #endif /* defined(SQLITE_TEST) */
90 ** When testing, keep a count of the number of open files.
92 #if defined(SQLITE_TEST)
93 extern int sqlite3_open_file_count;
94 #define OpenCounter(X) sqlite3_open_file_count+=(X)
95 #else
96 #define OpenCounter(X)
97 #endif /* defined(SQLITE_TEST) */
99 #endif /* !defined(_OS_COMMON_H_) */