System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 9de1887768d94a63a4043ad487dd1c595437488e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0230: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0240: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0250: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0260: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0270: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0280: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0290: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
02a0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
02b0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
02c0: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
02d0: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
02e0: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
02f0: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0300: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0310: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0320: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0330: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0340: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0350: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0360: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0370: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0380: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0390: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
03a0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
03b0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
03c0: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
03d0: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
03e0: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
03f0: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0400: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0410: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0420: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0430: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0440: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0450: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0460: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0470: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0480: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0490: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
04a0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
04b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
04c0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
04d0: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
04e0: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
04f0: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0500: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0520: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0530: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
0540: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
0550: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
0560: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
0570: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0580: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0590: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
05a0: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
05b0: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
05c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
05d0: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
05e0: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
05f0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0600: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
0610: 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66  to be thread-saf
0620: 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  e, include the p
0630: 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61  threads header a
0640: 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65  nd define.** the
0650: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
0660: 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  EADS macro..*/.#
0670: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
0680: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
0690: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
06a0: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
06b0: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
06c0: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
06d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
06e0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
06f0: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
0700: 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  file.*/.#ifndef 
0710: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0720: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  ILE_PERMISSIONS.
0730: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0740: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
0750: 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65  MISSIONS 0644.#e
0760: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif..../*.** Th
0770: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
0780: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
0790: 20 6f 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69   of OsFile speci
07a0: 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78  fic for the unix
07b0: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
07c0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
07d0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
07e0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
07f0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
0800: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0810: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
0820: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
0830: 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  try */.  struct 
0840: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  openCnt *pOpen; 
0850: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0860: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
0870: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
0880: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
0890: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49  o *pLock;   /* I
08a0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
08b0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
08c0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08e0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
08f0: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
0900: 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b  d char locktype;
0910: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
0920: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
0930: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
0940: 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70 65 6e  gned char isOpen
0950: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
0960: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6c 6f   needs to be clo
0970: 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  sed */.  unsigne
0980: 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e 63 3b  d char fullSync;
0990: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
09a0: 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61 62 6c  SYNC if availabl
09b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  e */.  int dirfd
09c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
09d0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
09e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
09f0: 63 74 6f 72 79 20 2a 2f 0a 23 69 66 64 65 66 20  ctory */.#ifdef 
0a00: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0a10: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0a20: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0a30: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0a40: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0a50: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0a70: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0a80: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0a90: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0aa0: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0ab0: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0ac0: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0ad0: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0ae0: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0af0: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0b00: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0b10: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0b20: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0b30: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0b40: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0b50: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0b60: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0b70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0b80: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0b90: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0ba0: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0bb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0bc0: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0bd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0be0: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0bf0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0c00: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0c10: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0c20: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0c30: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0c40: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0c50: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0c60: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0c70: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0c80: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0c90: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0ca0: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0cb0: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0cc0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0cd0: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0ce0: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0cf0: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0d00: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0d10: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0d20: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0d30: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0d40: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0d50: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0d60: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0d70: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0d80: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0d90: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0da0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0db0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0dc0: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0dd0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0de0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0df0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0e00: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0e10: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0e20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0e30: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0e40: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0e50: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0e60: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0e70: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
0e80: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
0e90: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
0ea0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
0eb0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
0ec0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
0ed0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
0ee0: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
0ef0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
0f00: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
0f10: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
0f20: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
0f30: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
0f40: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
0f50: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
0f60: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
0f70: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
0f80: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
0f90: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
0fa0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
0fb0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
0fc0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
0fd0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
0fe0: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
0ff0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1000: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
1010: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
1020: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
1030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
1040: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
1050: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
1060: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1070: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1080: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1090: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
10a0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
10b0: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
10c0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
10d0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
10e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
10f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1100: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
1110: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
1120: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
1130: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
1140: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
1150: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
1160: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1170: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1180: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1190: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
11a0: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
11b0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
11c0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
11d0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
11e0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
11f0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1200: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
1210: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
1220: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
1230: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1240: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
1250: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
1260: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1270: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1280: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1290: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
12a0: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
12b0: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
12c0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
12d0: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
12e0: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
12f0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1300: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
1310: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
1320: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
1330: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
1340: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
1350: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
1360: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1370: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1380: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1390: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
13a0: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
13b0: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
13c0: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
13d0: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
13e0: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
13f0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1400: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
1410: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
1420: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
1430: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
1440: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1450: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
1460: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1470: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1480: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1490: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
14a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
14b0: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
14c0: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
14d0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
14e0: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
1510: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
1520: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
1530: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
1540: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1550: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
1560: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1580: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1590: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
15a0: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
15b0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
15c0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
15d0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
15e0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
15f0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1600: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
1610: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
1620: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
1630: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
1640: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
1650: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
1660: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1670: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1680: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1690: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
16a0: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
16b0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
16c0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
16d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
16e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
16f0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1700: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
1710: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
1720: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
1730: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1740: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
1750: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
1760: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1770: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1780: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1790: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
17a0: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
17b0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
17c0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
17d0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
17e0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
17f0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1800: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
1810: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
1820: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
1830: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1840: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
1850: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
1860: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1870: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1880: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1890: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
18a0: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
18b0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
18c0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
18d0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
18e0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
18f0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1900: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1910: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1920: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1930: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1940: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1950: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1960: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1970: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1980: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1990: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
19a0: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
19b0: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
19c0: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
19d0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
19e0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
19f0: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1a00: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1a10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1a20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1a30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1a40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1a50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1a60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1a70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1a80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1a90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1aa0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1ab0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1ac0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1ad0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1ae0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1af0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1b00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1b10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1b20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1b30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1b40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1b50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1b60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1b70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1b80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1b90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1bb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1bc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1bd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1be0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1bf0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1c00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1c10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1c20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1c30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1c40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1c50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1c60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1c70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1c80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1c90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1ca0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1cb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1cc0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1cd0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1ce0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1cf0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1d00: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1d10: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1d20: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1d30: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1d40: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1d50: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1d60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1d70: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1d80: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1d90: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1da0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1db0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1dc0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1dd0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1de0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1df0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1e00: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1e10: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1e20: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1e30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1e40: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1e50: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1e60: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1e70: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1e80: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1e90: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1ea0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
1eb0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
1ec0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
1ed0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
1ee0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
1ef0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
1f00: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1f10: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1f20: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1f30: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1f40: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1f50: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1f60: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1f70: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1f80: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1f90: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1fa0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
1fb0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
1fc0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
1fd0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
1fe0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
1ff0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2000: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
2010: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
2020: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
2030: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
2040: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
2050: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
2060: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2070: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2080: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2090: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
20a0: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
20b0: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
20c0: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
20d0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
20e0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
20f0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2100: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
2110: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
2120: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
2130: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
2140: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
2150: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2160: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2170: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2180: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2190: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
21a0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
21b0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
21c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
21e0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
21f0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2210: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
2220: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
2230: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
2240: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
2250: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
2260: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2270: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2280: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2290: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
22a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
22b0: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
22c0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
22d0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
22e0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
22f0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2310: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
2320: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
2330: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
2340: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2350: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
2360: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2370: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2380: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2390: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
23a0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
23b0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
23c0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
23d0: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
23e0: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
23f0: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2400: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
2410: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
2420: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
2430: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
2440: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
2450: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
2460: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2470: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2480: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2490: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
24a0: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
24b0: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
24c0: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
24d0: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
24e0: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
24f0: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2500: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
2510: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
2520: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2530: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
2540: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
2550: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
2560: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2570: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2580: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2590: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
25a0: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
25b0: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
25c0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
25d0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
25e0: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
25f0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2600: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
2610: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
2620: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
2630: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
2640: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
2650: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
2660: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2670: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2680: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2690: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
26a0: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
26b0: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
26c0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
26d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
26e0: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
26f0: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2700: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
2710: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
2720: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
2730: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
2740: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
2750: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
2760: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2770: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2780: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2790: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
27a0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
27b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
27c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
27d0: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
27e0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
27f0: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2800: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2810: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
2820: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
2830: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
2840: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
2850: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
2860: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2870: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2880: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2890: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
28a0: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
28b0: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
28c0: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
28d0: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
28e0: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
28f0: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2900: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2910: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2920: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2930: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2940: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2950: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2960: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2970: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2980: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2990: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
29a0: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
29b0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29c0: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
29d0: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
29e0: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
29f0: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2a00: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2a10: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2a20: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2a30: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2a40: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2a50: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2a60: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2a70: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2a80: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2a90: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2aa0: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2ab0: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2ac0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2af0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2b00: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2b10: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2b20: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2b30: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2b40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2b50: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2b60: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2b70: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2b80: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2b90: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2ba0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2bb0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2bc0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2bd0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2be0: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2bf0: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2c00: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2c10: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2c20: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2c30: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2c40: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2c50: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2c60: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2c70: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2c80: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2c90: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2ca0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2cb0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2cc0: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2cd0: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2ce0: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2d10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d40: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2d50: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2d60: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2d70: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2d80: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2d90: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2da0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2db0: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2dc0: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2dd0: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2de0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2df0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2e00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2e10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2e20: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2e30: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2e60: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2e70: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2e80: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2e90: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
2ea0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2eb0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2ec0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2ed0: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2ee0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2ef0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f10: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2f20: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2f30: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2f40: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2f50: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2f60: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2f70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2f80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2fa0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fe0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2ff0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3000: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
3010: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
3020: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
3030: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
3040: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
3050: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
3060: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3070: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3080: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3090: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
30a0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
30b0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
30c0: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
30d0: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
30e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
30f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3100: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
3110: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
3120: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
3130: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
3140: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
3150: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3160: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3170: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3180: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3190: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
31a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
31b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
31c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
31d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
31e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
31f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3200: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
3210: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
3220: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
3230: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
3240: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
3250: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3260: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3280: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3290: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
32a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
32b0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
32c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
32d0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
32e0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
32f0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3300: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
3310: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
3320: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
3330: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
3340: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
3350: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
3360: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3370: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3380: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3390: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
33a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
33b0: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
33c0: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
33d0: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
33e0: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
33f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3400: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
3410: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
3420: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
3430: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
3440: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
3450: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c  lockHash = { SQL
3460: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
3480: 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70  ;.static Hash op
3490: 65 6e 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  enHash = { SQLIT
34a0: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
34b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
34c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34d0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a  UNIX_THREADS./*.
34e0: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
34f0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3500: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
3510: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
3520: 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b  h others.** lock
3530: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  s..**.**    0:  
3540: 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  No.  Threads can
3550: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
3560: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
3570: 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20  **    1:  Yes.  
3580: 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  Threads can over
3590: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
35a0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a   locks..**   -1:
35b0: 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20    We don't know 
35c0: 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f  yet..**.** On so
35d0: 6d 65 20 73 79 73 74 65 6d 73 2c 20 77 65 20 6b  me systems, we k
35e0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
35f0: 69 6d 65 20 69 66 20 74 68 72 65 61 64 73 20 63  ime if threads c
3600: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
3610: 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  .** others locks
3620: 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73 79 73 74  .  On those syst
3630: 65 6d 73 2c 20 74 68 65 20 53 51 4c 49 54 45 5f  ems, the SQLITE_
3640: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3650: 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69  LOCK macro.** wi
3660: 6c 6c 20 62 65 20 73 65 74 20 61 70 70 72 6f 70  ll be set approp
3670: 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68  riately.  On oth
3680: 65 72 20 73 79 73 74 65 6d 73 2c 20 77 65 20 68  er systems, we h
3690: 61 76 65 20 74 6f 20 63 68 65 63 6b 20 61 74 0a  ave to check at.
36a0: 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20  ** runtime.  On 
36b0: 74 68 65 73 65 20 6c 61 74 74 65 72 20 73 79 73  these latter sys
36c0: 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f 54 48 52  tems, SQLTIE_THR
36d0: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
36e0: 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65  K is.** undefine
36f0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61  d..**.** This va
3700: 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20  riable normally 
3710: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 20 6f  has file scope o
3720: 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69 6e 67  nly.  But during
3730: 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b   testing, we mak
3740: 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c  e.** it a global
3750: 20 73 6f 20 74 68 61 74 20 74 68 65 20 74 65 73   so that the tes
3760: 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61 6e 67  t code can chang
3770: 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e 20 6f  e its value in o
3780: 72 64 65 72 20 74 6f 20 76 65 72 69 66 79 0a 2a  rder to verify.*
3790: 2a 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  * that the right
37a0: 20 73 74 75 66 66 20 68 61 70 70 65 6e 73 20 69   stuff happens i
37b0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e 0a 2a  n either case..*
37c0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
37d0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
37e0: 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53  _LOCK.# define S
37f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3800: 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65  RRIDE_LOCK -1.#e
3810: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
3820: 54 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65  TE_TEST.int thre
3830: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
3840: 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c  thersLocks = SQL
3850: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3860: 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a  IDE_LOCK;.#else.
3870: 73 74 61 74 69 63 20 69 6e 74 20 74 68 72 65 61  static int threa
3880: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
3890: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49  hersLocks = SQLI
38a0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
38b0: 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a  DE_LOCK;.#endif.
38c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75  ./*.** This stru
38d0: 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f  cture holds info
38e0: 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69  rmation passed i
38f0: 6e 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74  nto individual t
3900: 65 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62  est.** threads b
3910: 79 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64  y the testThread
3920: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
3930: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
3940: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
3950: 61 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20  ata {.  int fd; 
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3970: 2a 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  * File to be loc
3980: 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ked */.  struct 
3990: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20  flock lock;     
39a0: 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f  /* The locking o
39b0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
39c0: 74 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20  t result;       
39d0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
39e0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70  f the locking op
39f0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23  eration */.};..#
3a00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ifdef SQLITE_LOC
3a10: 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72  K_TRACE./*.** Pr
3a20: 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74  int out informat
3a30: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f  ion about all lo
3a40: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
3a50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3a60: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
3a70: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
3a80: 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74   locks on multit
3a90: 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66  hreaded.** platf
3aa0: 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79  orms.  Enable by
3ab0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
3ac0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43  the -DSQLITE_LOC
3ad0: 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61  K_TRACE.** comma
3ae0: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f  nd-line option o
3af0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
3b00: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   This code is no
3b10: 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64  rmally.** turned
3b20: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
3b30: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
3b40: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
3b50: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
3b60: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
3b70: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
3b80: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
3b90: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
3ba0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
3bb0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
3bc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3bd0: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
3be0: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
3bf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3c00: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
3c10: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
3c20: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3c30: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
3c40: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
3c50: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
3c60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
3c70: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
3c80: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
3c90: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
3ca0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
3cb0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
3cc0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
3cd0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
3ce0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
3cf0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
3d00: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
3d10: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
3d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
3d30: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
3d40: 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74  ET );.  s = fcnt
3d50: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
3d60: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
3d70: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
3d80: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
3d90: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
3da0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
3db0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
3dc0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
3dd0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
3de0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
3df0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
3e00: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 20 26  d, s);.  if( s &
3e10: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
3e20: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
3e30: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
3e40: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
3e50: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
3e60: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
3e70: 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  .    fcntl(fd, F
3e80: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
3e90: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
3ea0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
3eb0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
3ec0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
3ed0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
3ee0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
3ef0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
3f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
3f10: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
3f20: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
3f30: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
3f40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
3f50: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
3f60: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
3f70: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
3f80: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
3f90: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
3fa0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
3fb0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
3fc0: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
3fd0: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
3fe0: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
3ff0: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
4000: 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c  .#define fcntl l
4010: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
4020: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
4030: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RACE */../*.** T
4040: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
4050: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
4060: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20  outine launches 
4070: 74 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  two separate.** 
4080: 74 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20  threads on this 
4090: 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72  routine.  This r
40a0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
40b0: 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a  to lock a file.*
40c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  * descriptor the
40d0: 6e 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20  n returns.  The 
40e0: 73 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75  success or failu
40f0: 72 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d  re of that attem
4100: 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  pt.** allows the
4110: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
4120: 6e 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f  ngBehavior() pro
4130: 63 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d  cedure to determ
4140: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
4150: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
4160: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
4170: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f  others locks..*/
4180: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68  .static void *th
4190: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28  readLockingTest(
41a0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
41b0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
41c0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73  Data *pData = (s
41d0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
41e0: 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44  Data*)pArg;.  pD
41f0: 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63  ata->result = fc
4200: 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46  ntl(pData->fd, F
4210: 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e  _SETLK, &pData->
4220: 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  lock);.  return 
4230: 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pArg;.}../*.** T
4240: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74  his procedure at
4250: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
4260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
4270: 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61  ot threads.** ca
4280: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
4290: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
42a0: 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74  n sets the .** t
42b0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
42c0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61  chOthersLocks va
42d0: 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61  riable appropria
42e0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
42f0: 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c  void testThreadL
4300: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 69  ockingBehavior(i
4310: 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69  nt fd_orig){.  i
4320: 6e 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20  nt fd;.  struct 
4330: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64  threadTestData d
4340: 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 74  [2];.  pthread_t
4350: 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64   t[2];..  fd = d
4360: 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69  up(fd_orig);.  i
4370: 66 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e  f( fd<0 ) return
4380: 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c  ;.  memset(d, 0,
4390: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
43a0: 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64  [0].fd = fd;.  d
43b0: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20  [0].lock.l_type 
43c0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30  = F_RDLCK;.  d[0
43d0: 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31  ].lock.l_len = 1
43e0: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
43f0: 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30  start = 0;.  d[0
4400: 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20  ].lock.l_whence 
4410: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b  = SEEK_SET;.  d[
4420: 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31  1] = d[0];.  d[1
4430: 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20  ].lock.l_type = 
4440: 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65  F_WRLCK;.  pthre
4450: 61 64 5f 63 72 65 61 74 65 28 26 74 5b 30 5d 2c  ad_create(&t[0],
4460: 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e   0, threadLockin
4470: 67 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20  gTest, &d[0]);. 
4480: 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28   pthread_create(
4490: 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65 61 64  &t[1], 0, thread
44a0: 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b  LockingTest, &d[
44b0: 31 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a  1]);.  pthread_j
44c0: 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20  oin(t[0], 0);.  
44d0: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31  pthread_join(t[1
44e0: 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66  ], 0);.  close(f
44f0: 64 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65  d);.  threadsOve
4500: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
4510: 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73  ocks =  d[0].res
4520: 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72  ult==0 && d[1].r
4530: 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  esult==0;.}.#end
4540: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 49  if /* SQLITE_UNI
4550: 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a  X_THREADS */../*
4560: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
4570: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
4580: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4590: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
45a0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
45b0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4c  ic void releaseL
45c0: 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 6c  ockInfo(struct l
45d0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b  ockInfo *pLock){
45e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
45f0: 65 33 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29  e3OsInMutex(1) )
4600: 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d  ;.  pLock->nRef-
4610: 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  -;.  if( pLock->
4620: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
4630: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4640: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f  (&lockHash, &pLo
4650: 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28  ck->key, sizeof(
4660: 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b  pLock->key), 0);
4670: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4680: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4690: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
46a0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
46b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
46c0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
46d0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
46e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
46f0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4700: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4710: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4720: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4730: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
4740: 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52  .  if( pOpen->nR
4750: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ef==0 ){.    sql
4760: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4770: 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e  openHash, &pOpen
4780: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f  ->key, sizeof(pO
4790: 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20  pen->key), 0);. 
47a0: 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61     free(pOpen->a
47b0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71  Pending);.    sq
47c0: 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b  liteFree(pOpen);
47d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
47e0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
47f0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f  iptor, locate lo
4800: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
4810: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68  nt structures th
4820: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
4830: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
4840: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65  ptor.  Create ne
4850: 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73  w ones if necess
4860: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
4870: 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74  urn values might
4880: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
4890: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
48a0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  curs..**.** Retu
48b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
48c0: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
48d0: 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  ic int findLockI
48e0: 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  nfo(.  int fd,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
4910: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
4920: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
4930: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
4940: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
4950: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
4960: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
4970: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
4980: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
4990: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
49a0: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
49b0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ture here */.){.
49c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
49d0: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
49e0: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
49f0: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
4a00: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
4a10: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
4a20: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
4a30: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
4a40: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66  ;.  rc = fstat(f
4a50: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
4a60: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
4a70: 72 6e 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  rn 1;..  assert(
4a80: 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
4a90: 78 28 31 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  x(1) );.  memset
4aa0: 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f  (&key1, 0, sizeo
4ab0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31  f(key1));.  key1
4ac0: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
4ad0: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e  t_dev;.  key1.in
4ae0: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
4af0: 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  no;.#ifdef SQLIT
4b00: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
4b10: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
4b20: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
4b30: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
4b40: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
4b50: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
4b60: 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72    key1.tid = thr
4b70: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
4b80: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
4b90: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
4ba0: 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65  ;.#endif.  memse
4bb0: 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65  t(&key2, 0, size
4bc0: 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79  of(key2));.  key
4bd0: 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  2.dev = statbuf.
4be0: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69  st_dev;.  key2.i
4bf0: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
4c00: 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28  ino;.  pLock = (
4c10: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a  struct lockInfo*
4c20: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
4c30: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79  (&lockHash, &key
4c40: 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  1, sizeof(key1))
4c50: 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30  ;.  if( pLock==0
4c60: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c   ){.    struct l
4c70: 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20  ockInfo *pOld;. 
4c80: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
4c90: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
4ca0: 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20  of(*pLock) );.  
4cb0: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
4cc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
4cd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
4ce0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
4cf0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
4d00: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
4d10: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
4d20: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
4d30: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
4d40: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
4d50: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
4d60: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
4d70: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
4d80: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20  , sizeof(key1), 
4d90: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  pLock);.    if( 
4da0: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
4db0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4dc0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71  Lock );.      sq
4dd0: 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b  liteFree(pLock);
4de0: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
4df0: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
4e00: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
4e10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
4e20: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pLock->nRef++;. 
4e30: 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70   }.  *ppLock = p
4e40: 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70  Lock;.  if( ppOp
4e50: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70  en!=0 ){.    pOp
4e60: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65  en = (struct ope
4e70: 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73  nCnt*)sqlite3Has
4e80: 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c  hFind(&openHash,
4e90: 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b   &key2, sizeof(k
4ea0: 65 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ey2));.    if( p
4eb0: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
4ec0: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
4ed0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70  *pOld;.      pOp
4ee0: 65 6e 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  en = sqliteMallo
4ef0: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4f  cRaw( sizeof(*pO
4f00: 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66  pen) );.      if
4f10: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
4f20: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
4f30: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
4f40: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
4f50: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
4f60: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
4f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
4f80: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
4f90: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
4fa0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
4fb0: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
4fc0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
4fd0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
4fe0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
4ff0: 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d   0;.      pOld =
5000: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5010: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
5020: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
5030: 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b  f(key2), pOpen);
5040: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21  .      if( pOld!
5050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5060: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
5070: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n );.        sql
5080: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a  iteFree(pOpen);.
5090: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c          releaseL
50a0: 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a  ockInfo(pLock);.
50b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
50c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
50d0: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
50e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
50f0: 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  e{.      pOpen->
5100: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
5110: 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65    *ppOpen = pOpe
5120: 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e  n;.  }..exit_fin
5130: 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74  dlockinfo:.  ret
5140: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
5150: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
5160: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5170: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5180: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5190: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
51a0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
51b0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
51c0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
51d0: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
51e0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
51f0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
5200: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5210: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
5220: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
5230: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
5240: 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e  type ){.  case N
5250: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
5260: 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48  NONE";.  case SH
5270: 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  ARED_LOCK: retur
5280: 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61  n "SHARED";.  ca
5290: 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  se RESERVED_LOCK
52a0: 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56  : return "RESERV
52b0: 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44  ED";.  case PEND
52c0: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
52d0: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61   "PENDING";.  ca
52e0: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
52f0: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5300: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5310: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5320: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5330: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
5340: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
5350: 74 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20  thread than the 
5360: 74 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a  thread that the.
5370: 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75  ** unixFile argu
5380: 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c  ment belongs to,
5390: 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f   then transfer o
53a0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
53b0: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72  unixFile.** over
53c0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
53d0: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
53e0: 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79  unixFile is only
53f0: 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65   owned by a thre
5400: 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68  ad on systems wh
5410: 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69  ere one thread i
5420: 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f  s.** unable to o
5430: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72  verride locks cr
5440: 65 61 74 65 64 20 62 79 20 61 20 64 69 66 66 65  eated by a diffe
5450: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65  rent thread.  Re
5460: 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65  dHat9 is.** an e
5470: 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61  xample of such a
5480: 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f   system..**.** O
5490: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
54a0: 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  r is only allowe
54b0: 64 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c  d if the unixFil
54c0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
54d0: 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74  nlocked..** If t
54e0: 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c  he unixFile is l
54f0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e  ocked and an own
5500: 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c  ership is wrong,
5510: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
5520: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20  SQLITE_MISUSE.  
5530: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5540: 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
5550: 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69  ing works..*/.#i
5560: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
5570: 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69 63 20  _THREADS.static 
5580: 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  int transferOwne
5590: 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a  rship(unixFile *
55a0: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  pFile){.  int rc
55b0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53  ;.  pthread_t hS
55c0: 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61  elf;.  if( threa
55d0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
55e0: 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20  hersLocks ){.   
55f0: 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72   /* Ownership tr
5600: 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64  ansfers not need
5610: 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65  ed on this syste
5620: 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  m */.    return 
5630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
5640: 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64   hSelf = pthread
5650: 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70  _self();.  if( p
5660: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69  thread_equal(pFi
5670: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20  le->tid, hSelf) 
5680: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
5690: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61   still in the sa
56a0: 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20  me thread */.   
56b0: 20 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e   TRACE1("No-tran
56c0: 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61  sfer, same threa
56d0: 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  d\n");.    retur
56e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
56f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
5700: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
5710: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e  ){.    /* We can
5720: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72  not change owner
5730: 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72  ship while we ar
5740: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  e holding a lock
5750: 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ! */.    return 
5760: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
5770: 20 7d 0a 20 20 54 52 41 43 45 34 28 22 54 72 61   }.  TRACE4("Tra
5780: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
5790: 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f  of %d from %d to
57a0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
57b0: 2c 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53 65 6c  ,pFile->tid,hSel
57c0: 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64  f);.  pFile->tid
57d0: 20 3d 20 68 53 65 6c 66 3b 0a 20 20 72 65 6c 65   = hSelf;.  rele
57e0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
57f0: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 63 20  e->pLock);.  rc 
5800: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
5810: 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d  File->h, &pFile-
5820: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 54 52  >pLock, 0);.  TR
5830: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
5840: 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64   is now %s(%s,%d
5850: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
5860: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
5870: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
5880: 65 29 2c 0a 20 20 20 20 20 6c 6f 63 6b 74 79 70  e),.     locktyp
5890: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
58a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
58b0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
58c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
58d0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20  }.#else.  /* On 
58e0: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
58f0: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
5900: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
5910: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
5920: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
5930: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
5940: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
5950: 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
5960: 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  file.*/.int sqli
5970: 74 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63 6f  te3UnixDelete(co
5980: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
5990: 61 6d 65 29 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ame){.  unlink(z
59a0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
59b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
59c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
59d0: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
59e0: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
59f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
5a00: 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74  FileExists(const
5a10: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
5a20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  ){.  return acce
5a30: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
5a40: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ==0;.}../* Forwa
5a50: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
5a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
5a70: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 75 6e  ocateUnixFile(un
5a80: 69 78 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f  ixFile *pInit, O
5a90: 73 46 69 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f  sFile **pId);../
5aa0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
5ab0: 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20  open a file for 
5ac0: 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
5ad0: 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68   writing.  If th
5ae0: 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79  at.** fails, try
5af0: 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64   opening it read
5b00: 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66  -only.  If the f
5b10: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
5b20: 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72  st,.** try to cr
5b30: 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  eate it..**.** O
5b40: 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e  n success, a han
5b50: 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e  dle for the open
5b60: 20 66 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e   file is written
5b70: 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a   to *id.** and *
5b80: 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74  pReadonly is set
5b90: 20 74 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c   to 0 if the fil
5ba0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72  e was opened for
5bb0: 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20   reading and.** 
5bc0: 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20  writing or 1 if 
5bd0: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
5be0: 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
5bf0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
5c00: 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  urns.** SQLITE_O
5c10: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
5c20: 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  ure, the functio
5c30: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
5c40: 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65  _CANTOPEN and le
5c50: 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20  aves.** *id and 
5c60: 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61  *pReadonly uncha
5c70: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
5c80: 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64  ite3UnixOpenRead
5c90: 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63  Write(.  const c
5ca0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
5cb0: 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a    OsFile **pId,.
5cc0: 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79    int *pReadonly
5cd0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
5ce0: 75 6e 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43  unixFile f;..  C
5cf0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
5d00: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
5d10: 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20 7a 46  penReadWrite, zF
5d20: 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 70 52  ilename, pId, pR
5d30: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 61 73 73 65  eadonly);.  asse
5d40: 72 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20  rt( 0==*pId );. 
5d50: 20 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c   f.h = open(zFil
5d60: 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ename, O_RDWR|O_
5d70: 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c  CREAT|O_LARGEFIL
5d80: 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20  E|O_BINARY,.    
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
5db0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5dc0: 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e  SIONS);.  if( f.
5dd0: 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49  h<0 ){.#ifdef EI
5de0: 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72  SDIR.    if( err
5df0: 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20  no==EISDIR ){.  
5e00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5e10: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
5e20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 2e 68  }.#endif.    f.h
5e30: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
5e40: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
5e50: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
5e60: 29 3b 0a 20 20 20 20 69 66 28 20 66 2e 68 3c 30  );.    if( f.h<0
5e70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
5e80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
5e90: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  ; .    }.    *pR
5ea0: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
5eb0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
5ec0: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  only = 0;.  }.  
5ed0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
5ee0: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
5ef0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20  ndLockInfo(f.h, 
5f00: 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70  &f.pLock, &f.pOp
5f10: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
5f20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
5f30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
5f40: 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65  ose(f.h);.    re
5f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5f60: 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  M;.  }.  TRACE3(
5f70: 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
5f80: 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e  \n", f.h, zFilen
5f90: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ame);.  return a
5fa0: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
5fb0: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a  &f, pId);.}.../*
5fc0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
5fd0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
5fe0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
5ff0: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
6000: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
6010: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
6020: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
6030: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
6040: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
6050: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
6060: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
6070: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
6080: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
6090: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
60a0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
60b0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
60c0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
60d0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
60e0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
60f0: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
6100: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
6110: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
6120: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
6130: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
6140: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
6150: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
6160: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
6170: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
6180: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
6190: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
61a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
61b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
61c0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f  OpenExclusive(co
61d0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
61e0: 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  ame, OsFile **pI
61f0: 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  d, int delFlag){
6200: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
6210: 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53  xFile f;..  CRAS
6220: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
6230: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
6240: 45 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65  Exclusive, zFile
6250: 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c  name, pId, delFl
6260: 61 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  ag);.  assert( 0
6270: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 69 66 28 20  ==*pId );.  if( 
6280: 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65  access(zFilename
6290: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 0)==0 ){.    r
62a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
62b0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e 68  TOPEN;.  }.  f.h
62c0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
62d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
62e0: 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41     O_RDWR|O_CREA
62f0: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
6300: 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  LOW|O_LARGEFILE|
6310: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
6320: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6330: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
6340: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
6350: 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72  ( f.h<0 ){.    r
6360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6370: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c  TOPEN;.  }.  sql
6380: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
6390: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
63a0: 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e  ockInfo(f.h, &f.
63b0: 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
63c0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
63d0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
63e0: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
63f0: 28 66 2e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  (f.h);.    unlin
6400: 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
6410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6420: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
6430: 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20   delFlag ){.    
6440: 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
6450: 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  );.  }.  TRACE3(
6460: 22 4f 50 45 4e 2d 45 58 20 25 2d 33 64 20 25 73  "OPEN-EX %-3d %s
6470: 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e  \n", f.h, zFilen
6480: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ame);.  return a
6490: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
64a0: 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a  &f, pId);.}../*.
64b0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
64c0: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
64d0: 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65  r read-only acce
64e0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ss..**.** On suc
64f0: 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20  cess, write the 
6500: 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f  file handle into
6510: 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20   *id and return 
6520: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
6530: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74   On failure, ret
6540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6550: 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  PEN..*/.int sqli
6560: 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f  te3UnixOpenReadO
6570: 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nly(const char *
6580: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c  zFilename, OsFil
6590: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20  e **pId){.  int 
65a0: 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66  rc;.  unixFile f
65b0: 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f  ;..  CRASH_TEST_
65c0: 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33  OVERRIDE(sqlite3
65d0: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
65e0: 79 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49  y, zFilename, pI
65f0: 64 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  d, 0);.  assert(
6600: 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e   0==*pId );.  f.
6610: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
6620: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
6630: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6640: 59 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20  Y);.  if( f.h<0 
6650: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6660: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
6670: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
6680: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
6690: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
66a0: 66 2e 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26  f.h, &f.pLock, &
66b0: 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69  f.pOpen);.  sqli
66c0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
66d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
66e0: 20 20 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20     close(f.h);. 
66f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6700: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52  _NOMEM;.  }.  TR
6710: 41 43 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d  ACE3("OPEN-RO %-
6720: 33 64 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a  3d %s\n", f.h, z
6730: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
6740: 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  urn allocateUnix
6750: 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d  File(&f, pId);.}
6760: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
6770: 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64  to open a file d
6780: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
6790: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
67a0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66   contains a.** f
67b0: 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ile.  This file 
67c0: 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62  descriptor can b
67d0: 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28  e used to fsync(
67e0: 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  ) the directory.
67f0: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ** in order to m
6800: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65  ake sure the cre
6810: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66  ation of a new f
6820: 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ile is actually 
6830: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69  written.** to di
6840: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sk..**.** This r
6850: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d  outine is only m
6860: 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e  eaningful for Un
6870: 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d  ix.  It is a no-
6880: 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64  op under.** wind
6890: 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77  ows since window
68a0: 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  s does not suppo
68b0: 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a  rt hard links..*
68c0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
68d0: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20   a handle for a 
68e0: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20  previously open 
68f0: 66 69 6c 65 20 61 74 20 2a 69 64 20 69 73 0a 2a  file at *id is.*
6900: 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  * updated with t
6910: 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79  he new directory
6920: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6930: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
6940: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
6950: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
6960: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
6970: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
6980: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
6990: 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65  .** *id unchange
69a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
69b0: 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
69c0: 72 79 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64  ry(.  OsFile *id
69d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
69e0: 7a 44 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e  zDirname.){.  un
69f0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
6a00: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
6a10: 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b   if( pFile==0 ){
6a20: 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f  .    /* Do not o
6a30: 70 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  pen the director
6a40: 79 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  y if the corresp
6a50: 6f 6e 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e  onding file is n
6a60: 6f 74 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ot already.    *
6a70: 2a 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72  * open. */.    r
6a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6a90: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54  TOPEN;.  }.  SET
6aa0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
6ac0: 65 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20  e->dirfd<0 );.  
6ad0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f  pFile->dirfd = o
6ae0: 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
6af0: 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
6b00: 20 30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65   0);.  if( pFile
6b10: 2d 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20 20 20  ->dirfd<0 ){.   
6b20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6b30: 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20  ANTOPEN; .  }.  
6b40: 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
6b50: 25 2d 33 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c  %-3d %s\n", pFil
6b60: 65 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61  e->dirfd, zDirna
6b70: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  me);.  return SQ
6b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6b90: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
6ba0: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
6bb0: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
6bc0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
6bd0: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
6be0: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
6bf0: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
6c00: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
6c10: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
6c20: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
6c30: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
6c40: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
6c50: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
6c60: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
6c70: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
6c80: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
6c90: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
6ca0: 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
6cb0: 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
6cc0: 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
6cd0: 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
6ce0: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
6cf0: 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61  PNAME_SIZE chara
6d00: 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cters..*/.int sq
6d10: 6c 69 74 65 33 55 6e 69 78 54 65 6d 70 46 69 6c  lite3UnixTempFil
6d20: 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66  eName(char *zBuf
6d30: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
6d40: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
6d50: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
6d60: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
6d70: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
6d80: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
6d90: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
6da0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
6db0: 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
6dc0: 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
6dd0: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
6de0: 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
6df0: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
6e00: 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
6e10: 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20  6789";.  int i, 
6e20: 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
6e30: 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
6e40: 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
6e50: 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
6e60: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
6e70: 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  tory;.  for(i=0;
6e80: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
6e90: 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
6ea0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
6eb0: 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20  f( azDirs[i]==0 
6ec0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6ed0: 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b  if( stat(azDirs[
6ee0: 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  i], &buf) ) cont
6ef0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
6f00: 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
6f10: 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
6f20: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61      if( access(a
6f30: 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20  zDirs[i], 07) ) 
6f40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44  continue;.    zD
6f50: 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a  ir = azDirs[i];.
6f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
6f70: 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66   do{.    sprintf
6f80: 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50  (zBuf, "%s/"TEMP
6f90: 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
6fa0: 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  ir);.    j = str
6fb0: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
6fc0: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6fd0: 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
6fe0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
6ff0: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
7000: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
7010: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
7020: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
7030: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
7040: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
7050: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
7060: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
7070: 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
7080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7090: 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _OK; .}../*.** C
70a0: 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 65  heck that a give
70b0: 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20  n pathname is a 
70c0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73  directory and is
70d0: 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f   writable .**.*/
70e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
70f0: 49 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68  IsDirWritable(ch
7100: 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64  ar *zBuf){.#ifnd
7110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
7120: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 73  AGER_PRAGMAS.  s
7130: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
7140: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20    if( zBuf==0 ) 
7150: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7160: 7a 42 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74  zBuf[0]==0 ) ret
7170: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 61  urn 0;.  if( sta
7180: 74 28 7a 42 75 66 2c 20 26 62 75 66 29 20 29 20  t(zBuf, &buf) ) 
7190: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
71a0: 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
71b0: 6d 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 30  mode) ) return 0
71c0: 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a  ;.  if( access(z
71d0: 42 75 66 2c 20 30 37 29 20 29 20 72 65 74 75 72  Buf, 07) ) retur
71e0: 6e 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  n 0;.#endif /* S
71f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
7200: 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65  _PRAGMAS */.  re
7210: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
7220: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
7230: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
7240: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
7250: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
7260: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
7270: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
7280: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
7290: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
72a0: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
72b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61  atic int unixRea
72c0: 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f  d(OsFile *id, vo
72d0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
72e0: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
72f0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
7300: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
7310: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
7320: 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
7330: 20 67 6f 74 20 3d 20 72 65 61 64 28 28 28 75 6e   got = read(((un
7340: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
7350: 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 54 49  pBuf, amt);.  TI
7360: 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45  MER_END;.  TRACE
7370: 35 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20  5("READ    %-3d 
7380: 25 35 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 28  %5d %7d %d\n", (
7390: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
73a0: 68 2c 20 67 6f 74 2c 0a 20 20 20 20 20 20 20 20  h, got,.        
73b0: 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d    last_page, TIM
73c0: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53  ER_ELAPSED);.  S
73d0: 45 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28  EEK(0);.  /* if(
73e0: 20 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30   got<0 ) got = 0
73f0: 3b 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d  ; */.  if( got==
7400: 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
7410: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7420: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7430: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
7440: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74   }.}../*.** Writ
7450: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
7460: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
7470: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
7480: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
7490: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
74a0: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
74b0: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
74c0: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 4f   int unixWrite(O
74d0: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
74e0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
74f0: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f   amt){.  int wro
7500: 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
7510: 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
7520: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 53 69 6d  ( amt>0 );.  Sim
7530: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
7540: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53 69  ITE_IOERR);.  Si
7550: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
7560: 72 6f 72 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  ror;.  TIMER_STA
7570: 52 54 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  RT;.  while( amt
7580: 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 77  >0 && (wrote = w
7590: 72 69 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a  rite(((unixFile*
75a0: 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61  )id)->h, pBuf, a
75b0: 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
75c0: 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
75d0: 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
75e0: 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
75f0: 7d 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  }.  TIMER_END;. 
7600: 20 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20   TRACE5("WRITE  
7610: 20 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64   %-3d %5d %7d %d
7620: 5c 6e 22 2c 20 28 28 75 6e 69 78 46 69 6c 65 2a  \n", ((unixFile*
7630: 29 69 64 29 2d 3e 68 2c 20 77 72 6f 74 65 2c 0a  )id)->h, wrote,.
7640: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f 70            last_p
7650: 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  age, TIMER_ELAPS
7660: 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a  ED);.  SEEK(0);.
7670: 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
7680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7690: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
76a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
76b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
76c0: 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69 6e   read/write poin
76d0: 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a  ter in a file..*
76e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
76f0: 78 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xSeek(OsFile *id
7700: 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a 20  , i64 offset){. 
7710: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
7720: 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32   SEEK(offset/102
7730: 34 20 2b 20 31 29 3b 0a 23 69 66 64 65 66 20 53  4 + 1);.#ifdef S
7740: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
7750: 20 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61   offset ) Simula
7760: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a  teDiskfullError.
7770: 23 65 6e 64 69 66 0a 20 20 6c 73 65 65 6b 28 28  #endif.  lseek((
7780: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
7790: 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
77a0: 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  SET);.  return S
77b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
77c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
77d0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
77e0: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
77f0: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
7800: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
7810: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
7820: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
7830: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
7840: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
7850: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
7860: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
7870: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
7880: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
7890: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
78a0: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
78b0: 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
78c0: 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
78d0: 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
78e0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
78f0: 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
7900: 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
7910: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
7920: 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
7930: 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
7940: 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  sync.#endif.../*
7950: 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
7960: 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
7970: 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
7980: 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
7990: 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
79a0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
79b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
79c0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
79d0: 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
79e0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
79f0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
7a00: 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
7a10: 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
7a20: 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
7a30: 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
7a40: 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
7a50: 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
7a60: 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
7a70: 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
7a80: 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
7a90: 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
7aa0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
7ab0: 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
7ac0: 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
7ad0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
7ae0: 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
7af0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
7b00: 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
7b10: 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
7b20: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7b30: 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
7b40: 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
7b50: 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
7b60: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
7b70: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
7b80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
7b90: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
7ba0: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
7bb0: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
7bc0: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
7bd0: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
7be0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
7bf0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
7c00: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
7c10: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
7c20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
7c30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7c40: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
7c50: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
7c60: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
7c70: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
7c80: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
7c90: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
7ca0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
7cb0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
7cc0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
7cd0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
7ce0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7cf0: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
7d00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
7d10: 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  ..#ifdef F_FULLF
7d20: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
7d30: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
7d40: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
7d50: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
7d60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
7d70: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
7d80: 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64 2c  FULLSYNC failed,
7d90: 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f 72   try to do a nor
7da0: 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 20  mal fsync() */. 
7db0: 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
7dc0: 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65  sync(fd);..#else
7dd0: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
7de0: 46 5f 46 55 4c 4c 53 59 4e 43 29 20 2a 2f 0a 20  F_FULLSYNC) */. 
7df0: 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b   if( dataOnly ){
7e00: 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73  .    rc = fdatas
7e10: 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65  ync(fd);.  }else
7e20: 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
7e30: 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
7e40: 20 2f 2a 20 64 65 66 69 6e 65 64 28 46 5f 46 55   /* defined(F_FU
7e50: 4c 4c 46 53 59 4e 43 29 20 2a 2f 0a 23 65 6e 64  LLFSYNC) */.#end
7e60: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
7e70: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f  LITE_NO_SYNC) */
7e80: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
7e90: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
7ea0: 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
7eb0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
7ec0: 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
7ed0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
7ee0: 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
7ef0: 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
7f00: 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
7f10: 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
7f20: 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
7f30: 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
7f40: 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
7f50: 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
7f60: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
7f70: 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
7f80: 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
7f90: 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
7fa0: 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
7fb0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
7fc0: 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
7fd0: 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
7fe0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
7ff0: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
8000: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
8010: 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
8020: 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
8030: 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
8040: 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
8050: 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
8060: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
8070: 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
8080: 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
8090: 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
80a0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
80b0: 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
80c0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
80d0: 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
80e0: 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
80f0: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
8100: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
8110: 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
8120: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
8130: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
8140: 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
8150: 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
8160: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
8170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8180: 6e 69 78 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  nixSync(OsFile *
8190: 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  id, int dataOnly
81a0: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
81b0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
81c0: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
81d0: 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
81e0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
81f0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43  E_IOERR);.  TRAC
8200: 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64  E2("SYNC    %-3d
8210: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
8220: 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63    if( full_fsync
8230: 28 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  (pFile->h, pFile
8240: 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61 74 61  ->fullSync, data
8250: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
8260: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8270: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
8280: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
8290: 20 20 20 54 52 41 43 45 32 28 22 44 49 52 53 59     TRACE2("DIRSY
82a0: 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c  NC %-3d\n", pFil
82b0: 65 2d 3e 64 69 72 66 64 29 3b 0a 23 69 66 6e 64  e->dirfd);.#ifnd
82c0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
82d0: 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 69 66  E_DIRSYNC.    if
82e0: 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  ( full_fsync(pFi
82f0: 6c 65 2d 3e 64 69 72 66 64 2c 20 70 46 69 6c 65  le->dirfd, pFile
8300: 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 30 29 20 29  ->fullSync, 0) )
8310: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8320: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8330: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8340: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
8350: 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  fd);  /* Only ne
8360: 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
8370: 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69   so close the di
8380: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70  rectory */.    p
8390: 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31  File->dirfd = -1
83a0: 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20  ;    /* when we 
83b0: 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d  are done. */.  }
83c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
83d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
83e0: 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
83f0: 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20   zDirname. This 
8400: 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70  is a no-op on op
8410: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
8420: 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e  other.** than UN
8430: 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  IX..**.** This i
8440: 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
8450: 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ure the master j
8460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
8470: 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65  truely been dele
8480: 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61  ted.** before ma
8490: 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20  king changes to 
84a0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
84b0: 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64  als on a multi-d
84c0: 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a  atabase commit..
84d0: 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** The F_FULLFSY
84e0: 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74  NC option is not
84f0: 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f   needed here..*/
8500: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
8510: 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f  SyncDirectory(co
8520: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61  nst char *zDirna
8530: 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
8540: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
8550: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
8560: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
8570: 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a  nt fd;.  int r;.
8580: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
8590: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
85a0: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69  .  fd = open(zDi
85b0: 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
85c0: 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
85d0: 54 52 41 43 45 33 28 22 44 49 52 53 59 4e 43 20  TRACE3("DIRSYNC 
85e0: 25 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66 64  %-3d (%s)\n", fd
85f0: 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69  , zDirname);.  i
8600: 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
8610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
8620: 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20  TOPEN; .  }.  r 
8630: 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 63  = fsync(fd);.  c
8640: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 72 65 74 75  lose(fd);.  retu
8650: 72 6e 20 28 28 72 3d 3d 30 29 3f 53 51 4c 49 54  rn ((r==0)?SQLIT
8660: 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 49 4f 45 52  E_OK:SQLITE_IOER
8670: 52 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  R);.#endif.}../*
8680: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
8690: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
86a0: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
86b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
86c0: 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20  Truncate(OsFile 
86d0: 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
86e0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
86f0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
8700: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
8710: 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 72 75 6e  ;.  return ftrun
8720: 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a  cate(((unixFile*
8730: 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 29 3d  )id)->h, nByte)=
8740: 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  =0 ? SQLITE_OK :
8750: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d   SQLITE_IOERR;.}
8760: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
8770: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
8780: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
8790: 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
87a0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
87b0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
87c0: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 73 74 72 75   *pSize){.  stru
87d0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
87e0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53  ssert( id );.  S
87f0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
8800: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
8810: 69 66 28 20 66 73 74 61 74 28 28 28 75 6e 69 78  if( fstat(((unix
8820: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62  File*)id)->h, &b
8830: 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  uf)!=0 ){.    re
8840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8850: 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  R;.  }.  *pSize 
8860: 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20  = buf.st_size;. 
8870: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8880: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
8890: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
88a0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
88b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
88c0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
88d0: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
88e0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
88f0: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
8900: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
8910: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
8920: 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ro.  If the file
8930: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20   is unlocked or 
8940: 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45  holds only SHARE
8950: 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a  D locks, then.**
8960: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f   return zero..*/
8970: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8980: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
8990: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  k(OsFile *id){. 
89a0: 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e   int r = 0;.  un
89b0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
89c0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
89d0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
89e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  );.  sqlite3OsEn
89f0: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
8a00: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
8a10: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
8a20: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
8a30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
8a40: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
8a50: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
8a60: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
8a70: 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  f( pFile->pLock-
8a80: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
8a90: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d  _LOCK ){.    r =
8aa0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
8ab0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
8ac0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
8ad0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
8ae0: 0a 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20 20  .  if( !r ){.   
8af0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
8b00: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
8b10: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
8b20: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
8b30: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
8b40: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
8b50: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
8b60: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
8b70: 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46 69  K;.    fcntl(pFi
8b80: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
8b90: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
8ba0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
8bb0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20  NLCK ){.      r 
8bc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
8bd0: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61   .  sqlite3OsLea
8be0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41  veMutex();.  TRA
8bf0: 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE3("TEST WR-LOC
8c00: 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c  K %d %d\n", pFil
8c10: 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74  e->h, r);..  ret
8c20: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
8c30: 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
8c40: 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
8c50: 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
8c60: 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
8c70: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
8c80: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
8c90: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
8ca0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
8cb0: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
8cc0: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
8cd0: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
8ce0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
8cf0: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
8d00: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
8d10: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
8d20: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
8d30: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
8d40: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
8d50: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
8d60: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
8d70: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
8d80: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
8d90: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
8da0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
8db0: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
8dc0: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
8dd0: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
8de0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
8df0: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
8e00: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
8e10: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
8e20: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
8e30: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
8e40: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
8e50: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
8e60: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
8e70: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
8e80: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
8e90: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
8ea0: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
8eb0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
8ec0: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
8ed0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
8ee0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
8ef0: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
8f00: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
8f10: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
8f20: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
8f30: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
8f40: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
8f50: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
8f60: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
8f70: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a   locktype){.  /*
8f80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
8f90: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
8fa0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
8fb0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
8fc0: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
8fd0: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
8fe0: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
8ff0: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
9000: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
9010: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
9020: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
9030: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
9040: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
9050: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
9060: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
9070: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
9080: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
9090: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
90a0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
90b0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
90c0: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
90d0: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
90e0: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
90f0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
9100: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
9110: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
9120: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
9130: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
9140: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
9150: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
9160: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
9170: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
9180: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
9190: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
91a0: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
91b0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
91c0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
91d0: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
91e0: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
91f0: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
9200: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
9210: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
9220: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
9230: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
9240: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
9250: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
9260: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
9270: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
9280: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
9290: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
92a0: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
92b0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
92c0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
92d0: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
92e0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
92f0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
9300: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
9310: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
9320: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
9330: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
9340: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
9350: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
9360: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
9370: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
9380: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
9390: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
93a0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
93b0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
93c0: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
93d0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
93e0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
93f0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
9400: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
9410: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
9420: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
9430: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
9440: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
9450: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
9460: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
9470: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
9480: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
9490: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
94a0: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
94b0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
94c0: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
94d0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
94e0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
94f0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
9500: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
9510: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
9520: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
9530: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
9540: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
9550: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
9560: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
9570: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
9580: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
9590: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
95a0: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
95b0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
95c0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
95d0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
95e0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
95f0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
9600: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
9610: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
9620: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
9630: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
9640: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
9650: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
9660: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
9670: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
9680: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
9690: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
96a0: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
96b0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
96c0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
96d0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
96e0: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
96f0: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
9700: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
9710: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
9720: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
9730: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
9740: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
9750: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
9760: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
9770: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
9780: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
9790: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
97a0: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
97b0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
97c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
97d0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
97e0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
97f0: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
9800: 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69  nfo *pLock = pFi
9810: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  le->pLock;.  str
9820: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
9830: 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65    int s;..  asse
9840: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54  rt( pFile );.  T
9850: 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25  RACE7("LOCK    %
9860: 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
9870: 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  d) pid=%d\n", pF
9880: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f  ile->h,.      lo
9890: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
98a0: 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  ype), locktypeNa
98b0: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
98c0: 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  pe),.      lockt
98d0: 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c  ypeName(pLock->l
98e0: 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d  ocktype), pLock-
98f0: 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29  >cnt , getpid())
9900: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
9910: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
9920: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
9930: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
9940: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
9950: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
9960: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
9970: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
9980: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
9990: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
99a0: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
99b0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
99c0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
99d0: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
99e0: 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 33 28  e ){.    TRACE3(
99f0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
9a00: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
9a10: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
9a20: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
9a30: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
9a40: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
9a50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
9a60: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
9a70: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
9a80: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
9a90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
9aa0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
9ab0: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
9ac0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
9ad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
9ae0: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
9af0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9b00: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
9b10: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
9b20: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
9b30: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
9b40: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
9b50: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
9b60: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
9b70: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
9b80: 61 64 73 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ads.  */.  sqlit
9b90: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
9ba0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
9bb0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
9bc0: 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
9bd0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ile..  */.  rc =
9be0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
9bf0: 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
9c00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9c10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
9c20: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
9c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9c40: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
9c50: 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  >pLock;..  /* If
9c60: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
9c70: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
9c80: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
9c90: 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20  ferent OsFile*. 
9ca0: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
9cb0: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
9cc0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
9cd0: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
9ce0: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f    if( (pFile->lo
9cf0: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
9d00: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
9d10: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
9d20: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
9d30: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
9d40: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
9d50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
9d60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
9d70: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
9d80: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
9d90: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
9da0: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
9db0: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
9dc0: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
9dd0: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
9de0: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
9df0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
9e00: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
9e10: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
9e20: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
9e30: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
9e40: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
9e50: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
9e60: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9e70: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
9e80: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
9e90: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
9ea0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
9eb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
9ed0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  e->locktype==0 )
9ee0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
9ef0: 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20  ock->cnt>0 );.  
9f00: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
9f10: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
9f20: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
9f30: 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  +;.    pFile->pO
9f40: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
9f50: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
9f60: 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  }..  lock.l_l
9f70: 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b  en = 1L;..  lock
9f80: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
9f90: 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45  _SET;..  /* A PE
9fa0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
9fb0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
9fc0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
9fd0: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
9fe0: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
9ff0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
a000: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
a010: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
a020: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
a030: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
a040: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
a050: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
a060: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
a070: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
a080: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
a090: 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
a0a0: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
a0b0: 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65  type = (locktype
a0c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
a0d0: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
a0e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
a0f0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
a100: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
a110: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a120: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
a130: 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ( s ){.      rc 
a140: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
a150: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
a160: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
a170: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
a180: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
a190: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
a1a0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
a1b0: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
a1c0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
a1d0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
a1e0: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
a1f0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
a200: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
a210: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
a220: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
a230: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
a240: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
a250: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
a260: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
a270: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
a280: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
a290: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a2a0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
a2b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
a2c0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
a2d0: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a2e0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a2f0: 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ck);..    /* Dro
a300: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
a310: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
a320: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
a330: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
a340: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
a350: 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  = 1L;.    lock.l
a360: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
a370: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
a380: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
a390: 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20  , &lock)!=0 ){. 
a3a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a3b0: 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73  _IOERR;  /* This
a3c0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
a3d0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f  ppen */.      go
a3e0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
a3f0: 20 7d 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a   }.    if( s ){.
a400: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
a410: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
a420: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
a430: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
a440: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
a450: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
a460: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
a470: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
a480: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63  ck++;.      pLoc
a490: 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20  k->cnt = 1;.    
a4a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
a4b0: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
a4c0: 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d  E_LOCK && pLock-
a4d0: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  >cnt>1 ){.    /*
a4e0: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
a4f0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
a500: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
a510: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
a520: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
a530: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
a540: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
a550: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
a560: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
a570: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
a580: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
a590: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
a5a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
a5b0: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
a5c0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
a5d0: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
a5e0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
a5f0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
a600: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
a610: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
a620: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
a630: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a640: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a650: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
a660: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52   ){.      case R
a670: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20  ESERVED_LOCK:.  
a680: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
a690: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
a6a0: 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  TE;.        brea
a6b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58  k;.      case EX
a6c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20  CLUSIVE_LOCK:.  
a6d0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
a6e0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
a6f0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
a700: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a710: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IZE;.        bre
a720: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
a730: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
a740: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
a750: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a760: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a770: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29  ck);.    if( s )
a780: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
a790: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
a7a0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
a7b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a7c0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
a7d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a7e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a7f0: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a800: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
a810: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a820: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
a830: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
a840: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
a850: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
a860: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
a870: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a880: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
a890: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
a8a0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
a8b0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 34 28  tex();.  TRACE4(
a8c0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
a8d0: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
a8e0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
a8f0: 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72  ktype), .      r
a900: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
a910: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
a920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a930: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
a940: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
a950: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
a960: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
a970: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
a980: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
a990: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
a9a0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
a9b0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
a9c0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
a9d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
a9e0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
a9f0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
aa00: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
aa10: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
aa20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
aa30: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
aa40: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
aa50: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
aa60: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
aa70: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
aa80: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
aa90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
aaa0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
aab0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
aac0: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
aad0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41  ( pFile );.  TRA
aae0: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
aaf0: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
ab00: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
ab10: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
ab20: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ab30: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
ab40: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ock->locktype, p
ab50: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
ab60: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
ab70: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
ab80: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
ab90: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
aba0: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
abb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
abc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
abd0: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
abe0: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
abf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ac00: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
ac10: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
ac20: 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46  ();.  pLock = pF
ac30: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73  ile->pLock;.  as
ac40: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
ac50: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
ac60: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
ac70: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ac80: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
ac90: 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e  ocktype==pFile->
aca0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
acb0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
acc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
acd0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
ace0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
acf0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
ad00: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
ad10: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ad20: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ad30: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ad40: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
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 21 3d 30 20 29 7b 0a 20 20 20  &lock)!=0 ){.   
ad80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
ad90: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
ada0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
adb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
adc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
add0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ade0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
adf0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
ae00: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
ae10: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
ae20: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
ae30: 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73  l_len = 2L;  ass
ae40: 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54  ert( PENDING_BYT
ae50: 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59  E+1==RESERVED_BY
ae60: 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63  TE );.    if( fc
ae70: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
ae80: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30  SETLK, &lock)==0
ae90: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   ){.      pLock-
aea0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
aeb0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
aec0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
aed0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 20 2f 2a  QLITE_IOERR;  /*
aee0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
aef0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
af00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63   }.  }.  if( loc
af10: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
af20: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65  {.    struct ope
af30: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20  nCnt *pOpen;..  
af40: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
af50: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
af60: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
af70: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
af80: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
af90: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
afa0: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
afb0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
afc0: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
afd0: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
afe0: 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  */.    pLock->cn
aff0: 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  t--;.    if( pLo
b000: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  ck->cnt==0 ){.  
b010: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
b020: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
b030: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
b040: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
b050: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b060: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
b070: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
b080: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b090: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  LK, &lock)==0 ){
b0a0: 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  .        pLock->
b0b0: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
b0c0: 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
b0d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
b0e0: 4c 49 54 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20  LITE_IOERR;  /* 
b0f0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
b100: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
b110: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
b120: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
b130: 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61  count of locks a
b140: 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65  gainst this same
b150: 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65   file.  When the
b160: 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65  .    ** count re
b170: 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73  aches zero, clos
b180: 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65  e any other file
b190: 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f   descriptors who
b1a0: 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  se close.    ** 
b1b0: 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63  was deferred bec
b1c0: 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64  ause of outstand
b1d0: 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a  ing locks..    *
b1e0: 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46  /.    pOpen = pF
b1f0: 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20  ile->pOpen;.    
b200: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  pOpen->nLock--;.
b210: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65      assert( pOpe
b220: 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  n->nLock>=0 );. 
b230: 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c     if( pOpen->nL
b240: 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d  ock==0 && pOpen-
b250: 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20  >nPending>0 ){. 
b260: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b270: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70    for(i=0; i<pOp
b280: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b  en->nPending; i+
b290: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  +){.        clos
b2a0: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
b2b0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[i]);.      }. 
b2c0: 20 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d       free(pOpen-
b2d0: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
b2e0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
b2f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
b300: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
b310: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
b320: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
b330: 78 28 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  x();.  pFile->lo
b340: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
b350: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
b360: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
b370: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b380: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 4f   int unixClose(O
b390: 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20  sFile **pId){.  
b3a0: 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28  unixFile *id = (
b3b0: 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
b3c0: 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
b3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b3e0: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64   unixUnlock(*pId
b3f0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  , NO_LOCK);.  if
b400: 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
b410: 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
b420: 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
b430: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
b440: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
b450: 20 69 66 28 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e   if( id->pOpen->
b460: 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20  nLock ){.    /* 
b470: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
b480: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
b490: 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
b4a0: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
b4b0: 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62  ust.    ** yet b
b4c0: 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
b4d0: 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f  d clear those lo
b4e0: 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61  cks.  Instead, a
b4f0: 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  dd the file.    
b500: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
b510: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
b520: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
b530: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
b540: 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74  ed when.    ** t
b550: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
b560: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  cleared..    */.
b570: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20      int *aNew;. 
b580: 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e     struct openCn
b590: 74 20 2a 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70  t *pOpen = id->p
b5a0: 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d  Open;.    aNew =
b5b0: 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d   realloc( pOpen-
b5c0: 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65  >aPending, (pOpe
b5d0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73  n->nPending+1)*s
b5e0: 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20  izeof(int) );.  
b5f0: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
b600: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  .      /* If a m
b610: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73  alloc fails, jus
b620: 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  t leak the file 
b630: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
b640: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b650: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
b660: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70   aNew;.      pOp
b670: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
b680: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
b690: 69 64 2d 3e 68 3b 0a 20 20 20 20 20 20 70 4f 70  id->h;.      pOp
b6a0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a  en->nPending++;.
b6b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b6c0: 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
b6d0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  no outstanding l
b6e0: 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63  ocks so we can c
b6f0: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d  lose the file im
b700: 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20  mediately */.   
b710: 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
b720: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b   }.  releaseLock
b730: 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b  Info(id->pLock);
b740: 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e  .  releaseOpenCn
b750: 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20  t(id->pOpen);.. 
b760: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
b770: 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73  utex();.  id->is
b780: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43  Open = 0;.  TRAC
b790: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
b7a0: 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f  \n", id->h);.  O
b7b0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
b7c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 69 64 29    sqliteFree(id)
b7d0: 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
b7e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  ;.}../*.** Turn 
b800: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
b810: 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
b820: 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
b830: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
b840: 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  o the full pathn
b850: 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70  ame stored in sp
b860: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
b870: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
b880: 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
b890: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
b8a0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
b8b0: 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20  eing this space 
b8c0: 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  once it.** is no
b8d0: 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a   longer needed..
b8e0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
b8f0: 55 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  UnixFullPathname
b900: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
b910: 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20  lative){.  char 
b920: 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66  *zFull = 0;.  if
b930: 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
b940: 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
b950: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75  e3SetString(&zFu
b960: 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28  ll, zRelative, (
b970: 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73  char*)0);.  }els
b980: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75  e{.    char *zBu
b990: 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  f = sqliteMalloc
b9a0: 28 35 30 30 30 29 3b 0a 20 20 20 20 69 66 28 20  (5000);.    if( 
b9b0: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
b9c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
b9d0: 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30  .    zBuf[0] = 0
b9e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
b9f0: 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67  String(&zFull, g
ba00: 65 74 63 77 64 28 7a 42 75 66 2c 20 35 30 30 30  etcwd(zBuf, 5000
ba10: 29 2c 20 22 2f 22 2c 20 7a 52 65 6c 61 74 69 76  ), "/", zRelativ
ba20: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
ba30: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
ba40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
ba50: 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (zBuf);.  }.  re
ba60: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f  turn zFull;.}../
ba70: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ba80: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75 6c  value of the ful
ba90: 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20 74 68  lsync flag in th
baa0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
bab0: 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
bac0: 69 63 20 76 6f 69 64 20 75 6e 69 78 53 65 74 46  ic void unixSetF
bad0: 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  ullSync(OsFile *
bae0: 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20 28 28  id, int v){.  ((
baf0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66  unixFile*)id)->f
bb00: 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a  ullSync = v;.}..
bb10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
bb20: 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
bb30: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f   handle for an O
bb40: 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  sFile.*/.static 
bb50: 69 6e 74 20 75 6e 69 78 46 69 6c 65 48 61 6e 64  int unixFileHand
bb60: 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  le(OsFile *id){.
bb70: 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78 46    return ((unixF
bb80: 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a  ile*)id)->h;.}..
bb90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
bba0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 6e 64  integer that ind
bbb0: 69 63 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ices the type of
bbc0: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
bbd0: 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69 73 20  held.** by this 
bbe0: 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64 20 66  handle.  (Used f
bbf0: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
bc00: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a  nalysis only.).*
bc10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
bc20: 78 4c 6f 63 6b 53 74 61 74 65 28 4f 73 46 69 6c  xLockState(OsFil
bc30: 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
bc40: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
bc50: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f  ->locktype;.}../
bc60: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
bc70: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
bc80: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
bc90: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
bca0: 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e  OsFile.** for un
bcb0: 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ix..*/.static co
bcc0: 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
bcd0: 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
bce0: 20 3d 20 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65   = {.  unixClose
bcf0: 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65  ,.  unixOpenDire
bd00: 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78 52 65 61  ctory,.  unixRea
bd10: 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  d,.  unixWrite,.
bd20: 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e    unixSeek,.  un
bd30: 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e  ixTruncate,.  un
bd40: 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65  ixSync,.  unixSe
bd50: 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69  tFullSync,.  uni
bd60: 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75  xFileHandle,.  u
bd70: 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75  nixFileSize,.  u
bd80: 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55  nixLock,.  unixU
bd90: 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63  nlock,.  unixLoc
bda0: 6b 53 74 61 74 65 2c 0a 20 20 75 6e 69 78 43 68  kState,.  unixCh
bdb0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
bdc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .};../*.** Alloc
bdd0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
bde0: 20 75 6e 69 78 46 69 6c 65 2e 20 20 49 6e 69 74   unixFile.  Init
bdf0: 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77 20 75  ialize the new u
be00: 6e 69 78 46 69 6c 65 0a 2a 2a 20 74 6f 20 74 68  nixFile.** to th
be10: 65 20 76 61 6c 75 65 20 67 69 76 65 6e 20 69 6e  e value given in
be20: 20 70 49 6e 69 74 20 61 6e 64 20 72 65 74 75 72   pInit and retur
be30: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
be40: 68 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69 6c 65  he new.** OsFile
be50: 2e 20 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74  .  If we run out
be60: 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73   of memory, clos
be70: 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72  e the file and r
be80: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
be90: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
bea0: 74 65 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  teUnixFile(unixF
beb0: 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69  ile *pInit, OsFi
bec0: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69  le **pId){.  uni
bed0: 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70  xFile *pNew;.  p
bee0: 49 6e 69 74 2d 3e 64 69 72 66 64 20 3d 20 2d 31  Init->dirfd = -1
bef0: 3b 0a 20 20 70 49 6e 69 74 2d 3e 66 75 6c 6c 53  ;.  pInit->fullS
bf00: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 49 6e 69 74  ync = 0;.  pInit
bf10: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
bf20: 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 70    SET_THREADID(p
bf30: 49 6e 69 74 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Init);.  pNew = 
bf40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
bf50: 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 20 29  zeof(unixFile) )
bf60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
bf70: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 70 49 6e  ){.    close(pIn
bf80: 69 74 2d 3e 68 29 3b 0a 20 20 20 20 73 71 6c 69  it->h);.    sqli
bf90: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
bfa0: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
bfb0: 63 6b 49 6e 66 6f 28 70 49 6e 69 74 2d 3e 70 4c  ckInfo(pInit->pL
bfc0: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
bfd0: 65 4f 70 65 6e 43 6e 74 28 70 49 6e 69 74 2d 3e  eOpenCnt(pInit->
bfe0: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
bff0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
c000: 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30 3b  );.    *pId = 0;
c010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c020: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
c030: 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20 2a  e{.    *pNew = *
c040: 70 49 6e 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d  pInit;.    pNew-
c050: 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
c060: 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  te3UnixIoMethod;
c070: 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46  .    *pId = (OsF
c080: 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f  ile*)pNew;.    O
c090: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
c0a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c0b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65  E_OK;.  }.}...#e
c0c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c0d0: 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a  MIT_DISKIO */./*
c0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76  **********.** Ev
c130: 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20 64  erything above d
c140: 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20 49  eals with file I
c150: 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20  /O.  Everything 
c160: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65 61  that follows dea
c170: 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65 72  ls.** with other
c180: 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61 73   miscellanous as
c190: 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65  pects of the ope
c1a0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
c1b0: 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  terface.********
c1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c1e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c1f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c200: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ****/.../*.** Ge
c210: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  t information to
c220: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   seed the random
c230: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
c240: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20  r.  The seed.** 
c250: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
c260: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b  the buffer zBuf[
c270: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69  256].  The calli
c280: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
c290: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66  .** supply a suf
c2a0: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20  ficiently large 
c2b0: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  buffer..*/.int s
c2c0: 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64 6f 6d  qlite3UnixRandom
c2d0: 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29  Seed(char *zBuf)
c2e0: 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  {.  /* We have t
c2f0: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
c300: 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
c310: 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
c320: 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
c330: 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
c340: 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
c350: 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
c360: 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
c370: 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
c380: 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
c390: 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
c3a0: 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
c3b0: 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
c3c0: 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
c3d0: 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
c3e0: 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
c3f0: 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
c400: 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
c410: 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
c420: 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
c430: 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
c440: 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
c450: 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
c460: 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
c470: 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
c480: 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
c490: 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
c4a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
c4b0: 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
c4c0: 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
c4d0: 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
c4e0: 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
c4f0: 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
c500: 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
c510: 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
c520: 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
c530: 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
c540: 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
c550: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
c560: 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69 66 20  f, 0, 256);.#if 
c570: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c580: 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
c590: 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
c5a0: 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75  d = open("/dev/u
c5b0: 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
c5c0: 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  Y);.    if( fd<0
c5d0: 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
c5e0: 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
c5f0: 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
c600: 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
c610: 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
c620: 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
c630: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
c640: 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c  sizeof(time_t)],
c650: 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
c660: 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  d));.    }else{.
c670: 20 20 20 20 20 20 72 65 61 64 28 66 64 2c 20 7a        read(fd, z
c680: 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20 20 20  Buf, 256);.     
c690: 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20   close(fd);.    
c6a0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
c6b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
c6d0: 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
c6e0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
c6f0: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
c700: 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
c710: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
c720: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
c730: 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
c740: 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  leep..*/.int sql
c750: 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28 69 6e  ite3UnixSleep(in
c760: 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66 69 6e  t ms){.#if defin
c770: 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
c780: 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
c790: 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30 29   usleep(ms*1000)
c7a0: 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a 23  ;.  return ms;.#
c7b0: 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d 73  else.  sleep((ms
c7c0: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 72  +999)/1000);.  r
c7d0: 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73 2b  eturn 1000*((ms+
c7e0: 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e 64  999)/1000);.#end
c7f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74  if.}../*.** Stat
c800: 69 63 20 76 61 72 69 61 62 6c 65 73 20 75 73 65  ic variables use
c810: 64 20 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e  d for thread syn
c820: 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a  chronization.*/.
c830: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74  static int inMut
c840: 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ex = 0;.#ifdef S
c850: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
c860: 44 53 0a 73 74 61 74 69 63 20 70 74 68 72 65 61  DS.static pthrea
c870: 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65 72 3b 0a  d_t mutexOwner;.
c880: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
c890: 75 74 65 78 5f 74 20 6d 75 74 65 78 31 20 3d 20  utex_t mutex1 = 
c8a0: 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
c8b0: 49 54 49 41 4c 49 5a 45 52 3b 0a 73 74 61 74 69  ITIALIZER;.stati
c8c0: 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
c8d0: 74 20 6d 75 74 65 78 32 20 3d 20 50 54 48 52 45  t mutex2 = PTHRE
c8e0: 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
c8f0: 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  IZER;.#endif../*
c900: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
c910: 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e  g pair of routin
c920: 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75  e implement mutu
c930: 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72  al exclusion for
c940: 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  .** multi-thread
c950: 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f  ed processes.  O
c960: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72  nly a single thr
c970: 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ead is allowed t
c980: 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f  o.** executed co
c990: 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72 6f  de that is surro
c9a0: 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75  unded by EnterMu
c9b0: 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d  tex() and LeaveM
c9c0: 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  utex()..**.** SQ
c9d0: 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61  Lite uses only a
c9e0: 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20   single Mutex.  
c9f0: 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  There is not muc
ca00: 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f  h critical.** co
ca10: 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74  de and what litt
ca20: 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65 63  le there is exec
ca30: 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64  utes quickly and
ca40: 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e   without blockin
ca50: 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20 76  g..**.** As of v
ca60: 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74 68  ersion 3.3.2, th
ca70: 69 73 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65  is mutex must be
ca80: 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a 76   recursive..*/.v
ca90: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78 45  oid sqlite3UnixE
caa0: 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66  nterMutex(){.#if
cab0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
cac0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
cad0: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
cae0: 74 65 78 31 29 3b 0a 20 20 69 66 28 20 69 6e 4d  tex1);.  if( inM
caf0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 70  utex==0 ){.    p
cb00: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
cb10: 6b 28 26 6d 75 74 65 78 32 29 3b 0a 20 20 20 20  k(&mutex2);.    
cb20: 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20 70 74 68  mutexOwner = pth
cb30: 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 7d  read_self();.  }
cb40: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
cb50: 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 31 29  _unlock(&mutex1)
cb60: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 4d 75 74  ;.#endif.  inMut
cb70: 65 78 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ex++;.}.void sql
cb80: 69 74 65 33 55 6e 69 78 4c 65 61 76 65 4d 75 74  ite3UnixLeaveMut
cb90: 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ex(){.  assert( 
cba0: 69 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23 69 66  inMutex>0 );.#if
cbb0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
cbc0: 54 48 52 45 41 44 53 0a 20 20 61 73 73 65 72 74  THREADS.  assert
cbd0: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
cbe0: 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72  mutexOwner, pthr
cbf0: 65 61 64 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20  ead_self()) );. 
cc00: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
cc10: 6f 63 6b 28 26 6d 75 74 65 78 31 29 3b 0a 20 20  ock(&mutex1);.  
cc20: 69 6e 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  inMutex--;.  if(
cc30: 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20   inMutex==0 ){. 
cc40: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
cc50: 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 32 29  _unlock(&mutex2)
cc60: 3b 0a 20 20 7d 0a 20 20 70 74 68 72 65 61 64 5f  ;.  }.  pthread_
cc70: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
cc80: 74 65 78 31 29 3b 0a 23 65 6c 73 65 0a 20 20 69  tex1);.#else.  i
cc90: 6e 4d 75 74 65 78 2d 2d 3b 0a 23 65 6e 64 69 66  nMutex--;.#endif
cca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ccb0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 75 74   TRUE if the mut
ccc0: 65 78 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ex is currently 
ccd0: 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  held..**.** If t
cce0: 68 65 20 74 68 69 73 54 68 72 65 61 64 4f 6e 6c  he thisThreadOnl
ccf0: 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  y parameter is t
cd00: 72 75 65 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rue, return true
cd10: 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20   only if the.** 
cd20: 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 68  calling thread h
cd30: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 20  olds the mutex. 
cd40: 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
cd50: 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65 74 75  r is false, retu
cd60: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 61 6e  rn.** true if an
cd70: 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74  y thread holds t
cd80: 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74  he mutex..*/.int
cd90: 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e 4d 75   sqlite3UnixInMu
cda0: 74 65 78 28 69 6e 74 20 74 68 69 73 54 68 72 65  tex(int thisThre
cdb0: 61 64 4f 6e 6c 79 29 7b 0a 23 69 66 64 65 66 20  adOnly){.#ifdef 
cdc0: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
cdd0: 41 44 53 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d  ADS.  return inM
cde0: 75 74 65 78 3e 30 20 26 26 20 0a 20 20 20 20 20  utex>0 && .     
cdf0: 20 20 20 20 20 20 28 74 68 69 73 54 68 72 65 61        (thisThrea
ce00: 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 74 68 72  dOnly==0 || pthr
ce10: 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
ce20: 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
ce30: 6c 66 28 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20  lf()));.#else.  
ce40: 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30  return inMutex>0
ce50: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ce60: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e  * Remember the n
ce70: 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64 2d  umber of thread-
ce80: 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 62 6c  specific-data bl
ce90: 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  ocks allocated..
cea0: 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f 20 76  ** Use this to v
ceb0: 65 72 69 66 79 20 74 68 61 74 20 77 65 20 61 72  erify that we ar
cec0: 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20 74 68  e not leaking th
ced0: 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
cee0: 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  ta..** Ticket #1
cef0: 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  601.*/.#ifdef SQ
cf00: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
cf10: 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
cf20: 3d 20 30 3b 0a 23 20 69 66 64 65 66 20 53 51 4c  = 0;.# ifdef SQL
cf30: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
cf40: 0a 20 20 20 20 73 74 61 74 69 63 20 70 74 68 72  .    static pthr
cf50: 65 61 64 5f 6d 75 74 65 78 5f 74 20 74 73 64 5f  ead_mutex_t tsd_
cf60: 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 20 3d 20  counter_mutex = 
cf70: 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
cf80: 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20 20 20 64  ITIALIZER;.#   d
cf90: 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
cfa0: 52 28 4e 29 20 5c 0a 20 20 20 20 20 20 20 20 20  R(N) \.         
cfb0: 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
cfc0: 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  x_lock(&tsd_coun
cfd0: 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c 0a 20 20  ter_mutex); \.  
cfe0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
cff0: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20  e3_tsd_count += 
d000: 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  N; \.           
d010: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
d020: 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  unlock(&tsd_coun
d030: 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23 20 65 6c  ter_mutex);.# el
d040: 73 65 0a 23 20 20 20 64 65 66 69 6e 65 20 54 53  se.#   define TS
d050: 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 73 71  D_COUNTER(N)  sq
d060: 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
d070: 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a 23 65 6c  += N.# endif.#el
d080: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f  se.# define TSD_
d090: 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f 2a 20 6e  COUNTER(N)  /* n
d0a0: 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  o-op */.#endif..
d0b0: 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  /*.** If called 
d0c0: 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
d0d0: 67 3e 30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  g>0, then return
d0e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
d0f0: 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63  read.** specific
d100: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75   data for the cu
d110: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41  rrent thread.  A
d120: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f  llocate and zero
d130: 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73   the.** thread-s
d140: 70 65 63 69 66 69 63 20 64 61 74 61 20 69 66 20  pecific data if 
d150: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
d160: 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ady exist..**.**
d170: 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
d180: 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c  allocateFlag==0,
d190: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20   then check the 
d1a0: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a  current thread.*
d1b0: 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61 2e  * specific data.
d1c0: 20 20 52 65 74 75 72 6e 20 69 74 20 69 66 20 69    Return it if i
d1d0: 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 69 74  t exists.  If it
d1e0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
d1f0: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
d200: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  NULL..**.** If c
d210: 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63  alled with alloc
d220: 61 74 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b  ateFlag<0, check
d230: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
d240: 68 72 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a  hread specific.*
d250: 2a 20 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61  * data is alloca
d260: 74 65 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a  ted and is all z
d270: 65 72 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74  ero.  If it is t
d280: 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69  hen deallocate i
d290: 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  t..** Return a p
d2a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68  ointer to the th
d2b0: 72 65 61 64 20 73 70 65 63 69 66 69 63 20 64 61  read specific da
d2c0: 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74  ta or NULL if it
d2d0: 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74   is.** unallocat
d2e0: 65 64 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c  ed or gets deall
d2f0: 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61  ocated..*/.Threa
d300: 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33 55 6e  dData *sqlite3Un
d310: 69 78 54 68 72 65 61 64 53 70 65 63 69 66 69 63  ixThreadSpecific
d320: 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74  Data(int allocat
d330: 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63  eFlag){.  static
d340: 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
d350: 61 20 7a 65 72 6f 44 61 74 61 20 3d 20 7b 30 7d  a zeroData = {0}
d360: 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
d370: 72 20 74 6f 20 73 69 6c 65 6e 63 65 20 77 61 72  r to silence war
d380: 6e 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  nings.          
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b 65 6e 20   ** from broken 
d3c0: 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a 23 69 66  compilers */.#if
d3d0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
d3e0: 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
d3f0: 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74 20 6b   pthread_key_t k
d400: 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ey;.  static int
d410: 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20   keyInit = 0;.  
d420: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
d430: 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79 49 6e 69  ;..  if( !keyIni
d440: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
d450: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
d460: 20 20 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74      if( !keyInit
d470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
d480: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 68  ;.      rc = pth
d490: 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74 65 28  read_key_create(
d4a0: 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  &key, 0);.      
d4b0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d4c0: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
d4d0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
d4e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
d4f0: 20 7d 0a 20 20 20 20 20 20 6b 65 79 49 6e 69 74   }.      keyInit
d500: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
d510: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
d520: 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20 20 70 54  tex();.  }..  pT
d530: 73 64 20 3d 20 70 74 68 72 65 61 64 5f 67 65 74  sd = pthread_get
d540: 73 70 65 63 69 66 69 63 28 6b 65 79 29 3b 0a 20  specific(key);. 
d550: 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
d560: 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
d570: 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
d580: 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
d590: 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
d5a0: 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
d5b0: 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 73  qlite3OsMalloc(s
d5c0: 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 29  izeof(zeroData))
d5d0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
d5e0: 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
d5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
d600: 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  sFail = 0;.#endi
d610: 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64  f.      if( pTsd
d620: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73   ){.        *pTs
d630: 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20  d = zeroData;.  
d640: 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 73 65        pthread_se
d650: 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 70  tspecific(key, p
d660: 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20 54 53  Tsd);.        TS
d670: 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20  D_COUNTER(+1);. 
d680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d690: 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30  else if( pTsd!=0
d6a0: 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67   && allocateFlag
d6b0: 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  <0 .            
d6c0: 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20  && memcmp(pTsd, 
d6d0: 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f  &zeroData, sizeo
d6e0: 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d  f(ThreadData))==
d6f0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d700: 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20  OsFree(pTsd);.  
d710: 20 20 70 74 68 72 65 61 64 5f 73 65 74 73 70 65    pthread_setspe
d720: 63 69 66 69 63 28 6b 65 79 2c 20 30 29 3b 0a 20  cific(key, 0);. 
d730: 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d     TSD_COUNTER(-
d740: 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30  1);.    pTsd = 0
d750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
d760: 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 61  Tsd;.#else.  sta
d770: 74 69 63 20 54 68 72 65 61 64 44 61 74 61 20 2a  tic ThreadData *
d780: 70 54 73 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pTsd = 0;.  if( 
d790: 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29  allocateFlag>0 )
d7a0: 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d  {.    if( pTsd==
d7b0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
d7c0: 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f  sqlite3TestMallo
d7d0: 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20  cFail() ){.     
d7e0: 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65     pTsd = sqlite
d7f0: 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3OsMalloc( sizeo
d800: 66 28 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a 20  f(zeroData) );. 
d810: 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
d820: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
d830: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73 46 61      sqlite3_isFa
d840: 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
d850: 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29 7b       if( pTsd ){
d860: 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d  .        *pTsd =
d870: 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20   zeroData;.     
d880: 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
d890: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
d8a0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
d8b0: 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
d8c0: 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20 20 20  eFlag<0.        
d8d0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54      && memcmp(pT
d8e0: 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73  sd, &zeroData, s
d8f0: 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61  izeof(ThreadData
d900: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
d910: 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29  ite3OsFree(pTsd)
d920: 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
d930: 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
d940: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d950: 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a 7d  n pTsd;.#endif.}
d960: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
d970: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
d980: 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
d990: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
d9a0: 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
d9b0: 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
d9c0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
d9d0: 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
d9e0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
d9f0: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
da00: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
da10: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
da20: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
da30: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
da40: 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
da50: 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
da60: 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
da70: 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
da80: 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
da90: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
daa0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
dab0: 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
dac0: 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
dad0: 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
dae0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
daf0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
db00: 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  e3UnixCurrentTim
db10: 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  e(double *prNow)
db20: 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54  {.#ifdef NO_GETT
db30: 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  OD.  time_t t;. 
db40: 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
db50: 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20  Now = t/86400.0 
db60: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c  + 2440587.5;.#el
db70: 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
db80: 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73 74 72 75  val sNow;.  stru
db90: 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73 54 7a 3b  ct timezone sTz;
dba0: 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
dbb0: 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  .  gettimeofday(
dbc0: 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b 0a 20 20  &sNow, &sTz);.  
dbd0: 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38 37  *prNow = 2440587
dbe0: 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63  .5 + sNow.tv_sec
dbf0: 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e  /86400.0 + sNow.
dc00: 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30 30  tv_usec/86400000
dc10: 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23 69  000.0;.#endif.#i
dc20: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
dc30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
dc40: 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
dc50: 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69     *prNow = sqli
dc60: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
dc70: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
dc80: 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  87.5;.  }.#endif
dc90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
dca0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49  #endif /* OS_UNI
dcb0: 58 20 2a 2f 0a                                   X */.