xref: /sqlite-3.40.0/src/os_common.h (revision 9bcbdad2)
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.
10 **
11 ******************************************************************************
12 **
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.
16 **
17 ** This file should be #included by the os_*.c files only.  It is not a
18 ** general purpose header file.
19 **
20 ** $Id: os_common.h,v 1.37 2008/05/29 20:22:37 shane Exp $
21 */
22 #ifndef _OS_COMMON_H_
23 #define _OS_COMMON_H_
24 
25 /*
26 ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
27 ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
28 ** switch.  The following code should catch this problem at compile-time.
29 */
30 #ifdef MEMORY_DEBUG
31 # error "The MEMORY_DEBUG macro is obsolete.  Use SQLITE_DEBUG instead."
32 #endif
33 
34 
35 /*
36  * When testing, this global variable stores the location of the
37  * pending-byte in the database file.
38  */
39 #ifdef SQLITE_TEST
40 unsigned int sqlite3_pending_byte = 0x40000000;
41 #endif
42 
43 #ifdef SQLITE_DEBUG
44 int sqlite3OSTrace = 0;
45 #define OSTRACE1(X)         if( sqlite3OSTrace ) sqlite3DebugPrintf(X)
46 #define OSTRACE2(X,Y)       if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y)
47 #define OSTRACE3(X,Y,Z)     if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z)
48 #define OSTRACE4(X,Y,Z,A)   if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A)
49 #define OSTRACE5(X,Y,Z,A,B) if( sqlite3OSTrace ) sqlite3DebugPrintf(X,Y,Z,A,B)
50 #define OSTRACE6(X,Y,Z,A,B,C) \
51     if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C)
52 #define OSTRACE7(X,Y,Z,A,B,C,D) \
53     if(sqlite3OSTrace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D)
54 #else
55 #define OSTRACE1(X)
56 #define OSTRACE2(X,Y)
57 #define OSTRACE3(X,Y,Z)
58 #define OSTRACE4(X,Y,Z,A)
59 #define OSTRACE5(X,Y,Z,A,B)
60 #define OSTRACE6(X,Y,Z,A,B,C)
61 #define OSTRACE7(X,Y,Z,A,B,C,D)
62 #endif
63 
64 /*
65 ** Macros for performance tracing.  Normally turned off.  Only works
66 ** on i486 hardware.
67 */
68 #ifdef SQLITE_PERFORMANCE_TRACE
69 
70 /*
71 ** hwtime.h contains inline assembler code for implementing
72 ** high-performance timing routines.
73 */
74 #include "hwtime.h"
75 
76 static sqlite_uint64 g_start;
77 static sqlite_uint64 g_elapsed;
78 #define TIMER_START       g_start=sqlite3Hwtime()
79 #define TIMER_END         g_elapsed=sqlite3Hwtime()-g_start
80 #define TIMER_ELAPSED     g_elapsed
81 #else
82 #define TIMER_START
83 #define TIMER_END
84 #define TIMER_ELAPSED     ((sqlite_uint64)0)
85 #endif
86 
87 /*
88 ** If we compile with the SQLITE_TEST macro set, then the following block
89 ** of code will give us the ability to simulate a disk I/O error.  This
90 ** is used for testing the I/O recovery logic.
91 */
92 #ifdef SQLITE_TEST
93 int sqlite3_io_error_hit = 0;            /* Total number of I/O Errors */
94 int sqlite3_io_error_hardhit = 0;        /* Number of non-benign errors */
95 int sqlite3_io_error_pending = 0;        /* Count down to first I/O error */
96 int sqlite3_io_error_persist = 0;        /* True if I/O errors persist */
97 int sqlite3_io_error_benign = 0;         /* True if errors are benign */
98 int sqlite3_diskfull_pending = 0;
99 int sqlite3_diskfull = 0;
100 #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
101 #define SimulateIOError(CODE)  \
102   if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
103        || sqlite3_io_error_pending-- == 1 )  \
104               { local_ioerr(); CODE; }
105 static void local_ioerr(){
106   IOTRACE(("IOERR\n"));
107   sqlite3_io_error_hit++;
108   if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
109 }
110 #define SimulateDiskfullError(CODE) \
111    if( sqlite3_diskfull_pending ){ \
112      if( sqlite3_diskfull_pending == 1 ){ \
113        local_ioerr(); \
114        sqlite3_diskfull = 1; \
115        sqlite3_io_error_hit = 1; \
116        CODE; \
117      }else{ \
118        sqlite3_diskfull_pending--; \
119      } \
120    }
121 #else
122 #define SimulateIOErrorBenign(X)
123 #define SimulateIOError(A)
124 #define SimulateDiskfullError(A)
125 #endif
126 
127 /*
128 ** When testing, keep a count of the number of open files.
129 */
130 #ifdef SQLITE_TEST
131 int sqlite3_open_file_count = 0;
132 #define OpenCounter(X)  sqlite3_open_file_count+=(X)
133 #else
134 #define OpenCounter(X)
135 #endif
136 
137 #endif /* !defined(_OS_COMMON_H_) */
138