blob: 1ed4d7a8e1a053cd67b13ad10377fa3ffd67cae2 [file] [log] [blame]
drhbbd42a62004-05-22 17:41:58 +00001/*
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*/
shane9bcbdad2008-05-29 20:22:37 +000020#ifndef _OS_COMMON_H_
21#define _OS_COMMON_H_
drhbbd42a62004-05-22 17:41:58 +000022
drha9600bc2004-08-04 14:44:33 +000023/*
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
mistachkin34cf2582015-04-02 17:46:52 +000032/*
drhbbd42a62004-05-22 17:41:58 +000033** Macros for performance tracing. Normally turned off. Only works
34** on i486 hardware.
35*/
drha9600bc2004-08-04 14:44:33 +000036#ifdef SQLITE_PERFORMANCE_TRACE
shane9bcbdad2008-05-29 20:22:37 +000037
mistachkinc04c54b2016-02-11 21:28:16 +000038/*
39** hwtime.h contains inline assembler code for implementing
shane9bcbdad2008-05-29 20:22:37 +000040** high-performance timing routines.
41*/
42#include "hwtime.h"
43
44static sqlite_uint64 g_start;
45static sqlite_uint64 g_elapsed;
46#define TIMER_START g_start=sqlite3Hwtime()
47#define TIMER_END g_elapsed=sqlite3Hwtime()-g_start
48#define TIMER_ELAPSED g_elapsed
drhbbd42a62004-05-22 17:41:58 +000049#else
50#define TIMER_START
51#define TIMER_END
shane9bcbdad2008-05-29 20:22:37 +000052#define TIMER_ELAPSED ((sqlite_uint64)0)
drhbbd42a62004-05-22 17:41:58 +000053#endif
54
drhbbd42a62004-05-22 17:41:58 +000055/*
56** If we compile with the SQLITE_TEST macro set, then the following block
57** of code will give us the ability to simulate a disk I/O error. This
58** is used for testing the I/O recovery logic.
59*/
mistachkinc04c54b2016-02-11 21:28:16 +000060#if defined(SQLITE_TEST)
61extern int sqlite3_io_error_hit;
62extern int sqlite3_io_error_hardhit;
63extern int sqlite3_io_error_pending;
64extern int sqlite3_io_error_persist;
65extern int sqlite3_io_error_benign;
66extern int sqlite3_diskfull_pending;
67extern int sqlite3_diskfull;
drh1aa5af12008-03-07 19:51:14 +000068#define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
drh59685932006-09-14 13:47:11 +000069#define SimulateIOError(CODE) \
drh1aa5af12008-03-07 19:51:14 +000070 if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
71 || sqlite3_io_error_pending-- == 1 ) \
72 { local_ioerr(); CODE; }
drhbbd42a62004-05-22 17:41:58 +000073static void local_ioerr(){
drh538f5702007-04-13 02:14:30 +000074 IOTRACE(("IOERR\n"));
drh1aa5af12008-03-07 19:51:14 +000075 sqlite3_io_error_hit++;
76 if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
drhbbd42a62004-05-22 17:41:58 +000077}
drh59685932006-09-14 13:47:11 +000078#define SimulateDiskfullError(CODE) \
drhf307a4a2005-09-09 10:46:19 +000079 if( sqlite3_diskfull_pending ){ \
80 if( sqlite3_diskfull_pending == 1 ){ \
81 local_ioerr(); \
82 sqlite3_diskfull = 1; \
drha7aea3d2007-03-15 12:51:16 +000083 sqlite3_io_error_hit = 1; \
drh59685932006-09-14 13:47:11 +000084 CODE; \
drhf307a4a2005-09-09 10:46:19 +000085 }else{ \
86 sqlite3_diskfull_pending--; \
87 } \
88 }
drhbbd42a62004-05-22 17:41:58 +000089#else
drh1aa5af12008-03-07 19:51:14 +000090#define SimulateIOErrorBenign(X)
drhbbd42a62004-05-22 17:41:58 +000091#define SimulateIOError(A)
adamd4fc93082006-09-14 16:57:19 +000092#define SimulateDiskfullError(A)
mistachkinc04c54b2016-02-11 21:28:16 +000093#endif /* defined(SQLITE_TEST) */
drhbbd42a62004-05-22 17:41:58 +000094
95/*
96** When testing, keep a count of the number of open files.
97*/
mistachkinc04c54b2016-02-11 21:28:16 +000098#if defined(SQLITE_TEST)
99extern int sqlite3_open_file_count;
drhbbd42a62004-05-22 17:41:58 +0000100#define OpenCounter(X) sqlite3_open_file_count+=(X)
101#else
102#define OpenCounter(X)
mistachkinc04c54b2016-02-11 21:28:16 +0000103#endif /* defined(SQLITE_TEST) */
shane9bcbdad2008-05-29 20:22:37 +0000104
105#endif /* !defined(_OS_COMMON_H_) */