text: /*
  ** 2004 May 22
  **
  ** The author disclaims copyright to this source code.  In place of
  ** a legal notice, here is a blessing:
  **
  **    May you do good and not evil.
  **    May you find forgiveness for yourself and forgive others.
  **    May you share freely, never taking more than you give.
  **
  ******************************************************************************
  **
  ** This file contains macros and a little bit of code that is common to
  ** all of the platform-specific files (os_*.c) and is #included into those
  ** files.
  **
  ** This file should be #included by the os_*.c files only.  It is not a
  ** general purpose header file.
  */
  #ifndef _OS_COMMON_H_
  #define _OS_COMMON_H_
  
  /*
  ** At least two bugs have slipped in because we changed the MEMORY_DEBUG
  ** macro to SQLITE_DEBUG and some older makefiles have not yet made the
  ** switch.  The following code should catch this problem at compile-time.
  */
  #ifdef MEMORY_DEBUG
  # error "The MEMORY_DEBUG macro is obsolete.  Use SQLITE_DEBUG instead."
  #endif
  
  /*
  ** Macros for performance tracing.  Normally turned off.  Only works
  ** on i486 hardware.
  */
  #ifdef SQLITE_PERFORMANCE_TRACE
  
  /* 
  ** hwtime.h contains inline assembler code for implementing 
  ** high-performance timing routines.
  */
  #include "hwtime.h"
  
  static sqlite_uint64 g_start;
  static sqlite_uint64 g_elapsed;
  #define TIMER_START       g_start=sqlite3Hwtime()
  #define TIMER_END         g_elapsed=sqlite3Hwtime()-g_start
  #define TIMER_ELAPSED     g_elapsed
  #else
  #define TIMER_START
  #define TIMER_END
  #define TIMER_ELAPSED     ((sqlite_uint64)0)
  #endif
  
  /*
  ** If we compile with the SQLITE_TEST macro set, then the following block
  ** of code will give us the ability to simulate a disk I/O error.  This
  ** is used for testing the I/O recovery logic.
  */
  #ifdef SQLITE_TEST
  int sqlite3_io_error_hit = 0;            /* Total number of I/O Errors */
  int sqlite3_io_error_hardhit = 0;        /* Number of non-benign errors */
  int sqlite3_io_error_pending = 0;        /* Count down to first I/O error */
  int sqlite3_io_error_persist = 0;        /* True if I/O errors persist */
  int sqlite3_io_error_benign = 0;         /* True if errors are benign */
  int sqlite3_diskfull_pending = 0;
  int sqlite3_diskfull = 0;
  #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X)
  #define SimulateIOError(CODE)  \
    if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \
         || sqlite3_io_error_pending-- == 1 )  \
                { local_ioerr(); CODE; }
  static void local_ioerr(){
    IOTRACE(("IOERR\n"));
    sqlite3_io_error_hit++;
    if( !sqlite3_io_error_benign ) sqlite3_io_error_hardhit++;
  }
  #define SimulateDiskfullError(CODE) \
     if( sqlite3_diskfull_pending ){ \
       if( sqlite3_diskfull_pending == 1 ){ \
         local_ioerr(); \
         sqlite3_diskfull = 1; \
         sqlite3_io_error_hit = 1; \
         CODE; \
       }else{ \
         sqlite3_diskfull_pending--; \
       } \
     }
  #else
  #define SimulateIOErrorBenign(X)
  #define SimulateIOError(A)
  #define SimulateDiskfullError(A)
  #endif
  
  /*
  ** When testing, keep a count of the number of open files.
  */
  #ifdef SQLITE_TEST
  int sqlite3_open_file_count = 0;
  #define OpenCounter(X)  sqlite3_open_file_count+=(X)
  #else
  #define OpenCounter(X)
  #endif
  
  #endif /* !defined(_OS_COMMON_H_) */
  