/ Hex Artifact Content
Login

Artifact 38a55e51fb2c6f32c0ce86d274f5787f6c3668ed:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0230: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0240: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0250: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0260: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0270: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0280: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0290: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
02a0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
02b0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
02c0: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
02d0: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
02e0: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
02f0: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0300: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0310: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0320: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0330: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0340: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0350: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0360: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0370: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0380: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0390: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
03a0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
03b0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
03c0: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
03d0: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
03e0: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
03f0: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0400: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0410: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0420: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0430: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0440: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0450: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0460: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0470: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0480: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0490: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
04a0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
04b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
04c0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
04d0: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
04e0: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
04f0: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0500: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0520: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0530: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
0540: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
0550: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
0560: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
0570: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0580: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0590: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
05a0: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
05b0: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
05c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
05d0: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
05e0: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
05f0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0600: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
0610: 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66  to be thread-saf
0620: 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  e, include the p
0630: 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61  threads header a
0640: 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65  nd define.** the
0650: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
0660: 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  EADS macro..*/.#
0670: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
0680: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
0690: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
06a0: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
06b0: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
06c0: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
06d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
06e0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
06f0: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
0700: 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  file.*/.#ifndef 
0710: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0720: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  ILE_PERMISSIONS.
0730: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0740: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
0750: 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65  MISSIONS 0644.#e
0760: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif..../*.** Th
0770: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
0780: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
0790: 20 6f 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69   of OsFile speci
07a0: 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78  fic for the unix
07b0: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
07c0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
07d0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
07e0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
07f0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
0800: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0810: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
0820: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
0830: 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  try */.  struct 
0840: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  openCnt *pOpen; 
0850: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0860: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
0870: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
0880: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
0890: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49  o *pLock;   /* I
08a0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
08b0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
08c0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08e0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
08f0: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
0900: 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b  d char locktype;
0910: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
0920: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
0930: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
0940: 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70 65 6e  gned char isOpen
0950: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
0960: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6c 6f   needs to be clo
0970: 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  sed */.  unsigne
0980: 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e 63 3b  d char fullSync;
0990: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
09a0: 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61 62 6c  SYNC if availabl
09b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  e */.  int dirfd
09c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
09d0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
09e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
09f0: 63 74 6f 72 79 20 2a 2f 0a 23 69 66 64 65 66 20  ctory */.#ifdef 
0a00: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0a10: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0a20: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0a30: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0a40: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0a50: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0a70: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0a80: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0a90: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0aa0: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0ab0: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0ac0: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0ad0: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0ae0: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0af0: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0b00: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0b10: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0b20: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0b30: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0b40: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0b50: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0b60: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0b70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0b80: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0b90: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0ba0: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0bb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0bc0: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0bd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0be0: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0bf0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0c00: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0c10: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0c20: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0c30: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0c40: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0c50: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0c60: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0c70: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0c80: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0c90: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0ca0: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0cb0: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0cc0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0cd0: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0ce0: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0cf0: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0d00: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0d10: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0d20: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0d30: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0d40: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0d50: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0d60: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0d70: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0d80: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0d90: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0da0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0db0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0dc0: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0dd0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0de0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0df0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0e00: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0e10: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0e20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0e30: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0e40: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0e50: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0e60: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0e70: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
0e80: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
0e90: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
0ea0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
0eb0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
0ec0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
0ed0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
0ee0: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
0ef0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
0f00: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
0f10: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
0f20: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
0f30: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
0f40: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
0f50: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
0f60: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
0f70: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
0f80: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
0f90: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
0fa0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
0fb0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
0fc0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
0fd0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
0fe0: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
0ff0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1000: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
1010: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
1020: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
1030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
1040: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
1050: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
1060: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1070: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1080: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1090: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
10a0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
10b0: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
10c0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
10d0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
10e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
10f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1100: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
1110: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
1120: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
1130: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
1140: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
1150: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
1160: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1170: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1180: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1190: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
11a0: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
11b0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
11c0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
11d0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
11e0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
11f0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1200: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
1210: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
1220: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
1230: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1240: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
1250: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
1260: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1270: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1280: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1290: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
12a0: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
12b0: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
12c0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
12d0: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
12e0: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
12f0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1300: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
1310: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
1320: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
1330: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
1340: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
1350: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
1360: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1370: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1380: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1390: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
13a0: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
13b0: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
13c0: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
13d0: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
13e0: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
13f0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1400: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
1410: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
1420: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
1430: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
1440: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1450: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
1460: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1470: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1480: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1490: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
14a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
14b0: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
14c0: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
14d0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
14e0: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
1510: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
1520: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
1530: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
1540: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1550: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
1560: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1580: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1590: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
15a0: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
15b0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
15c0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
15d0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
15e0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
15f0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1600: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
1610: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
1620: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
1630: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
1640: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
1650: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
1660: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1670: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1680: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1690: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
16a0: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
16b0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
16c0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
16d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
16e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
16f0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1700: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
1710: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
1720: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
1730: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1740: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
1750: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
1760: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1770: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1780: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1790: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
17a0: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
17b0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
17c0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
17d0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
17e0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
17f0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1800: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
1810: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
1820: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
1830: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1840: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
1850: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
1860: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1870: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1880: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1890: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
18a0: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
18b0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
18c0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
18d0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
18e0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
18f0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1900: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1910: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1920: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1930: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1940: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1950: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1960: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1970: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1980: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1990: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
19a0: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
19b0: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
19c0: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
19d0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
19e0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
19f0: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1a00: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1a10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1a20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1a30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1a40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1a50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1a60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1a70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1a80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1a90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1aa0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1ab0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1ac0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1ad0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1ae0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1af0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1b00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1b10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1b20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1b30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1b40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1b50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1b60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1b70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1b80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1b90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1bb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1bc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1bd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1be0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1bf0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1c00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1c10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1c20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1c30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1c40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1c50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1c60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1c70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1c80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1c90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1ca0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1cb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1cc0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1cd0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1ce0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1cf0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1d00: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1d10: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1d20: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1d30: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1d40: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1d50: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1d60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1d70: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1d80: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1d90: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1da0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1db0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1dc0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1dd0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1de0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1df0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1e00: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1e10: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1e20: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1e30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1e40: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1e50: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1e60: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1e70: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1e80: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1e90: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1ea0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
1eb0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
1ec0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
1ed0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
1ee0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
1ef0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
1f00: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1f10: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1f20: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1f30: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1f40: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1f50: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1f60: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1f70: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1f80: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1f90: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1fa0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
1fb0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
1fc0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
1fd0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
1fe0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
1ff0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2000: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
2010: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
2020: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
2030: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
2040: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
2050: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
2060: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2070: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2080: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2090: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
20a0: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
20b0: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
20c0: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
20d0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
20e0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
20f0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2100: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
2110: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
2120: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
2130: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
2140: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
2150: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2160: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2170: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2180: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2190: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
21a0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
21b0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
21c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
21e0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
21f0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2210: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
2220: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
2230: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
2240: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
2250: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
2260: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2270: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2280: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2290: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
22a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
22b0: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
22c0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
22d0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
22e0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
22f0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2310: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
2320: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
2330: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
2340: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2350: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
2360: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2370: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2380: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2390: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
23a0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
23b0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
23c0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
23d0: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
23e0: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
23f0: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2400: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
2410: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
2420: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
2430: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
2440: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
2450: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
2460: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2470: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2480: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2490: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
24a0: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
24b0: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
24c0: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
24d0: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
24e0: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
24f0: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2500: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
2510: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
2520: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2530: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
2540: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
2550: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
2560: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2570: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2580: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2590: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
25a0: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
25b0: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
25c0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
25d0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
25e0: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
25f0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2600: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
2610: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
2620: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
2630: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
2640: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
2650: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
2660: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2670: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2680: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2690: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
26a0: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
26b0: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
26c0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
26d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
26e0: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
26f0: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2700: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
2710: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
2720: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
2730: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
2740: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
2750: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
2760: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2770: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2780: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2790: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
27a0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
27b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
27c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
27d0: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
27e0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
27f0: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2800: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2810: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
2820: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
2830: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
2840: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
2850: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
2860: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2870: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2880: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2890: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
28a0: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
28b0: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
28c0: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
28d0: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
28e0: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
28f0: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2900: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2910: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2920: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2930: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2940: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2950: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2960: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2970: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2980: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2990: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
29a0: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
29b0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29c0: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
29d0: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
29e0: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
29f0: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2a00: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2a10: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2a20: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2a30: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2a40: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2a50: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2a60: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2a70: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2a80: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2a90: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2aa0: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2ab0: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2ac0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2af0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2b00: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2b10: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2b20: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2b30: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2b40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2b50: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2b60: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2b70: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2b80: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2b90: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2ba0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2bb0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2bc0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2bd0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2be0: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2bf0: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2c00: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2c10: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2c20: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2c30: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2c40: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2c50: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2c60: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2c70: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2c80: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2c90: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2ca0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2cb0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2cc0: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2cd0: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2ce0: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2d10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d40: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2d50: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2d60: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2d70: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2d80: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2d90: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2da0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2db0: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2dc0: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2dd0: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2de0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2df0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2e00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2e10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2e20: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2e30: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2e60: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2e70: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2e80: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2e90: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
2ea0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2eb0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2ec0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2ed0: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2ee0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2ef0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f10: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2f20: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2f30: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2f40: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2f50: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2f60: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2f70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2f80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2fa0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fe0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2ff0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3000: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
3010: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
3020: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
3030: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
3040: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
3050: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
3060: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3070: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3080: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3090: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
30a0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
30b0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
30c0: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
30d0: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
30e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
30f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3100: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
3110: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
3120: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
3130: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
3140: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
3150: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3160: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3170: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3180: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3190: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
31a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
31b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
31c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
31d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
31e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
31f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3200: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
3210: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
3220: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
3230: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
3240: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
3250: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3260: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3280: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3290: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
32a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
32b0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
32c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
32d0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
32e0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
32f0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3300: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
3310: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
3320: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
3330: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
3340: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
3350: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
3360: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3370: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3380: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3390: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
33a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
33b0: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
33c0: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
33d0: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
33e0: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
33f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3400: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
3410: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
3420: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
3430: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
3440: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
3450: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c  lockHash = { SQL
3460: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
3480: 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70  ;.static Hash op
3490: 65 6e 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  enHash = { SQLIT
34a0: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
34b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
34c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34d0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a  UNIX_THREADS./*.
34e0: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
34f0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3500: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
3510: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
3520: 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b  h others.** lock
3530: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  s..**.**    0:  
3540: 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  No.  Threads can
3550: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
3560: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
3570: 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20  **    1:  Yes.  
3580: 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  Threads can over
3590: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
35a0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a   locks..**   -1:
35b0: 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20    We don't know 
35c0: 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  yet..**.** This 
35d0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
35e0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
35f0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
3600: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
3610: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
3620: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
3630: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
3640: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
3650: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
3660: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
3670: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
3680: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
3690: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
36a0: 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61  E_TEST.int threa
36b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
36c0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a  hersLocks = -1;.
36d0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
36e0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
36f0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3700: 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  = -1;.#endif../*
3710: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
3720: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
3730: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
3740: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
3750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
3760: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
3770: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
3780: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
3790: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
37a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37c0: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
37d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
37e0: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
37f0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
3800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
3810: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
3820: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
3830: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
3840: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
3850: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
3860: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
3870: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
3880: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
3890: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
38a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
38c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
38d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
38e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
38f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
3900: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
3910: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
3920: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
3930: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
3940: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
3950: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
3960: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
3970: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
3980: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
3990: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
39a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
39b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
39c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
39d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
39e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
39f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
3a00: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
3a10: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
3a20: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
3a30: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
3a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
3a50: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
3a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
3a70: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
3a80: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
3a90: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
3aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
3ab0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
3ac0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
3ad0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
3ae0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
3af0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
3b00: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
3b10: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
3b20: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
3b30: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
3b40: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
3b50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3b60: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
3b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
3b80: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
3b90: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
3ba0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
3bb0: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
3bc0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
3bd0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
3be0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
3bf0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
3c00: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
3c10: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
3c20: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
3c30: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
3c40: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
3c50: 73 29 3b 0a 20 20 69 66 28 20 73 20 26 26 20 6f  s);.  if( s && o
3c60: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
3c70: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
3c80: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
3c90: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
3ca0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
3cb0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
3cc0: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
3cd0: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
3ce0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3cf0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
3d00: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
3d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3d20: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
3d30: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3d40: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
3d50: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
3d60: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
3d70: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
3d80: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
3d90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
3da0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
3db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
3dc0: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
3dd0: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
3de0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
3df0: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
3e00: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
3e10: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
3e20: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
3e30: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
3e40: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
3e50: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
3e60: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
3e70: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
3e80: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
3e90: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
3ea0: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
3eb0: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
3ec0: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
3ed0: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
3ee0: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
3ef0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
3f00: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
3f10: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
3f20: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
3f30: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
3f40: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
3f50: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
3f60: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
3f70: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
3f80: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
3f90: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
3fa0: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
3fb0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3fc0: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
3fd0: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
3fe0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
3ff0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
4000: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4010: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
4020: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4030: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
4040: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
4050: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
4060: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
4070: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
4080: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4090: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
40a0: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
40b0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
40c0: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
40d0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
40e0: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
40f0: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
4100: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
4110: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
4120: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
4130: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
4140: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
4150: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 5f 6f  ingBehavior(fd_o
4160: 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  rig){.  int fd;.
4170: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4180: 65 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20  estData d[2];.  
4190: 70 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a  pthread_t t[2];.
41a0: 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f  .  fd = dup(fd_o
41b0: 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  rig);.  if( fd<0
41c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
41d0: 73 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66  set(d, 0, sizeof
41e0: 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20  (d));.  d[0].fd 
41f0: 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63  = fd;.  d[0].loc
4200: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
4210: 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e  CK;.  d[0].lock.
4220: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30  l_len = 1;.  d[0
4230: 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d  ].lock.l_start =
4240: 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e   0;.  d[0].lock.
4250: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
4260: 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b  SET;.  d[1] = d[
4270: 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e  0];.  d[1].lock.
4280: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
4290: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
42a0: 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72  te(&t[0], 0, thr
42b0: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
42c0: 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[0]);.  pthrea
42d0: 64 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20  d_create(&t[1], 
42e0: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
42f0: 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20  Test, &d[1]);.  
4300: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30  pthread_join(t[0
4310: 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64  ], 0);.  pthread
4320: 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a  _join(t[1], 0);.
4330: 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74    close(fd);.  t
4340: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
4350: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
4360: 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20   d[0].result==0 
4370: 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d  && d[1].result==
4380: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
4390: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
43a0: 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  DS */../*.** Rel
43b0: 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20  ease a lockInfo 
43c0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
43d0: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
43e0: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
43f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4400: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
4410: 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  (struct lockInfo
4420: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 61 73 73 65   *pLock){.  asse
4430: 72 74 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  rt( sqlite3OsInM
4440: 75 74 65 78 28 31 29 20 29 3b 0a 20 20 70 4c 6f  utex(1) );.  pLo
4450: 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  ck->nRef--;.  if
4460: 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30  ( pLock->nRef==0
4470: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48   ){.    sqlite3H
4480: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
4490: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
44a0: 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e  , sizeof(pLock->
44b0: 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71  key), 0);.    sq
44c0: 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b  liteFree(pLock);
44d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
44e0: 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20  lease a openCnt 
44f0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
4500: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
4510: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
4520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4530: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
4540: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
4550: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
4560: 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
4570: 65 78 28 31 29 20 29 3b 0a 20 20 70 4f 70 65 6e  ex(1) );.  pOpen
4580: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4590: 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29  pOpen->nRef==0 )
45a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
45b0: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
45c0: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
45d0: 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65  sizeof(pOpen->ke
45e0: 79 29 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  y), 0);.    free
45f0: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
4600: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
4610: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  e(pOpen);.  }.}.
4620: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
4630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
4640: 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20  locate lockInfo 
4650: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
4660: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
4670: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
4680: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4690: 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20  Create new ones 
46a0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
46b0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
46c0: 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69  ues might be uni
46d0: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
46e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
46f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4700: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
4710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4720: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20  findLockInfo(.  
4730: 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
4760: 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20  tor used in the 
4770: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
4780: 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  lockInfo **ppLoc
4790: 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  k,    /* Return 
47a0: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  the lockInfo str
47b0: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
47c0: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
47d0: 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a  **ppOpen      /*
47e0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e   Return the open
47f0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
4800: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
4810: 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  c;.  struct lock
4820: 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75  Key key1;.  stru
4830: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b  ct openKey key2;
4840: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
4850: 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74  tatbuf;.  struct
4860: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
4870: 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  ;.  struct openC
4880: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20  nt *pOpen;.  rc 
4890: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
48a0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
48b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
48c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
48d0: 33 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b  3OsInMutex(1) );
48e0: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c  .  memset(&key1,
48f0: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29   0, sizeof(key1)
4900: 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20  );.  key1.dev = 
4910: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
4920: 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61    key1.ino = sta
4930: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66  tbuf.st_ino;.#if
4940: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
4950: 54 48 52 45 41 44 53 0a 20 20 69 66 28 20 74 68  THREADS.  if( th
4960: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
4970: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29  hOthersLocks<0 )
4980: 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64  {.    testThread
4990: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
49a0: 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e  fd);.  }.  key1.
49b0: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
49c0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
49d0: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
49e0: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
49f0: 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32  f.  memset(&key2
4a00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  , 0, sizeof(key2
4a10: 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d  ));.  key2.dev =
4a20: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
4a30: 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74  .  key2.ino = st
4a40: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20  atbuf.st_ino;.  
4a50: 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20  pLock = (struct 
4a60: 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65  lockInfo*)sqlite
4a70: 33 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48  3HashFind(&lockH
4a80: 61 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65  ash, &key1, size
4a90: 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28  of(key1));.  if(
4aa0: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
4ab0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
4ac0: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63   *pOld;.    pLoc
4ad0: 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  k = sqliteMalloc
4ae0: 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f  Raw( sizeof(*pLo
4af0: 63 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ck) );.    if( p
4b00: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
4b10: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
4b20: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
4b30: 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  kinfo;.    }.   
4b40: 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65   pLock->key = ke
4b50: 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  y1;.    pLock->n
4b60: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  Ref = 1;.    pLo
4b70: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ck->cnt = 0;.   
4b80: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
4b90: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d   = 0;.    pOld =
4ba0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4bb0: 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70  rt(&lockHash, &p
4bc0: 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Lock->key, sizeo
4bd0: 66 28 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b  f(key1), pLock);
4be0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30  .    if( pOld!=0
4bf0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
4c00: 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b  ( pOld==pLock );
4c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
4c20: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
4c30: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
4c40: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
4c50: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
4c60: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
4c70: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
4c80: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
4c90: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
4ca0: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
4cb0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
4cc0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4cd0: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
4ce0: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
4cf0: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
4d00: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
4d10: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
4d20: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
4d30: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
4d40: 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b  izeof(*pOpen) );
4d50: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
4d60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
4d70: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
4d80: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72  Lock);.        r
4d90: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
4da0: 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63  oto exit_findloc
4db0: 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  kinfo;.      }. 
4dc0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20       pOpen->key 
4dd0: 3d 20 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f  = key2;.      pO
4de0: 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pen->nRef = 1;. 
4df0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
4e00: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  k = 0;.      pOp
4e10: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
4e20: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
4e30: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
4e40: 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
4e50: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65  3HashInsert(&ope
4e60: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b  nHash, &pOpen->k
4e70: 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29  ey, sizeof(key2)
4e80: 2c 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  , pOpen);.      
4e90: 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20  if( pOld!=0 ){. 
4ea0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4eb0: 4f 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20  Old==pOpen );.  
4ec0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4ed0: 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  (pOpen);.       
4ee0: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
4ef0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  (pLock);.       
4f00: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
4f10: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
4f20: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d  ockinfo;.      }
4f30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4f40: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b    pOpen->nRef++;
4f50: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70  .    }.    *ppOp
4f60: 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a  en = pOpen;.  }.
4f70: 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e  .exit_findlockin
4f80: 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  fo:.  return rc;
4f90: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4fa0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65  E_DEBUG./*.** He
4fb0: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
4fc0: 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74  r printing out t
4fd0: 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  race information
4fe0: 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a   from debugging.
4ff0: 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69  ** binaries. Thi
5000: 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  s returns the st
5010: 72 69 6e 67 20 72 65 70 72 65 73 65 74 61 74 69  ring represetati
5020: 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  on of the suppli
5030: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f  ed.** integer lo
5040: 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ck-type..*/.stat
5050: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  ic const char *l
5060: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e 74 20  ocktypeName(int 
5070: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 77 69  locktype){.  swi
5080: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
5090: 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a  .  case NO_LOCK:
50a0: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
50b0: 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f    case SHARED_LO
50c0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52  CK: return "SHAR
50d0: 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45 53 45  ED";.  case RESE
50e0: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
50f0: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5100: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5110: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5120: 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58 43 4c  NG";.  case EXCL
5130: 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75  USIVE_LOCK: retu
5140: 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a  rn "EXCLUSIVE";.
5150: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52    }.  return "ER
5160: 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ROR";.}.#endif..
5170: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
5180: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 64  currently in a d
5190: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20  ifferent thread 
51a0: 74 68 61 6e 20 74 68 65 20 74 68 72 65 61 64 20  than the thread 
51b0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78  that the.** unix
51c0: 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20 62 65  File argument be
51d0: 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e 20 74  longs to, then t
51e0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
51f0: 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  p of the unixFil
5200: 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68 65  e.** over to the
5210: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
5220: 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c  .**.** A unixFil
5230: 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20  e is only owned 
5240: 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e 20 73  by a thread on s
5250: 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f 6e 65  ystems where one
5260: 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20 75 6e   thread is.** un
5270: 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69 64 65  able to override
5280: 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64 20 62   locks created b
5290: 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  y a different th
52a0: 72 65 61 64 2e 20 20 52 65 64 48 61 74 39 20 69  read.  RedHat9 i
52b0: 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c 65 20  s.** an example 
52c0: 6f 66 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  of such a system
52d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69  ..**.** Ownershi
52e0: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 6f 6e  p transfer is on
52f0: 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20 74 68  ly allowed if th
5300: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 63 75  e unixFile is cu
5310: 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
5320: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e 69 78  ..** If the unix
5330: 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 61  File is locked a
5340: 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69 70 20  nd an ownership 
5350: 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72  is wrong, then r
5360: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
5370: 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54 45 5f  MISUSE.  SQLITE_
5380: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
5390: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
53a0: 6b 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ks..*/.#ifdef SQ
53b0: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
53c0: 53 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  S.static int tra
53d0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 75  nsferOwnership(u
53e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
53f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
5400: 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20  read_t hSelf;.  
5410: 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72 72  if( threadsOverr
5420: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
5430: 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e  ks ){.    /* Own
5440: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 73  ership transfers
5450: 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 74   not needed on t
5460: 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20  his system */.  
5470: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5480: 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20  OK;.  }.  hSelf 
5490: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
54a0: 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61 64 5f  ;.  if( pthread_
54b0: 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64  equal(pFile->tid
54c0: 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20 20 20  , hSelf) ){.    
54d0: 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c 6c 20  /* We are still 
54e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68 72 65  in the same thre
54f0: 61 64 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 31  ad */.    TRACE1
5500: 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73  ("No-transfer, s
5510: 61 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a  ame thread\n");.
5520: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5530: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
5540: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
5550: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
5560: 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61  /* We cannot cha
5570: 6e 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68  nge ownership wh
5580: 69 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69  ile we are holdi
5590: 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20  ng a lock! */.  
55a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
55b0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 54 52  MISUSE;.  }.  TR
55c0: 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20 6f  ACE4("Transfer o
55d0: 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20 66  wnership of %d f
55e0: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
55f0: 20 70 46 69 6c 65 2d 3e 68 2c 70 46 69 6c 65 2d   pFile->h,pFile-
5600: 3e 74 69 64 2c 68 53 65 6c 66 29 3b 0a 20 20 70  >tid,hSelf);.  p
5610: 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c  File->tid = hSel
5620: 66 3b 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  f;.  releaseLock
5630: 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Info(pFile->pLoc
5640: 6b 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  k);.  rc = findL
5650: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 68  ockInfo(pFile->h
5660: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
5670: 20 30 29 3b 0a 20 20 54 52 41 43 45 35 28 22 4c   0);.  TRACE5("L
5680: 4f 43 4b 20 20 20 20 25 64 20 69 73 20 6e 6f 77  OCK    %d is now
5690: 20 25 73 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70   %s(%s,%d)\n", p
56a0: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 6c 6f  File->h,.     lo
56b0: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
56c0: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20  ->locktype),.   
56d0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
56e0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
56f0: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
5700: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 72 65  Lock->cnt);.  re
5710: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
5720: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
5730: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
5740: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
5750: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
5760: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
5770: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
5780: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
5790: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
57a0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
57b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
57c0: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
57d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
57e0: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
57f0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
5800: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5810: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5820: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65  the named file e
5830: 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
5840: 6c 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69  lite3UnixFileExi
5850: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
5860: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
5870: 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c  turn access(zFil
5880: 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a  ename, 0)==0;.}.
5890: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
58a0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
58b0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
58c0: 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
58d0: 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a  *pInit, OsFile *
58e0: 2a 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74  *pId);../*.** At
58f0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
5900: 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65  file for both re
5910: 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
5920: 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66  g.  If that.** f
5930: 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e  ails, try openin
5940: 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  g it read-only. 
5950: 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
5960: 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20  s not exist,.** 
5970: 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74  try to create it
5980: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
5990: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
59a0: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69   the open file i
59b0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64  s written to *id
59c0: 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  .** and *pReadon
59d0: 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  ly is set to 0 i
59e0: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
59f0: 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e  pened for readin
5a00: 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67  g and.** writing
5a10: 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c   or 1 if the fil
5a20: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
5a30: 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e  d-only.  The fun
5a40: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
5a50: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
5a60: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
5a70: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
5a80: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
5a90: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
5aa0: 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f   *id and *pReado
5ab0: 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  nly unchanged..*
5ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
5ad0: 78 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a  xOpenReadWrite(.
5ae0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5af0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c  ilename,.  OsFil
5b00: 65 20 2a 2a 70 49 64 2c 0a 20 20 69 6e 74 20 2a  e **pId,.  int *
5b10: 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69  pReadonly.){.  i
5b20: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
5b30: 65 20 66 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45  e f;..  CRASH_TE
5b40: 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69  ST_OVERRIDE(sqli
5b50: 74 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64  te3CrashOpenRead
5b60: 57 72 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  Write, zFilename
5b70: 2c 20 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79  , pId, pReadonly
5b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
5b90: 2a 70 49 64 20 29 3b 0a 20 20 66 2e 64 69 72 66  *pId );.  f.dirf
5ba0: 64 20 3d 20 2d 31 3b 0a 20 20 53 45 54 5f 54 48  d = -1;.  SET_TH
5bb0: 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20 66 2e  READID(&f);.  f.
5bc0: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
5bd0: 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
5be0: 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  AT|O_LARGEFILE|O
5bf0: 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20  _BINARY,.       
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
5c20: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5c30: 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30  NS);.  if( f.h<0
5c40: 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53 44 49   ){.#ifdef EISDI
5c50: 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  R.    if( errno=
5c60: 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20 20 20  =EISDIR ){.     
5c70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
5c80: 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 23  ANTOPEN;.    }.#
5c90: 65 6e 64 69 66 0a 20 20 20 20 66 2e 68 20 3d 20  endif.    f.h = 
5ca0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
5cb0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
5cc0: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
5cd0: 20 20 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b      if( f.h<0 ){
5ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5cf0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
5d00: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
5d10: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
5d20: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
5d30: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  y = 0;.  }.  sql
5d40: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
5d50: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
5d60: 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e  ockInfo(f.h, &f.
5d70: 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
5d80: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
5d90: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
5da0: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
5db0: 28 66 2e 68 29 3b 0a 20 20 20 20 72 65 74 75 72  (f.h);.    retur
5dc0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5dd0: 20 20 7d 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65    }.  f.locktype
5de0: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 28 22   = 0;.  TRACE3("
5df0: 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
5e00: 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61  n", f.h, zFilena
5e10: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c  me);.  return al
5e20: 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26  locateUnixFile(&
5e30: 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  f, pId);.}.../*.
5e40: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
5e50: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
5e60: 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
5e70: 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ss by this proce
5e80: 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ss..** The file 
5e90: 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66  will be opened f
5ea0: 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
5eb0: 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f  and writing.  To
5ec0: 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65   avoid.** a pote
5ed0: 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 70  ntial security p
5ee0: 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f  roblem, we do no
5ef0: 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  t allow the file
5f00: 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76   to have.** prev
5f10: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
5f20: 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77   Nor do we allow
5f30: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
5f40: 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69  a symbolic.** li
5f50: 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c  nk..**.** If del
5f60: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
5f70: 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d  en make arrangem
5f80: 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69  ents to automati
5f90: 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20  cally delete.** 
5fa0: 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74  the file when it
5fb0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
5fc0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72  * On success, wr
5fd0: 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e  ite the file han
5fe0: 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64  dle into *id and
5ff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6000: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
6010: 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ure, return SQLI
6020: 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a  TE_CANTOPEN..*/.
6030: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f  int sqlite3UnixO
6040: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
6050: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6060: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
6070: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
6080: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
6090: 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53 48  File f;..  CRASH
60a0: 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73  _TEST_OVERRIDE(s
60b0: 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 45  qlite3CrashOpenE
60c0: 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65 6e  xclusive, zFilen
60d0: 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c 61  ame, pId, delFla
60e0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  g);.  assert( 0=
60f0: 3d 2a 70 49 64 20 29 3b 0a 20 20 69 66 28 20 61  =*pId );.  if( a
6100: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
6110: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   0)==0 ){.    re
6120: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
6130: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OPEN;.  }.  SET_
6140: 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20  THREADID(&f);.  
6150: 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  f.dirfd = -1;.  
6160: 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65  f.h = open(zFile
6170: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
6180: 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43        O_RDWR|O_C
6190: 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f  REAT|O_EXCL|O_NO
61a0: 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49  FOLLOW|O_LARGEFI
61b0: 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20  LE|O_BINARY,.   
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
61d0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
61e0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
61f0: 20 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20   if( f.h<0 ){.  
6200: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6210: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
6220: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
6230: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
6240: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20  ndLockInfo(f.h, 
6250: 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70  &f.pLock, &f.pOp
6260: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
6270: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
6280: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
6290: 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 75 6e  ose(f.h);.    un
62a0: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
62b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
62c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
62d0: 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  f.locktype = 0;.
62e0: 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b    if( delFlag ){
62f0: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
6300: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52  ename);.  }.  TR
6310: 41 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d  ACE3("OPEN-EX %-
6320: 33 64 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a  3d %s\n", f.h, z
6330: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
6340: 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  urn allocateUnix
6350: 46 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d  File(&f, pId);.}
6360: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
6370: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
6380: 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79  le for read-only
6390: 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f   access..**.** O
63a0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
63b0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
63c0: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
63d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
63e0: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
63f0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6400: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
6410: 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e   sqlite3UnixOpen
6420: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
6430: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
6440: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20  OsFile **pId){. 
6450: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
6460: 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53 48 5f  ile f;..  CRASH_
6470: 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71  TEST_OVERRIDE(sq
6480: 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 52 65  lite3CrashOpenRe
6490: 61 64 4f 6e 6c 79 2c 20 7a 46 69 6c 65 6e 61 6d  adOnly, zFilenam
64a0: 65 2c 20 70 49 64 2c 20 30 29 3b 0a 20 20 61 73  e, pId, 0);.  as
64b0: 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b  sert( 0==*pId );
64c0: 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
64d0: 26 66 29 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d  &f);.  f.dirfd =
64e0: 20 2d 31 3b 0a 20 20 66 2e 68 20 3d 20 6f 70 65   -1;.  f.h = ope
64f0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6500: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c  DONLY|O_LARGEFIL
6510: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69  E|O_BINARY);.  i
6520: 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20  f( f.h<0 ){.    
6530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
6540: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
6550: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
6560: 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64  x();.  rc = find
6570: 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66  LockInfo(f.h, &f
6580: 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e  .pLock, &f.pOpen
6590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  );.  sqlite3OsLe
65a0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
65b0: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73  ( rc ){.    clos
65c0: 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65 74 75  e(f.h);.    retu
65d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
65e0: 0a 20 20 7d 0a 20 20 66 2e 6c 6f 63 6b 74 79 70  .  }.  f.locktyp
65f0: 65 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 28  e = 0;.  TRACE3(
6600: 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73  "OPEN-RO %-3d %s
6610: 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e  \n", f.h, zFilen
6620: 61 6d 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ame);..  return 
6630: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
6640: 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a  (&f, pId);.}../*
6650: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
6660: 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  pen a file descr
6670: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
6680: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
6690: 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e  tains a.** file.
66a0: 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63    This file desc
66b0: 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73  riptor can be us
66c0: 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68  ed to fsync() th
66d0: 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69  e directory.** i
66e0: 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
66f0: 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f  sure the creatio
6700: 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20  n of a new file 
6710: 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  is actually writ
6720: 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a  ten.** to disk..
6730: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6740: 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69  ne is only meani
6750: 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20  ngful for Unix. 
6760: 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75   It is a no-op u
6770: 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20  nder.** windows 
6780: 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f  since windows do
6790: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68  es not support h
67a0: 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a  ard links..**.**
67b0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
67c0: 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76  andle for a prev
67d0: 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65  iously open file
67e0: 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70   at *id is.** up
67f0: 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  dated with the n
6800: 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  ew directory fil
6810: 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
6820: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
6830: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
6840: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
6850: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6860: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
6870: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
6880: 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  *id unchanged..*
6890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
68a0: 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a  xOpenDirectory(.
68b0: 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20    OsFile *id,.  
68c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
68d0: 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46 69  name.){.  unixFi
68e0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
68f0: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28  xFile*)id;.  if(
6900: 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   pFile==0 ){.   
6910: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20   /* Do not open 
6920: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 66  the directory if
6930: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6940: 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  ng file is not a
6950: 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70  lready.    ** op
6960: 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  en. */.    retur
6970: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
6980: 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48 52  N;.  }.  SET_THR
6990: 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20 20  EADID(pFile);.  
69a0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 64  assert( pFile->d
69b0: 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c  irfd<0 );.  pFil
69c0: 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28  e->dirfd = open(
69d0: 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
69e0: 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
69f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
6a00: 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  rfd<0 ){.    ret
6a10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6a20: 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43  PEN; .  }.  TRAC
6a30: 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
6a40: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64   %s\n", pFile->d
6a50: 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  irfd, zDirname);
6a60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6a70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
6a80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   the following g
6a90: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 70  lobal variable p
6aa0: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
6ab0: 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 2a  g which is the.*
6ac0: 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  * name of a dire
6ad0: 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61 74  ctory, then that
6ae0: 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20   directory will 
6af0: 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  be used to store
6b00: 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69  .** temporary fi
6b10: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  les..**.** See a
6b20: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
6b30: 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
6b40: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
6b50: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
6b60: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
6b70: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ry = 0;../*.** C
6b80: 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
6b90: 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a  y file name in z
6ba0: 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20  Buf.  zBuf must 
6bb0: 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  be big enough to
6bc0: 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  .** hold at leas
6bd0: 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  t SQLITE_TEMPNAM
6be0: 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65 72  E_SIZE character
6bf0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
6c00: 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d  3UnixTempFileNam
6c10: 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  e(char *zBuf){. 
6c20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
6c30: 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
6c40: 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f  .     0,.     "/
6c50: 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  var/tmp",.     "
6c60: 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
6c70: 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22  "/tmp",.     "."
6c80: 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
6c90: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6ca0: 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
6cb0: 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
6cc0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
6cd0: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
6ce0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
6cf0: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
6d00: 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
6d10: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
6d20: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6d30: 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a  zDir = ".";.  az
6d40: 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Dirs[0] = sqlite
6d50: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
6d60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
6d70: 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
6d80: 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
6d90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6da0: 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  zDirs[i]==0 ) co
6db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
6dc0: 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20  stat(azDirs[i], 
6dd0: 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
6de0: 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
6df0: 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
6e00: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6e10: 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72  if( access(azDir
6e20: 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74  s[i], 07) ) cont
6e30: 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d  inue;.    zDir =
6e40: 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20   azDirs[i];.    
6e50: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b  break;.  }.  do{
6e60: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
6e70: 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c  f, "%s/"TEMP_FIL
6e80: 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b  E_PREFIX, zDir);
6e90: 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28  .    j = strlen(
6ea0: 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
6eb0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  e3Randomness(15,
6ec0: 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20   &zBuf[j]);.    
6ed0: 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
6ee0: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ++, j++){.      
6ef0: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
6f00: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
6f10: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
6f20: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
6f30: 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  -1) ];.    }.   
6f40: 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
6f50: 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a  }while( access(z
6f60: 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72  Buf,0)==0 );.  r
6f70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6f80: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b   .}../*.** Check
6f90: 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61   that a given pa
6fa0: 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  thname is a dire
6fb0: 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69  ctory and is wri
6fc0: 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74  table .**.*/.int
6fd0: 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44 69   sqlite3UnixIsDi
6fe0: 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a  rWritable(char *
6ff0: 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20 53  zBuf){.#ifndef S
7000: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
7010: 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75 63  _PRAGMAS.  struc
7020: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 66  t stat buf;.  if
7030: 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74 75  ( zBuf==0 ) retu
7040: 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75 66  rn 0;.  if( zBuf
7050: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [0]==0 ) return 
7060: 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 42  0;.  if( stat(zB
7070: 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74 75  uf, &buf) ) retu
7080: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f 49  rn 0;.  if( !S_I
7090: 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
70a0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
70b0: 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c  if( access(zBuf,
70c0: 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30 3b   07) ) return 0;
70d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
70e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
70f0: 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  GMAS */.  return
7100: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61   1;.}../*.** Rea
7110: 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
7120: 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
7130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
7140: 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
7150: 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
7160: 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
7170: 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
7180: 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
7190: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
71a0: 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 4f 73   int unixRead(Os
71b0: 46 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a  File *id, void *
71c0: 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a  pBuf, int amt){.
71d0: 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73    int got;.  ass
71e0: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d  ert( id );.  Sim
71f0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
7200: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49  ITE_IOERR);.  TI
7210: 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74  MER_START;.  got
7220: 20 3d 20 72 65 61 64 28 28 28 75 6e 69 78 46 69   = read(((unixFi
7230: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66  le*)id)->h, pBuf
7240: 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f  , amt);.  TIMER_
7250: 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52  END;.  TRACE5("R
7260: 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
7270: 25 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69  %7d %d\n", ((uni
7280: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67  xFile*)id)->h, g
7290: 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ot,.          la
72a0: 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45  st_page, TIMER_E
72b0: 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28  LAPSED);.  SEEK(
72c0: 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74  0);.  /* if( got
72d0: 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f  <0 ) got = 0; */
72e0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
72f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7300: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
7310: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7320: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d  ITE_IOERR;.  }.}
7330: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
7340: 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
7350: 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
7360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
7370: 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
7380: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
7390: 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
73a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
73b0: 20 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69 6c   unixWrite(OsFil
73c0: 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69  e *id, const voi
73d0: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74  d *pBuf, int amt
73e0: 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  ){.  int wrote =
73f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
7400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
7410: 74 3e 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  t>0 );.  Simulat
7420: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
7430: 49 4f 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61  IOERR);.  Simula
7440: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b  teDiskfullError;
7450: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
7460: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
7470: 26 20 28 77 72 6f 74 65 20 3d 20 77 72 69 74 65  & (wrote = write
7480: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
7490: 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  ->h, pBuf, amt))
74a0: 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
74b0: 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
74c0: 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
74d0: 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
74e0: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41  TIMER_END;.  TRA
74f0: 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE5("WRITE   %-3
7500: 64 20 25 35 64 20 25 37 64 20 25 64 5c 6e 22 2c  d %5d %7d %d\n",
7510: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
7520: 2d 3e 68 2c 20 77 72 6f 74 65 2c 0a 20 20 20 20  ->h, wrote,.    
7530: 20 20 20 20 20 20 6c 61 73 74 5f 70 61 67 65 2c        last_page,
7540: 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
7550: 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20 69 66  .  SEEK(0);.  if
7560: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  ( amt>0 ){.    r
7570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
7580: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
7590: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
75a0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65 61  .** Move the rea
75b0: 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72 20  d/write pointer 
75c0: 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  in a file..*/.st
75d0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 65  atic int unixSee
75e0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  k(OsFile *id, i6
75f0: 34 20 6f 66 66 73 65 74 29 7b 0a 20 20 61 73 73  4 offset){.  ass
7600: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 45 45  ert( id );.  SEE
7610: 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b 20  K(offset/1024 + 
7620: 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1);.#ifdef SQLIT
7630: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66  E_TEST.  if( off
7640: 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69  set ) SimulateDi
7650: 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64  skfullError.#end
7660: 69 66 0a 20 20 6c 73 65 65 6b 28 28 28 75 6e 69  if.  lseek(((uni
7670: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f  xFile*)id)->h, o
7680: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
7690: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
76a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
76b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
76c0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
76d0: 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
76e0: 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
76f0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
7700: 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
7710: 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
7720: 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
7730: 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
7740: 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
7750: 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
7760: 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
7770: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
7780: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
7790: 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61 73  * Use the fdatas
77a0: 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69  ync() API only i
77b0: 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54 41  f the HAVE_FDATA
77c0: 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
77d0: 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  fined..** Otherw
77e0: 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29 20  ise use fsync() 
77f0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f  in its place..*/
7800: 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44  .#ifndef HAVE_FD
7810: 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  ATASYNC.# define
7820: 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63   fdatasync fsync
7830: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7840: 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73 74  The fsync() syst
7850: 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74  em call does not
7860: 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69   work as adverti
7870: 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75  sed on many.** u
7880: 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68  nix systems.  Th
7890: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63  e following proc
78a0: 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74 65  edure is an atte
78b0: 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69  mpt to make.** i
78c0: 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a  t work better..*
78d0: 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
78e0: 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69  NO_SYNC macro di
78f0: 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63  sables all fsync
7900: 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ()s.  This is us
7910: 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74  eful.** for test
7920: 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74  ing when we want
7930: 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20   to run through 
7940: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 71  the test suite q
7950: 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61  uickly..** You a
7960: 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69  re strongly advi
7970: 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70  sed *not* to dep
7980: 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f  loy with SQLITE_
7990: 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c  NO_SYNC.** enabl
79a0: 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e  ed, however, sin
79b0: 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e  ce with SQLITE_N
79c0: 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20  O_SYNC enabled, 
79d0: 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f  an OS crash.** o
79e0: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  r power failure 
79f0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72  will likely corr
7a00: 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65  upt the database
7a10: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
7a20: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28   int full_fsync(
7a30: 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c  int fd, int full
7a40: 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e  Sync, int dataOn
7a50: 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ly){.  int rc;..
7a60: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
7a70: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
7a80: 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
7a90: 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
7aa0: 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
7ab0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
7ac0: 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
7ad0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
7ae0: 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
7af0: 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
7b00: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
7b10: 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
7b20: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
7b30: 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
7b40: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
7b50: 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
7b60: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
7b70: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
7b80: 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
7b90: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
7ba0: 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
7bb0: 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
7bc0: 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
7bd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
7be0: 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49  SYNC.  rc = SQLI
7bf0: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69  TE_OK;.#else..#i
7c00: 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
7c10: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
7c20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  ){.    rc = fcnt
7c30: 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
7c40: 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
7c50: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
7c60: 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
7c70: 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 74 72 79  SYNC failed, try
7c80: 20 74 6f 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   to do a normal 
7c90: 66 73 79 6e 63 28 29 20 2a 2f 0a 20 20 69 66 28  fsync() */.  if(
7ca0: 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
7cb0: 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20  (fd);..#else /* 
7cc0: 69 66 20 21 64 65 66 69 6e 65 64 28 46 5f 46 55  if !defined(F_FU
7cd0: 4c 4c 53 59 4e 43 29 20 2a 2f 0a 20 20 69 66 28  LLSYNC) */.  if(
7ce0: 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20   dataOnly ){.   
7cf0: 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
7d00: 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fd);.  }else{.  
7d10: 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
7d20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
7d30: 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53  defined(F_FULLFS
7d40: 59 4e 43 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  YNC) */.#endif /
7d50: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
7d60: 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20  _NO_SYNC) */..  
7d70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7d80: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
7d90: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
7da0: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
7db0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
7dc0: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
7dd0: 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
7de0: 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
7df0: 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
7e00: 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
7e10: 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
7e20: 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
7e30: 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
7e40: 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
7e50: 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
7e60: 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
7e70: 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
7e80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
7e90: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7ea0: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
7eb0: 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
7ec0: 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
7ed0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
7ee0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7ef0: 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
7f00: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
7f10: 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
7f20: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
7f30: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
7f40: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
7f50: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
7f60: 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
7f70: 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
7f80: 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
7f90: 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
7fa0: 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
7fb0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
7fc0: 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
7fd0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
7fe0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
7ff0: 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
8000: 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
8010: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
8020: 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
8030: 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
8040: 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
8050: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
8060: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
8070: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ync(OsFile *id, 
8080: 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
8090: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
80a0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
80b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
80c0: 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
80d0: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
80e0: 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22  ERR);.  TRACE2("
80f0: 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
8100: 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 69 66   pFile->h);.  if
8110: 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  ( full_fsync(pFi
8120: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75  le->h, pFile->fu
8130: 6c 6c 53 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79  llSync, dataOnly
8140: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8150: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
8160: 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  }.  if( pFile->d
8170: 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 54  irfd>=0 ){.    T
8180: 52 41 43 45 32 28 22 44 49 52 53 59 4e 43 20 25  RACE2("DIRSYNC %
8190: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  -3d\n", pFile->d
81a0: 69 72 66 64 29 3b 0a 23 69 66 6e 64 65 66 20 53  irfd);.#ifndef S
81b0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
81c0: 52 53 59 4e 43 0a 20 20 20 20 69 66 28 20 66 75  RSYNC.    if( fu
81d0: 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
81e0: 64 69 72 66 64 2c 20 70 46 69 6c 65 2d 3e 66 75  dirfd, pFile->fu
81f0: 6c 6c 53 79 6e 63 2c 20 30 29 20 29 7b 0a 20 20  llSync, 0) ){.  
8200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8210: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
8220: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73  .#endif.    clos
8230: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
8240: 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74    /* Only need t
8250: 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
8260: 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74  close the direct
8270: 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ory */.    pFile
8280: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  ->dirfd = -1;   
8290: 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20   /* when we are 
82a0: 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  done. */.  }.  r
82b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
82c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
82d0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69  he directory zDi
82e0: 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61  rname. This is a
82f0: 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74   no-op on operat
8300: 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65  ing systems othe
8310: 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a  r.** than UNIX..
8320: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
8330: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
8340: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8350: 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75 65  al file has true
8360: 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a  ly been deleted.
8370: 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ** before making
8380: 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69   changes to indi
8390: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
83a0: 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62  on a multi-datab
83b0: 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54  ase commit..** T
83c0: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f  he F_FULLFSYNC o
83d0: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65  ption is not nee
83e0: 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  ded here..*/.int
83f0: 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63   sqlite3UnixSync
8400: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
8410: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
8420: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8430: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
8440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8450: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66  K;.#else.  int f
8460: 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53 69  d;.  int r;.  Si
8470: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
8480: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66  LITE_IOERR);.  f
8490: 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
84a0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
84b0: 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41 43  NARY, 0);.  TRAC
84c0: 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E3("DIRSYNC %-3d
84d0: 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44   (%s)\n", fd, zD
84e0: 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 66  irname);.  if( f
84f0: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
8500: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
8510: 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73  N; .  }.  r = fs
8520: 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65  ync(fd);.  close
8530: 28 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  (fd);.  return (
8540: 28 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b  (r==0)?SQLITE_OK
8550: 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  :SQLITE_IOERR);.
8560: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8570: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
8580: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
8590: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
85a0: 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
85b0: 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  cate(OsFile *id,
85c0: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 61   i64 nByte){.  a
85d0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53  ssert( id );.  S
85e0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
85f0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
8600: 72 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74 65  return ftruncate
8610: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
8620: 2d 3e 68 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f  ->h, nByte)==0 ?
8630: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
8640: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
8650: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
8660: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
8670: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
8680: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8690: 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46  unixFileSize(OsF
86a0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
86b0: 69 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ize){.  struct s
86c0: 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
86d0: 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
86e0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
86f0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20  E_IOERR);.  if( 
8700: 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
8710: 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 21  *)id)->h, &buf)!
8720: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8730: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8740: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
8750: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
8760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8770: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8780: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
8790: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
87a0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
87b0: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
87c0: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
87d0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
87e0: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
87f0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
8800: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
8810: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
8820: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
8830: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
8840: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
8850: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
8860: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
8870: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
8880: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
8890: 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69   r = 0;.  unixFi
88a0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
88b0: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
88c0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
88d0: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
88e0: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
88f0: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
8900: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
8910: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
8920: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
8930: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
8940: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
8950: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
8960: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
8970: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
8980: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
8990: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
89a0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
89b0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
89c0: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
89d0: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
89e0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
89f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
8a00: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
8a10: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
8a20: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
8a30: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
8a40: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
8a50: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
8a60: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
8a70: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
8a80: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
8a90: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
8aa0: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
8ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
8ac0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
8ad0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28  tex();.  TRACE3(
8ae0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
8af0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
8b00: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
8b10: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
8b20: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
8b30: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
8b40: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
8b50: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
8b60: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8b70: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
8b80: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
8b90: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
8ba0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
8bb0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
8bc0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
8bd0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
8be0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
8bf0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
8c00: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
8c10: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
8c20: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
8c30: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
8c40: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
8c50: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
8c60: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
8c70: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
8c80: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
8c90: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
8ca0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
8cb0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
8cc0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
8cd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
8ce0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
8cf0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
8d00: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
8d10: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
8d20: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
8d30: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
8d40: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
8d50: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
8d60: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
8d70: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
8d80: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
8d90: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
8da0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
8db0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
8dc0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
8dd0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
8de0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
8df0: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
8e00: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
8e10: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
8e20: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
8e30: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
8e40: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
8e50: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
8e60: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
8e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
8e80: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
8e90: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
8ea0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
8eb0: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
8ec0: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
8ed0: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
8ee0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
8ef0: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
8f00: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
8f10: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
8f20: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
8f30: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
8f40: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
8f50: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
8f60: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
8f70: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
8f80: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
8f90: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
8fa0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
8fb0: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
8fc0: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
8fd0: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
8fe0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
8ff0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
9000: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
9010: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
9020: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
9030: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
9040: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
9050: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
9060: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
9070: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
9080: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
9090: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
90a0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
90b0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
90c0: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
90d0: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
90e0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
90f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
9100: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
9110: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
9120: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
9130: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
9140: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
9150: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
9160: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
9170: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
9180: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
9190: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
91a0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
91b0: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
91c0: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
91d0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
91e0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
91f0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9200: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
9210: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
9220: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
9230: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9240: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
9250: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
9260: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
9270: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
9280: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
9290: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
92a0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
92b0: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
92c0: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
92d0: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
92e0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
92f0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
9300: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
9310: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9320: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
9330: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
9340: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
9350: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
9360: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
9370: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
9380: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
9390: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
93a0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
93b0: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
93c0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
93d0: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
93e0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
93f0: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
9400: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
9410: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
9420: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
9430: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
9440: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
9450: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
9460: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
9470: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
9480: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
9490: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
94a0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
94b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
94c0: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
94d0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
94e0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
94f0: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
9500: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
9510: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
9520: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
9530: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
9540: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
9550: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
9560: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
9570: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
9580: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
9590: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
95a0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
95b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
95c0: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
95d0: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
95e0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
95f0: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
9600: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
9610: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
9620: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
9630: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
9640: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
9650: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
9660: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
9670: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
9680: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
9690: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
96a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
96b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
96c0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
96d0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
96e0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
96f0: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
9700: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
9710: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
9720: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
9730: 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45  pFile );.  TRACE
9740: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
9750: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
9760: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
9770: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
9780: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
9790: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
97a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
97b0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
97c0: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
97d0: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
97e0: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
97f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
9800: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
9810: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
9820: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
9830: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
9840: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
9850: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
9860: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
9870: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
9880: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
9890: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
98a0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
98b0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
98c0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
98d0: 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43  .    TRACE3("LOC
98e0: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
98f0: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
9900: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
9910: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
9920: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
9930: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9940: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
9950: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
9960: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
9970: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
9980: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
9990: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
99a0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
99b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
99c0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
99d0: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
99e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
99f0: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
9a00: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
9a10: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9a20: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
9a30: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
9a40: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
9a50: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
9a60: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
9a70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
9a80: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
9a90: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
9aa0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
9ab0: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
9ac0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
9ad0: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
9ae0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
9af0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9b00: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
9b10: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
9b20: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
9b30: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
9b40: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
9b50: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
9b60: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
9b70: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
9b80: 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20  nt OsFile*.  ** 
9b90: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
9ba0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
9bb0: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
9bc0: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
9bd0: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
9be0: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
9bf0: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
9c00: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
9c10: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
9c20: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
9c30: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
9c40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9c50: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
9c60: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
9c70: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
9c80: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
9c90: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
9ca0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
9cb0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
9cc0: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
9cd0: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
9ce0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
9cf0: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
9d00: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9d10: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
9d20: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
9d30: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
9d40: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
9d50: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9d60: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
9d70: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
9d80: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
9d90: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
9da0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
9db0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
9dc0: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
9dd0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
9de0: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
9df0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
9e00: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
9e10: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
9e20: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
9e30: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
9e40: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
9e50: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
9e60: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
9e70: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
9e80: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
9e90: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
9ea0: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
9eb0: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
9ec0: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
9ed0: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
9ee0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
9ef0: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
9f00: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
9f10: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
9f20: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
9f30: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
9f40: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
9f50: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
9f60: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
9f70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
9f80: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
9f90: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9fa0: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
9fb0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
9fc0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
9fd0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
9fe0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
9ff0: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
a000: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a010: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20  ock);.    if( s 
a020: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
a030: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
a040: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
a050: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a060: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
a070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
a080: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
a090: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
a0a0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
a0b0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
a0c0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
a0d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
a0e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
a0f0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
a100: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a110: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
a120: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
a130: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a140: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
a150: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
a160: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
a170: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
a180: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a190: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
a1a0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
a1b0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20  D_SIZE;.    s = 
a1c0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a1d0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a1e0: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
a1f0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
a200: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
a210: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
a220: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
a230: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
a240: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
a250: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
a260: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
a270: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a280: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
a290: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
a2a0: 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  RR;  /* This sho
a2b0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
a2c0: 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
a2d0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
a2e0: 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20     if( s ){.    
a2f0: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
a300: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
a310: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
a320: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
a330: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
a340: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
a350: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
a360: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
a370: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
a380: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
a390: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
a3a0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
a3b0: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
a3c0: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
a3d0: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
a3e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
a3f0: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
a400: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
a410: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
a420: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
a430: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
a440: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
a450: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
a460: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
a470: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
a480: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
a490: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
a4a0: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
a4b0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
a4c0: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
a4d0: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
a4e0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
a4f0: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
a500: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
a510: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
a520: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
a530: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
a540: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
a550: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
a560: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
a570: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a580: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
a590: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a5a0: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
a5b0: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
a5c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a5d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
a5e0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
a5f0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
a600: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a610: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
a620: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
a630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
a640: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a650: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
a660: 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20  .    if( s ){.  
a670: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
a680: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
a690: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
a6a0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
a6b0: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
a6c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
a6d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
a6e0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
a6f0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a700: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
a710: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
a720: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a730: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
a740: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
a750: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
a760: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
a770: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
a780: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
a790: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
a7a0: 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f 43  );.  TRACE4("LOC
a7b0: 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22  K    %d %s %s\n"
a7c0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
a7d0: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
a7e0: 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  e), .      rc==S
a7f0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
a800: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
a810: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a820: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
a830: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
a840: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
a850: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
a860: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
a870: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
a880: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
a890: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
a8a0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
a8b0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
a8c0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
a8d0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
a8e0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
a8f0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
a900: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
a910: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
a920: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
a930: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
a940: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
a950: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
a960: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
a970: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
a980: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a990: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a9a0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
a9b0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
a9c0: 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28  ile );.  TRACE7(
a9d0: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
a9e0: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
a9f0: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
aa00: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
aa10: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
aa20: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
aa30: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
aa40: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
aa50: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
aa60: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
aa70: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
aa80: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
aa90: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aab0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
aac0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
aad0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
aae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
aaf0: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
ab00: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
ab10: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
ab20: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
ab30: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
ab40: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ab50: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
ab60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
ab70: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
ab80: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
ab90: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28 20  type );.    if( 
aba0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
abb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
abc0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
abd0: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  DLCK;.      lock
abe0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
abf0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
ac00: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ac10: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
ac20: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
ac30: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  ED_SIZE;.      i
ac40: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
ac50: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
ac60: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
ac70: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
ac80: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
ac90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
aca0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
acb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
acc0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
acd0: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
ace0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
acf0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
ad00: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
ad10: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
ad20: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
ad30: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
ad40: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
ad50: 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28  ;.    if( fcntl(
ad60: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
ad70: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  K, &lock)==0 ){.
ad80: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
ad90: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
ada0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
adb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
adc0: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
add0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
ade0: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  appen */.    }. 
adf0: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
ae00: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
ae10: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
ae20: 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a   *pOpen;..    /*
ae30: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
ae40: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
ae50: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
ae60: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
ae70: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
ae80: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
ae90: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
aea0: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
aeb0: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
aec0: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
aed0: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b     pLock->cnt--;
aee0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
aef0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
af00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
af10: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
af20: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
af30: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
af40: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
af50: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
af60: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
af70: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
af80: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
af90: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
afa0: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
afb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
afc0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
afd0: 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73  _IOERR;  /* This
afe0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
aff0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ppen */.      }.
b000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
b010: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
b020: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
b030: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
b040: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
b050: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
b060: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
b070: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
b080: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
b090: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
b0a0: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
b0b0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
b0c0: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
b0d0: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
b0e0: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
b0f0: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
b100: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
b110: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
b120: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
b130: 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65  =0 && pOpen->nPe
b140: 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nding>0 ){.     
b150: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
b160: 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
b170: 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
b180: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
b190: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
b1a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b1b0: 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65   free(pOpen->aPe
b1c0: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f  nding);.      pO
b1d0: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
b1e0: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
b1f0: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
b200: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
b210: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
b220: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
b230: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
b240: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b250: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
b260: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b270: 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c   unixClose(OsFil
b280: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  e **pId){.  unix
b290: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
b2a0: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69  File*)*pId;..  i
b2b0: 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20  f( !id ) return 
b2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
b2d0: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
b2e0: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64  _LOCK);.  if( id
b2f0: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
b300: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
b310: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
b320: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
b330: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28  rMutex();..  if(
b340: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
b350: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
b360: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
b370: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
b380: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
b390: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
b3a0: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
b3b0: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
b3c0: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
b3d0: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
b3e0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
b3f0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
b400: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
b410: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
b420: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
b430: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
b440: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
b450: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
b460: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
b470: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
b480: 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e  Open = id->pOpen
b490: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61  ;.    aNew = rea
b4a0: 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65  lloc( pOpen->aPe
b4b0: 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e  nding, (pOpen->n
b4c0: 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f  Pending+1)*sizeo
b4d0: 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66  f(int) );.    if
b4e0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
b4f0: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
b500: 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
b510: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
b520: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65  riptor */.    }e
b530: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
b540: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
b550: 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  w;.      pOpen->
b560: 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
b570: 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e  nPending] = id->
b580: 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  h;.      pOpen->
b590: 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20  nPending++;.    
b5a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
b5b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * There are no o
b5c0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
b5d0: 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65   so we can close
b5e0: 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69   the file immedi
b5f0: 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f  ately */.    clo
b600: 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20  se(id->h);.  }. 
b610: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
b620: 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72  (id->pLock);.  r
b630: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64  eleaseOpenCnt(id
b640: 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c  ->pOpen);..  sql
b650: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
b660: 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
b670: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22   = 0;.  TRACE2("
b680: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
b690: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
b6a0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
b6b0: 6c 69 74 65 46 72 65 65 28 69 64 29 3b 0a 20 20  liteFree(id);.  
b6c0: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
b6d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b6e0: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
b6f0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
b700: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
b710: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
b720: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
b730: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
b740: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
b750: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
b760: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
b770: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
b780: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
b790: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
b7a0: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
b7b0: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
b7c0: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
b7d0: 68 61 72 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  har *sqlite3Unix
b7e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
b7f0: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
b800: 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ve){.  char *zFu
b810: 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52  ll = 0;.  if( zR
b820: 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
b830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
b840: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
b850: 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72  zRelative, (char
b860: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
b870: 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20     char *zBuf = 
b880: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30  sqliteMalloc(500
b890: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
b8a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
b8b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
b8c0: 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
b8d0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
b8e0: 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77  ng(&zFull, getcw
b8f0: 64 28 7a 42 75 66 2c 20 35 30 30 30 29 2c 20 22  d(zBuf, 5000), "
b900: 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20  /", zRelative,. 
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
b930: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 75    sqliteFree(zBu
b940: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
b950: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
b960: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
b970: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e  e of the fullsyn
b980: 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69  c flag in the gi
b990: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b9a0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b9b0: 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  oid unixSetFullS
b9c0: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ync(OsFile *id, 
b9d0: 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78  int v){.  ((unix
b9e0: 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53  File*)id)->fullS
b9f0: 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = v;.}../*.*
ba00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64  * Return the und
ba10: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
ba20: 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c  dle for an OsFil
ba30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
ba40: 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f  unixFileHandle(O
ba50: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
ba60: 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a  turn ((unixFile*
ba70: 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  )id)->h;.}../*.*
ba80: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
ba90: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
baa0: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
bab0: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
bac0: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
bad0: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
bae0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
baf0: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
bb00: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
bb10: 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  kState(OsFile *i
bb20: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  d){.  return ((u
bb30: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
bb40: 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cktype;.}../*.**
bb50: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
bb60: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
bb70: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
bb80: 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
bb90: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a  le.** for unix..
bba0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
bbb0: 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
bbc0: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
bbd0: 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  .  unixClose,.  
bbe0: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
bbf0: 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  y,.  unixRead,. 
bc00: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
bc10: 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72  ixSeek,.  unixTr
bc20: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
bc30: 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c  nc,.  unixSetFul
bc40: 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c  lSync,.  unixFil
bc50: 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46  eHandle,.  unixF
bc60: 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c  ileSize,.  unixL
bc70: 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  ock,.  unixUnloc
bc80: 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  k,.  unixLockSta
bc90: 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52  te,.  unixCheckR
bca0: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
bcb0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
bcc0: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e 69  memory for a uni
bcd0: 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69  xFile.  Initiali
bce0: 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  ze the new unixF
bcf0: 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  ile.** to the va
bd00: 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49 6e  lue given in pIn
bd10: 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  it and return a 
bd20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
bd30: 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49  ew.** OsFile.  I
bd40: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
bd50: 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68  memory, close th
bd60: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  e file and retur
bd70: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
bd80: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
bd90: 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
bda0: 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a  *pInit, OsFile *
bdb0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
bdc0: 65 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  e *pNew;.  pNew 
bdd0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
bde0: 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
bdf0: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
be00: 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 70  0 ){.    close(p
be10: 49 6e 69 74 2d 3e 68 29 3b 0a 20 20 20 20 73 71  Init->h);.    sq
be20: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
be30: 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
be40: 4c 6f 63 6b 49 6e 66 6f 28 70 49 6e 69 74 2d 3e  LockInfo(pInit->
be50: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65  pLock);.    rele
be60: 61 73 65 4f 70 65 6e 43 6e 74 28 70 49 6e 69 74  aseOpenCnt(pInit
be70: 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  ->pOpen);.    sq
be80: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
be90: 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  x();.    *pId = 
bea0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
beb0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
bec0: 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d  lse{.    *pNew =
bed0: 20 2a 70 49 6e 69 74 3b 0a 20 20 20 20 70 4e 65   *pInit;.    pNe
bee0: 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
bef0: 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f  lite3UnixIoMetho
bf00: 64 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f  d;.    *pId = (O
bf10: 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20  sFile*)pNew;.   
bf20: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
bf30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
bf40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ITE_OK;.  }.}...
bf50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bf60: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.
bf70: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
bf80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bfb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
bfc0: 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65  Everything above
bfd0: 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65   deals with file
bfe0: 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e   I/O.  Everythin
bff0: 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  g that follows d
c000: 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68  eals.** with oth
c010: 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  er miscellanous 
c020: 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f  aspects of the o
c030: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
c040: 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a  interface.******
c050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c090: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ******/.../*.** 
c0a0: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
c0b0: 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
c0c0: 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
c0d0: 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
c0e0: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
c0f0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
c100: 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
c110: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
c120: 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
c130: 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
c140: 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
c150: 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64   sqlite3UnixRand
c160: 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
c170: 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
c180: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
c190: 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
c1a0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
c1b0: 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
c1c0: 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
c1d0: 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
c1e0: 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
c1f0: 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
c200: 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
c210: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
c220: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
c230: 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
c240: 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
c250: 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
c260: 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
c270: 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
c280: 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
c290: 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
c2a0: 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
c2b0: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
c2c0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
c2d0: 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
c2e0: 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
c2f0: 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
c300: 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
c310: 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
c320: 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
c330: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
c340: 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
c350: 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
c360: 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
c370: 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
c380: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
c390: 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
c3a0: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
c3b0: 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
c3c0: 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
c3d0: 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
c3e0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
c3f0: 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69  Buf, 0, 256);.#i
c400: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c410: 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
c420: 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
c430: 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
c440: 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
c450: 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
c460: 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
c470: 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
c480: 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
c490: 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
c4a0: 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
c4b0: 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
c4c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
c4d0: 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  f[sizeof(time_t)
c4e0: 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
c4f0: 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
c500: 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
c510: 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20   zBuf, 256);.   
c520: 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
c530: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
c540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c550: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
c560: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
c570: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
c580: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
c590: 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
c5a0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
c5b0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
c5c0: 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
c5d0: 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74 20 73   sleep..*/.int s
c5e0: 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28  qlite3UnixSleep(
c5f0: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66  int ms){.#if def
c600: 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
c610: 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
c620: 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30  .  usleep(ms*100
c630: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  0);.  return ms;
c640: 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28  .#else.  sleep((
c650: 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ms+999)/1000);. 
c660: 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d   return 1000*((m
c670: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65  s+999)/1000);.#e
c680: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  ndif.}../*.** St
c690: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
c6a0: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
c6b0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
c6c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
c6d0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
c6e0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
c6f0: 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68 72  EADS.static pthr
c700: 65 61 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65 72  ead_t mutexOwner
c710: 3b 0a 73 74 61 74 69 63 20 70 74 68 72 65 61 64  ;.static pthread
c720: 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 31 20  _mutex_t mutex1 
c730: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
c740: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 73 74 61  INITIALIZER;.sta
c750: 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
c760: 78 5f 74 20 6d 75 74 65 78 32 20 3d 20 50 54 48  x_t mutex2 = PTH
c770: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
c780: 41 4c 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a 0a  ALIZER;.#endif..
c790: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
c7a0: 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74  ing pair of rout
c7b0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75  ine implement mu
c7c0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66  tual exclusion f
c7d0: 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65  or.** multi-thre
c7e0: 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20  aded processes. 
c7f0: 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   Only a single t
c800: 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64  hread is allowed
c810: 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20   to.** executed 
c820: 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72  code that is sur
c830: 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72  rounded by Enter
c840: 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76  Mutex() and Leav
c850: 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20  eMutex()..**.** 
c860: 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79  SQLite uses only
c870: 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e   a single Mutex.
c880: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d    There is not m
c890: 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20  uch critical.** 
c8a0: 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69  code and what li
c8b0: 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78  ttle there is ex
c8c0: 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61  ecutes quickly a
c8d0: 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b  nd without block
c8e0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66  ing..**.** As of
c8f0: 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20   version 3.3.2, 
c900: 74 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74 20  this mutex must 
c910: 62 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2f  be recursive..*/
c920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
c930: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23  xEnterMutex(){.#
c940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
c950: 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72  X_THREADS.  pthr
c960: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
c970: 6d 75 74 65 78 31 29 3b 0a 20 20 69 66 28 20 69  mutex1);.  if( i
c980: 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  nMutex==0 ){.   
c990: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
c9a0: 6f 63 6b 28 26 6d 75 74 65 78 32 29 3b 0a 20 20  ock(&mutex2);.  
c9b0: 20 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20 70    mutexOwner = p
c9c0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
c9d0: 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74   }.  pthread_mut
c9e0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
c9f0: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 4d  1);.#endif.  inM
ca00: 75 74 65 78 2b 2b 3b 0a 7d 0a 76 6f 69 64 20 73  utex++;.}.void s
ca10: 71 6c 69 74 65 33 55 6e 69 78 4c 65 61 76 65 4d  qlite3UnixLeaveM
ca20: 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74  utex(){.  assert
ca30: 28 20 69 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23  ( inMutex>0 );.#
ca40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
ca50: 58 5f 54 48 52 45 41 44 53 0a 20 20 61 73 73 65  X_THREADS.  asse
ca60: 72 74 28 20 70 74 68 72 65 61 64 5f 65 71 75 61  rt( pthread_equa
ca70: 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74  l(mutexOwner, pt
ca80: 68 72 65 61 64 5f 73 65 6c 66 28 29 29 20 29 3b  hread_self()) );
ca90: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
caa0: 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 31 29 3b 0a  _lock(&mutex1);.
cab0: 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 20 20 69    inMutex--;.  i
cac0: 66 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29 7b  f( inMutex==0 ){
cad0: 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74  .    pthread_mut
cae0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
caf0: 32 29 3b 0a 20 20 7d 0a 20 20 70 74 68 72 65 61  2);.  }.  pthrea
cb00: 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
cb10: 6d 75 74 65 78 31 29 3b 0a 23 65 6c 73 65 0a 20  mutex1);.#else. 
cb20: 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 23 65 6e 64   inMutex--;.#end
cb30: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
cb40: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6d  rn TRUE if the m
cb50: 75 74 65 78 20 69 73 20 63 75 72 72 65 6e 74 6c  utex is currentl
cb60: 79 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  y held..**.** If
cb70: 20 74 68 65 20 74 68 69 73 54 68 72 65 61 64 4f   the thisThreadO
cb80: 6e 6c 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  nly parameter is
cb90: 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 74 72   true, return tr
cba0: 75 65 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a  ue only if the.*
cbb0: 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64  * calling thread
cbc0: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
cbd0: 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
cbe0: 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65  ter is false, re
cbf0: 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
cc00: 61 6e 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73  any thread holds
cc10: 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69   the mutex..*/.i
cc20: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e  nt sqlite3UnixIn
cc30: 4d 75 74 65 78 28 69 6e 74 20 74 68 69 73 54 68  Mutex(int thisTh
cc40: 72 65 61 64 4f 6e 6c 79 29 7b 0a 23 69 66 64 65  readOnly){.#ifde
cc50: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
cc60: 52 45 41 44 53 0a 20 20 72 65 74 75 72 6e 20 69  READS.  return i
cc70: 6e 4d 75 74 65 78 3e 30 20 26 26 20 0a 20 20 20  nMutex>0 && .   
cc80: 20 20 20 20 20 20 20 20 28 74 68 69 73 54 68 72          (thisThr
cc90: 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 74  eadOnly==0 || pt
cca0: 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65  hread_equal(mute
ccb0: 78 4f 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f  xOwner, pthread_
ccc0: 73 65 6c 66 28 29 29 29 3b 0a 23 65 6c 73 65 0a  self()));.#else.
ccd0: 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78    return inMutex
cce0: 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  >0;.#endif.}../*
ccf0: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
cd00: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61   number of threa
cd10: 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20  d-specific-data 
cd20: 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64  blocks allocated
cd30: 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f  ..** Use this to
cd40: 20 76 65 72 69 66 79 20 74 68 61 74 20 77 65 20   verify that we 
cd50: 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20  are not leaking 
cd60: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d  thread-specific-
cd70: 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20  data..** Ticket 
cd80: 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20  #1601.*/.#ifdef 
cd90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
cda0: 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
cdb0: 74 20 3d 20 30 3b 0a 23 20 69 66 64 65 66 20 53  t = 0;.# ifdef S
cdc0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
cdd0: 44 53 0a 20 20 20 20 73 74 61 74 69 63 20 70 74  DS.    static pt
cde0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 74 73  hread_mutex_t ts
cdf0: 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 20  d_counter_mutex 
ce00: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
ce10: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20 20  INITIALIZER;.#  
ce20: 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e   define TSD_COUN
ce30: 54 45 52 28 4e 29 20 5c 0a 20 20 20 20 20 20 20  TER(N) \.       
ce40: 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75        pthread_mu
ce50: 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63 6f  tex_lock(&tsd_co
ce60: 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c 0a  unter_mutex); \.
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ce80: 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b  ite3_tsd_count +
ce90: 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20 20  = N; \.         
cea0: 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
ceb0: 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63 6f  x_unlock(&tsd_co
cec0: 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23 20  unter_mutex);.# 
ced0: 65 6c 73 65 0a 23 20 20 20 64 65 66 69 6e 65 20  else.#   define 
cee0: 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20  TSD_COUNTER(N)  
cef0: 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
cf00: 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a 23  t += N.# endif.#
cf10: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53  else.# define TS
cf20: 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f 2a  D_COUNTER(N)  /*
cf30: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
cf40: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65  ../*.** If calle
cf50: 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46  d with allocateF
cf60: 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72 65 74 75  lag>0, then retu
cf70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
cf80: 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66  thread.** specif
cf90: 69 63 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ic data for the 
cfa0: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
cfb0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
cfc0: 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64  ro the.** thread
cfd0: 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 69  -specific data i
cfe0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
cff0: 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a  ready exist..**.
d000: 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74  ** If called wit
d010: 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d 3d  h allocateFlag==
d020: 30 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 68  0, then check th
d030: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
d040: 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61 74  .** specific dat
d050: 61 2e 20 20 52 65 74 75 72 6e 20 69 74 20 69 66  a.  Return it if
d060: 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
d070: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
d080: 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
d090: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
d0a0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c   called with all
d0b0: 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20 63 68 65  ocateFlag<0, che
d0c0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
d0d0: 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63   thread specific
d0e0: 0a 2a 2a 20 64 61 74 61 20 69 73 20 61 6c 6c 6f  .** data is allo
d0f0: 63 61 74 65 64 20 61 6e 64 20 69 73 20 61 6c 6c  cated and is all
d100: 20 7a 65 72 6f 2e 20 20 49 66 20 69 74 20 69 73   zero.  If it is
d110: 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   then deallocate
d120: 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61   it..** Return a
d130: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d140: 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63 20  thread specific 
d150: 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20  data or NULL if 
d160: 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63  it is.** unalloc
d170: 61 74 65 64 20 6f 72 20 67 65 74 73 20 64 65 61  ated or gets dea
d180: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68 72  llocated..*/.Thr
d190: 65 61 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33  eadData *sqlite3
d1a0: 55 6e 69 78 54 68 72 65 61 64 53 70 65 63 69 66  UnixThreadSpecif
d1b0: 69 63 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63  icData(int alloc
d1c0: 61 74 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74  ateFlag){.  stat
d1d0: 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  ic const ThreadD
d1e0: 61 74 61 20 7a 65 72 6f 44 61 74 61 3b 0a 23 69  ata zeroData;.#i
d1f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
d200: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
d210: 63 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74 20  c pthread_key_t 
d220: 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  key;.  static in
d230: 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20  t keyInit = 0;. 
d240: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
d250: 64 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79 49 6e  d;..  if( !keyIn
d260: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
d270: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
d280: 0a 20 20 20 20 69 66 28 20 21 6b 65 79 49 6e 69  .    if( !keyIni
d290: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
d2a0: 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  c;.      rc = pt
d2b0: 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74 65  hread_key_create
d2c0: 28 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  (&key, 0);.     
d2d0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d2e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76     sqlite3OsLeav
d2f0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
d300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
d310: 20 20 7d 0a 20 20 20 20 20 20 6b 65 79 49 6e 69    }.      keyIni
d320: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
d330: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
d340: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20 20 70  utex();.  }..  p
d350: 54 73 64 20 3d 20 70 74 68 72 65 61 64 5f 67 65  Tsd = pthread_ge
d360: 74 73 70 65 63 69 66 69 63 28 6b 65 79 29 3b 0a  tspecific(key);.
d370: 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c    if( allocateFl
d380: 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ag>0 ){.    if( 
d390: 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTsd==0 ){.     
d3a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73   if( !sqlite3Tes
d3b0: 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b  tMallocFail() ){
d3c0: 0a 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20  .        pTsd = 
d3d0: 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28  sqlite3OsMalloc(
d3e0: 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29  sizeof(zeroData)
d3f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
d400: 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55  f SQLITE_MEMDEBU
d410: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  G.      sqlite3_
d420: 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64  isFail = 0;.#end
d430: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73  if.      if( pTs
d440: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54  d ){.        *pT
d450: 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20  sd = zeroData;. 
d460: 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 73         pthread_s
d470: 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20  etspecific(key, 
d480: 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20 54  pTsd);.        T
d490: 53 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a  SD_COUNTER(+1);.
d4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d4b0: 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d  }else if( pTsd!=
d4c0: 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61  0 && allocateFla
d4d0: 67 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  g<0 .           
d4e0: 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c   && memcmp(pTsd,
d4f0: 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65   &zeroData, size
d500: 6f 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d  of(ThreadData))=
d510: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d520: 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20  3OsFree(pTsd);. 
d530: 20 20 20 70 74 68 72 65 61 64 5f 73 65 74 73 70     pthread_setsp
d540: 65 63 69 66 69 63 28 6b 65 79 2c 20 30 29 3b 0a  ecific(key, 0);.
d550: 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28      TSD_COUNTER(
d560: 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20  -1);.    pTsd = 
d570: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d580: 70 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74  pTsd;.#else.  st
d590: 61 74 69 63 20 54 68 72 65 61 64 44 61 74 61 20  atic ThreadData 
d5a0: 2a 70 54 73 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pTsd = 0;.  if(
d5b0: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20   allocateFlag>0 
d5c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d  ){.    if( pTsd=
d5d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
d5e0: 21 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c  !sqlite3TestMall
d5f0: 6f 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20  ocFail() ){.    
d600: 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74      pTsd = sqlit
d610: 65 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  e3OsMalloc( size
d620: 6f 66 28 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a  of(zeroData) );.
d630: 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
d640: 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20  QLITE_MEMDEBUG. 
d650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73 46       sqlite3_isF
d660: 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ail = 0;.#endif.
d670: 20 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29        if( pTsd )
d680: 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20  {.        *pTsd 
d690: 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20  = zeroData;.    
d6a0: 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28      TSD_COUNTER(
d6b0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +1);.      }.   
d6c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
d6d0: 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61  Tsd!=0 && alloca
d6e0: 74 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20 20  teFlag<0.       
d6f0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
d700: 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20  Tsd, &zeroData, 
d710: 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74  sizeof(ThreadDat
d720: 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  a))==0 ){.    sq
d730: 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64  lite3OsFree(pTsd
d740: 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54  );.    TSD_COUNT
d750: 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64  ER(-1);.    pTsd
d760: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
d770: 72 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a  rn pTsd;.#endif.
d780: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
d790: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
d7a0: 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
d7b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63  -zero value, bec
d7c0: 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a  omes the result.
d7d0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ** returned from
d7e0: 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
d7f0: 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69  tTime().  This i
d800: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
d810: 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
d820: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
d830: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
d840: 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  me = 0;.#endif..
d850: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
d860: 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
d870: 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
d880: 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
d890: 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
d8a0: 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
d8b0: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
d8c0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
d8d0: 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
d8e0: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
d8f0: 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
d900: 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
d910: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
d920: 74 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54 69  te3UnixCurrentTi
d930: 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  me(double *prNow
d940: 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54  ){.#ifdef NO_GET
d950: 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a  TOD.  time_t t;.
d960: 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70    time(&t);.  *p
d970: 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30  rNow = t/86400.0
d980: 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65   + 2440587.5;.#e
d990: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
d9a0: 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73 74 72  eval sNow;.  str
d9b0: 75 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73 54 7a  uct timezone sTz
d9c0: 3b 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  ;  /* Not used *
d9d0: 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61 79  /.  gettimeofday
d9e0: 28 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b 0a 20  (&sNow, &sTz);. 
d9f0: 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35 38   *prNow = 244058
da00: 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73 65  7.5 + sNow.tv_se
da10: 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f 77  c/86400.0 + sNow
da20: 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30 30  .tv_usec/8640000
da30: 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a 23  0000.0;.#endif.#
da40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
da50: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
da60: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
da70: 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c      *prNow = sql
da80: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
da90: 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  e/86400.0 + 2440
daa0: 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69  587.5;.  }.#endi
dab0: 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  f.  return 0;.}.
dac0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55 4e  .#endif /* OS_UN
dad0: 49 58 20 2a 2f 0a                                IX */.