engine/sqlite/src/os_common.h
changeset 2 29cda98b007e
equal deleted inserted replaced
1:5f8e5adbbed9 2:29cda98b007e
       
     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 
       
    21 /*
       
    22 ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
       
    23 ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
       
    24 ** switch.  The following code should catch this problem at compile-time.
       
    25 */
       
    26 #ifdef MEMORY_DEBUG
       
    27 # error "The MEMORY_DEBUG macro is obsolete.  Use SQLITE_DEBUG instead."
       
    28 #endif
       
    29 
       
    30 
       
    31 /*
       
    32  * When testing, this global variable stores the location of the
       
    33  * pending-byte in the database file.
       
    34  */
       
    35 #ifdef SQLITE_TEST
       
    36 unsigned int sqlite3_pending_byte = 0x40000000;
       
    37 #endif
       
    38 
       
    39 #ifdef SQLITE_DEBUG
       
    40 int sqlite3_os_trace = 0;
       
    41 #define OSTRACE1(X)         if( sqlite3_os_trace ) sqlite3DebugPrintf(X)
       
    42 #define OSTRACE2(X,Y)       if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y)
       
    43 #define OSTRACE3(X,Y,Z)     if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z)
       
    44 #define OSTRACE4(X,Y,Z,A)   if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A)
       
    45 #define OSTRACE5(X,Y,Z,A,B) if( sqlite3_os_trace ) sqlite3DebugPrintf(X,Y,Z,A,B)
       
    46 #define OSTRACE6(X,Y,Z,A,B,C) \
       
    47     if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C)
       
    48 #define OSTRACE7(X,Y,Z,A,B,C,D) \
       
    49     if(sqlite3_os_trace) sqlite3DebugPrintf(X,Y,Z,A,B,C,D)
       
    50 #else
       
    51 #define OSTRACE1(X)
       
    52 #define OSTRACE2(X,Y)
       
    53 #define OSTRACE3(X,Y,Z)
       
    54 #define OSTRACE4(X,Y,Z,A)
       
    55 #define OSTRACE5(X,Y,Z,A,B)
       
    56 #define OSTRACE6(X,Y,Z,A,B,C)
       
    57 #define OSTRACE7(X,Y,Z,A,B,C,D)
       
    58 #endif
       
    59 
       
    60 /*
       
    61 ** Macros for performance tracing.  Normally turned off.  Only works
       
    62 ** on i486 hardware.
       
    63 */
       
    64 #ifdef SQLITE_PERFORMANCE_TRACE
       
    65 __inline__ unsigned long long int hwtime(void){
       
    66   unsigned long long int x;
       
    67   __asm__("rdtsc\n\t"
       
    68           "mov %%edx, %%ecx\n\t"
       
    69           :"=A" (x));
       
    70   return x;
       
    71 }
       
    72 static unsigned long long int g_start;
       
    73 static unsigned int elapse;
       
    74 #define TIMER_START       g_start=hwtime()
       
    75 #define TIMER_END         elapse=hwtime()-g_start
       
    76 #define TIMER_ELAPSED     elapse
       
    77 #else
       
    78 #define TIMER_START
       
    79 #define TIMER_END
       
    80 #define TIMER_ELAPSED     0
       
    81 #endif
       
    82 
       
    83 /*
       
    84 ** If we compile with the SQLITE_TEST macro set, then the following block
       
    85 ** of code will give us the ability to simulate a disk I/O error.  This
       
    86 ** is used for testing the I/O recovery logic.
       
    87 */
       
    88 #ifdef SQLITE_TEST
       
    89 int sqlite3_io_error_hit = 0;
       
    90 int sqlite3_io_error_pending = 0;
       
    91 int sqlite3_io_error_persist = 0;
       
    92 int sqlite3_diskfull_pending = 0;
       
    93 int sqlite3_diskfull = 0;
       
    94 #define SimulateIOError(CODE)  \
       
    95   if( sqlite3_io_error_pending || sqlite3_io_error_hit ) \
       
    96      if( sqlite3_io_error_pending-- == 1 \
       
    97          || (sqlite3_io_error_persist && sqlite3_io_error_hit) ) \
       
    98                 { local_ioerr(); CODE; }
       
    99 static void local_ioerr(){
       
   100   IOTRACE(("IOERR\n"));
       
   101   sqlite3_io_error_hit = 1;
       
   102 }
       
   103 #define SimulateDiskfullError(CODE) \
       
   104    if( sqlite3_diskfull_pending ){ \
       
   105      if( sqlite3_diskfull_pending == 1 ){ \
       
   106        local_ioerr(); \
       
   107        sqlite3_diskfull = 1; \
       
   108        sqlite3_io_error_hit = 1; \
       
   109        CODE; \
       
   110      }else{ \
       
   111        sqlite3_diskfull_pending--; \
       
   112      } \
       
   113    }
       
   114 #else
       
   115 #define SimulateIOError(A)
       
   116 #define SimulateDiskfullError(A)
       
   117 #endif
       
   118 
       
   119 /*
       
   120 ** When testing, keep a count of the number of open files.
       
   121 */
       
   122 #ifdef SQLITE_TEST
       
   123 int sqlite3_open_file_count = 0;
       
   124 #define OpenCounter(X)  sqlite3_open_file_count+=(X)
       
   125 #else
       
   126 #define OpenCounter(X)
       
   127 #endif