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: #ifndef _OS_COMMON_H_
21: #define _OS_COMMON_H_
22:
23: /*
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.
27: */
28: #ifdef MEMORY_DEBUG
29: # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
30: #endif
31:
32: #if defined(SQLITE_TEST) && defined(SQLITE_DEBUG)
33: # ifndef SQLITE_DEBUG_OS_TRACE
34: # define SQLITE_DEBUG_OS_TRACE 0
35: # endif
36: int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
37: # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
38: #else
39: # define OSTRACE(X)
40: #endif
41:
42: /*
43: ** Macros for performance tracing. Normally turned off. Only works
44: ** on i486 hardware.
45: */
46: #ifdef SQLITE_PERFORMANCE_TRACE
47:
48: /*
49: ** hwtime.h contains inline assembler code for implementing
50: ** high-performance timing routines.
51: */
52: #include "hwtime.h"
53:
54: static sqlite_uint64 g_start;
55: static sqlite_uint64 g_elapsed;
56: #define TIMER_START g_start=sqlite3Hwtime()
57: #define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
58: #define TIMER_ELAPSED g_elapsed
59: #else
60: #define TIMER_START
61: #define TIMER_END
62: #define TIMER_ELAPSED ((sqlite_uint64)0)
63: #endif
64:
65: /*
66: ** If we compile with the SQLITE_TEST macro set, then the following block
67: ** of code will give us the ability to simulate a disk I/O error. This
68: ** is used for testing the I/O recovery logic.
69: */
70: #ifdef SQLITE_TEST
71: int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */
72: int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */
73: int sqlite3_io_error_pending = 0; /* Count down to first I/O error */
74: int sqlite3_io_error_persist = 0; /* True if I/O errors persist */
75: int sqlite3_io_error_benign = 0; /* True if errors are benign */
76: int sqlite3_diskfull_pending = 0;
77: int sqlite3_diskfull = 0;
78: #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
79: #define SimulateIOError(CODE) \
80: if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
81: || sqlite3_io_error_pending-- == 1 ) \
82: { local_ioerr(); CODE; }
83: static void local_ioerr(){
84: IOTRACE(("IOERR\n"));
85: sqlite3_io_error_hit++;
86: if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
87: }
88: #define SimulateDiskfullError(CODE) \
89: if( sqlite3_diskfull_pending ){ \
90: if( sqlite3_diskfull_pending == 1 ){ \
91: local_ioerr(); \
92: sqlite3_diskfull = 1; \
93: sqlite3_io_error_hit = 1; \
94: CODE; \
95: }else{ \
96: sqlite3_diskfull_pending--; \
97: } \
98: }
99: #else
100: #define SimulateIOErrorBenign(X)
101: #define SimulateIOError(A)
102: #define SimulateDiskfullError(A)
103: #endif
104:
105: /*
106: ** When testing, keep a count of the number of open files.
107: */
108: #ifdef SQLITE_TEST
109: int sqlite3_open_file_count = 0;
110: #define OpenCounter(X) sqlite3_open_file_count+=(X)
111: #else
112: #define OpenCounter(X)
113: #endif
114:
115: #endif /* !defined(_OS_COMMON_H_) */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>