System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7daa1720d46bbc31c6138462b35876650eb1885e:


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 54 68 69 73 20  yet..**.** This 
35d0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
35e0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
35f0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
3600: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
3610: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
3620: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
3630: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
3640: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
3650: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
3660: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
3670: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
3680: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
3690: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
36a0: 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61  E_TEST.int threa
36b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
36c0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a  hersLocks = -1;.
36d0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
36e0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
36f0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3700: 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  = -1;.#endif../*
3710: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
3720: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
3730: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
3740: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
3750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
3760: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
3770: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
3780: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
3790: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
37a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37c0: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
37d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
37e0: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
37f0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
3800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
3810: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
3820: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
3830: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
3840: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
3850: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
3860: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
3870: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
3880: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
3890: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
38a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
38c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
38d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
38e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
38f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
3900: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
3910: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
3920: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
3930: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
3940: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
3950: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
3960: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
3970: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
3980: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
3990: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
39a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
39b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
39c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
39d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
39e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
39f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
3a00: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
3a10: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
3a20: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
3a30: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
3a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
3a50: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
3a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
3a70: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
3a80: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
3a90: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
3aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
3ab0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
3ac0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
3ad0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
3ae0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
3af0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
3b00: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
3b10: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
3b20: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
3b30: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
3b40: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
3b50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3b60: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
3b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
3b80: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
3b90: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
3ba0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
3bb0: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
3bc0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
3bd0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
3be0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
3bf0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
3c00: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
3c10: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
3c20: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
3c30: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
3c40: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
3c50: 73 29 3b 0a 20 20 69 66 28 20 73 20 26 26 20 6f  s);.  if( s && o
3c60: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
3c70: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
3c80: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
3c90: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
3ca0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
3cb0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
3cc0: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
3cd0: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
3ce0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3cf0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
3d00: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
3d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3d20: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
3d30: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3d40: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
3d50: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
3d60: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
3d70: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
3d80: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
3d90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
3da0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
3db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
3dc0: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
3dd0: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
3de0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
3df0: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
3e00: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
3e10: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
3e20: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
3e30: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
3e40: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
3e50: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
3e60: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
3e70: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
3e80: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
3e90: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
3ea0: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
3eb0: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
3ec0: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
3ed0: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
3ee0: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
3ef0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
3f00: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
3f10: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
3f20: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
3f30: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
3f40: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
3f50: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
3f60: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
3f70: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
3f80: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
3f90: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
3fa0: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
3fb0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3fc0: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
3fd0: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
3fe0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
3ff0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
4000: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4010: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
4020: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4030: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
4040: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
4050: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
4060: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
4070: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
4080: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4090: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
40a0: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
40b0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
40c0: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
40d0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
40e0: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
40f0: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
4100: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
4110: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
4120: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
4130: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
4140: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
4150: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 5f 6f  ingBehavior(fd_o
4160: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
4170: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4180: 65 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20  estData d[2];.  
4190: 70 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a  pthread_t t[2];.
41a0: 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f  .  fd = dup(fd_o
41b0: 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  rig);.  if( fd<0
41c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
41d0: 73 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66  set(d, 0, sizeof
41e0: 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20  (d));.  d[0].fd 
41f0: 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63  = fd;.  d[0].loc
4200: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
4210: 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e  CK;.  d[0].lock.
4220: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30  l_len = 1;.  d[0
4230: 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d  ].lock.l_start =
4240: 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e   0;.  d[0].lock.
4250: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
4260: 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b  SET;.  d[1] = d[
4270: 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e  0];.  d[1].lock.
4280: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
4290: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
42a0: 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72  te(&t[0], 0, thr
42b0: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
42c0: 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[0]);.  pthrea
42d0: 64 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20  d_create(&t[1], 
42e0: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
42f0: 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20  Test, &d[1]);.  
4300: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30  pthread_join(t[0
4310: 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64  ], 0);.  pthread
4320: 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a  _join(t[1], 0);.
4330: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74    close(fd);.  t
4340: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
4350: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
4360: 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20   d[0].result==0 
4370: 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d  && d[1].result==
4380: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
4390: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
43a0: 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  DS */../*.** Rel
43b0: 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20  ease a lockInfo 
43c0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
43d0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
43e0: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
43f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4400: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
4410: 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  (struct lockInfo
4420: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65   *pLock){.  asse
4430: 72 74 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  rt( sqlite3OsInM
4440: 75 74 65 78 28 29 20 29 3b 0a 20 20 70 4c 6f 63  utex() );.  pLoc
4450: 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  k->nRef--;.  if(
4460: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20   pLock->nRef==0 
4470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
4480: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61  shInsert(&lockHa
4490: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  sh, &pLock->key,
44a0: 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b   sizeof(pLock->k
44b0: 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ey), 0);.    sql
44c0: 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  iteFree(pLock);.
44d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c    }.}../*.** Rel
44e0: 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73  ease a openCnt s
44f0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
4500: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
4510: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
4520: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4530: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
4540: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
4550: 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  Open){.  assert(
4560: 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
4570: 78 28 29 20 29 3b 0a 20 20 70 4f 70 65 6e 2d 3e  x() );.  pOpen->
4580: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f  nRef--;.  if( pO
4590: 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pen->nRef==0 ){.
45a0: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
45b0: 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c  nsert(&openHash,
45c0: 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69   &pOpen->key, si
45d0: 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29  zeof(pOpen->key)
45e0: 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 70  , 0);.    free(p
45f0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
4600: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4610: 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pOpen);.  }.}../
4620: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
4630: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
4640: 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e  cate lockInfo an
4650: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
4660: 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73  ures that.** des
4670: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
4680: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
4690: 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66  eate new ones if
46a0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
46b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
46c0: 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  s might be unini
46d0: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
46e0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
46f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
4700: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
4710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
4720: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e  ndLockInfo(.  in
4730: 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
4740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4750: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
4760: 72 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  r used in the ke
4770: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f  y */.  struct lo
4780: 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c  ckInfo **ppLock,
4790: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
47a0: 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  e lockInfo struc
47b0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73  ture here */.  s
47c0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a  truct openCnt **
47d0: 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52  ppOpen      /* R
47e0: 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e  eturn the openCn
47f0: 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  t structure here
4800: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
4810: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65  .  struct lockKe
4820: 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74  y key1;.  struct
4830: 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20   openKey key2;. 
4840: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
4850: 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c  tbuf;.  struct l
4860: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a  ockInfo *pLock;.
4870: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
4880: 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20   *pOpen;.  rc = 
4890: 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  fstat(fd, &statb
48a0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
48b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
48c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
48d0: 73 49 6e 4d 75 74 65 78 28 29 20 29 3b 0a 20 20  sInMutex() );.  
48e0: 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c  memset(&key1, 0,
48f0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a   sizeof(key1));.
4900: 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61    key1.dev = sta
4910: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
4920: 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey1.ino = statbu
4930: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65 66  f.st_ino;.#ifdef
4940: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
4950: 45 41 44 53 0a 20 20 69 66 28 20 74 68 72 65 61  EADS.  if( threa
4960: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
4970: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
4980: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
4990: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
49a0: 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64  ;.  }.  key1.tid
49b0: 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69   = threadsOverri
49c0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49d0: 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f  s ? 0 : pthread_
49e0: 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20  self();.#endif. 
49f0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30   memset(&key2, 0
4a00: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
4a10: 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74  .  key2.dev = st
4a20: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20  atbuf.st_dev;.  
4a30: 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62  key2.ino = statb
4a40: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f  uf.st_ino;.  pLo
4a50: 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63  ck = (struct loc
4a60: 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61  kInfo*)sqlite3Ha
4a70: 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68  shFind(&lockHash
4a80: 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28  , &key1, sizeof(
4a90: 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c  key1));.  if( pL
4aa0: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ock==0 ){.    st
4ab0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
4ac0: 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  Old;.    pLock =
4ad0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
4ae0: 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29  ( sizeof(*pLock)
4af0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
4b00: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
4b10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
4b20: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
4b30: 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  fo;.    }.    pL
4b40: 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b  ock->key = key1;
4b50: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66  .    pLock->nRef
4b60: 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = 1;.    pLock-
4b70: 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c  >cnt = 0;.    pL
4b80: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
4b90: 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  0;.    pOld = sq
4ba0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4bb0: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63  &lockHash, &pLoc
4bc0: 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b  k->key, sizeof(k
4bd0: 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20  ey1), pLock);.  
4be0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b    if( pOld!=0 ){
4bf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4c00: 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20  Old==pLock );.  
4c10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4c20: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  Lock);.      rc 
4c30: 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
4c40: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
4c50: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  o;.    }.  }else
4c60: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65  {.    pLock->nRe
4c70: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f  f++;.  }.  *ppLo
4c80: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66  ck = pLock;.  if
4c90: 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20  ( ppOpen!=0 ){. 
4ca0: 20 20 20 70 4f 70 65 6e 20 3d 20 28 73 74 72 75     pOpen = (stru
4cb0: 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69  ct openCnt*)sqli
4cc0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 6f 70 65  te3HashFind(&ope
4cd0: 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c 20 73 69  nHash, &key2, si
4ce0: 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 20  zeof(key2));.   
4cf0: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
4d00: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 6f 70  .      struct op
4d10: 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20  enCnt *pOld;.   
4d20: 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74     pOpen = sqlit
4d30: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
4d40: 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20  of(*pOpen) );.  
4d50: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
4d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
4d70: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63  aseLockInfo(pLoc
4d80: 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  k);.        rc =
4d90: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
4da0: 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e   exit_findlockin
4db0: 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  fo;.      }.    
4dc0: 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b    pOpen->key = k
4dd0: 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ey2;.      pOpen
4de0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
4df0: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d    pOpen->nLock =
4e00: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
4e10: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
4e20: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
4e30: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
4e40: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
4e50: 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61  shInsert(&openHa
4e60: 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c  sh, &pOpen->key,
4e70: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70   sizeof(key2), p
4e80: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
4e90: 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20   pOld!=0 ){.    
4ea0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
4eb0: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
4ec0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f     sqliteFree(pO
4ed0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pen);.        re
4ee0: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
4ef0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
4f00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
4f10: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
4f20: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
4f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4f40: 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Open->nRef++;.  
4f50: 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20    }.    *ppOpen 
4f60: 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78  = pOpen;.  }..ex
4f70: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a  it_findlockinfo:
4f80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4fa0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  EBUG./*.** Helpe
4fb0: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
4fc0: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
4fd0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
4fe0: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
4ff0: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
5000: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
5010: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
5020: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5030: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5040: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
5060: 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63  typeName(int loc
5070: 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68  ktype){.  switch
5080: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
5090: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
50a0: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63  turn "NONE";.  c
50b0: 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a  ase SHARED_LOCK:
50c0: 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22   return "SHARED"
50d0: 3b 0a 20 20 63 61 73 65 20 52 45 53 45 52 56 45  ;.  case RESERVE
50e0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
50f0: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73  RESERVED";.  cas
5100: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20  e PENDING_LOCK: 
5110: 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22  return "PENDING"
5120: 3b 0a 20 20 63 61 73 65 20 45 58 43 4c 55 53 49  ;.  case EXCLUSI
5130: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
5140: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
5150: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
5160: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ";.}.#endif../*.
5170: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
5180: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
5190: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
51a0: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
51b0: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
51c0: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
51d0: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
51e0: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
51f0: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
5200: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
5210: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
5220: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
5230: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
5240: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
5250: 65 6d 73 20 77 68 65 72 65 20 6f 6e 65 20 74 68  ems where one th
5260: 72 65 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  read is.** unabl
5270: 65 20 74 6f 20 6f 76 65 72 72 69 64 65 20 6c 6f  e to override lo
5280: 63 6b 73 20 63 72 65 61 74 65 64 20 62 79 20 61  cks created by a
5290: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
52a0: 64 2e 20 20 52 65 64 48 61 74 39 20 69 73 0a 2a  d.  RedHat9 is.*
52b0: 2a 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20  * an example of 
52c0: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 0a 2a  such a system..*
52d0: 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74  *.** Ownership t
52e0: 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20  ransfer is only 
52f0: 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75  allowed if the u
5300: 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72 72 65  nixFile is curre
5310: 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  ntly unlocked..*
5320: 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c  * If the unixFil
5330: 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20  e is locked and 
5340: 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20  an ownership is 
5350: 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75  wrong, then retu
5360: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  rn.** SQLITE_MIS
5370: 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20  USE.  SQLITE_OK 
5380: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
5390: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e  verything works.
53a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
53b0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73  E_UNIX_THREADS.s
53c0: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66  tatic int transf
53d0: 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78  erOwnership(unix
53e0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
53f0: 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
5400: 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28  d_t hSelf;.  if(
5410: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
5420: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
5430: 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73  ){.    /* Owners
5440: 68 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f  hip transfers no
5450: 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73  t needed on this
5460: 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72   system */.    r
5470: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5480: 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70  .  }.  hSelf = p
5490: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
54a0: 20 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75   if( pthread_equ
54b0: 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68  al(pFile->tid, h
54c0: 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Self) ){.    /* 
54d0: 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  We are still in 
54e0: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20  the same thread 
54f0: 2a 2f 0a 20 20 20 20 54 52 41 43 45 31 28 22 4e  */.    TRACE1("N
5500: 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65  o-transfer, same
5510: 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20   thread\n");.   
5520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5530: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  K;.  }.  if( pFi
5540: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
5550: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
5560: 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65  We cannot change
5570: 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65   ownership while
5580: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
5590: 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72  a lock! */.    r
55a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
55b0: 55 53 45 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  USE;.  }.  TRACE
55c0: 34 28 22 54 72 61 6e 73 66 65 72 20 6f 77 6e 65  4("Transfer owne
55d0: 72 73 68 69 70 20 6f 66 20 25 64 20 66 72 6f 6d  rship of %d from
55e0: 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 20 70 46   %d to %d\n", pF
55f0: 69 6c 65 2d 3e 68 2c 70 46 69 6c 65 2d 3e 74 69  ile->h,pFile->ti
5600: 64 2c 68 53 65 6c 66 29 3b 0a 20 20 70 46 69 6c  d,hSelf);.  pFil
5610: 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66 3b 0a  e->tid = hSelf;.
5620: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
5630: 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b  o(pFile->pLock);
5640: 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b  .  rc = findLock
5650: 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Info(pFile->h, &
5660: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29  pFile->pLock, 0)
5670: 3b 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b  ;.  TRACE5("LOCK
5680: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
5690: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
56a0: 65 2d 3e 68 2c 0a 20 20 20 20 20 6c 6f 63 6b 74  e->h,.     lockt
56b0: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
56c0: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 6c  ocktype),.     l
56d0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
56e0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
56f0: 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  pe), pFile->pLoc
5700: 6b 2d 3e 63 6e 74 29 3b 0a 20 20 72 65 74 75 72  k->cnt);.  retur
5710: 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 20 20  n rc;.}.#else.  
5720: 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72  /* On single-thr
5730: 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77  eaded builds, ow
5740: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
5750: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23   is a no-op */.#
5760: 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72   define transfer
5770: 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c  Ownership(X) SQL
5780: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
5790: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
57a0: 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e  named file.*/.in
57b0: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 44 65 6c  t sqlite3UnixDel
57c0: 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ete(const char *
57d0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 75 6e  zFilename){.  un
57e0: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
57f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5800: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5810: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
5820: 20 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73   named file exis
5830: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
5840: 65 33 55 6e 69 78 46 69 6c 65 45 78 69 73 74 73  e3UnixFileExists
5850: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
5860: 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
5870: 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61  n access(zFilena
5880: 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  me, 0)==0;.}../*
5890: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
58a0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
58b0: 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  nt allocateUnixF
58c0: 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 49  ile(unixFile *pI
58d0: 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  nit, OsFile **pI
58e0: 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  d);../*.** Attem
58f0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
5900: 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  e for both readi
5910: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
5920: 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c   If that.** fail
5930: 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69  s, try opening i
5940: 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66  t read-only.  If
5950: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
5960: 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79  ot exist,.** try
5970: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a   to create it..*
5980: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
5990: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68   a handle for th
59a0: 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77  e open file is w
59b0: 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a  ritten to *id.**
59c0: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
59d0: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74  is set to 0 if t
59e0: 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
59f0: 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61  ed for reading a
5a00: 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72  nd.** writing or
5a10: 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77   1 if the file w
5a20: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  as opened read-o
5a30: 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69  nly.  The functi
5a40: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51  on returns.** SQ
5a50: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f  LITE_OK..**.** O
5a60: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66  n failure, the f
5a70: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5a80: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
5a90: 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69  and leaves.** *i
5aa0: 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  d and *pReadonly
5ab0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
5ac0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
5ad0: 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63  enReadWrite(.  c
5ae0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
5af0: 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a  name,.  OsFile *
5b00: 2a 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65  *pId,.  int *pRe
5b10: 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20  adonly.){.  int 
5b20: 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66  rc;.  unixFile f
5b30: 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f  ;..  CRASH_TEST_
5b40: 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33  OVERRIDE(sqlite3
5b50: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69  CrashOpenReadWri
5b60: 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  te, zFilename, p
5b70: 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29 3b 0a  Id, pReadonly);.
5b80: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49    assert( 0==*pI
5b90: 64 20 29 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d  d );.  f.dirfd =
5ba0: 20 2d 31 3b 0a 20 20 53 45 54 5f 54 48 52 45 41   -1;.  SET_THREA
5bb0: 44 49 44 28 26 66 29 3b 0a 20 20 66 2e 68 20 3d  DID(&f);.  f.h =
5bc0: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
5bd0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c   O_RDWR|O_CREAT|
5be0: 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
5bf0: 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20 20 20  NARY,.          
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
5c20: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
5c30: 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b  ;.  if( f.h<0 ){
5c40: 0a 23 69 66 64 65 66 20 45 49 53 44 49 52 0a 20  .#ifdef EISDIR. 
5c50: 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49     if( errno==EI
5c60: 53 44 49 52 20 29 7b 0a 20 20 20 20 20 20 72 65  SDIR ){.      re
5c70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
5c80: 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  OPEN;.    }.#end
5c90: 69 66 0a 20 20 20 20 66 2e 68 20 3d 20 6f 70 65  if.    f.h = ope
5ca0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
5cb0: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c  DONLY|O_LARGEFIL
5cc0: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 20  E|O_BINARY);.   
5cd0: 20 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20   if( f.h<0 ){.  
5ce0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5cf0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20  E_CANTOPEN; .   
5d00: 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c   }.    *pReadonl
5d10: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
5d20: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
5d30: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
5d40: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
5d50: 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b  .  rc = findLock
5d60: 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70 4c 6f  Info(f.h, &f.pLo
5d70: 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a 20  ck, &f.pOpen);. 
5d80: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
5d90: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
5da0: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 66 2e   ){.    close(f.
5db0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  h);.    return S
5dc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5dd0: 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20  .  f.locktype = 
5de0: 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45  0;.  TRACE3("OPE
5df0: 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
5e00: 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29   f.h, zFilename)
5e10: 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63  ;.  return alloc
5e20: 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66 2c 20  ateUnixFile(&f, 
5e30: 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pId);.}.../*.** 
5e40: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
5e50: 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 65  a new file for e
5e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
5e70: 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
5e80: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77 69 6c  .** The file wil
5e90: 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20  l be opened for 
5ea0: 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
5eb0: 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20 61 76   writing.  To av
5ec0: 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69  oid.** a potenti
5ed0: 61 6c 20 73 65 63 75 72 69 74 79 20 70 72 6f 62  al security prob
5ee0: 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61  lem, we do not a
5ef0: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
5f00: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
5f10: 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 4e 6f  sly existed.  No
5f20: 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68  r do we allow th
5f30: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61 20 73  e file to be a s
5f40: 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e  ymbolic.** link.
5f50: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61  .**.** If delFla
5f60: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
5f70: 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  make arrangement
5f80: 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  s to automatical
5f90: 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65  ly delete.** the
5fa0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
5fb0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   closed..**.** O
5fc0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
5fd0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
5fe0: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
5ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
6000: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
6010: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6020: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
6030: 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e   sqlite3UnixOpen
6040: 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20  Exclusive(const 
6050: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
6060: 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69   OsFile **pId, i
6070: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 69  nt delFlag){.  i
6080: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
6090: 65 20 66 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45  e f;..  CRASH_TE
60a0: 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69  ST_OVERRIDE(sqli
60b0: 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c  te3CrashOpenExcl
60c0: 75 73 69 76 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  usive, zFilename
60d0: 2c 20 70 49 64 2c 20 64 65 6c 46 6c 61 67 29 3b  , pId, delFlag);
60e0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
60f0: 49 64 20 29 3b 0a 20 20 69 66 28 20 61 63 63 65  Id );.  if( acce
6100: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
6110: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6120: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
6130: 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48 52  N;.  }.  SET_THR
6140: 45 41 44 49 44 28 26 66 29 3b 0a 20 20 66 2e 64  EADID(&f);.  f.d
6150: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e 68  irfd = -1;.  f.h
6160: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
6170: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
6180: 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41     O_RDWR|O_CREA
6190: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
61a0: 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  LOW|O_LARGEFILE|
61b0: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
61c0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
61d0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
61e0: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
61f0: 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72  ( f.h<0 ){.    r
6200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6210: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c  TOPEN;.  }.  sql
6220: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
6230: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
6240: 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e  ockInfo(f.h, &f.
6250: 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
6260: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
6270: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
6280: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
6290: 28 66 2e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  (f.h);.    unlin
62a0: 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
62b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
62c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 66 2e 6c  NOMEM;.  }.  f.l
62d0: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 69  ocktype = 0;.  i
62e0: 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
62f0: 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
6300: 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  me);.  }.  TRACE
6310: 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d 33 64 20  3("OPEN-EX %-3d 
6320: 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c  %s\n", f.h, zFil
6330: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
6340: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
6350: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
6360: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
6370: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
6380: 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  for read-only ac
6390: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  cess..**.** On s
63a0: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
63b0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
63c0: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
63d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
63e0: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
63f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6400: 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TOPEN..*/.int sq
6410: 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61  lite3UnixOpenRea
6420: 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72  dOnly(const char
6430: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46   *zFilename, OsF
6440: 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e  ile **pId){.  in
6450: 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65  t rc;.  unixFile
6460: 20 66 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53   f;..  CRASH_TES
6470: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
6480: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f  e3CrashOpenReadO
6490: 6e 6c 79 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  nly, zFilename, 
64a0: 70 49 64 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  pId, 0);.  asser
64b0: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
64c0: 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29  SET_THREADID(&f)
64d0: 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31  ;.  f.dirfd = -1
64e0: 3b 0a 20 20 66 2e 68 20 3d 20 6f 70 65 6e 28 7a  ;.  f.h = open(z
64f0: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  Filename, O_RDON
6500: 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  LY|O_LARGEFILE|O
6510: 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66 28 20  _BINARY);.  if( 
6520: 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  f.h<0 ){.    ret
6530: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6540: 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PEN;.  }.  sqlit
6550: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
6560: 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63  ;.  rc = findLoc
6570: 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70 4c  kInfo(f.h, &f.pL
6580: 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a  ock, &f.pOpen);.
6590: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
65a0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
65b0: 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 66  c ){.    close(f
65c0: 2e 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .h);.    return 
65d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
65e0: 7d 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d  }.  f.locktype =
65f0: 20 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50   0;.  TRACE3("OP
6600: 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22  EN-RO %-3d %s\n"
6610: 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  , f.h, zFilename
6620: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c  );..  return all
6630: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66  ocateUnixFile(&f
6640: 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pId);.}../*.**
6650: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
6660: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
6670: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
6680: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
6690: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
66a0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
66b0: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
66c0: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
66d0: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
66e0: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
66f0: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
6700: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
6710: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
6720: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
6730: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6740: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
6750: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
6760: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
6770: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e  r.** windows sin
6780: 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  ce windows does 
6790: 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64  not support hard
67a0: 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e   links..**.** On
67b0: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
67c0: 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  le for a previou
67d0: 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  sly open file at
67e0: 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70 64 61 74   *id is.** updat
67f0: 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ed with the new 
6800: 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
6810: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 53 51  escriptor and SQ
6820: 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65  LITE_OK is.** re
6830: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  turned..**.** On
6840: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
6850: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
6860: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
6870: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
6880: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
6890: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
68a0: 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20 4f  enDirectory(.  O
68b0: 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63 6f 6e  sFile *id,.  con
68c0: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
68d0: 65 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e.){.  unixFile 
68e0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
68f0: 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
6900: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ile==0 ){.    /*
6910: 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65   Do not open the
6920: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74 68   directory if th
6930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
6940: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  file is not alre
6950: 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e  ady.    ** open.
6960: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
6970: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
6980: 20 20 7d 0a 20 20 53 45 54 5f 54 48 52 45 41 44    }.  SET_THREAD
6990: 49 44 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73  ID(pFile);.  ass
69a0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66  ert( pFile->dirf
69b0: 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  d<0 );.  pFile->
69c0: 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69  dirfd = open(zDi
69d0: 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
69e0: 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
69f0: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
6a00: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
6a10: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6a20: 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  ; .  }.  TRACE3(
6a30: 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
6a40: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
6a50: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
6a60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6a70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
6a80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
6a90: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
6aa0: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
6ab0: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
6ac0: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
6ad0: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
6ae0: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
6af0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
6b00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6b10: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
6b20: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
6b30: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
6b40: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
6b50: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
6b60: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
6b70: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  = 0;../*.** Crea
6b80: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
6b90: 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
6ba0: 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
6bb0: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
6bc0: 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53   hold at least S
6bd0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
6be0: 49 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a  IZE characters..
6bf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
6c00: 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63  ixTempFileName(c
6c10: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
6c20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6c30: 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
6c40: 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
6c50: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
6c60: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
6c70: 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
6c80: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
6c90: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6ca0: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
6cb0: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
6cc0: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
6cd0: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
6ce0: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
6cf0: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
6d00: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
6d10: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
6d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
6d30: 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72  r = ".";.  azDir
6d40: 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
6d50: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
6d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
6d70: 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
6d80: 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
6d90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
6da0: 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
6db0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
6dc0: 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
6dd0: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
6de0: 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
6df0: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
6e00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
6e10: 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
6e20: 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
6e30: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
6e40: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
6e50: 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20  ak;.  }.  do{.  
6e60: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6e70: 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50  "%s/"TEMP_FILE_P
6e80: 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
6e90: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
6ea0: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  f);.    sqlite3R
6eb0: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
6ec0: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
6ed0: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
6ee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
6ef0: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
6f00: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
6f10: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
6f20: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
6f30: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
6f40: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
6f50: 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
6f60: 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
6f70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
6f80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
6f90: 61 74 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e  at a given pathn
6fa0: 61 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f  ame is a directo
6fb0: 72 79 20 61 6e 64 20 69 73 20 77 72 69 74 61 62  ry and is writab
6fc0: 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  le .**.*/.int sq
6fd0: 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72 57 72  lite3UnixIsDirWr
6fe0: 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75  itable(char *zBu
6ff0: 66 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f){.#ifndef SQLI
7000: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
7010: 41 47 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73  AGMAS.  struct s
7020: 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a  tat buf;.  if( z
7030: 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
7040: 30 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d  0;.  if( zBuf[0]
7050: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7060: 20 20 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c    if( stat(zBuf,
7070: 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
7080: 30 3b 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49  0;.  if( !S_ISDI
7090: 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
70a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
70b0: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37   access(zBuf, 07
70c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
70d0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
70e0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
70f0: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  S */.  return 1;
7100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
7110: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
7120: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
7130: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7140: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
7150: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
7160: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
7170: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
7180: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
7190: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
71a0: 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c  t unixRead(OsFil
71b0: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
71c0: 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69  f, int amt){.  i
71d0: 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
71e0: 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61  ( id );.  Simula
71f0: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
7200: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45 52  _IOERR);.  TIMER
7210: 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20  _START;.  got = 
7220: 72 65 61 64 28 28 28 75 6e 69 78 46 69 6c 65 2a  read(((unixFile*
7230: 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61  )id)->h, pBuf, a
7240: 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44  mt);.  TIMER_END
7250: 3b 0a 20 20 54 52 41 43 45 35 28 22 52 45 41 44  ;.  TRACE5("READ
7260: 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 64      %-3d %5d %7d
7270: 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46 69   %d\n", ((unixFi
7280: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67 6f 74 2c  le*)id)->h, got,
7290: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f  .          last_
72a0: 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50  page, TIMER_ELAP
72b0: 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  SED);.  SEEK(0);
72c0: 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74 3c 30 20  .  /* if( got<0 
72d0: 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  ) got = 0; */.  
72e0: 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
72f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7300: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
7310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7320: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _IOERR;.  }.}../
7330: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
7340: 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
7350: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
7360: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
7370: 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
7380: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
7390: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
73a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
73b0: 69 78 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a  ixWrite(OsFile *
73c0: 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  id, const void *
73d0: 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a  pBuf, int amt){.
73e0: 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
73f0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
7400: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
7410: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
7420: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
7430: 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  RR);.  SimulateD
7440: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20  iskfullError;.  
7450: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 77  TIMER_START;.  w
7460: 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
7470: 77 72 6f 74 65 20 3d 20 77 72 69 74 65 28 28 28  wrote = write(((
7480: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
7490: 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
74a0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
74b0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
74c0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
74d0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d  rote];.  }.  TIM
74e0: 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35  ER_END;.  TRACE5
74f0: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
7500: 35 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 28 28  5d %7d %d\n", ((
7510: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
7520: 2c 20 77 72 6f 74 65 2c 0a 20 20 20 20 20 20 20  , wrote,.       
7530: 20 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49     last_page, TI
7540: 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
7550: 53 45 45 4b 28 30 29 3b 0a 20 20 69 66 28 20 61  SEEK(0);.  if( a
7560: 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
7570: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
7580: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7590: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
75a0: 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77   Move the read/w
75b0: 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rite pointer in 
75c0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
75d0: 63 20 69 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f  c int unixSeek(O
75e0: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  sFile *id, i64 o
75f0: 66 66 73 65 74 29 7b 0a 20 20 61 73 73 65 72 74  ffset){.  assert
7600: 28 20 69 64 20 29 3b 0a 20 20 53 45 45 4b 28 6f  ( id );.  SEEK(o
7610: 66 66 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b  ffset/1024 + 1);
7620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7630: 45 53 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74  EST.  if( offset
7640: 20 29 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66   ) SimulateDiskf
7650: 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64 69 66 0a  ullError.#endif.
7660: 20 20 6c 73 65 65 6b 28 28 28 75 6e 69 78 46 69    lseek(((unixFi
7670: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73  le*)id)->h, offs
7680: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
7690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
76a0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
76b0: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
76c0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
76d0: 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
76e0: 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
76f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
7700: 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
7710: 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
7720: 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
7730: 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
7740: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7750: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
7760: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
7770: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
7780: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
7790: 73 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63  se the fdatasync
77a0: 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74  () API only if t
77b0: 68 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e  he HAVE_FDATASYN
77c0: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
77d0: 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
77e0: 20 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20   use fsync() in 
77f0: 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69  its place..*/.#i
7800: 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41  fndef HAVE_FDATA
7810: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64  SYNC.# define fd
7820: 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
7830: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
7840: 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
7850: 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
7860: 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
7870: 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
7880: 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
7890: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
78a0: 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
78b0: 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
78c0: 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
78d0: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
78e0: 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
78f0: 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
7900: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
7910: 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
7920: 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
7930: 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
7940: 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
7950: 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
7960: 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
7970: 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
7980: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
7990: 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
79a0: 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
79b0: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
79c0: 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
79d0: 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
79e0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
79f0: 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
7a00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7a10: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7a20: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
7a30: 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
7a40: 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
7a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
7a60: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
7a70: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
7a80: 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
7a90: 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
7aa0: 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
7ab0: 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
7ac0: 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
7ad0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
7ae0: 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
7af0: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
7b00: 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
7b10: 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
7b20: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
7b30: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
7b40: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
7b50: 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
7b60: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
7b70: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
7b80: 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
7b90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
7ba0: 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
7bb0: 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
7bc0: 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
7bd0: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
7be0: 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
7bf0: 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 64 65  OK;.#else..#ifde
7c00: 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  f F_FULLFSYNC.  
7c10: 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
7c20: 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66      rc = fcntl(f
7c30: 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
7c40: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
7c50: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
7c60: 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 53 59 4e  * If the FULLSYN
7c70: 43 20 66 61 69 6c 65 64 2c 20 74 72 79 20 74 6f  C failed, try to
7c80: 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
7c90: 6e 63 28 29 20 2a 2f 0a 20 20 69 66 28 20 72 63  nc() */.  if( rc
7ca0: 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
7cb0: 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  );..#else /* if 
7cc0: 21 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c 53  !defined(F_FULLS
7cd0: 59 4e 43 29 20 2a 2f 0a 20 20 69 66 28 20 64 61  YNC) */.  if( da
7ce0: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
7cf0: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
7d00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7d10: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
7d20: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
7d30: 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e 43  ined(F_FULLFSYNC
7d40: 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ) */.#endif /* d
7d50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
7d60: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
7d70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7d80: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
7d90: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
7da0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
7db0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
7dc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
7dd0: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
7de0: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
7df0: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
7e00: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
7e10: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
7e20: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
7e30: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
7e40: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
7e50: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
7e60: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
7e70: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
7e80: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
7e90: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
7ea0: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
7eb0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
7ec0: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
7ed0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
7ee0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
7ef0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
7f00: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
7f10: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
7f20: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
7f30: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
7f40: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
7f50: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
7f60: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
7f70: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
7f80: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
7f90: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
7fa0: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
7fb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
7fc0: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
7fd0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7fe0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
7ff0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
8000: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
8010: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
8020: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
8030: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
8040: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
8050: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
8060: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
8070: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
8080: 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 75 6e   dataOnly){.  un
8090: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
80a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
80b0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
80c0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
80d0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
80e0: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e  );.  TRACE2("SYN
80f0: 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
8100: 69 6c 65 2d 3e 68 29 3b 0a 20 20 69 66 28 20 66  ile->h);.  if( f
8110: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
8120: 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  >h, pFile->fullS
8130: 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 20 29  ync, dataOnly) )
8140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8150: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20  ITE_IOERR;.  }. 
8160: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
8170: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43  d>=0 ){.    TRAC
8180: 45 32 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E2("DIRSYNC %-3d
8190: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
81a0: 64 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d);.#ifndef SQLI
81b0: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
81c0: 4e 43 0a 20 20 20 20 69 66 28 20 66 75 6c 6c 5f  NC.    if( full_
81d0: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
81e0: 66 64 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  fd, pFile->fullS
81f0: 79 6e 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ync, 0) ){.     
8200: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8210: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 23 65  _IOERR;.    }.#e
8220: 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73 65 28 70  ndif.    close(p
8230: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 20 2f  File->dirfd);  /
8240: 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  * Only need to s
8250: 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f  ync once, so clo
8260: 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  se the directory
8270: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   */.    pFile->d
8280: 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  irfd = -1;    /*
8290: 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
82a0: 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  e. */.  }.  retu
82b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
82c0: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
82d0: 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61  directory zDirna
82e0: 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  me. This is a no
82f0: 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67  -op on operating
8300: 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a   systems other.*
8310: 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2a 0a  * than UNIX..**.
8320: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
8330: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
8340: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8350: 66 69 6c 65 20 68 61 73 20 74 72 75 65 6c 79 20  file has truely 
8360: 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 2a 2a 20  been deleted.** 
8370: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 63 68  before making ch
8380: 61 6e 67 65 73 20 74 6f 20 69 6e 64 69 76 69 64  anges to individ
8390: 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 6f 6e 20  ual journals on 
83a0: 61 20 6d 75 6c 74 69 2d 64 61 74 61 62 61 73 65  a multi-database
83b0: 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54 68 65 20   commit..** The 
83c0: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f 70 74 69  F_FULLFSYNC opti
83d0: 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  on is not needed
83e0: 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   here..*/.int sq
83f0: 6c 69 74 65 33 55 6e 69 78 53 79 6e 63 44 69 72  lite3UnixSyncDir
8400: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
8410: 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 23 69  r *zDirname){.#i
8420: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
8430: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 72 65  BLE_DIRSYNC.  re
8440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8450: 23 65 6c 73 65 0a 20 20 69 6e 74 20 66 64 3b 0a  #else.  int fd;.
8460: 20 20 69 6e 74 20 72 3b 0a 20 20 53 69 6d 75 6c    int r;.  Simul
8470: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
8480: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66 64 20 3d  E_IOERR);.  fd =
8490: 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20   open(zDirname, 
84a0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
84b0: 59 2c 20 30 29 3b 0a 20 20 54 52 41 43 45 33 28  Y, 0);.  TRACE3(
84c0: 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 25  "DIRSYNC %-3d (%
84d0: 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  s)\n", fd, zDirn
84e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ame);.  if( fd<0
84f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8500: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
8510: 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63  .  }.  r = fsync
8520: 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64  (fd);.  close(fd
8530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 3d  );.  return ((r=
8540: 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51  =0)?SQLITE_OK:SQ
8550: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 23 65 6e  LITE_IOERR);.#en
8560: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  dif.}../*.** Tru
8570: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
8580: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
8590: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
85a0: 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
85b0: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
85c0: 34 20 6e 42 79 74 65 29 7b 0a 20 20 61 73 73 65  4 nByte){.  asse
85d0: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
85e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
85f0: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 72 65 74  TE_IOERR);.  ret
8600: 75 72 6e 20 66 74 72 75 6e 63 61 74 65 28 28 28  urn ftruncate(((
8610: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
8620: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
8630: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
8640: 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _IOERR;.}../*.**
8650: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
8660: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
8670: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
8680: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8690: 78 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65  xFileSize(OsFile
86a0: 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
86b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
86c0: 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
86d0: 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  id );.  Simulate
86e0: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
86f0: 4f 45 52 52 29 3b 0a 20 20 69 66 28 20 66 73 74  OERR);.  if( fst
8700: 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
8710: 64 29 2d 3e 68 2c 20 26 62 75 66 29 21 3d 30 20  d)->h, &buf)!=0 
8720: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8730: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
8740: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
8750: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
8760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8770: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8780: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
8790: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
87a0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
87b0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
87c0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
87d0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
87e0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
87f0: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
8800: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ** non-zero.  If
8810: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
8820: 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f  ocked or holds o
8830: 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  nly SHARED locks
8840: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
8850: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
8860: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
8870: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
8880: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
8890: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
88a0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
88b0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
88c0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 73 71  t( pFile );.  sq
88d0: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
88e0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
88f0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
8900: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
8910: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
8920: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
8930: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
8940: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
8950: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
8960: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
8970: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
8980: 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d  {.    r = 1;.  }
8990: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
89a0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
89b0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
89c0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
89d0: 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  !r ){.    struct
89e0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
89f0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
8a00: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
8a10: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
8a20: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
8a30: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
8a40: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
8a50: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
8a60: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
8a70: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_GETLK, &lock);
8a80: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  .    if( lock.l_
8a90: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
8aa0: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
8ab0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
8ac0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
8ad0: 28 29 3b 0a 20 20 54 52 41 43 45 33 28 22 54 45  ();.  TRACE3("TE
8ae0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
8af0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
8b00: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a  );..  return r;.
8b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
8b20: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
8b30: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
8b40: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
8b50: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
8b60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
8b70: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
8b80: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
8b90: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
8ba0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
8bb0: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
8bc0: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
8bd0: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
8be0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
8bf0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
8c00: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
8c10: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
8c20: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
8c30: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
8c40: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
8c50: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
8c60: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
8c70: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
8c80: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
8c90: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
8ca0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
8cb0: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
8cc0: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
8cd0: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
8ce0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
8cf0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
8d00: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
8d10: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
8d20: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
8d30: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
8d40: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
8d50: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
8d60: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
8d70: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
8d80: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
8d90: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
8da0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
8db0: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
8dc0: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
8dd0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
8de0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
8df0: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
8e00: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
8e10: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
8e20: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
8e30: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
8e40: 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65   unixLock(OsFile
8e50: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
8e60: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
8e70: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
8e80: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
8e90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
8ea0: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
8eb0: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
8ec0: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
8ed0: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
8ee0: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
8ef0: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
8f00: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
8f10: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
8f20: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
8f30: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
8f40: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
8f50: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
8f60: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
8f70: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
8f80: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
8f90: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
8fa0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
8fb0: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
8fc0: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
8fd0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
8fe0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
8ff0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
9000: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
9010: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
9020: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
9030: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
9040: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
9050: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
9060: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
9070: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
9080: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
9090: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
90a0: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
90b0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
90c0: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
90d0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
90e0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
90f0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
9100: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
9110: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
9120: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
9130: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
9140: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
9150: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
9160: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
9170: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
9180: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
9190: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
91a0: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
91b0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
91c0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
91d0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
91e0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
91f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
9200: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
9210: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
9220: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
9230: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
9240: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
9250: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
9260: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
9270: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
9280: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
9290: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
92a0: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
92b0: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
92c0: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
92d0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
92e0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
92f0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
9300: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
9310: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
9320: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
9330: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
9340: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
9350: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
9360: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
9370: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
9380: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
9390: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
93a0: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
93b0: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
93c0: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
93d0: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
93e0: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
93f0: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
9400: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
9410: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
9420: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
9430: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
9440: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
9450: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
9460: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
9470: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
9480: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
9490: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
94a0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
94b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
94c0: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
94d0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
94e0: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
94f0: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
9500: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
9510: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
9520: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
9530: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
9540: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
9550: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
9560: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
9570: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
9580: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
9590: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
95a0: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
95b0: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
95c0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
95d0: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
95e0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
95f0: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
9600: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
9610: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
9620: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
9630: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
9640: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
9650: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
9660: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
9670: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
9680: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
9690: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
96a0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
96b0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
96c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
96d0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72  xFile*)id;.  str
96e0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
96f0: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
9700: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
9710: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73  ck lock;.  int s
9720: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
9730: 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22  le );.  TRACE7("
9740: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
9750: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
9760: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
9770: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
9780: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
9790: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
97a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
97b0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
97c0: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
97d0: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
97e0: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
97f0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
9800: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
9810: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
9820: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
9830: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
9840: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
9850: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
9860: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
9870: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
9880: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
9890: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
98a0: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
98b0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
98c0: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
98d0: 20 20 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20    TRACE3("LOCK  
98e0: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
98f0: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
9900: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
9910: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9920: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
9930: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9940: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
9950: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
9960: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
9970: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
9980: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
9990: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
99a0: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
99b0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
99c0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
99d0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
99e0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
99f0: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
9a00: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
9a10: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9a20: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
9a30: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
9a40: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
9a50: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
9a60: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
9a70: 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  /.  sqlite3OsEnt
9a80: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
9a90: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9aa0: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
9ab0: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
9ac0: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
9ad0: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
9ae0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9af0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
9b00: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
9b10: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
9b20: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
9b30: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
9b40: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
9b50: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
9b60: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
9b70: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
9b80: 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  OsFile*.  ** han
9b90: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
9ba0: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
9bb0: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
9bc0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
9bd0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
9be0: 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
9bf0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
9c00: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
9c10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
9c20: 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44   locktype>SHARED
9c30: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
9c40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
9c50: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
9c60: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
9c70: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
9c80: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
9c90: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
9ca0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
9cb0: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
9cc0: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
9cd0: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
9ce0: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
9cf0: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
9d00: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9d10: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
9d20: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9d30: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
9d40: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
9d50: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
9d60: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
9d70: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
9d80: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9d90: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9da0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
9db0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
9dc0: 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  type==0 );.    a
9dd0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
9de0: 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  t>0 );.    pFile
9df0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
9e00: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  RED_LOCK;.    pL
9e10: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
9e20: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
9e30: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
9e40: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
9e50: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
9e60: 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  ;..  lock.l_when
9e70: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a  ce = SEEK_SET;..
9e80: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
9e90: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
9ea0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
9eb0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
9ec0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
9ed0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
9ee0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
9ef0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
9f00: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
9f10: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
9f20: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
9f30: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9f40: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
9f50: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
9f60: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
9f70: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
9f80: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
9f90: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9fa0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
9fb0: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
9fc0: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
9fd0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
9fe0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
9ff0: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
a000: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a010: 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a  );.    if( s ){.
a020: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
a030: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
a040: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
a050: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
a060: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
a070: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
a080: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
a090: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
a0a0: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
a0b0: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
a0c0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
a0d0: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
a0e0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
a0f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
a100: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a110: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
a120: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20  ( pLock->cnt==0 
a130: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a140: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
a150: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  0 );..    /* Now
a160: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
a170: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
a180: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
a190: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
a1a0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a1b0: 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  IZE;.    s = fcn
a1c0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a1d0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20  ETLK, &lock);.. 
a1e0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
a1f0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
a200: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
a210: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
a220: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
a230: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
a240: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a250: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
a260: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
a270: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a280: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )!=0 ){.      rc
a290: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
a2a0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
a2b0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
a2c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
a2d0: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lock;.    }.    
a2e0: 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72  if( s ){.      r
a2f0: 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56  c = (errno==EINV
a300: 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c  AL) ? SQLITE_NOL
a310: 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  FS : SQLITE_BUSY
a320: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a330: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a340: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a350: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
a360: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a370: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
a380: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
a390: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
a3a0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a3b0: 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20  && pLock->cnt>1 
a3c0: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
a3d0: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
a3e0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
a3f0: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
a400: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
a410: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
a420: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
a430: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
a440: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a450: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
a460: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
a470: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
a480: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
a490: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
a4a0: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
a4b0: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
a4c0: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
a4d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
a4e0: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
a4f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
a500: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
a510: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f  cktype );.    lo
a520: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
a530: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
a540: 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20   locktype ){.   
a550: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
a560: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
a570: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a580: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a5a0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
a5b0: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
a5c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a5d0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a5e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a5f0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
a600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a610: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
a620: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
a630: 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e     }.    s = fcn
a640: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a650: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
a660: 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20    if( s ){.     
a670: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
a680: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
a690: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
a6a0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
a6b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
a6c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
a6d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
a6e0: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
a6f0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
a700: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
a710: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
a720: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
a730: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a740: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
a750: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
a760: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a770: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
a780: 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33  _lock:.  sqlite3
a790: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
a7a0: 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20    TRACE4("LOCK  
a7b0: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
a7c0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
a7d0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
a7e0: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
a7f0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
a800: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
a810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a820: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
a830: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
a840: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
a850: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
a860: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
a870: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
a880: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
a890: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
a8a0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
a8b0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a8c0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
a8d0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
a8e0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
a8f0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
a900: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
a910: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a920: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46  t unixUnlock(OsF
a930: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a940: 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74  ktype){.  struct
a950: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
a960: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
a970: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
a980: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
a990: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a9a0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a9b0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
a9c0: 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 55 4e   );.  TRACE7("UN
a9d0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
a9e0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
a9f0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
aa00: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70  ocktype,.      p
aa10: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
aa20: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
aa30: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
aa40: 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69  Lock->cnt, getpi
aa50: 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  d());..  assert(
aa60: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
aa70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
aa80: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
aa90: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
aaa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
aab0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45  K;.  }.  if( CHE
aac0: 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c  CK_THREADID(pFil
aad0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
aae0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
aaf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45    }.  sqlite3OsE
ab00: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
ab10: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
ab20: 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ock;.  assert( p
ab30: 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a  Lock->cnt!=0 );.
ab40: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ab50: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
ab60: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
ab70: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
ab80: 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ==pFile->locktyp
ab90: 65 20 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  e );.    if( loc
aba0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
abb0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
abc0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
abd0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
abe0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
abf0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
ac00: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ac10: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
ac20: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ac30: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
ac40: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
ac50: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
ac60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
ac70: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
ac80: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
ac90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
aca0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a  _IOERR;.      }.
acb0: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
acc0: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
acd0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
ace0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
acf0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ad00: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
ad10: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ad20: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
ad30: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
ad40: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
ad50: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
ad60: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
ad70: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
ad80: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
ad90: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
ada0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
adb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
adc0: 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73  OERR;  /* This s
add0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
ade0: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  en */.    }.  }.
adf0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ae00: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
ae10: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
ae20: 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  Open;..    /* De
ae30: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
ae40: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
ae50: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
ae60: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
ae70: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
ae80: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
ae90: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
aea0: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
aeb0: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
aec0: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
aed0: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
aee0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74    if( pLock->cnt
aef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
af00: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
af10: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
af20: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
af30: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
af40: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
af50: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
af60: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
af70: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
af80: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
af90: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
afa0: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  e = NO_LOCK;.   
afb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
afc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
afd0: 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  ERR;  /* This sh
afe0: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
aff0: 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
b000: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
b010: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
b020: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
b030: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
b040: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
b050: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
b060: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
b070: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
b080: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
b090: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
b0a0: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
b0b0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
b0c0: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
b0d0: 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
b0e0: 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e  pen;.    pOpen->
b0f0: 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
b100: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
b110: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
b120: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
b130: 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  && pOpen->nPendi
b140: 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ng>0 ){.      in
b150: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
b160: 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65  =0; i<pOpen->nPe
b170: 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nding; i++){.   
b180: 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e       close(pOpen
b190: 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a  ->aPending[i]);.
b1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
b1b0: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
b1c0: 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ng);.      pOpen
b1d0: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
b1e0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b1f0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d  nding = 0;.    }
b200: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
b210: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
b220: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b230: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
b240: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b250: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
b260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b270: 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a  ixClose(OsFile *
b280: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
b290: 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c  e *id = (unixFil
b2a0: 65 2a 29 2a 70 49 64 3b 0a 20 20 69 6e 74 20 72  e*)*pId;.  int r
b2b0: 63 3b 0a 0a 20 20 69 66 28 20 21 69 64 20 29 20  c;..  if( !id ) 
b2c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b2d0: 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 2a  ;.  unixUnlock(*
b2e0: 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  pId, NO_LOCK);. 
b2f0: 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
b300: 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
b310: 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
b320: 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
b330: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
b340: 0a 0a 20 20 69 66 28 20 69 64 2d 3e 70 4f 70 65  ..  if( id->pOpe
b350: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
b360: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
b370: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
b380: 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
b390: 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
b3a0: 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
b3b0: 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
b3c0: 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
b3d0: 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
b3e0: 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
b3f0: 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
b400: 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64   to pOpen->aPend
b410: 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
b420: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
b430: 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  losed when.    *
b440: 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
b450: 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
b460: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77  */.    int *aNew
b470: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65  ;.    struct ope
b480: 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 69 64  nCnt *pOpen = id
b490: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65  ->pOpen;.    aNe
b4a0: 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70  w = realloc( pOp
b4b0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70  en->aPending, (p
b4c0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31  Open->nPending+1
b4d0: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  )*sizeof(int) );
b4e0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
b4f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b500: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20  a malloc fails, 
b510: 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69  just leak the fi
b520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
b530: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b540: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
b550: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  g = aNew;.      
b560: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
b570: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d  pOpen->nPending]
b580: 20 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20 20 20   = id->h;.      
b590: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b  pOpen->nPending+
b5a0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  +;.    }.  }else
b5b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
b5c0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
b5d0: 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61  g locks so we ca
b5e0: 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  n close the file
b5f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
b600: 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29      close(id->h)
b610: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c  ;.  }.  releaseL
b620: 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63  ockInfo(id->pLoc
b630: 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65  k);.  releaseOpe
b640: 6e 43 6e 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b  nCnt(id->pOpen);
b650: 0a 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ..  sqlite3OsLea
b660: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d  veMutex();.  id-
b670: 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54  >isOpen = 0;.  T
b680: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
b690: 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a  -3d\n", id->h);.
b6a0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
b6b0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
b6c0: 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b  id);.  *pId = 0;
b6d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b6e0: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
b6f0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
b700: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
b710: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
b720: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
b730: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
b740: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
b750: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
b760: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
b770: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
b780: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
b790: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
b7a0: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
b7b0: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
b7c0: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
b7d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  har *sqlite3Unix
b7e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
b7f0: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
b800: 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ve){.  char *zFu
b810: 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52  ll = 0;.  if( zR
b820: 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
b830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
b840: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
b850: 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72  zRelative, (char
b860: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
b870: 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20     char *zBuf = 
b880: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30  sqliteMalloc(500
b890: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
b8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
b8b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
b8c0: 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
b8d0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
b8e0: 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77  ng(&zFull, getcw
b8f0: 64 28 7a 42 75 66 2c 20 35 30 30 30 29 2c 20 22  d(zBuf, 5000), "
b900: 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20  /", zRelative,. 
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
b930: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 75    sqliteFree(zBu
b940: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
b950: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
b960: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
b970: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e  e of the fullsyn
b980: 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69  c flag in the gi
b990: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b9a0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b9b0: 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  oid unixSetFullS
b9c0: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ync(OsFile *id, 
b9d0: 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78  int v){.  ((unix
b9e0: 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53  File*)id)->fullS
b9f0: 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = v;.}../*.*
ba00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64  * Return the und
ba10: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
ba20: 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c  dle for an OsFil
ba30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
ba40: 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f  unixFileHandle(O
ba50: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
ba60: 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a  turn ((unixFile*
ba70: 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  )id)->h;.}../*.*
ba80: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
ba90: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
baa0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
bab0: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
bac0: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
bad0: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
bae0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
baf0: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
bb00: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
bb10: 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  kState(OsFile *i
bb20: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  d){.  return ((u
bb30: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
bb40: 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cktype;.}../*.**
bb50: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
bb60: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
bb70: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
bb80: 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
bb90: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a  le.** for unix..
bba0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
bbb0: 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
bbc0: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
bbd0: 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  .  unixClose,.  
bbe0: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
bbf0: 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  y,.  unixRead,. 
bc00: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
bc10: 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72  ixSeek,.  unixTr
bc20: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
bc30: 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c  nc,.  unixSetFul
bc40: 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c  lSync,.  unixFil
bc50: 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46  eHandle,.  unixF
bc60: 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c  ileSize,.  unixL
bc70: 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  ock,.  unixUnloc
bc80: 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  k,.  unixLockSta
bc90: 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52  te,.  unixCheckR
bca0: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
bcb0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
bcc0: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e 69  memory for a uni
bcd0: 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69  xFile.  Initiali
bce0: 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  ze the new unixF
bcf0: 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  ile.** to the va
bd00: 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49 6e  lue given in pIn
bd10: 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  it and return a 
bd20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
bd30: 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49  ew.** OsFile.  I
bd40: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
bd50: 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68  memory, close th
bd60: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  e file and retur
bd70: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
bd80: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
bd90: 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
bda0: 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a  *pInit, OsFile *
bdb0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
bdc0: 65 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  e *pNew;.  pNew 
bdd0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
bde0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bdf0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
be00: 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 70  0 ){.    close(p
be10: 49 6e 69 74 2d 3e 68 29 3b 0a 20 20 20 20 73 71  Init->h);.    sq
be20: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
be30: 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
be40: 4c 6f 63 6b 49 6e 66 6f 28 70 49 6e 69 74 2d 3e  LockInfo(pInit->
be50: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65  pLock);.    rele
be60: 61 73 65 4f 70 65 6e 43 6e 74 28 70 49 6e 69 74  aseOpenCnt(pInit
be70: 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  ->pOpen);.    sq
be80: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
be90: 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  x();.    *pId = 
bea0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
beb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
bec0: 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d  lse{.    *pNew =
bed0: 20 2a 70 49 6e 69 74 3b 0a 20 20 20 20 70 4e 65   *pInit;.    pNe
bee0: 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
bef0: 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f  lite3UnixIoMetho
bf00: 64 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f  d;.    *pId = (O
bf10: 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20  sFile*)pNew;.   
bf20: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
bf30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bf40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ITE_OK;.  }.}...
bf50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bf60: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.
bf70: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
bf80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
bfc0: 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65  Everything above
bfd0: 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65   deals with file
bfe0: 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e   I/O.  Everythin
bff0: 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  g that follows d
c000: 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68  eals.** with oth
c010: 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  er miscellanous 
c020: 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f  aspects of the o
c030: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c040: 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a  interface.******
c050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c090: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ******/.../*.** 
c0a0: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
c0b0: 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
c0c0: 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
c0d0: 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
c0e0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
c0f0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
c100: 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
c110: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
c120: 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
c130: 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
c140: 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
c150: 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64   sqlite3UnixRand
c160: 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
c170: 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
c180: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
c190: 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
c1a0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
c1b0: 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
c1c0: 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
c1d0: 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
c1e0: 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
c1f0: 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
c200: 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
c210: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
c220: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
c230: 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
c240: 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
c250: 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
c260: 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
c270: 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
c280: 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
c290: 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
c2a0: 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
c2b0: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
c2c0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
c2d0: 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
c2e0: 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
c2f0: 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
c300: 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
c310: 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
c320: 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
c330: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
c340: 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
c350: 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
c360: 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
c370: 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
c380: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
c390: 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
c3a0: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
c3b0: 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
c3c0: 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
c3d0: 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
c3e0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
c3f0: 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69  Buf, 0, 256);.#i
c400: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c410: 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
c420: 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
c430: 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
c440: 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
c450: 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
c460: 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
c470: 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
c480: 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
c490: 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
c4a0: 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
c4b0: 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
c4c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
c4d0: 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  f[sizeof(time_t)
c4e0: 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
c4f0: 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
c500: 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
c510: 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20   zBuf, 256);.   
c520: 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
c530: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
c540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c550: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
c560: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
c570: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
c580: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
c590: 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
c5a0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
c5b0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
c5c0: 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
c5d0: 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74 20 73   sleep..*/.int s
c5e0: 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28  qlite3UnixSleep(
c5f0: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66  int ms){.#if def
c600: 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
c610: 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
c620: 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30  .  usleep(ms*100
c630: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  0);.  return ms;
c640: 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28  .#else.  sleep((
c650: 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ms+999)/1000);. 
c660: 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d   return 1000*((m
c670: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65  s+999)/1000);.#e
c680: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  ndif.}../*.** St
c690: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
c6a0: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
c6b0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
c6c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
c6d0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
c6e0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
c6f0: 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68 72  EADS.static pthr
c700: 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65  ead_mutex_t mute
c710: 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45  x = PTHREAD_MUTE
c720: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23  X_INITIALIZER;.#
c730: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
c740: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20   following pair 
c750: 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  of routine imple
c760: 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c  ment mutual excl
c770: 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c  usion for.** mul
c780: 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63  ti-threaded proc
c790: 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73  esses.  Only a s
c7a0: 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20  ingle thread is 
c7b0: 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78  allowed to.** ex
c7c0: 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74  ecuted code that
c7d0: 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62   is surrounded b
c7e0: 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61  y EnterMutex() a
c7f0: 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e  nd LeaveMutex().
c800: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
c810: 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  es only a single
c820: 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69   Mutex.  There i
c830: 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69  s not much criti
c840: 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20  cal.** code and 
c850: 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72  what little ther
c860: 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75  e is executes qu
c870: 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75  ickly and withou
c880: 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  t blocking..**.*
c890: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
c8a0: 6e 6f 74 20 72 65 63 75 72 73 69 76 65 2e 0a 2a  not recursive..*
c8b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
c8c0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a  ixEnterMutex(){.
c8d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
c8e0: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
c8f0: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
c900: 26 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a  &mutex);.#endif.
c910: 20 20 61 73 73 65 72 74 28 20 21 69 6e 4d 75 74    assert( !inMut
c920: 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20  ex );.  inMutex 
c930: 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  = 1;.}.void sqli
c940: 74 65 33 55 6e 69 78 4c 65 61 76 65 4d 75 74 65  te3UnixLeaveMute
c950: 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  x(){.  assert( i
c960: 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75  nMutex );.  inMu
c970: 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  tex = 0;.#ifdef 
c980: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
c990: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  ADS.  pthread_mu
c9a0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
c9b0: 78 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  x);.#endif.}../*
c9c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
c9d0: 69 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  if we are curren
c9e0: 74 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 6d  tly within the m
c9f0: 75 74 65 78 20 61 6e 64 20 46 41 4c 53 45 20 69  utex and FALSE i
ca00: 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  f not..*/.int sq
ca10: 6c 69 74 65 33 55 6e 69 78 49 6e 4d 75 74 65 78  lite3UnixInMutex
ca20: 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d  (){.  return inM
ca30: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  utex;.}../*.** R
ca40: 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d 62  emember the numb
ca50: 65 72 20 6f 66 20 74 68 72 65 61 64 2d 73 70 65  er of thread-spe
ca60: 63 69 66 69 63 2d 64 61 74 61 20 62 6c 6f 63 6b  cific-data block
ca70: 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20  s allocated..** 
ca80: 55 73 65 20 74 68 69 73 20 74 6f 20 76 65 72 69  Use this to veri
ca90: 66 79 20 74 68 61 74 20 77 65 20 61 72 65 20 6e  fy that we are n
caa0: 6f 74 20 6c 65 61 6b 69 6e 67 20 74 68 72 65 61  ot leaking threa
cab0: 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 2e  d-specific-data.
cac0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 36 30 31  .** Ticket #1601
cad0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
cae0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
caf0: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 3d 20 30  e3_tsd_count = 0
cb00: 3b 0a 23 20 69 66 64 65 66 20 53 51 4c 49 54 45  ;.# ifdef SQLITE
cb10: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
cb20: 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61 64    static pthread
cb30: 5f 6d 75 74 65 78 5f 74 20 74 73 64 5f 63 6f 75  _mutex_t tsd_cou
cb40: 6e 74 65 72 5f 6d 75 74 65 78 20 3d 20 50 54 48  nter_mutex = PTH
cb50: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
cb60: 41 4c 49 5a 45 52 3b 0a 23 20 20 20 64 65 66 69  ALIZER;.#   defi
cb70: 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e  ne TSD_COUNTER(N
cb80: 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) \.            
cb90: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
cba0: 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72  ock(&tsd_counter
cbb0: 5f 6d 75 74 65 78 29 3b 20 5c 0a 20 20 20 20 20  _mutex); \.     
cbc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
cbd0: 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20  tsd_count += N; 
cbe0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  \.             p
cbf0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
cc00: 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72  ock(&tsd_counter
cc10: 5f 6d 75 74 65 78 29 3b 0a 23 20 65 6c 73 65 0a  _mutex);.# else.
cc20: 23 20 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43  #   define TSD_C
cc30: 4f 55 4e 54 45 52 28 4e 29 20 20 73 71 6c 69 74  OUNTER(N)  sqlit
cc40: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20  e3_tsd_count += 
cc50: 4e 0a 23 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a  N.# endif.#else.
cc60: 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55  # define TSD_COU
cc70: 4e 54 45 52 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f  NTER(N)  /* no-o
cc80: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  p */.#endif.../*
cc90: 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69  .** If called wi
cca0: 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e  th allocateFlag>
ccb0: 30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  0, then return a
ccc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 72 65   pointer to thre
ccd0: 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64  ad.** specific d
cce0: 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
ccf0: 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41 6c 6c  ent thread.  All
cd00: 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74  ocate and zero t
cd10: 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73 70 65  he.** thread-spe
cd20: 63 69 66 69 63 20 64 61 74 61 20 69 66 20 69 74  cific data if it
cd30: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
cd40: 79 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  y exist..**.** I
cd50: 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
cd60: 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74  locateFlag==0, t
cd70: 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20 63 75  hen check the cu
cd80: 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20  rrent thread.** 
cd90: 73 70 65 63 69 66 69 63 20 64 61 74 61 2e 20 20  specific data.  
cda0: 52 65 74 75 72 6e 20 69 74 20 69 66 20 69 74 20  Return it if it 
cdb0: 65 78 69 73 74 73 2e 20 20 49 66 20 69 74 20 64  exists.  If it d
cdc0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a  oes not exist,.*
cdd0: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  * then return NU
cde0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  LL..**.** If cal
cdf0: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
ce00: 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b 20 74  eFlag<0, check t
ce10: 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 68 72  o see if the thr
ce20: 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead specific.** 
ce30: 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  data is allocate
ce40: 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72  d and is all zer
ce50: 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74 68 65  o.  If it is the
ce60: 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e  n deallocate it.
ce70: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
ce80: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68 72 65  nter to the thre
ce90: 61 64 20 73 70 65 63 69 66 69 63 20 64 61 74 61  ad specific data
cea0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69   or NULL if it i
ceb0: 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64  s.** unallocated
cec0: 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c 6f 63   or gets dealloc
ced0: 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44  ated..*/.ThreadD
cee0: 61 74 61 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  ata *sqlite3Unix
cef0: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
cf00: 74 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74 65 46  ta(int allocateF
cf10: 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  lag){.  static c
cf20: 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
cf30: 7a 65 72 6f 44 61 74 61 3b 0a 23 69 66 64 65 66  zeroData;.#ifdef
cf40: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
cf50: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 70 74  EADS.  static pt
cf60: 68 72 65 61 64 5f 6b 65 79 5f 74 20 6b 65 79 3b  hread_key_t key;
cf70: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65  .  static int ke
cf80: 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54 68 72  yInit = 0;.  Thr
cf90: 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a  eadData *pTsd;..
cfa0: 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29    if( !keyInit )
cfb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45  {.    sqlite3OsE
cfc0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
cfd0: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
cfe0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
cff0: 20 20 20 20 20 72 63 20 3d 20 70 74 68 72 65 61       rc = pthrea
d000: 64 5f 6b 65 79 5f 63 72 65 61 74 65 28 26 6b 65  d_key_create(&ke
d010: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  y, 0);.      if(
d020: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73   rc ){.        s
d030: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
d040: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ex();.        re
d050: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
d060: 20 20 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20        keyInit = 
d070: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
d080: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
d090: 28 29 3b 0a 20 20 7d 0a 0a 20 20 70 54 73 64 20  ();.  }..  pTsd 
d0a0: 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65  = pthread_getspe
d0b0: 63 69 66 69 63 28 6b 65 79 29 3b 0a 20 20 69 66  cific(key);.  if
d0c0: 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30  ( allocateFlag>0
d0d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64   ){.    if( pTsd
d0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 73  ==0 ){.      pTs
d0f0: 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  d = sqlite3OsMal
d100: 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44  loc(sizeof(zeroD
d110: 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ata));.      if(
d120: 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
d130: 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
d140: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  a;.        pthre
d150: 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b  ad_setspecific(k
d160: 65 79 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20  ey, pTsd);.     
d170: 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
d180: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
d190: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
d1a0: 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
d1b0: 65 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20  eFlag<0 .       
d1c0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
d1d0: 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20  Tsd, &zeroData, 
d1e0: 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29  sizeof(zeroData)
d1f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
d200: 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b  te3OsFree(pTsd);
d210: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73 65 74  .    pthread_set
d220: 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 30 29  specific(key, 0)
d230: 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
d240: 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
d250: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d260: 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20  n pTsd;.#else.  
d270: 73 74 61 74 69 63 20 54 68 72 65 61 64 44 61 74  static ThreadDat
d280: 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20 20 69  a *pTsd = 0;.  i
d290: 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e  f( allocateFlag>
d2a0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73  0 ){.    if( pTs
d2b0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  d==0 ){.      pT
d2c0: 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61  sd = sqlite3OsMa
d2d0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72  lloc( sizeof(zer
d2e0: 6f 44 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20  oData) );.      
d2f0: 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20  if( pTsd ){.    
d300: 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f      *pTsd = zero
d310: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 54 53  Data;.        TS
d320: 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20  D_COUNTER(+1);. 
d330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d340: 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30  else if( pTsd!=0
d350: 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67   && allocateFlag
d360: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  <0.            &
d370: 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26  & memcmp(pTsd, &
d380: 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66  zeroData, sizeof
d390: 28 7a 65 72 6f 44 61 74 61 29 29 3d 3d 30 20 29  (zeroData))==0 )
d3a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
d3b0: 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 54  ree(pTsd);.    T
d3c0: 53 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a  SD_COUNTER(-1);.
d3d0: 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20      pTsd = 0;.  
d3e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b  }.  return pTsd;
d3f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d400: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
d410: 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
d420: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
d430: 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65  lue, becomes the
d440: 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72   result.** retur
d450: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
d460: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e  OsCurrentTime().
d470: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
d480: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  or testing..*/.#
d490: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
d4a0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
d4b0: 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a  rrent_time = 0;.
d4c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
d4d0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
d4e0: 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
d4f0: 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
d500: 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
d510: 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
d520: 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
d530: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
d540: 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
d550: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
d560: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
d570: 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
d580: 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
d590: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 43  int sqlite3UnixC
d5a0: 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c  urrentTime(doubl
d5b0: 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65  e *prNow){.#ifde
d5c0: 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69  f NO_GETTOD.  ti
d5d0: 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
d5e0: 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
d5f0: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
d600: 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74  87.5;.#else.  st
d610: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f  ruct timeval sNo
d620: 77 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  w;.  struct time
d630: 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f  zone sTz;  /* No
d640: 74 20 75 73 65 64 20 2a 2f 0a 20 20 67 65 74 74  t used */.  gett
d650: 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
d660: 26 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77 20  &sTz);.  *prNow 
d670: 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e  = 2440587.5 + sN
d680: 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e  ow.tv_sec/86400.
d690: 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  0 + sNow.tv_usec
d6a0: 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a  /86400000000.0;.
d6b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
d6c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
d6d0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
d6e0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
d6f0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
d700: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
d710: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
d720: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
d730: 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  rn 0;.}..#endif 
d740: 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a        /* OS_UNIX */.