System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact bd42a51385691dc4834c7e1eca614f7f7c2889da:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0230: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0240: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0250: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0260: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0270: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0280: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0290: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
02a0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
02b0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
02c0: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
02d0: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
02e0: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
02f0: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0300: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0310: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0320: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0330: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0340: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0350: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0360: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0370: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0380: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0390: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
03a0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
03b0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
03c0: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
03d0: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
03e0: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
03f0: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0400: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0410: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0420: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0430: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0440: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0450: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0460: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0470: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0480: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0490: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
04a0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
04b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
04c0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
04d0: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
04e0: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
04f0: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0500: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0520: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0530: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
0540: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
0550: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
0560: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
0570: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0580: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0590: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
05a0: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
05b0: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
05c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
05d0: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
05e0: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
05f0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0600: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
0610: 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66  to be thread-saf
0620: 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  e, include the p
0630: 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61  threads header a
0640: 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65  nd define.** the
0650: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
0660: 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  EADS macro..*/.#
0670: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
0680: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
0690: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
06a0: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
06b0: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
06c0: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
06d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
06e0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
06f0: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
0700: 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  file.*/.#ifndef 
0710: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0720: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  ILE_PERMISSIONS.
0730: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0740: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
0750: 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65  MISSIONS 0644.#e
0760: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif..../*.** Th
0770: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
0780: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
0790: 20 6f 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69   of OsFile speci
07a0: 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78  fic for the unix
07b0: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
07c0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
07d0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
07e0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
07f0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
0800: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0810: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
0820: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
0830: 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  try */.  struct 
0840: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  openCnt *pOpen; 
0850: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0860: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
0870: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
0880: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
0890: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49  o *pLock;   /* I
08a0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
08b0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
08c0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08e0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
08f0: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
0900: 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b  d char locktype;
0910: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
0920: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
0930: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
0940: 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70 65 6e  gned char isOpen
0950: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
0960: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6c 6f   needs to be clo
0970: 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  sed */.  unsigne
0980: 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e 63 3b  d char fullSync;
0990: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
09a0: 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61 62 6c  SYNC if availabl
09b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  e */.  int dirfd
09c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
09d0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
09e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
09f0: 63 74 6f 72 79 20 2a 2f 0a 23 69 66 64 65 66 20  ctory */.#ifdef 
0a00: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0a10: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0a20: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0a30: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0a40: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0a50: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0a70: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0a80: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0a90: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0aa0: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0ab0: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0ac0: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0ad0: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0ae0: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0af0: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0b00: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0b10: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0b20: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0b30: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0b40: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0b50: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0b60: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0b70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0b80: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0b90: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0ba0: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0bb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0bc0: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0bd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0be0: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0bf0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0c00: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0c10: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0c20: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0c30: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0c40: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0c50: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0c60: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0c70: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0c80: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0c90: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0ca0: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0cb0: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0cc0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0cd0: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0ce0: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0cf0: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0d00: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0d10: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0d20: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0d30: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0d40: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0d50: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0d60: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0d70: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0d80: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0d90: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0da0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0db0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0dc0: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0dd0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0de0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0df0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0e00: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0e10: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0e20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0e30: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0e40: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0e50: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0e60: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0e70: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
0e80: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
0e90: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
0ea0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
0eb0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
0ec0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
0ed0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
0ee0: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
0ef0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
0f00: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
0f10: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
0f20: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
0f30: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
0f40: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
0f50: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
0f60: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
0f70: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
0f80: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
0f90: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
0fa0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
0fb0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
0fc0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
0fd0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
0fe0: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
0ff0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1000: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
1010: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
1020: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
1030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
1040: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
1050: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
1060: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1070: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1080: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1090: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
10a0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
10b0: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
10c0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
10d0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
10e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
10f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1100: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
1110: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
1120: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
1130: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
1140: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
1150: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
1160: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1170: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1180: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1190: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
11a0: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
11b0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
11c0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
11d0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
11e0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
11f0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1200: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
1210: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
1220: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
1230: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1240: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
1250: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
1260: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1270: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1280: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1290: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
12a0: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
12b0: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
12c0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
12d0: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
12e0: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
12f0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1300: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
1310: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
1320: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
1330: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
1340: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
1350: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
1360: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1370: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1380: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1390: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
13a0: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
13b0: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
13c0: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
13d0: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
13e0: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
13f0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1400: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
1410: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
1420: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
1430: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
1440: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1450: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
1460: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1470: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1480: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1490: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
14a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
14b0: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
14c0: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
14d0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
14e0: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
1510: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
1520: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
1530: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
1540: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1550: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
1560: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1580: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1590: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
15a0: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
15b0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
15c0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
15d0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
15e0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
15f0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1600: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
1610: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
1620: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
1630: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
1640: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
1650: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
1660: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1670: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1680: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1690: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
16a0: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
16b0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
16c0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
16d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
16e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
16f0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1700: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
1710: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
1720: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
1730: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1740: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
1750: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
1760: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1770: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1780: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1790: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
17a0: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
17b0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
17c0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
17d0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
17e0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
17f0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1800: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
1810: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
1820: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
1830: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1840: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
1850: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
1860: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1870: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1880: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1890: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
18a0: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
18b0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
18c0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
18d0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
18e0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
18f0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1900: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1910: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1920: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1930: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1940: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1950: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1960: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1970: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1980: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1990: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
19a0: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
19b0: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
19c0: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
19d0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
19e0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
19f0: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1a00: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1a10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1a20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1a30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1a40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1a50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1a60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1a70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1a80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1a90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1aa0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1ab0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1ac0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1ad0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1ae0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1af0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1b00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1b10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1b20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1b30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1b40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1b50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1b60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1b70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1b80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1b90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1bb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1bc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1bd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1be0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1bf0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1c00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1c10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1c20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1c30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1c40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1c50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1c60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1c70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1c80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1c90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1ca0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1cb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1cc0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1cd0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1ce0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1cf0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1d00: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1d10: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1d20: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1d30: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1d40: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1d50: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1d60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1d70: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1d80: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1d90: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1da0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1db0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1dc0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1dd0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1de0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1df0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1e00: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1e10: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1e20: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1e30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1e40: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1e50: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1e60: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1e70: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1e80: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1e90: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1ea0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
1eb0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
1ec0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
1ed0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
1ee0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
1ef0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
1f00: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1f10: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1f20: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1f30: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1f40: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1f50: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1f60: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1f70: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1f80: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1f90: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1fa0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
1fb0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
1fc0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
1fd0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
1fe0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
1ff0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2000: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
2010: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
2020: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
2030: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
2040: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
2050: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
2060: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2070: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2080: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2090: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
20a0: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
20b0: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
20c0: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
20d0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
20e0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
20f0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2100: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
2110: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
2120: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
2130: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
2140: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
2150: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2160: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2170: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2180: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2190: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
21a0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
21b0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
21c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
21e0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
21f0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2210: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
2220: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
2230: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
2240: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
2250: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
2260: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2270: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2280: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2290: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
22a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
22b0: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
22c0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
22d0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
22e0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
22f0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2310: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
2320: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
2330: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
2340: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2350: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
2360: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2370: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2380: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2390: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
23a0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
23b0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
23c0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
23d0: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
23e0: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
23f0: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2400: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
2410: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
2420: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
2430: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
2440: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
2450: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
2460: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2470: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2480: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2490: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
24a0: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
24b0: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
24c0: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
24d0: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
24e0: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
24f0: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2500: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
2510: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
2520: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2530: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
2540: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
2550: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
2560: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2570: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2580: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2590: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
25a0: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
25b0: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
25c0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
25d0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
25e0: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
25f0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2600: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
2610: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
2620: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
2630: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
2640: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
2650: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
2660: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2670: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2680: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2690: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
26a0: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
26b0: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
26c0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
26d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
26e0: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
26f0: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2700: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
2710: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
2720: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
2730: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
2740: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
2750: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
2760: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2770: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2780: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2790: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
27a0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
27b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
27c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
27d0: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
27e0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
27f0: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2800: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2810: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
2820: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
2830: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
2840: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
2850: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
2860: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2870: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2880: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2890: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
28a0: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
28b0: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
28c0: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
28d0: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
28e0: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
28f0: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2900: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2910: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2920: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2930: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2940: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2950: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2960: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2970: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2980: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2990: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
29a0: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
29b0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29c0: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
29d0: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
29e0: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
29f0: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2a00: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2a10: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2a20: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2a30: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2a40: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2a50: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2a60: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2a70: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2a80: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2a90: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2aa0: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2ab0: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2ac0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2af0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2b00: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2b10: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2b20: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2b30: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2b40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2b50: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2b60: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2b70: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2b80: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2b90: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2ba0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2bb0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2bc0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2bd0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2be0: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2bf0: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2c00: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2c10: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2c20: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2c30: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2c40: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2c50: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2c60: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2c70: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2c80: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2c90: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2ca0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2cb0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2cc0: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2cd0: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2ce0: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2d10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d40: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2d50: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2d60: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2d70: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2d80: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2d90: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2da0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2db0: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2dc0: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2dd0: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2de0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2df0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2e00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2e10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2e20: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2e30: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2e60: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2e70: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2e80: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2e90: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
2ea0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2eb0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2ec0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2ed0: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2ee0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2ef0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f10: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2f20: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2f30: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2f40: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2f50: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2f60: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2f70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2f80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2fa0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fe0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2ff0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3000: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
3010: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
3020: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
3030: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
3040: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
3050: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
3060: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3070: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3080: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3090: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
30a0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
30b0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
30c0: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
30d0: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
30e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
30f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3100: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
3110: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
3120: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
3130: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
3140: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
3150: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3160: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3170: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3180: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3190: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
31a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
31b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
31c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
31d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
31e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
31f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3200: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
3210: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
3220: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
3230: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
3240: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
3250: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3260: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3280: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3290: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
32a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
32b0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
32c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
32d0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
32e0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
32f0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3300: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
3310: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
3320: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
3330: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
3340: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
3350: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
3360: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3370: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3380: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3390: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
33a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
33b0: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
33c0: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
33d0: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
33e0: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
33f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3400: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
3410: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
3420: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
3430: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
3440: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
3450: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c  lockHash = { SQL
3460: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
3480: 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70  ;.static Hash op
3490: 65 6e 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  enHash = { SQLIT
34a0: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
34b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
34c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34d0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a  UNIX_THREADS./*.
34e0: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
34f0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3500: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
3510: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
3520: 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b  h others.** lock
3530: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  s..**.**    0:  
3540: 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  No.  Threads can
3550: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
3560: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
3570: 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20  **    1:  Yes.  
3580: 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  Threads can over
3590: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
35a0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a   locks..**   -1:
35b0: 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20    We don't know 
35c0: 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f  yet..**.** On so
35d0: 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b  me systems, we k
35e0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
35f0: 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20 63  ime if threads c
3600: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
3610: 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  .** others locks
3620: 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74  .  On those syst
3630: 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f  ems, the SQLITE_
3640: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3650: 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69  LOCK macro.** wi
3660: 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f 70  ll be set approp
3670: 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68  riately.  On oth
3680: 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68  er systems, we h
3690: 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a  ave to check at.
36a0: 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20  ** runtime.  On 
36b0: 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79 73  these latter sys
36c0: 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52  tems, SQLTIE_THR
36d0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
36e0: 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65  K is.** undefine
36f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61  d..**.** This va
3700: 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20  riable normally 
3710: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f  has file scope o
3720: 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67  nly.  But during
3730: 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b   testing, we mak
3740: 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c  e.** it a global
3750: 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65 73   so that the tes
3760: 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67  t code can chang
3770: 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f  e its value in o
3780: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a  rder to verify.*
3790: 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  * that the right
37a0: 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20 69   stuff happens i
37b0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a  n either case..*
37c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
37d0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
37e0: 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53  _LOCK.# define S
37f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3800: 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65  RRIDE_LOCK -1.#e
3810: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3820: 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65  TE_TEST.int thre
3830: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
3840: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c  thersLocks = SQL
3850: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3860: 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a  IDE_LOCK;.#else.
3870: 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65 61  static int threa
3880: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
3890: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49  hersLocks = SQLI
38a0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
38b0: 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  DE_LOCK;.#endif.
38c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75  ./*.** This stru
38d0: 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f  cture holds info
38e0: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69  rmation passed i
38f0: 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74  nto individual t
3900: 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62  est.** threads b
3910: 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64  y the testThread
3920: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
3930: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
3940: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
3950: 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20  ata {.  int fd; 
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3970: 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  * File to be loc
3980: 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ked */.  struct 
3990: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20  flock lock;     
39a0: 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  /* The locking o
39b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
39c0: 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20  t result;       
39d0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
39e0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70  f the locking op
39f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23  eration */.};..#
3a00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ifdef SQLITE_LOC
3a10: 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72  K_TRACE./*.** Pr
3a20: 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74  int out informat
3a30: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f  ion about all lo
3a40: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
3a50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3a60: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
3a70: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
3a80: 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74   locks on multit
3a90: 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66  hreaded.** platf
3aa0: 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79  orms.  Enable by
3ab0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
3ac0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43  the -DSQLITE_LOC
3ad0: 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61  K_TRACE.** comma
3ae0: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f  nd-line option o
3af0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
3b00: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   This code is no
3b10: 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64  rmally.** turned
3b20: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
3b30: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
3b40: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
3b50: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
3b60: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
3b70: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
3b80: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
3b90: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
3ba0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
3bb0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
3bc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3bd0: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
3be0: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
3bf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3c00: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
3c10: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
3c20: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3c30: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
3c40: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
3c50: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
3c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
3c70: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
3c80: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
3c90: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
3ca0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
3cb0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
3cc0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
3cd0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
3ce0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
3cf0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
3d00: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
3d10: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
3d30: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
3d40: 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74  ET );.  s = fcnt
3d50: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
3d60: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
3d70: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
3d80: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
3d90: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
3da0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
3db0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
3dc0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
3dd0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
3de0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
3df0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
3e00: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 20 26  d, s);.  if( s &
3e10: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
3e20: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
3e30: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
3e40: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
3e50: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
3e60: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
3e70: 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  .    fcntl(fd, F
3e80: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
3e90: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
3ea0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
3eb0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
3ec0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
3ed0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
3ee0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
3ef0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
3f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
3f10: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
3f20: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
3f30: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
3f40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
3f50: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
3f60: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
3f70: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
3f80: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
3f90: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
3fa0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
3fb0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
3fc0: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
3fd0: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
3fe0: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
3ff0: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
4000: 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c  .#define fcntl l
4010: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
4020: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
4030: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RACE */../*.** T
4040: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
4050: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
4060: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20  outine launches 
4070: 74 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  two separate.** 
4080: 74 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20  threads on this 
4090: 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72  routine.  This r
40a0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
40b0: 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a  to lock a file.*
40c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  * descriptor the
40d0: 6e 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20  n returns.  The 
40e0: 73 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75  success or failu
40f0: 72 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d  re of that attem
4100: 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  pt.** allows the
4110: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
4120: 6e 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f  ngBehavior() pro
4130: 63 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d  cedure to determ
4140: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
4150: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
4160: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
4170: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f  others locks..*/
4180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68  .static void *th
4190: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28  readLockingTest(
41a0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
41b0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
41c0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73  Data *pData = (s
41d0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
41e0: 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44  Data*)pArg;.  pD
41f0: 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63  ata->result = fc
4200: 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46  ntl(pData->fd, F
4210: 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e  _SETLK, &pData->
4220: 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  lock);.  return 
4230: 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pArg;.}../*.** T
4240: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74  his procedure at
4250: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
4260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4270: 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61  ot threads.** ca
4280: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
4290: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
42a0: 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74  n sets the .** t
42b0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
42c0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61  chOthersLocks va
42d0: 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61  riable appropria
42e0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
42f0: 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c  void testThreadL
4300: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69  ockingBehavior(i
4310: 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69  nt fd_orig){.  i
4320: 6e 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20  nt fd;.  struct 
4330: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64  threadTestData d
4340: 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 74  [2];.  pthread_t
4350: 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64   t[2];..  fd = d
4360: 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69  up(fd_orig);.  i
4370: 66 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e  f( fd<0 ) return
4380: 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c  ;.  memset(d, 0,
4390: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
43a0: 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64  [0].fd = fd;.  d
43b0: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20  [0].lock.l_type 
43c0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30  = F_RDLCK;.  d[0
43d0: 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31  ].lock.l_len = 1
43e0: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
43f0: 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30  start = 0;.  d[0
4400: 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20  ].lock.l_whence 
4410: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b  = SEEK_SET;.  d[
4420: 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31  1] = d[0];.  d[1
4430: 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20  ].lock.l_type = 
4440: 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65  F_WRLCK;.  pthre
4450: 61 64 5f 63 72 65 61 74 65 28 26 74 5b 30 5d 2c  ad_create(&t[0],
4460: 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e   0, threadLockin
4470: 67 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20  gTest, &d[0]);. 
4480: 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28   pthread_create(
4490: 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65 61 64  &t[1], 0, thread
44a0: 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b  LockingTest, &d[
44b0: 31 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a  1]);.  pthread_j
44c0: 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20  oin(t[0], 0);.  
44d0: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31  pthread_join(t[1
44e0: 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66  ], 0);.  close(f
44f0: 64 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65  d);.  threadsOve
4500: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
4510: 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73  ocks =  d[0].res
4520: 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72  ult==0 && d[1].r
4530: 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  esult==0;.}.#end
4540: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 49  if /* SQLITE_UNI
4550: 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a  X_THREADS */../*
4560: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
4570: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
4580: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4590: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
45a0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
45b0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4c  ic void releaseL
45c0: 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 6c  ockInfo(struct l
45d0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b  ockInfo *pLock){
45e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
45f0: 65 33 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29  e3OsInMutex(1) )
4600: 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d  ;.  pLock->nRef-
4610: 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  -;.  if( pLock->
4620: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
4630: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4640: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f  (&lockHash, &pLo
4650: 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  ck->key, sizeof(
4660: 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b  pLock->key), 0);
4670: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4680: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4690: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
46a0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
46b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
46c0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
46d0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
46e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
46f0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4700: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4710: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4720: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4730: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
4740: 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52  .  if( pOpen->nR
4750: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ef==0 ){.    sql
4760: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4770: 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e  openHash, &pOpen
4780: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f  ->key, sizeof(pO
4790: 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20  pen->key), 0);. 
47a0: 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61     free(pOpen->a
47b0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71  Pending);.    sq
47c0: 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b  liteFree(pOpen);
47d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
47e0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
47f0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f  iptor, locate lo
4800: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
4810: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68  nt structures th
4820: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
4830: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
4840: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65  ptor.  Create ne
4850: 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73  w ones if necess
4860: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
4870: 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74  urn values might
4880: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
4890: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
48a0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  curs..**.** Retu
48b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
48c0: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
48d0: 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  ic int findLockI
48e0: 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  nfo(.  int fd,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
4910: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
4920: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
4930: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
4940: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
4950: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
4960: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
4970: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
4980: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
4990: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
49a0: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
49b0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ture here */.){.
49c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
49d0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
49e0: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
49f0: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
4a00: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
4a10: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
4a20: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
4a30: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
4a40: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66  ;.  rc = fstat(f
4a50: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
4a60: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
4a70: 72 6e 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  rn 1;..  assert(
4a80: 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
4a90: 78 28 31 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  x(1) );.  memset
4aa0: 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f  (&key1, 0, sizeo
4ab0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31  f(key1));.  key1
4ac0: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
4ad0: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e  t_dev;.  key1.in
4ae0: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
4af0: 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  no;.#ifdef SQLIT
4b00: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
4b10: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
4b20: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
4b30: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
4b40: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
4b50: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
4b60: 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72    key1.tid = thr
4b70: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
4b80: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
4b90: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
4ba0: 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65  ;.#endif.  memse
4bb0: 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65  t(&key2, 0, size
4bc0: 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79  of(key2));.  key
4bd0: 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  2.dev = statbuf.
4be0: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69  st_dev;.  key2.i
4bf0: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
4c00: 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28  ino;.  pLock = (
4c10: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a  struct lockInfo*
4c20: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
4c30: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79  (&lockHash, &key
4c40: 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  1, sizeof(key1))
4c50: 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30  ;.  if( pLock==0
4c60: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c   ){.    struct l
4c70: 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20  ockInfo *pOld;. 
4c80: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
4c90: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
4ca0: 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20  of(*pLock) );.  
4cb0: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
4cc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
4cd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
4ce0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
4cf0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
4d00: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
4d10: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
4d20: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
4d30: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
4d40: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
4d50: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
4d60: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
4d70: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
4d80: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20  , sizeof(key1), 
4d90: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  pLock);.    if( 
4da0: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
4db0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4dc0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71  Lock );.      sq
4dd0: 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b  liteFree(pLock);
4de0: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
4df0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
4e00: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
4e10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4e20: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pLock->nRef++;. 
4e30: 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70   }.  *ppLock = p
4e40: 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70  Lock;.  if( ppOp
4e50: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  en!=0 ){.    pOp
4e60: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65  en = (struct ope
4e70: 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73  nCnt*)sqlite3Has
4e80: 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c  hFind(&openHash,
4e90: 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b   &key2, sizeof(k
4ea0: 65 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ey2));.    if( p
4eb0: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
4ec0: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
4ed0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70  *pOld;.      pOp
4ee0: 65 6e 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  en = sqliteMallo
4ef0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4f  cRaw( sizeof(*pO
4f00: 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66  pen) );.      if
4f10: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
4f20: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
4f30: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
4f40: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
4f50: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
4f60: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
4f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
4f80: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
4f90: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
4fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
4fb0: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
4fc0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
4fd0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
4fe0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
4ff0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d   0;.      pOld =
5000: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5010: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
5020: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
5030: 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b  f(key2), pOpen);
5040: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21  .      if( pOld!
5050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5060: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
5070: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n );.        sql
5080: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a  iteFree(pOpen);.
5090: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c          releaseL
50a0: 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a  ockInfo(pLock);.
50b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
50c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
50d0: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
50e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
50f0: 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  e{.      pOpen->
5100: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
5110: 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65    *ppOpen = pOpe
5120: 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e  n;.  }..exit_fin
5130: 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74  dlockinfo:.  ret
5140: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
5150: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
5160: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5170: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5180: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5190: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
51a0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
51b0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
51c0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
51d0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
51e0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
51f0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
5200: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5210: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
5220: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
5230: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
5240: 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e  type ){.  case N
5250: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
5260: 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48  NONE";.  case SH
5270: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
5280: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61  n "SHARED";.  ca
5290: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
52a0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
52b0: 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44  ED";.  case PEND
52c0: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
52d0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61   "PENDING";.  ca
52e0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
52f0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5300: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5310: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5320: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5330: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
5340: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
5350: 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20  thread than the 
5360: 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a  thread that the.
5370: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75  ** unixFile argu
5380: 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c  ment belongs to,
5390: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f   then transfer o
53a0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
53b0: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72  unixFile.** over
53c0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
53d0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
53e0: 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79  unixFile is only
53f0: 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65   owned by a thre
5400: 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68  ad on systems wh
5410: 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69  ere one thread i
5420: 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f  s.** unable to o
5430: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72  verride locks cr
5440: 65 61 74 65 64 20 62 79 20 61 20 64 69 66 66 65  eated by a diffe
5450: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65  rent thread.  Re
5460: 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65  dHat9 is.** an e
5470: 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61  xample of such a
5480: 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f   system..**.** O
5490: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
54a0: 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  r is only allowe
54b0: 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c  d if the unixFil
54c0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
54d0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74  nlocked..** If t
54e0: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c  he unixFile is l
54f0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e  ocked and an own
5500: 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c  ership is wrong,
5510: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
5520: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20  SQLITE_MISUSE.  
5530: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5540: 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
5550: 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69  ing works..*/.#i
5560: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
5570: 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69 63 20  _THREADS.static 
5580: 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  int transferOwne
5590: 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a  rship(unixFile *
55a0: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
55b0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53  ;.  pthread_t hS
55c0: 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61  elf;.  if( threa
55d0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
55e0: 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20  hersLocks ){.   
55f0: 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72   /* Ownership tr
5600: 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64  ansfers not need
5610: 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65  ed on this syste
5620: 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  m */.    return 
5630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
5640: 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64   hSelf = pthread
5650: 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70  _self();.  if( p
5660: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69  thread_equal(pFi
5670: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20  le->tid, hSelf) 
5680: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
5690: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61   still in the sa
56a0: 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20  me thread */.   
56b0: 20 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e   TRACE1("No-tran
56c0: 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61  sfer, same threa
56d0: 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  d\n");.    retur
56e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
56f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
5700: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
5710: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e  ){.    /* We can
5720: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72  not change owner
5730: 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72  ship while we ar
5740: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  e holding a lock
5750: 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ! */.    return 
5760: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
5770: 20 7d 0a 20 20 54 52 41 43 45 34 28 22 54 72 61   }.  TRACE4("Tra
5780: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
5790: 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f  of %d from %d to
57a0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
57b0: 2c 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53 65 6c  ,pFile->tid,hSel
57c0: 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64  f);.  pFile->tid
57d0: 20 3d 20 68 53 65 6c 66 3b 0a 20 20 72 65 6c 65   = hSelf;.  rele
57e0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
57f0: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 63 20  e->pLock);.  rc 
5800: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
5810: 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d  File->h, &pFile-
5820: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 54 52  >pLock, 0);.  TR
5830: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
5840: 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64   is now %s(%s,%d
5850: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
5860: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
5870: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
5880: 65 29 2c 0a 20 20 20 20 20 6c 6f 63 6b 74 79 70  e),.     locktyp
5890: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
58a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
58b0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
58c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
58d0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20  }.#else.  /* On 
58e0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
58f0: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
5900: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
5910: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
5920: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
5930: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
5940: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
5950: 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
5960: 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  file.*/.int sqli
5970: 74 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63 6f  te3UnixDelete(co
5980: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
5990: 61 6d 65 29 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ame){.  unlink(z
59a0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
59b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
59c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
59d0: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
59e0: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
59f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
5a00: 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74  FileExists(const
5a10: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
5a20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  ){.  return acce
5a30: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
5a40: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ==0;.}../* Forwa
5a50: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
5a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
5a70: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 75 6e  ocateUnixFile(un
5a80: 69 78 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f  ixFile *pInit, O
5a90: 73 46 69 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f  sFile **pId);../
5aa0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
5ab0: 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20  open a file for 
5ac0: 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
5ad0: 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68   writing.  If th
5ae0: 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79  at.** fails, try
5af0: 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64   opening it read
5b00: 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66  -only.  If the f
5b10: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
5b20: 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72  st,.** try to cr
5b30: 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  eate it..**.** O
5b40: 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e  n success, a han
5b50: 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e  dle for the open
5b60: 20 66 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e   file is written
5b70: 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a   to *id.** and *
5b80: 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74  pReadonly is set
5b90: 20 74 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c   to 0 if the fil
5ba0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72  e was opened for
5bb0: 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20   reading and.** 
5bc0: 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20  writing or 1 if 
5bd0: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
5be0: 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
5bf0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
5c00: 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  urns.** SQLITE_O
5c10: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
5c20: 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  ure, the functio
5c30: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
5c40: 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65  _CANTOPEN and le
5c50: 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20  aves.** *id and 
5c60: 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61  *pReadonly uncha
5c70: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
5c80: 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64  ite3UnixOpenRead
5c90: 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63  Write(.  const c
5ca0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
5cb0: 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a    OsFile **pId,.
5cc0: 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79    int *pReadonly
5cd0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
5ce0: 75 6e 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43  unixFile f;..  C
5cf0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
5d00: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
5d10: 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20 7a 46  penReadWrite, zF
5d20: 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 70 52  ilename, pId, pR
5d30: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 61 73 73 65  eadonly);.  asse
5d40: 72 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20  rt( 0==*pId );. 
5d50: 20 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c   f.h = open(zFil
5d60: 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ename, O_RDWR|O_
5d70: 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c  CREAT|O_LARGEFIL
5d80: 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20  E|O_BINARY,.    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
5db0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5dc0: 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e  SIONS);.  if( f.
5dd0: 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49  h<0 ){.#ifdef EI
5de0: 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72  SDIR.    if( err
5df0: 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20  no==EISDIR ){.  
5e00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5e10: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
5e20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 2e 68  }.#endif.    f.h
5e30: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
5e40: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
5e50: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
5e60: 29 3b 0a 20 20 20 20 69 66 28 20 66 2e 68 3c 30  );.    if( f.h<0
5e70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
5e80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
5e90: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  ; .    }.    *pR
5ea0: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
5eb0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
5ec0: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  only = 0;.  }.  
5ed0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
5ee0: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
5ef0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20  ndLockInfo(f.h, 
5f00: 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70  &f.pLock, &f.pOp
5f10: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
5f20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
5f30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
5f40: 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65  ose(f.h);.    re
5f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5f60: 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  M;.  }.  TRACE3(
5f70: 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
5f80: 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e  \n", f.h, zFilen
5f90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ame);.  return a
5fa0: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
5fb0: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a  &f, pId);.}.../*
5fc0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
5fd0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
5fe0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
5ff0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
6000: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
6010: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
6020: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
6030: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
6040: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
6050: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
6060: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
6070: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
6080: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
6090: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
60a0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
60b0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
60c0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
60d0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
60e0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
60f0: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
6100: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
6110: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
6120: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
6130: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
6140: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
6150: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
6160: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
6170: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
6180: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
6190: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
61a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
61b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
61c0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f  OpenExclusive(co
61d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
61e0: 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  ame, OsFile **pI
61f0: 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  d, int delFlag){
6200: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
6210: 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53  xFile f;..  CRAS
6220: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
6230: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
6240: 45 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65  Exclusive, zFile
6250: 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c  name, pId, delFl
6260: 61 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  ag);.  assert( 0
6270: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 69 66 28 20  ==*pId );.  if( 
6280: 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65  access(zFilename
6290: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 0)==0 ){.    r
62a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
62b0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e 68  TOPEN;.  }.  f.h
62c0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
62d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
62e0: 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41     O_RDWR|O_CREA
62f0: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
6300: 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  LOW|O_LARGEFILE|
6310: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
6320: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6330: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
6340: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
6350: 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72  ( f.h<0 ){.    r
6360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6370: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c  TOPEN;.  }.  sql
6380: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
6390: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
63a0: 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e  ockInfo(f.h, &f.
63b0: 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
63c0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
63d0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
63e0: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
63f0: 28 66 2e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  (f.h);.    unlin
6400: 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
6410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6420: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
6430: 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20   delFlag ){.    
6440: 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
6450: 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  );.  }.  TRACE3(
6460: 22 4f 50 45 4e 2d 45 58 20 25 2d 33 64 20 25 73  "OPEN-EX %-3d %s
6470: 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e  \n", f.h, zFilen
6480: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ame);.  return a
6490: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
64a0: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a  &f, pId);.}../*.
64b0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
64c0: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
64d0: 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65  r read-only acce
64e0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ss..**.** On suc
64f0: 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20  cess, write the 
6500: 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f  file handle into
6510: 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20   *id and return 
6520: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
6530: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74   On failure, ret
6540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6550: 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  PEN..*/.int sqli
6560: 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f  te3UnixOpenReadO
6570: 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nly(const char *
6580: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c  zFilename, OsFil
6590: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20  e **pId){.  int 
65a0: 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66  rc;.  unixFile f
65b0: 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f  ;..  CRASH_TEST_
65c0: 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33  OVERRIDE(sqlite3
65d0: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
65e0: 79 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49  y, zFilename, pI
65f0: 64 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  d, 0);.  assert(
6600: 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e   0==*pId );.  f.
6610: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
6620: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
6630: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6640: 59 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20  Y);.  if( f.h<0 
6650: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6660: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
6670: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
6680: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
6690: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
66a0: 66 2e 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26  f.h, &f.pLock, &
66b0: 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69  f.pOpen);.  sqli
66c0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
66d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
66e0: 20 20 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20     close(f.h);. 
66f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6700: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52  _NOMEM;.  }.  TR
6710: 41 43 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d  ACE3("OPEN-RO %-
6720: 33 64 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a  3d %s\n", f.h, z
6730: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
6740: 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  urn allocateUnix
6750: 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d  File(&f, pId);.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
6770: 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64  to open a file d
6780: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
6790: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
67a0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66   contains a.** f
67b0: 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ile.  This file 
67c0: 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62  descriptor can b
67d0: 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28  e used to fsync(
67e0: 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  ) the directory.
67f0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ** in order to m
6800: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65  ake sure the cre
6810: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66  ation of a new f
6820: 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ile is actually 
6830: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69  written.** to di
6840: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sk..**.** This r
6850: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d  outine is only m
6860: 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e  eaningful for Un
6870: 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d  ix.  It is a no-
6880: 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64  op under.** wind
6890: 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77  ows since window
68a0: 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  s does not suppo
68b0: 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a  rt hard links..*
68c0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
68d0: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20   a handle for a 
68e0: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20  previously open 
68f0: 66 69 6c 65 20 61 74 20 2a 69 64 20 69 73 0a 2a  file at *id is.*
6900: 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  * updated with t
6910: 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79  he new directory
6920: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6930: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
6940: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
6950: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
6960: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
6970: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
6980: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
6990: 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65  .** *id unchange
69a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
69b0: 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
69c0: 72 79 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64  ry(.  OsFile *id
69d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
69e0: 7a 44 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e  zDirname.){.  un
69f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
6a00: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
6a10: 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b   if( pFile==0 ){
6a20: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f  .    /* Do not o
6a30: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
6a40: 79 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  y if the corresp
6a50: 6f 6e 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e  onding file is n
6a60: 6f 74 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ot already.    *
6a70: 2a 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72  * open. */.    r
6a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6a90: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54  TOPEN;.  }.  SET
6aa0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
6ac0: 65 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20  e->dirfd<0 );.  
6ad0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f  pFile->dirfd = o
6ae0: 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
6af0: 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
6b00: 20 30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65   0);.  if( pFile
6b10: 2d 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20 20 20  ->dirfd<0 ){.   
6b20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6b30: 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20  ANTOPEN; .  }.  
6b40: 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
6b50: 25 2d 33 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c  %-3d %s\n", pFil
6b60: 65 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61  e->dirfd, zDirna
6b70: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  me);.  return SQ
6b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6b90: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
6ba0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
6bb0: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
6bc0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
6bd0: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
6be0: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
6bf0: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
6c00: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
6c10: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
6c20: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
6c30: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
6c40: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
6c50: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
6c60: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
6c70: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
6c80: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
6c90: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
6ca0: 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
6cb0: 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
6cc0: 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
6cd0: 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
6ce0: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
6cf0: 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61  PNAME_SIZE chara
6d00: 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cters..*/.int sq
6d10: 6c 69 74 65 33 55 6e 69 78 54 65 6d 70 46 69 6c  lite3UnixTempFil
6d20: 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66  eName(char *zBuf
6d30: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
6d40: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
6d50: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
6d60: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
6d70: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
6d80: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
6d90: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
6da0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
6db0: 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
6dc0: 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
6dd0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
6de0: 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
6df0: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
6e00: 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
6e10: 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20  6789";.  int i, 
6e20: 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
6e30: 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
6e40: 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
6e50: 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
6e60: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
6e70: 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  tory;.  for(i=0;
6e80: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
6e90: 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
6ea0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
6eb0: 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20  f( azDirs[i]==0 
6ec0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6ed0: 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b  if( stat(azDirs[
6ee0: 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  i], &buf) ) cont
6ef0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
6f00: 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
6f10: 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
6f20: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61      if( access(a
6f30: 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20  zDirs[i], 07) ) 
6f40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44  continue;.    zD
6f50: 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a  ir = azDirs[i];.
6f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
6f70: 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66   do{.    sprintf
6f80: 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50  (zBuf, "%s/"TEMP
6f90: 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
6fa0: 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  ir);.    j = str
6fb0: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
6fc0: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6fd0: 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
6fe0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
6ff0: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
7000: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
7010: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
7020: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
7030: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
7040: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
7050: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
7060: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
7070: 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
7080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7090: 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _OK; .}../*.** C
70a0: 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 65  heck that a give
70b0: 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20  n pathname is a 
70c0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73  directory and is
70d0: 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f   writable .**.*/
70e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
70f0: 49 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68  IsDirWritable(ch
7100: 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64  ar *zBuf){.#ifnd
7110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
7120: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 73  AGER_PRAGMAS.  s
7130: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
7140: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20    if( zBuf==0 ) 
7150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7160: 7a 42 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74  zBuf[0]==0 ) ret
7170: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 61  urn 0;.  if( sta
7180: 74 28 7a 42 75 66 2c 20 26 62 75 66 29 20 29 20  t(zBuf, &buf) ) 
7190: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
71a0: 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
71b0: 6d 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 30  mode) ) return 0
71c0: 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a  ;.  if( access(z
71d0: 42 75 66 2c 20 30 37 29 20 29 20 72 65 74 75 72  Buf, 07) ) retur
71e0: 6e 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n 0;.#endif /* S
71f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
7200: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65  _PRAGMAS */.  re
7210: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
7220: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
7230: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
7240: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
7250: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
7260: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
7270: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
7280: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
7290: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
72a0: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
72b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61  atic int unixRea
72c0: 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f  d(OsFile *id, vo
72d0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
72e0: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
72f0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
7300: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7310: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
7320: 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
7330: 20 67 6f 74 20 3d 20 72 65 61 64 28 28 28 75 6e   got = read(((un
7340: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
7350: 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 54 49  pBuf, amt);.  TI
7360: 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45  MER_END;.  TRACE
7370: 35 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  5("READ    %-3d 
7380: 25 35 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 28  %5d %7d %d\n", (
7390: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
73a0: 68 2c 20 67 6f 74 2c 0a 20 20 20 20 20 20 20 20  h, got,.        
73b0: 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d    last_page, TIM
73c0: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53  ER_ELAPSED);.  S
73d0: 45 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28  EEK(0);.  /* if(
73e0: 20 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30   got<0 ) got = 0
73f0: 3b 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d  ; */.  if( got==
7400: 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
7410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7420: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7430: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7440: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74   }.}../*.** Writ
7450: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
7460: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
7470: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
7480: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
7490: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
74a0: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
74b0: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
74c0: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 4f   int unixWrite(O
74d0: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
74e0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
74f0: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f   amt){.  int wro
7500: 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
7510: 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
7520: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 53 69 6d  ( amt>0 );.  Sim
7530: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
7540: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53 69  ITE_IOERR);.  Si
7550: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
7560: 72 6f 72 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  ror;.  TIMER_STA
7570: 52 54 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  RT;.  while( amt
7580: 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 77  >0 && (wrote = w
7590: 72 69 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a  rite(((unixFile*
75a0: 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61  )id)->h, pBuf, a
75b0: 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
75c0: 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
75d0: 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
75e0: 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
75f0: 7d 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  }.  TIMER_END;. 
7600: 20 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20   TRACE5("WRITE  
7610: 20 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64   %-3d %5d %7d %d
7620: 5c 6e 22 2c 20 28 28 75 6e 69 78 46 69 6c 65 2a  \n", ((unixFile*
7630: 29 69 64 29 2d 3e 68 2c 20 77 72 6f 74 65 2c 0a  )id)->h, wrote,.
7640: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f 70            last_p
7650: 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  age, TIMER_ELAPS
7660: 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a  ED);.  SEEK(0);.
7670: 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
7680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7690: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
76a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
76b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
76c0: 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69 6e   read/write poin
76d0: 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a  ter in a file..*
76e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
76f0: 78 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xSeek(OsFile *id
7700: 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a 20  , i64 offset){. 
7710: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
7720: 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32   SEEK(offset/102
7730: 34 20 2b 20 31 29 3b 0a 23 69 66 64 65 66 20 53  4 + 1);.#ifdef S
7740: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
7750: 20 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61   offset ) Simula
7760: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a  teDiskfullError.
7770: 23 65 6e 64 69 66 0a 20 20 6c 73 65 65 6b 28 28  #endif.  lseek((
7780: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
7790: 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
77a0: 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  SET);.  return S
77b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
77c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
77d0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
77e0: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
77f0: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
7800: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
7810: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
7820: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
7830: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
7840: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
7850: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
7860: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
7870: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
7880: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
7890: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
78a0: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
78b0: 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
78c0: 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
78d0: 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
78e0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
78f0: 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
7900: 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
7910: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
7920: 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
7930: 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
7940: 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  sync.#endif.../*
7950: 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
7960: 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
7970: 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
7980: 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
7990: 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
79a0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
79b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
79c0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
79d0: 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
79e0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
79f0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
7a00: 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
7a10: 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
7a20: 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
7a30: 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
7a40: 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
7a50: 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
7a60: 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
7a70: 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
7a80: 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
7a90: 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
7aa0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
7ab0: 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
7ac0: 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
7ad0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
7ae0: 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
7af0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
7b00: 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
7b10: 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
7b20: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7b30: 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
7b40: 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
7b50: 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
7b60: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
7b70: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
7b80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
7b90: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
7ba0: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
7bb0: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
7bc0: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
7bd0: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
7be0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
7bf0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
7c00: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
7c10: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
7c20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
7c30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7c40: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
7c50: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
7c60: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
7c70: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
7c80: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
7c90: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
7ca0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
7cb0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
7cc0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
7cd0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
7ce0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7cf0: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
7d00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
7d10: 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  ..#ifdef F_FULLF
7d20: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
7d30: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
7d40: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
7d50: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
7d60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
7d70: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
7d80: 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64 2c  FULLSYNC failed,
7d90: 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f 72   try to do a nor
7da0: 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 20  mal fsync() */. 
7db0: 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
7dc0: 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65  sync(fd);..#else
7dd0: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
7de0: 46 5f 46 55 4c 4c 53 59 4e 43 29 20 2a 2f 0a 20  F_FULLSYNC) */. 
7df0: 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b   if( dataOnly ){
7e00: 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73  .    rc = fdatas
7e10: 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65  ync(fd);.  }else
7e20: 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
7e30: 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
7e40: 20 2f 2a 20 64 65 66 69 6e 65 64 28 46 5f 46 55   /* defined(F_FU
7e50: 4c 4c 46 53 59 4e 43 29 20 2a 2f 0a 23 65 6e 64  LLFSYNC) */.#end
7e60: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
7e70: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f  LITE_NO_SYNC) */
7e80: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7e90: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
7ea0: 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
7eb0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
7ec0: 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
7ed0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
7ee0: 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
7ef0: 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
7f00: 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
7f10: 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
7f20: 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
7f30: 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
7f40: 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
7f50: 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
7f60: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
7f70: 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
7f80: 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
7f90: 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
7fa0: 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
7fb0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
7fc0: 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
7fd0: 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
7fe0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
7ff0: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
8000: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
8010: 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
8020: 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
8030: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
8040: 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
8050: 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
8060: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
8070: 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
8080: 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
8090: 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
80a0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
80b0: 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
80c0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
80d0: 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
80e0: 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
80f0: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
8100: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
8110: 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
8120: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
8130: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
8140: 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
8150: 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
8160: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
8170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8180: 6e 69 78 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  nixSync(OsFile *
8190: 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  id, int dataOnly
81a0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
81b0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
81c0: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
81d0: 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
81e0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
81f0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43  E_IOERR);.  TRAC
8200: 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64  E2("SYNC    %-3d
8210: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
8220: 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63    if( full_fsync
8230: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  (pFile->h, pFile
8240: 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61 74 61  ->fullSync, data
8250: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
8260: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
8280: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
8290: 20 20 20 54 52 41 43 45 32 28 22 44 49 52 53 59     TRACE2("DIRSY
82a0: 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c  NC %-3d\n", pFil
82b0: 65 2d 3e 64 69 72 66 64 29 3b 0a 23 69 66 6e 64  e->dirfd);.#ifnd
82c0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
82d0: 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 69 66  E_DIRSYNC.    if
82e0: 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  ( full_fsync(pFi
82f0: 6c 65 2d 3e 64 69 72 66 64 2c 20 70 46 69 6c 65  le->dirfd, pFile
8300: 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 30 29 20 29  ->fullSync, 0) )
8310: 7b 0a 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  {.       /* We h
8320: 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c  ave received mul
8330: 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66  tiple reports of
8340: 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69   fsync() returni
8350: 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72  ng.       ** err
8360: 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64  ors when applied
8370: 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20   to directories 
8380: 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20  on certain file 
8390: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20  systems..       
83a0: 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65  ** A failed dire
83b0: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f  ctory sync is no
83c0: 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53  t a big deal.  S
83d0: 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20  o it seems.     
83e0: 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69    ** better to i
83f0: 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
8400: 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20    Ticket #1657. 
8410: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8420: 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
8430: 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
8440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73  .#endif.    clos
8450: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
8460: 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74    /* Only need t
8470: 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
8480: 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74  close the direct
8490: 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ory */.    pFile
84a0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  ->dirfd = -1;   
84b0: 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20   /* when we are 
84c0: 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  done. */.  }.  r
84d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
84e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
84f0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69  he directory zDi
8500: 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61  rname. This is a
8510: 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74   no-op on operat
8520: 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65  ing systems othe
8530: 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a  r.** than UNIX..
8540: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
8550: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
8560: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8570: 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75 65  al file has true
8580: 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a  ly been deleted.
8590: 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ** before making
85a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69   changes to indi
85b0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
85c0: 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62  on a multi-datab
85d0: 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54  ase commit..** T
85e0: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f  he F_FULLFSYNC o
85f0: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65  ption is not nee
8600: 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  ded here..*/.int
8610: 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63   sqlite3UnixSync
8620: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
8630: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8650: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
8660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8670: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66  K;.#else.  int f
8680: 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53 69  d;.  int r;.  Si
8690: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
86a0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66  LITE_IOERR);.  f
86b0: 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
86c0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
86d0: 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41 43  NARY, 0);.  TRAC
86e0: 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E3("DIRSYNC %-3d
86f0: 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44   (%s)\n", fd, zD
8700: 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 66  irname);.  if( f
8710: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
8720: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
8730: 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73  N; .  }.  r = fs
8740: 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65  ync(fd);.  close
8750: 28 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  (fd);.  return (
8760: 28 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b  (r==0)?SQLITE_OK
8770: 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  :SQLITE_IOERR);.
8780: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8790: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
87a0: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
87b0: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
87c0: 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
87d0: 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  cate(OsFile *id,
87e0: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 61   i64 nByte){.  a
87f0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53  ssert( id );.  S
8800: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
8810: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
8820: 72 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74 65  return ftruncate
8830: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
8840: 2d 3e 68 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f  ->h, nByte)==0 ?
8850: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
8860: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
8870: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
8880: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
8890: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
88a0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
88b0: 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46  unixFileSize(OsF
88c0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
88d0: 69 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ize){.  struct s
88e0: 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
88f0: 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
8900: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
8910: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20  E_IOERR);.  if( 
8920: 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
8930: 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 21  *)id)->h, &buf)!
8940: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8950: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8960: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
8970: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
8980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
89a0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
89b0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
89c0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
89d0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
89e0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
89f0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
8a00: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
8a10: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
8a20: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
8a30: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
8a40: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
8a50: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
8a60: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
8a70: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
8a80: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
8a90: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
8aa0: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
8ab0: 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69   r = 0;.  unixFi
8ac0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
8ad0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
8ae0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
8af0: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
8b00: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
8b10: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
8b20: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
8b30: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
8b40: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
8b50: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
8b60: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
8b70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
8b80: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
8b90: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
8ba0: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
8bb0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
8bc0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
8bd0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
8be0: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
8bf0: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
8c00: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
8c10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
8c20: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
8c30: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
8c40: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
8c50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
8c60: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
8c70: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
8c80: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
8c90: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
8ca0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
8cb0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
8cc0: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
8cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
8ce0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
8cf0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28  tex();.  TRACE3(
8d00: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
8d10: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
8d20: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
8d30: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
8d40: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
8d50: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
8d60: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
8d70: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
8d80: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8d90: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
8da0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
8db0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
8dc0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
8dd0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
8de0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
8df0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
8e00: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
8e10: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
8e20: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
8e30: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
8e40: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
8e50: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
8e60: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
8e70: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
8e80: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
8e90: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
8ea0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
8eb0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
8ec0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
8ed0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
8ee0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
8ef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
8f00: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
8f10: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
8f20: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
8f30: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
8f40: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
8f50: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
8f60: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
8f70: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
8f80: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
8f90: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
8fa0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
8fb0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
8fc0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
8fd0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
8fe0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
8ff0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9000: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
9010: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
9020: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
9030: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
9040: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
9050: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
9060: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
9070: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
9080: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
9090: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
90a0: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
90b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
90c0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
90d0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
90e0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
90f0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
9100: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
9110: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
9120: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
9130: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
9140: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
9150: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
9160: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
9170: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
9180: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
9190: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
91a0: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
91b0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
91c0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
91d0: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
91e0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
91f0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
9200: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
9210: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
9220: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
9230: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
9240: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
9250: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
9260: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
9270: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
9280: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
9290: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
92a0: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
92b0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
92c0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
92d0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
92e0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
92f0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
9300: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
9310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
9320: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
9330: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
9340: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
9350: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
9360: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
9370: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
9380: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
9390: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
93a0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
93b0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
93c0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
93d0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
93e0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
93f0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
9400: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
9410: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9420: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
9430: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
9440: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
9450: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9460: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
9470: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
9480: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
9490: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
94a0: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
94b0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
94c0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
94d0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
94e0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
94f0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
9500: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
9510: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
9520: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
9530: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9540: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
9550: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
9560: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
9570: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
9580: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
9590: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
95a0: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
95b0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
95c0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
95d0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
95e0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
95f0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
9600: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
9610: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
9620: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
9630: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
9640: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
9650: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
9660: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
9670: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
9680: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
9690: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
96a0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
96b0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
96c0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
96d0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
96e0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
96f0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
9700: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
9710: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
9720: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
9730: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
9740: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
9750: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
9760: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
9770: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
9780: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
9790: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
97a0: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
97b0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
97c0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
97d0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
97e0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
97f0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
9800: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
9810: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
9820: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
9830: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
9840: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
9850: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
9860: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
9870: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
9880: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
9890: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
98a0: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
98b0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
98c0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
98d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
98e0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
98f0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
9900: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
9910: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
9920: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
9930: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
9940: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
9950: 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45  pFile );.  TRACE
9960: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
9970: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
9980: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
9990: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
99a0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
99b0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
99c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
99d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
99e0: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
99f0: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
9a00: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
9a10: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
9a20: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
9a30: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
9a40: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
9a50: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
9a60: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
9a70: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
9a80: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
9a90: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
9aa0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
9ab0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
9ac0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
9ad0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
9ae0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
9af0: 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43  .    TRACE3("LOC
9b00: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
9b10: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
9b20: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
9b30: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
9b40: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
9b50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9b60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
9b70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
9b80: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
9b90: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
9ba0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
9bb0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
9bc0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
9bd0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
9be0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
9bf0: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
9c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
9c10: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
9c20: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
9c30: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9c40: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
9c50: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
9c60: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
9c70: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
9c80: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
9c90: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
9ca0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
9cb0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
9cc0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
9cd0: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
9ce0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
9cf0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
9d00: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
9d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d20: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
9d30: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
9d40: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
9d50: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
9d60: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
9d70: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
9d80: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
9d90: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
9da0: 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20  nt OsFile*.  ** 
9db0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
9dc0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
9dd0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
9de0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
9df0: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
9e00: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
9e10: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
9e20: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
9e30: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
9e40: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
9e50: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
9e60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9e70: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
9e80: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
9e90: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
9ea0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
9eb0: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
9ec0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
9ed0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
9ee0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
9ef0: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
9f00: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
9f10: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
9f20: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9f30: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
9f40: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
9f50: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
9f60: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
9f70: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9f80: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
9f90: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
9fa0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
9fb0: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
9fc0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
9fd0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
9fe0: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
9ff0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
a000: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
a010: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
a020: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
a030: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
a040: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
a050: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
a060: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
a070: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
a080: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
a090: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
a0a0: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
a0b0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
a0c0: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
a0d0: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
a0e0: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
a0f0: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
a100: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
a110: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
a120: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
a130: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
a140: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
a150: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
a160: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
a170: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
a180: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
a190: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
a1a0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
a1b0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a1c0: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
a1d0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
a1e0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
a1f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
a200: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
a210: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
a220: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a230: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20  ock);.    if( s 
a240: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
a250: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
a260: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
a270: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a280: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
a290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
a2a0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
a2b0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
a2c0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
a2d0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
a2e0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
a2f0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
a300: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
a310: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
a320: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a330: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
a340: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
a350: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a360: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
a370: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
a380: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
a390: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
a3a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a3b0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
a3c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
a3d0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20  D_SIZE;.    s = 
a3e0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a3f0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a400: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
a410: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
a420: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
a430: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
a440: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
a450: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
a460: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
a470: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
a480: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
a490: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a4a0: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
a4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
a4c0: 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  RR;  /* This sho
a4d0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
a4e0: 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
a4f0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
a500: 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20     if( s ){.    
a510: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
a520: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
a530: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
a540: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
a550: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
a560: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
a570: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
a580: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
a590: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
a5a0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
a5b0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
a5c0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
a5d0: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
a5e0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
a5f0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
a600: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a610: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
a620: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
a630: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
a640: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
a650: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
a660: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
a670: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
a680: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
a690: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
a6a0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
a6b0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
a6c0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
a6d0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
a6e0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
a6f0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
a700: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
a710: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
a720: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
a730: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
a740: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a750: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
a760: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
a770: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
a780: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
a790: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a7a0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
a7b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a7c0: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
a7d0: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
a7e0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a7f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a800: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a810: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
a820: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a830: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
a840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
a850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
a860: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a870: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a880: 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20  .    if( s ){.  
a890: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
a8a0: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
a8b0: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
a8c0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
a8d0: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
a8e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
a8f0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
a900: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
a910: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a920: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
a930: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
a940: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a950: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
a960: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
a970: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
a980: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
a990: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
a9a0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
a9b0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
a9c0: 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f 43  );.  TRACE4("LOC
a9d0: 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22  K    %d %s %s\n"
a9e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
a9f0: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
aa00: 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  e), .      rc==S
aa10: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
aa20: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
aa30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
aa40: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
aa50: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
aa60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
aa70: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
aa80: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
aa90: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
aaa0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
aab0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
aac0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
aad0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
aae0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
aaf0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
ab00: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
ab10: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
ab20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ab30: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
ab40: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
ab50: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
ab60: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
ab70: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
ab80: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
ab90: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
aba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
abb0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
abc0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
abd0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
abe0: 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28  ile );.  TRACE7(
abf0: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
ac00: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
ac10: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
ac20: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
ac30: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ac40: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
ac50: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
ac60: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
ac70: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
ac80: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
ac90: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
aca0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
acb0: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
acc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
acd0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ace0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
acf0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ad00: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ad10: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
ad20: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
ad30: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
ad40: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
ad50: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
ad60: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ad70: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
ad80: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
ad90: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
ada0: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
adb0: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28 20  type );.    if( 
adc0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
add0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
ade0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
adf0: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  DLCK;.      lock
ae00: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ae10: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
ae20: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ae30: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
ae40: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ae50: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  ED_SIZE;.      i
ae60: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
ae70: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ae80: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
ae90: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
aea0: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
aeb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
aec0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
aed0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
aee0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
aef0: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
af00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
af10: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
af20: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
af30: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
af40: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
af50: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
af60: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
af70: 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28  ;.    if( fcntl(
af80: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
af90: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  K, &lock)==0 ){.
afa0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
afb0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
afc0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
afd0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
afe0: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
aff0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
b000: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  appen */.    }. 
b010: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
b020: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
b030: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
b040: 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a   *pOpen;..    /*
b050: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
b060: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
b070: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
b080: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
b090: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
b0a0: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
b0b0: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
b0c0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
b0d0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
b0e0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
b0f0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b     pLock->cnt--;
b100: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
b110: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
b120: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b130: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
b140: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
b150: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
b160: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
b170: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
b180: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
b190: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
b1a0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
b1b0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
b1c0: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
b1d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b1e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b1f0: 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73  _IOERR;  /* This
b200: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
b210: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ppen */.      }.
b220: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
b230: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
b240: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
b250: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
b260: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
b270: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
b280: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
b290: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
b2a0: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
b2b0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
b2c0: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
b2d0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
b2e0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
b2f0: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
b300: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
b310: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
b320: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
b330: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
b340: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
b350: 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65  =0 && pOpen->nPe
b360: 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nding>0 ){.     
b370: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
b380: 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
b390: 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
b3a0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
b3b0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
b3c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b3d0: 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65   free(pOpen->aPe
b3e0: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f  nding);.      pO
b3f0: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
b400: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
b410: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
b420: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
b430: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
b440: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
b450: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
b460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b470: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
b480: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b490: 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c   unixClose(OsFil
b4a0: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  e **pId){.  unix
b4b0: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
b4c0: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69  File*)*pId;..  i
b4d0: 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20  f( !id ) return 
b4e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
b4f0: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
b500: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64  _LOCK);.  if( id
b510: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
b520: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
b530: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
b540: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
b550: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28  rMutex();..  if(
b560: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
b570: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
b580: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
b590: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
b5a0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
b5b0: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
b5c0: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
b5d0: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
b5e0: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
b5f0: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
b600: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
b610: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
b620: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
b630: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
b640: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
b650: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
b660: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
b670: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
b680: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
b690: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
b6a0: 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e  Open = id->pOpen
b6b0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61  ;.    aNew = rea
b6c0: 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65  lloc( pOpen->aPe
b6d0: 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e  nding, (pOpen->n
b6e0: 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f  Pending+1)*sizeo
b6f0: 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66  f(int) );.    if
b700: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
b710: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
b720: 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
b730: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
b740: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65  riptor */.    }e
b750: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
b760: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
b770: 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  w;.      pOpen->
b780: 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
b790: 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e  nPending] = id->
b7a0: 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  h;.      pOpen->
b7b0: 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20  nPending++;.    
b7c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
b7d0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * There are no o
b7e0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
b7f0: 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65   so we can close
b800: 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69   the file immedi
b810: 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f  ately */.    clo
b820: 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20  se(id->h);.  }. 
b830: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
b840: 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72  (id->pLock);.  r
b850: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64  eleaseOpenCnt(id
b860: 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c  ->pOpen);..  sql
b870: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
b880: 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
b890: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22   = 0;.  TRACE2("
b8a0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
b8b0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
b8c0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
b8d0: 6c 69 74 65 46 72 65 65 28 69 64 29 3b 0a 20 20  liteFree(id);.  
b8e0: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
b8f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b900: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
b910: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
b920: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
b930: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
b940: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
b950: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
b960: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
b970: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
b980: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
b990: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
b9a0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
b9b0: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
b9c0: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
b9d0: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
b9e0: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
b9f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  har *sqlite3Unix
ba00: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
ba10: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
ba20: 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ve){.  char *zFu
ba30: 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52  ll = 0;.  if( zR
ba40: 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
ba50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
ba60: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
ba70: 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72  zRelative, (char
ba80: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
ba90: 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20     char *zBuf = 
baa0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30  sqliteMalloc(500
bab0: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
bac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
bad0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
bae0: 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
baf0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
bb00: 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77  ng(&zFull, getcw
bb10: 64 28 7a 42 75 66 2c 20 35 30 30 30 29 2c 20 22  d(zBuf, 5000), "
bb20: 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20  /", zRelative,. 
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
bb50: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 75    sqliteFree(zBu
bb60: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
bb70: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
bb80: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
bb90: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e  e of the fullsyn
bba0: 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69  c flag in the gi
bbb0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
bbc0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
bbd0: 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  oid unixSetFullS
bbe0: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ync(OsFile *id, 
bbf0: 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78  int v){.  ((unix
bc00: 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53  File*)id)->fullS
bc10: 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = v;.}../*.*
bc20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64  * Return the und
bc30: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
bc40: 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c  dle for an OsFil
bc50: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
bc60: 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f  unixFileHandle(O
bc70: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
bc80: 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a  turn ((unixFile*
bc90: 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  )id)->h;.}../*.*
bca0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
bcb0: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
bcc0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
bcd0: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
bce0: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
bcf0: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
bd00: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
bd10: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
bd20: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
bd30: 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  kState(OsFile *i
bd40: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  d){.  return ((u
bd50: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
bd60: 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cktype;.}../*.**
bd70: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
bd80: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
bd90: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
bda0: 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
bdb0: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a  le.** for unix..
bdc0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
bdd0: 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
bde0: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
bdf0: 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  .  unixClose,.  
be00: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
be10: 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  y,.  unixRead,. 
be20: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
be30: 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72  ixSeek,.  unixTr
be40: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
be50: 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c  nc,.  unixSetFul
be60: 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c  lSync,.  unixFil
be70: 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46  eHandle,.  unixF
be80: 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c  ileSize,.  unixL
be90: 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  ock,.  unixUnloc
bea0: 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  k,.  unixLockSta
beb0: 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52  te,.  unixCheckR
bec0: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
bed0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
bee0: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e 69  memory for a uni
bef0: 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69  xFile.  Initiali
bf00: 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  ze the new unixF
bf10: 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  ile.** to the va
bf20: 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49 6e  lue given in pIn
bf30: 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  it and return a 
bf40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
bf50: 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49  ew.** OsFile.  I
bf60: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
bf70: 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68  memory, close th
bf80: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  e file and retur
bf90: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
bfa0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
bfb0: 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
bfc0: 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a  *pInit, OsFile *
bfd0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
bfe0: 65 20 2a 70 4e 65 77 3b 0a 20 20 70 49 6e 69 74  e *pNew;.  pInit
bff0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
c000: 70 49 6e 69 74 2d 3e 66 75 6c 6c 53 79 6e 63 20  pInit->fullSync 
c010: 3d 20 30 3b 0a 20 20 70 49 6e 69 74 2d 3e 6c 6f  = 0;.  pInit->lo
c020: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 53 45  cktype = 0;.  SE
c030: 54 5f 54 48 52 45 41 44 49 44 28 70 49 6e 69 74  T_THREADID(pInit
c040: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
c050: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
c060: 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20 20  (unixFile) );.  
c070: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
c080: 20 20 20 63 6c 6f 73 65 28 70 49 6e 69 74 2d 3e     close(pInit->
c090: 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  h);.    sqlite3O
c0a0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
c0b0: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
c0c0: 66 6f 28 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b 29  fo(pInit->pLock)
c0d0: 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
c0e0: 6e 43 6e 74 28 70 49 6e 69 74 2d 3e 70 4f 70 65  nCnt(pInit->pOpe
c0f0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  n);.    sqlite3O
c100: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
c110: 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20     *pId = 0;.   
c120: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c130: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
c140: 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49 6e 69     *pNew = *pIni
c150: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  t;.    pNew->pMe
c160: 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55  thod = &sqlite3U
c170: 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
c180: 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a   *pId = (OsFile*
c190: 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43  )pNew;.    OpenC
c1a0: 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
c1b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c1c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66  ;.  }.}...#endif
c1d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c1e0: 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  DISKIO */./*****
c1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c230: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74  ******.** Everyt
c240: 68 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c 73  hing above deals
c250: 20 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20   with file I/O. 
c260: 20 45 76 65 72 79 74 68 69 6e 67 20 74 68 61 74   Everything that
c270: 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a   follows deals.*
c280: 2a 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69 73  * with other mis
c290: 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63 74  cellanous aspect
c2a0: 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
c2b0: 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
c2c0: 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ace.************
c2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c310: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e  /.../*.** Get in
c320: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65  formation to see
c330: 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  d the random num
c340: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20  ber generator.  
c350: 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77  The seed.** is w
c360: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
c370: 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d  buffer zBuf[256]
c380: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
c390: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20  unction must.** 
c3a0: 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63 69  supply a suffici
c3b0: 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66  ently large buff
c3c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
c3d0: 65 33 55 6e 69 78 52 61 6e 64 6f 6d 53 65 65 64  e3UnixRandomSeed
c3e0: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
c3f0: 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
c400: 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
c410: 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
c420: 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
c430: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
c440: 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
c450: 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
c460: 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
c470: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
c480: 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
c490: 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
c4a0: 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
c4b0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
c4c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
c4d0: 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
c4e0: 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
c4f0: 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
c500: 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
c510: 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
c520: 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
c530: 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
c540: 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
c550: 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
c560: 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
c570: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
c580: 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
c590: 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
c5a0: 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
c5b0: 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
c5c0: 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
c5d0: 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
c5e0: 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
c5f0: 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
c600: 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
c610: 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
c620: 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
c630: 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
c640: 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
c650: 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
c660: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
c670: 2c 20 32 35 36 29 3b 0a 23 69 66 20 21 64 65 66  , 256);.#if !def
c680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
c690: 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
c6a0: 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
c6b0: 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
c6c0: 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
c6d0: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
c6e0: 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
c6f0: 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
c700: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
c710: 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
c720: 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
c730: 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
c740: 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
c750: 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69  of(time_t)], &pi
c760: 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
c770: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c780: 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c    read(fd, zBuf,
c790: 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c 6f   256);.      clo
c7a0: 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
c7b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
c7c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c7d0: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
c7e0: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
c7f0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
c800: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
c810: 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
c820: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
c830: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
c840: 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
c850: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c860: 55 6e 69 78 53 6c 65 65 70 28 69 6e 74 20 6d 73  UnixSleep(int ms
c870: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
c880: 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
c890: 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
c8a0: 65 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20  eep(ms*1000);.  
c8b0: 72 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65  return ms;.#else
c8c0: 0a 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39 39  .  sleep((ms+999
c8d0: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
c8e0: 6e 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39 29  n 1000*((ms+999)
c8f0: 2f 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  /1000);.#endif.}
c900: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76  ../*.** Static v
c910: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f  ariables used fo
c920: 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f  r thread synchro
c930: 6e 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nization..**.** 
c940: 69 6e 4d 75 74 65 78 20 20 20 20 20 20 74 68 65  inMutex      the
c950: 20 6e 65 73 74 69 6e 67 20 64 65 70 74 68 20 6f   nesting depth o
c960: 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  f the recursive 
c970: 6d 75 74 65 78 2e 20 20 54 68 65 20 74 68 72 65  mutex.  The thre
c980: 61 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ad.**           
c990: 20 20 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78     holding mutex
c9a0: 4d 61 69 6e 20 63 61 6e 20 72 65 61 64 20 74 68  Main can read th
c9b0: 69 73 20 76 61 72 69 61 62 6c 65 20 61 74 20 61  is variable at a
c9c0: 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 20 20 20 20  ny time..**     
c9d0: 20 20 20 20 20 20 20 20 20 42 75 74 20 69 73 20           But is 
c9e0: 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74 65 78 41  must hold mutexA
c9f0: 75 78 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69  ux to change thi
ca00: 73 20 76 61 72 69 61 62 6c 65 2e 20 20 4f 74 68  s variable.  Oth
ca10: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
ca20: 20 20 20 74 68 72 65 61 64 73 20 6d 75 73 74 20     threads must 
ca30: 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f  hold mutexAux to
ca40: 20 72 65 61 64 20 74 68 65 20 76 61 72 69 61 62   read the variab
ca50: 6c 65 20 61 6e 64 20 63 61 6e 0a 2a 2a 20 20 20  le and can.**   
ca60: 20 20 20 20 20 20 20 20 20 20 20 6e 65 76 65 72             never
ca70: 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75   write..**.** mu
ca80: 74 65 78 4f 77 6e 65 72 20 20 20 54 68 65 20 74  texOwner   The t
ca90: 68 72 65 61 64 20 69 64 20 6f 66 20 74 68 65 20  hread id of the 
caa0: 74 68 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d  thread holding m
cab0: 75 74 65 78 4d 61 69 6e 2e 20 20 53 61 6d 65 0a  utexMain.  Same.
cac0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
cad0: 61 63 63 65 73 73 20 72 75 6c 65 73 20 61 73 20  access rules as 
cae0: 66 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a  for inMutex..**.
caf0: 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  ** mutexOwnerVal
cb00: 69 64 20 20 20 54 72 75 65 20 69 66 20 74 68 65  id   True if the
cb10: 20 76 61 6c 75 65 20 69 6e 20 6d 75 74 65 78 4f   value in mutexO
cb20: 77 6e 65 72 20 69 73 20 76 61 6c 69 64 2e 20 20  wner is valid.  
cb30: 54 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20  The same.**     
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
cb50: 63 65 73 73 20 72 75 6c 65 73 20 61 70 70 6c 79  cess rules apply
cb60: 20 61 73 20 66 6f 72 20 69 6e 4d 75 74 65 78 2e   as for inMutex.
cb70: 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4d 61 69 6e  .**.** mutexMain
cb80: 20 20 20 20 54 68 65 20 6d 61 69 6e 20 6d 75 74      The main mut
cb90: 65 78 2e 20 20 48 6f 6c 64 20 74 68 69 73 20 6d  ex.  Hold this m
cba0: 75 74 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  utex in order to
cbb0: 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 0a 2a   get exclusive.*
cbc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
cbd0: 63 63 65 73 73 20 74 6f 20 53 51 4c 69 74 65 20  ccess to SQLite 
cbe0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 2e  data structures.
cbf0: 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 41 75 78 20  .**.** mutexAux 
cc00: 20 20 20 20 41 6e 20 61 75 78 69 6c 69 61 72 79      An auxiliary
cc10: 20 6d 75 74 65 78 20 6e 65 65 64 65 64 20 74 6f   mutex needed to
cc20: 20 61 63 63 65 73 73 20 76 61 72 69 61 62 6c 65   access variable
cc30: 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e  s defined above.
cc40: 0a 2a 2a 0a 2a 2a 20 4d 75 74 65 78 65 73 20 61  .**.** Mutexes a
cc50: 72 65 20 61 6c 77 61 79 73 20 61 63 71 75 69 72  re always acquir
cc60: 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
cc70: 3a 20 6d 75 74 65 78 4d 61 69 6e 20 6d 75 74 65  : mutexMain mute
cc80: 78 41 75 78 2e 20 20 20 49 74 0a 2a 2a 20 69 73  xAux.   It.** is
cc90: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
cca0: 6f 20 61 63 71 75 69 72 65 20 6d 75 74 65 78 4d  o acquire mutexM
ccb0: 61 69 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ain in order to 
ccc0: 67 65 74 20 6d 75 74 65 78 41 75 78 20 2d 20 6a  get mutexAux - j
ccd0: 75 73 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74  ust.** do not at
cce0: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
ccf0: 20 74 68 65 6d 20 69 6e 20 74 68 65 20 72 65 76   them in the rev
cd00: 65 72 73 65 20 6f 72 64 65 72 3a 20 6d 75 74 65  erse order: mute
cd10: 78 41 75 78 20 6d 75 74 65 78 4d 61 69 6e 2e 0a  xAux mutexMain..
cd20: 2a 2a 20 45 69 74 68 65 72 20 67 65 74 20 74 68  ** Either get th
cd30: 65 20 6d 75 74 65 78 65 73 20 77 69 74 68 20 6d  e mutexes with m
cd40: 75 74 65 78 4d 61 69 6e 20 66 69 72 73 74 20 6f  utexMain first o
cd50: 72 20 67 65 74 20 6d 75 74 65 78 41 75 78 20 6f  r get mutexAux o
cd60: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  nly..**.** When 
cd70: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 70 6c 61  running on a pla
cd80: 74 66 6f 72 6d 20 77 68 65 72 65 20 74 68 65 20  tform where the 
cd90: 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
cda0: 69 6e 4d 75 74 65 78 2c 20 6d 75 74 65 78 4f 77  inMutex, mutexOw
cdb0: 6e 65 72 2c 0a 2a 2a 20 61 6e 64 20 6d 75 74 65  ner,.** and mute
cdc0: 78 4f 77 6e 65 72 56 61 6c 69 64 20 63 61 6e 20  xOwnerValid can 
cdd0: 62 65 20 73 65 74 20 61 74 6f 6d 69 63 61 6c 6c  be set atomicall
cde0: 79 2c 20 74 68 65 20 6d 75 74 65 78 41 75 78 20  y, the mutexAux 
cdf0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
ce00: 0a 2a 2a 20 4f 6e 20 6d 61 6e 79 20 73 79 73 74  .** On many syst
ce10: 65 6d 73 2c 20 61 6c 6c 20 74 68 72 65 65 20 61  ems, all three a
ce20: 72 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  re 32-bit intege
ce30: 72 73 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74  rs and writing t
ce40: 6f 20 61 20 33 32 2d 62 69 74 0a 2a 2a 20 69 6e  o a 32-bit.** in
ce50: 74 65 67 65 72 20 69 73 20 61 74 6f 6d 69 63 2e  teger is atomic.
ce60: 20 20 49 20 74 68 69 6e 6b 2e 20 20 42 75 74 20    I think.  But 
ce70: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 67 75 61  there are no gua
ce80: 72 61 6e 74 65 65 73 2e 20 20 53 6f 20 69 74 20  rantees.  So it 
ce90: 73 65 65 6d 73 0a 2a 2a 20 73 61 66 65 72 20 74  seems.** safer t
cea0: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 6d 20 75  o protect them u
ceb0: 73 69 6e 67 20 6d 75 74 65 78 41 75 78 2e 0a 2a  sing mutexAux..*
cec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
ced0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
cee0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
cef0: 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68 72  EADS.static pthr
cf00: 65 61 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65 72  ead_t mutexOwner
cf10: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
cf20: 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74  read holding mut
cf30: 65 78 4d 61 69 6e 20 2a 2f 0a 73 74 61 74 69 63  exMain */.static
cf40: 20 69 6e 74 20 6d 75 74 65 78 4f 77 6e 65 72 56   int mutexOwnerV
cf50: 61 6c 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  alid = 0;       
cf60: 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 74 65 78  /* True if mutex
cf70: 4f 77 6e 65 72 20 69 73 20 76 61 6c 69 64 20 2a  Owner is valid *
cf80: 2f 0a 73 74 61 74 69 63 20 70 74 68 72 65 61 64  /.static pthread
cf90: 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 4d 61  _mutex_t mutexMa
cfa0: 69 6e 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54  in = PTHREAD_MUT
cfb0: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20  EX_INITIALIZER; 
cfc0: 2f 2a 20 54 68 65 20 6d 75 74 65 78 20 2a 2f 0a  /* The mutex */.
cfd0: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
cfe0: 75 74 65 78 5f 74 20 6d 75 74 65 78 41 75 78 20  utex_t mutexAux 
cff0: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
d000: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20 20 2f 2a  INITIALIZER;  /*
d010: 20 41 75 78 20 6d 75 74 65 78 20 2a 2f 0a 23 65   Aux mutex */.#e
d020: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
d030: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f  following pair o
d040: 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  f routine implem
d050: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75  ent mutual exclu
d060: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74  sion for.** mult
d070: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65  i-threaded proce
d080: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69  sses.  Only a si
d090: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61  ngle thread is a
d0a0: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65  llowed to.** exe
d0b0: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  cuted code that 
d0c0: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  is surrounded by
d0d0: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e   EnterMutex() an
d0e0: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a  d LeaveMutex()..
d0f0: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
d100: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
d110: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73  Mutex.  There is
d120: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63   not much critic
d130: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77  al.** code and w
d140: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65  hat little there
d150: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69   is executes qui
d160: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74  ckly and without
d170: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   blocking..**.**
d180: 20 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20 33   As of version 3
d190: 2e 33 2e 32 2c 20 74 68 69 73 20 6d 75 74 65 78  .3.2, this mutex
d1a0: 20 6d 75 73 74 20 62 65 20 72 65 63 75 72 73 69   must be recursi
d1b0: 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
d1c0: 74 65 33 55 6e 69 78 45 6e 74 65 72 4d 75 74 65  te3UnixEnterMute
d1d0: 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  x(){.#ifdef SQLI
d1e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
d1f0: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
d200: 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b  lock(&mutexAux);
d210: 0a 20 20 69 66 28 20 21 6d 75 74 65 78 4f 77 6e  .  if( !mutexOwn
d220: 65 72 56 61 6c 69 64 20 7c 7c 20 21 70 74 68 72  erValid || !pthr
d230: 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
d240: 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
d250: 6c 66 28 29 29 20 29 7b 0a 20 20 20 20 70 74 68  lf()) ){.    pth
d260: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
d270: 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
d280: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
d290: 6c 6f 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29  lock(&mutexMain)
d2a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
d2b0: 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
d2c0: 61 73 73 65 72 74 28 20 21 6d 75 74 65 78 4f 77  assert( !mutexOw
d2d0: 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  nerValid );.    
d2e0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
d2f0: 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20  ck(&mutexAux);. 
d300: 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20     mutexOwner = 
d310: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
d320: 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56 61      mutexOwnerVa
d330: 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  lid = 1;.  }.  i
d340: 6e 4d 75 74 65 78 2b 2b 3b 0a 20 20 70 74 68 72  nMutex++;.  pthr
d350: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
d360: 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23 65 6c  (&mutexAux);.#el
d370: 73 65 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 0a 23  se.  inMutex++.#
d380: 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 73 71 6c  endif.}.void sql
d390: 69 74 65 33 55 6e 69 78 4c 65 61 76 65 4d 75 74  ite3UnixLeaveMut
d3a0: 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ex(){.  assert( 
d3b0: 69 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23 69 66  inMutex>0 );.#if
d3c0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
d3d0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
d3e0: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
d3f0: 74 65 78 41 75 78 29 3b 0a 20 20 69 6e 4d 75 74  texAux);.  inMut
d400: 65 78 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20  ex--;.  assert( 
d410: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75  pthread_equal(mu
d420: 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72 65 61  texOwner, pthrea
d430: 64 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20 20 69  d_self()) );.  i
d440: 66 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29 7b  f( inMutex==0 ){
d450: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 75 74  .    assert( mut
d460: 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 29 3b 0a  exOwnerValid );.
d470: 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56 61      mutexOwnerVa
d480: 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 74 68  lid = 0;.    pth
d490: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
d4a0: 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a 20  k(&mutexMain);. 
d4b0: 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74   }.  pthread_mut
d4c0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
d4d0: 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Aux);.#else.  in
d4e0: 4d 75 74 65 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a  Mutex--;.#endif.
d4f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d500: 54 52 55 45 20 69 66 20 74 68 65 20 6d 75 74 65  TRUE if the mute
d510: 78 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68  x is currently h
d520: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
d530: 65 20 74 68 69 73 54 68 72 64 20 70 61 72 61 6d  e thisThrd param
d540: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 72 65  eter is true, re
d550: 74 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20 69  turn true only i
d560: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  f the.** calling
d570: 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68   thread holds th
d580: 65 20 6d 75 74 65 78 2e 20 20 49 66 20 74 68 65  e mutex.  If the
d590: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
d5a0: 6c 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  lse, return.** t
d5b0: 72 75 65 20 69 66 20 61 6e 79 20 74 68 72 65 61  rue if any threa
d5c0: 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  d holds the mute
d5d0: 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
d5e0: 33 55 6e 69 78 49 6e 4d 75 74 65 78 28 69 6e 74  3UnixInMutex(int
d5f0: 20 74 68 69 73 54 68 72 64 29 7b 0a 23 69 66 64   thisThrd){.#ifd
d600: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
d610: 48 52 45 41 44 53 0a 20 20 69 6e 74 20 72 63 3b  HREADS.  int rc;
d620: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
d630: 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  _lock(&mutexAux)
d640: 3b 0a 20 20 72 63 20 3d 20 69 6e 4d 75 74 65 78  ;.  rc = inMutex
d650: 3e 30 20 26 26 20 28 74 68 69 73 54 68 72 64 3d  >0 && (thisThrd=
d660: 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65 71  =0 || pthread_eq
d670: 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 70  ual(mutexOwner,p
d680: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29 3b  thread_self()));
d690: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
d6a0: 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75  _unlock(&mutexAu
d6b0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
d6c0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
d6d0: 69 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e 64 69  inMutex>0;.#endi
d6e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  f.}../*.** Remem
d6f0: 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ber the number o
d700: 66 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  f thread-specifi
d710: 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c  c-data blocks al
d720: 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20  located..** Use 
d730: 74 68 69 73 20 74 6f 20 76 65 72 69 66 79 20 74  this to verify t
d740: 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 6c  hat we are not l
d750: 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73 70  eaking thread-sp
d760: 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20  ecific-data..** 
d770: 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a  Ticket #1601.*/.
d780: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d790: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  ST.int sqlite3_t
d7a0: 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20  sd_count = 0;.# 
d7b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
d7c0: 58 5f 54 48 52 45 41 44 53 0a 20 20 20 20 73 74  X_THREADS.    st
d7d0: 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74  atic pthread_mut
d7e0: 65 78 5f 74 20 74 73 64 5f 63 6f 75 6e 74 65 72  ex_t tsd_counter
d7f0: 5f 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44  _mutex = PTHREAD
d800: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
d810: 45 52 3b 0a 23 20 20 20 64 65 66 69 6e 65 20 54  ER;.#   define T
d820: 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 5c 0a  SD_COUNTER(N) \.
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 74 68               pth
d840: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
d850: 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74  &tsd_counter_mut
d860: 65 78 29 3b 20 5c 0a 20 20 20 20 20 20 20 20 20  ex); \.         
d870: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f      sqlite3_tsd_
d880: 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20  count += N; \.  
d890: 20 20 20 20 20 20 20 20 20 20 20 70 74 68 72 65             pthre
d8a0: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
d8b0: 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74  &tsd_counter_mut
d8c0: 65 78 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 20  ex);.# else.#   
d8d0: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
d8e0: 45 52 28 4e 29 20 20 73 71 6c 69 74 65 33 5f 74  ER(N)  sqlite3_t
d8f0: 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20  sd_count += N.# 
d900: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64 65  endif.#else.# de
d910: 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52  fine TSD_COUNTER
d920: 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  (N)  /* no-op */
d930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
d940: 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
d950: 6c 6f 63 61 74 65 46 6c 61 67 3e 30 2c 20 74 68  locateFlag>0, th
d960: 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
d970: 74 65 72 20 74 6f 20 74 68 72 65 61 64 0a 2a 2a  ter to thread.**
d980: 20 73 70 65 63 69 66 69 63 20 64 61 74 61 20 66   specific data f
d990: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
d9a0: 68 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61 74 65  hread.  Allocate
d9b0: 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a 2a 2a   and zero the.**
d9c0: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
d9d0: 20 64 61 74 61 20 69 66 20 69 74 20 64 6f 65 73   data if it does
d9e0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
d9f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  st..**.** If cal
da00: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
da10: 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63  eFlag==0, then c
da20: 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
da30: 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
da40: 66 69 63 20 64 61 74 61 2e 20 20 52 65 74 75 72  fic data.  Retur
da50: 6e 20 69 74 20 69 66 20 69 74 20 65 78 69 73 74  n it if it exist
da60: 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  s.  If it does n
da70: 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68 65  ot exist,.** the
da80: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
da90: 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77  *.** If called w
daa0: 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  ith allocateFlag
dab0: 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  <0, check to see
dac0: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 73   if the thread s
dad0: 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
dae0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
daf0: 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49   is all zero.  I
db00: 66 20 69 74 20 69 73 20 74 68 65 6e 20 64 65 61  f it is then dea
db10: 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20 52  llocate it..** R
db20: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
db30: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 73 70  to the thread sp
db40: 65 63 69 66 69 63 20 64 61 74 61 20 6f 72 20 4e  ecific data or N
db50: 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  ULL if it is.** 
db60: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 67  unallocated or g
db70: 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  ets deallocated.
db80: 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61 20 2a  .*/.ThreadData *
db90: 73 71 6c 69 74 65 33 55 6e 69 78 54 68 72 65 61  sqlite3UnixThrea
dba0: 64 53 70 65 63 69 66 69 63 44 61 74 61 28 69 6e  dSpecificData(in
dbb0: 74 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29 7b  t allocateFlag){
dbc0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
dbd0: 54 68 72 65 61 64 44 61 74 61 20 7a 65 72 6f 44  ThreadData zeroD
dbe0: 61 74 61 20 3d 20 7b 30 7d 3b 20 20 2f 2a 20 49  ata = {0};  /* I
dbf0: 6e 69 74 69 61 6c 69 7a 65 72 20 74 6f 20 73 69  nitializer to si
dc00: 6c 65 6e 63 65 20 77 61 72 6e 69 6e 67 73 0a 20  lence warnings. 
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f            ** fro
dc40: 6d 20 62 72 6f 6b 65 6e 20 63 6f 6d 70 69 6c 65  m broken compile
dc50: 72 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  rs */.#ifdef SQL
dc60: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
dc70: 0a 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61  .  static pthrea
dc80: 64 5f 6b 65 79 5f 74 20 6b 65 79 3b 0a 20 20 73  d_key_t key;.  s
dc90: 74 61 74 69 63 20 69 6e 74 20 6b 65 79 49 6e 69  tatic int keyIni
dca0: 74 20 3d 20 30 3b 0a 20 20 54 68 72 65 61 64 44  t = 0;.  ThreadD
dcb0: 61 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69 66  ata *pTsd;..  if
dcc0: 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20  ( !keyInit ){.  
dcd0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
dce0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
dcf0: 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20   !keyInit ){.   
dd00: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
dd10: 20 72 63 20 3d 20 70 74 68 72 65 61 64 5f 6b 65   rc = pthread_ke
dd20: 79 5f 63 72 65 61 74 65 28 26 6b 65 79 2c 20 30  y_create(&key, 0
dd30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dd50: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
dd60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
dd70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
dd80: 20 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a 20    keyInit = 1;. 
dd90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
dda0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
ddb0: 20 20 7d 0a 0a 20 20 70 54 73 64 20 3d 20 70 74    }..  pTsd = pt
ddc0: 68 72 65 61 64 5f 67 65 74 73 70 65 63 69 66 69  hread_getspecifi
ddd0: 63 28 6b 65 79 29 3b 0a 20 20 69 66 28 20 61 6c  c(key);.  if( al
dde0: 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29 7b 0a  locateFlag>0 ){.
ddf0: 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d 30 20      if( pTsd==0 
de00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71  ){.      if( !sq
de10: 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f 63 46  lite3TestMallocF
de20: 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20 20 20  ail() ){.       
de30: 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f   pTsd = sqlite3O
de40: 73 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 7a  sMalloc(sizeof(z
de50: 65 72 6f 44 61 74 61 29 29 3b 0a 20 20 20 20 20  eroData));.     
de60: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
de70: 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20 20  _MEMDEBUG.      
de80: 73 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20 3d  sqlite3_isFail =
de90: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   0;.#endif.     
dea0: 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20   if( pTsd ){.   
deb0: 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72       *pTsd = zer
dec0: 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  oData;.        p
ded0: 74 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66  thread_setspecif
dee0: 69 63 28 6b 65 79 2c 20 70 54 73 64 29 3b 0a 20  ic(key, pTsd);. 
def0: 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54         TSD_COUNT
df00: 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ER(+1);.      }.
df10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
df20: 28 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c  ( pTsd!=0 && all
df30: 6f 63 61 74 65 46 6c 61 67 3c 30 20 0a 20 20 20  ocateFlag<0 .   
df40: 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
df50: 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61  mp(pTsd, &zeroDa
df60: 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61  ta, sizeof(Threa
df70: 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20  dData))==0 ){.  
df80: 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28    sqlite3OsFree(
df90: 70 54 73 64 29 3b 0a 20 20 20 20 70 74 68 72 65  pTsd);.    pthre
dfa0: 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b  ad_setspecific(k
dfb0: 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44 5f  ey, 0);.    TSD_
dfc0: 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20  COUNTER(-1);.   
dfd0: 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20   pTsd = 0;.  }. 
dfe0: 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65   return pTsd;.#e
dff0: 6c 73 65 0a 20 20 73 74 61 74 69 63 20 54 68 72  lse.  static Thr
e000: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
e010: 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74  0;.  if( allocat
e020: 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69  eFlag>0 ){.    i
e030: 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20  f( pTsd==0 ){.  
e040: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
e050: 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29  TestMallocFail()
e060: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64   ){.        pTsd
e070: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c   = sqlite3OsMall
e080: 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44  oc( sizeof(zeroD
e090: 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a  ata) );.      }.
e0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45  #ifdef SQLITE_ME
e0b0: 4d 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  MDEBUG.      sql
e0c0: 69 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b  ite3_isFail = 0;
e0d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
e0e0: 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20  ( pTsd ){.      
e0f0: 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61    *pTsd = zeroDa
e100: 74 61 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f  ta;.        TSD_
e110: 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20 20 20  COUNTER(+1);.   
e120: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
e130: 73 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26  se if( pTsd!=0 &
e140: 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30  & allocateFlag<0
e150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
e160: 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a 65  memcmp(pTsd, &ze
e170: 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 54  roData, sizeof(T
e180: 68 72 65 61 64 44 61 74 61 29 29 3d 3d 30 20 29  hreadData))==0 )
e190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
e1a0: 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 54  ree(pTsd);.    T
e1b0: 53 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a  SD_COUNTER(-1);.
e1c0: 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20      pTsd = 0;.  
e1d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b  }.  return pTsd;
e1e0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e1f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
e200: 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
e210: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
e220: 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65  lue, becomes the
e230: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72   result.** retur
e240: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
e250: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e  OsCurrentTime().
e260: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
e270: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  or testing..*/.#
e280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
e290: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
e2a0: 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a  rrent_time = 0;.
e2b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
e2c0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
e2d0: 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
e2e0: 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
e2f0: 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
e300: 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
e310: 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
e320: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
e330: 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
e340: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
e350: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
e360: 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
e370: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
e380: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 43  int sqlite3UnixC
e390: 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c  urrentTime(doubl
e3a0: 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65  e *prNow){.#ifde
e3b0: 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69  f NO_GETTOD.  ti
e3c0: 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
e3d0: 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
e3e0: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
e3f0: 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74  87.5;.#else.  st
e400: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
e410: 77 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  w;.  struct time
e420: 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f  zone sTz;  /* No
e430: 74 20 75 73 65 64 20 2a 2f 0a 20 20 67 65 74 74  t used */.  gett
e440: 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
e450: 26 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  &sTz);.  *prNow 
e460: 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
e470: 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
e480: 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  0 + sNow.tv_usec
e490: 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a  /86400000000.0;.
e4a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
e4b0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
e4c0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
e4d0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
e4e0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
e4f0: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
e500: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
e510: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
e520: 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  rn 0;.}..#endif 
e530: 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a        /* OS_UNIX */.