System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b25eca667f926d24b542fb20378b3665feccfe2b:


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 68 20 3d 20  *pId );.  f.h = 
5ba0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
5bb0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
5bc0: 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
5bd0: 41 52 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ARY,.           
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
5bf0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
5c00: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
5c10: 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a  .  if( f.h<0 ){.
5c20: 23 69 66 64 65 66 20 45 49 53 44 49 52 0a 20 20  #ifdef EISDIR.  
5c30: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 53    if( errno==EIS
5c40: 44 49 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74  DIR ){.      ret
5c50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
5c60: 50 45 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  PEN;.    }.#endi
5c70: 66 0a 20 20 20 20 66 2e 68 20 3d 20 6f 70 65 6e  f.    f.h = open
5c80: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
5c90: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
5ca0: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 20 20  |O_BINARY);.    
5cb0: 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20  if( f.h<0 ){.   
5cc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5cd0: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20  _CANTOPEN; .    
5ce0: 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79  }.    *pReadonly
5cf0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5d00: 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20     *pReadonly = 
5d10: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
5d20: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
5d30: 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
5d40: 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70 4c 6f 63  nfo(f.h, &f.pLoc
5d50: 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a 20 20  k, &f.pOpen);.  
5d60: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
5d70: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20  tex();.  if( rc 
5d80: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 66 2e 68  ){.    close(f.h
5d90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
5da0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5db0: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20    TRACE3("OPEN  
5dc0: 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 2e    %-3d %s\n", f.
5dd0: 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
5de0: 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65   return allocate
5df0: 55 6e 69 78 46 69 6c 65 28 26 66 2c 20 70 49 64  UnixFile(&f, pId
5e00: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  );.}.../*.** Att
5e10: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
5e20: 65 77 20 66 69 6c 65 20 66 6f 72 20 65 78 63 6c  ew file for excl
5e30: 75 73 69 76 65 20 61 63 63 65 73 73 20 62 79 20  usive access by 
5e40: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  this process..**
5e50: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
5e60: 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f 74  e opened for bot
5e70: 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  h reading and wr
5e80: 69 74 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64  iting.  To avoid
5e90: 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c 20  .** a potential 
5ea0: 73 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d  security problem
5eb0: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  , we do not allo
5ec0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  w the file to ha
5ed0: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
5ee0: 20 65 78 69 73 74 65 64 2e 20 20 4e 6f 72 20 64   existed.  Nor d
5ef0: 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68 65 20 66  o we allow the f
5f00: 69 6c 65 20 74 6f 20 62 65 20 61 20 73 79 6d 62  ile to be a symb
5f10: 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a  olic.** link..**
5f20: 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61 67 20 69  .** If delFlag i
5f30: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b  s true, then mak
5f40: 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74  e arrangements t
5f50: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
5f60: 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66 69  delete.** the fi
5f70: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
5f80: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  osed..**.** On s
5f90: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
5fa0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
5fb0: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
5fc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
5fd0: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
5fe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
5ff0: 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TOPEN..*/.int sq
6000: 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 45 78 63  lite3UnixOpenExc
6010: 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61  lusive(const cha
6020: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73  r *zFilename, Os
6030: 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69 6e 74 20  File **pId, int 
6040: 64 65 6c 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  delFlag){.  int 
6050: 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66  rc;.  unixFile f
6060: 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f  ;..  CRASH_TEST_
6070: 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33  OVERRIDE(sqlite3
6080: 43 72 61 73 68 4f 70 65 6e 45 78 63 6c 75 73 69  CrashOpenExclusi
6090: 76 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ve, zFilename, p
60a0: 49 64 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 20 20  Id, delFlag);.  
60b0: 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20  assert( 0==*pId 
60c0: 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  );.  if( access(
60d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30  zFilename, 0)==0
60e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
60f0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
6100: 20 20 7d 0a 20 20 66 2e 68 20 3d 20 6f 70 65 6e    }.  f.h = open
6110: 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  (zFilename,.    
6120: 20 20 20 20 20 20 20 20 20 20 20 20 4f 5f 52 44              O_RD
6130: 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43  WR|O_CREAT|O_EXC
6140: 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c  L|O_NOFOLLOW|O_L
6150: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
6160: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
6170: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
6180: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
6190: 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30  NS);.  if( f.h<0
61a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
61b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
61c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45    }.  sqlite3OsE
61d0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
61e0: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
61f0: 28 66 2e 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20  (f.h, &f.pLock, 
6200: 26 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c  &f.pOpen);.  sql
6210: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
6220: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ();.  if( rc ){.
6230: 20 20 20 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a      close(f.h);.
6240: 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
6250: 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
6260: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
6270: 20 20 7d 0a 20 20 69 66 28 20 64 65 6c 46 6c 61    }.  if( delFla
6280: 67 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  g ){.    unlink(
6290: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
62a0: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 2d 45    TRACE3("OPEN-E
62b0: 58 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 2e  X %-3d %s\n", f.
62c0: 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
62d0: 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65   return allocate
62e0: 55 6e 69 78 46 69 6c 65 28 26 66 2c 20 70 49 64  UnixFile(&f, pId
62f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  );.}../*.** Atte
6300: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  mpt to open a ne
6310: 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d  w file for read-
6320: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a  only access..**.
6330: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
6340: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
6350: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
6360: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
6370: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
6380: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
6390: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
63a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
63b0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
63c0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
63d0: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
63e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
63f0: 6e 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52  nixFile f;..  CR
6400: 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44  ASH_TEST_OVERRID
6410: 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70  E(sqlite3CrashOp
6420: 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69 6c  enReadOnly, zFil
6430: 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b 0a  ename, pId, 0);.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49    assert( 0==*pI
6450: 64 20 29 3b 0a 20 20 66 2e 68 20 3d 20 6f 70 65  d );.  f.h = ope
6460: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6470: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c  DONLY|O_LARGEFIL
6480: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69  E|O_BINARY);.  i
6490: 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20  f( f.h<0 ){.    
64a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
64b0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
64c0: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
64d0: 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64  x();.  rc = find
64e0: 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66  LockInfo(f.h, &f
64f0: 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e  .pLock, &f.pOpen
6500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  );.  sqlite3OsLe
6510: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
6520: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73  ( rc ){.    clos
6530: 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65 74 75  e(f.h);.    retu
6540: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
6550: 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f  .  }.  TRACE3("O
6560: 50 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e  PEN-RO %-3d %s\n
6570: 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d  ", f.h, zFilenam
6580: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c  e);.  return all
6590: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66  ocateUnixFile(&f
65a0: 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pId);.}../*.**
65b0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
65c0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
65d0: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
65e0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
65f0: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
6600: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
6610: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
6620: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
6630: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
6640: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
6650: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
6660: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
6670: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
6680: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
6690: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
66a0: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
66b0: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
66c0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
66d0: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e  r.** windows sin
66e0: 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  ce windows does 
66f0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64  not support hard
6700: 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e   links..**.** On
6710: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
6720: 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  le for a previou
6730: 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  sly open file at
6740: 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70 64 61 74   *id is.** updat
6750: 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ed with the new 
6760: 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64  directory file d
6770: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 53 51  escriptor and SQ
6780: 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65  LITE_OK is.** re
6790: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  turned..**.** On
67a0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
67b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
67c0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
67d0: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
67e0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
67f0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
6800: 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20 4f  enDirectory(.  O
6810: 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63 6f 6e  sFile *id,.  con
6820: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
6830: 65 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e.){.  unixFile 
6840: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
6850: 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46  le*)id;.  if( pF
6860: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ile==0 ){.    /*
6870: 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65   Do not open the
6880: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74 68   directory if th
6890: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
68a0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  file is not alre
68b0: 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e  ady.    ** open.
68c0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
68d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
68e0: 20 20 7d 0a 20 20 53 45 54 5f 54 48 52 45 41 44    }.  SET_THREAD
68f0: 49 44 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73  ID(pFile);.  ass
6900: 65 72 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66  ert( pFile->dirf
6910: 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  d<0 );.  pFile->
6920: 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69  dirfd = open(zDi
6930: 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
6940: 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
6950: 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  if( pFile->dirfd
6960: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
6970: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6980: 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  ; .  }.  TRACE3(
6990: 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
69a0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
69b0: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
69c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
69d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
69e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
69f0: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
6a00: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
6a10: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
6a20: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
6a30: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
6a40: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
6a50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
6a60: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6a70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
6a80: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
6a90: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
6aa0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
6ab0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
6ac0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
6ad0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  = 0;../*.** Crea
6ae0: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
6af0: 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
6b00: 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
6b10: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
6b20: 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53   hold at least S
6b30: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
6b40: 49 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a  IZE characters..
6b50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
6b60: 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63  ixTempFileName(c
6b70: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
6b80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6b90: 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
6ba0: 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72     0,.     "/var
6bb0: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
6bc0: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
6bd0: 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
6be0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
6bf0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6c00: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
6c10: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
6c20: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
6c30: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
6c40: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
6c50: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
6c60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
6c70: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
6c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
6c90: 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72  r = ".";.  azDir
6ca0: 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74  s[0] = sqlite3_t
6cb0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
6cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
6cd0: 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
6ce0: 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
6cf0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
6d00: 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
6d10: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
6d20: 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
6d30: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
6d40: 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
6d50: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
6d60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
6d70: 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
6d80: 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
6d90: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
6da0: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
6db0: 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20  ak;.  }.  do{.  
6dc0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6dd0: 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50  "%s/"TEMP_FILE_P
6de0: 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
6df0: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
6e00: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  f);.    sqlite3R
6e10: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
6e20: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
6e30: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
6e40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
6e50: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
6e60: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
6e70: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
6e80: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
6e90: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
6ea0: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
6eb0: 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
6ec0: 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
6ed0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
6ee0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
6ef0: 61 74 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e  at a given pathn
6f00: 61 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f  ame is a directo
6f10: 72 79 20 61 6e 64 20 69 73 20 77 72 69 74 61 62  ry and is writab
6f20: 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  le .**.*/.int sq
6f30: 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72 57 72  lite3UnixIsDirWr
6f40: 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75  itable(char *zBu
6f50: 66 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f){.#ifndef SQLI
6f60: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
6f70: 41 47 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73  AGMAS.  struct s
6f80: 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a  tat buf;.  if( z
6f90: 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
6fa0: 30 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d  0;.  if( zBuf[0]
6fb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6fc0: 20 20 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c    if( stat(zBuf,
6fd0: 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
6fe0: 30 3b 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49  0;.  if( !S_ISDI
6ff0: 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
7000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
7010: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37   access(zBuf, 07
7020: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
7030: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7040: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
7050: 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b  S */.  return 1;
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
7070: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
7080: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
7090: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
70a0: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
70b0: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
70c0: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
70d0: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
70e0: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
70f0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7100: 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c  t unixRead(OsFil
7110: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
7120: 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69  f, int amt){.  i
7130: 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
7140: 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61  ( id );.  Simula
7150: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
7160: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45 52  _IOERR);.  TIMER
7170: 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20  _START;.  got = 
7180: 72 65 61 64 28 28 28 75 6e 69 78 46 69 6c 65 2a  read(((unixFile*
7190: 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61  )id)->h, pBuf, a
71a0: 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44  mt);.  TIMER_END
71b0: 3b 0a 20 20 54 52 41 43 45 35 28 22 52 45 41 44  ;.  TRACE5("READ
71c0: 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 64      %-3d %5d %7d
71d0: 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46 69   %d\n", ((unixFi
71e0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67 6f 74 2c  le*)id)->h, got,
71f0: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f  .          last_
7200: 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50  page, TIMER_ELAP
7210: 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  SED);.  SEEK(0);
7220: 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74 3c 30 20  .  /* if( got<0 
7230: 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  ) got = 0; */.  
7240: 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
7250: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7260: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
7270: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7280: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _IOERR;.  }.}../
7290: 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
72a0: 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
72b0: 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
72c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
72d0: 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
72e0: 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
72f0: 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
7300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
7310: 69 78 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a  ixWrite(OsFile *
7320: 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  id, const void *
7330: 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a  pBuf, int amt){.
7340: 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
7350: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
7360: 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
7370: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
7380: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
7390: 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  RR);.  SimulateD
73a0: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b 0a 20 20  iskfullError;.  
73b0: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 77  TIMER_START;.  w
73c0: 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28  hile( amt>0 && (
73d0: 77 72 6f 74 65 20 3d 20 77 72 69 74 65 28 28 28  wrote = write(((
73e0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
73f0: 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
7400: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
7410: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
7420: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
7430: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d  rote];.  }.  TIM
7440: 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35  ER_END;.  TRACE5
7450: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
7460: 35 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 28 28  5d %7d %d\n", ((
7470: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
7480: 2c 20 77 72 6f 74 65 2c 0a 20 20 20 20 20 20 20  , wrote,.       
7490: 20 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49     last_page, TI
74a0: 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
74b0: 53 45 45 4b 28 30 29 3b 0a 20 20 69 66 28 20 61  SEEK(0);.  if( a
74c0: 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
74d0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
74e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
74f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
7500: 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77   Move the read/w
7510: 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rite pointer in 
7520: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
7530: 63 20 69 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f  c int unixSeek(O
7540: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  sFile *id, i64 o
7550: 66 66 73 65 74 29 7b 0a 20 20 61 73 73 65 72 74  ffset){.  assert
7560: 28 20 69 64 20 29 3b 0a 20 20 53 45 45 4b 28 6f  ( id );.  SEEK(o
7570: 66 66 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b  ffset/1024 + 1);
7580: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
7590: 45 53 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74  EST.  if( offset
75a0: 20 29 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66   ) SimulateDiskf
75b0: 75 6c 6c 45 72 72 6f 72 0a 23 65 6e 64 69 66 0a  ullError.#endif.
75c0: 20 20 6c 73 65 65 6b 28 28 28 75 6e 69 78 46 69    lseek(((unixFi
75d0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73  le*)id)->h, offs
75e0: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
75f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7600: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7610: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
7620: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
7630: 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
7640: 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
7650: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
7660: 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
7670: 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
7680: 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
7690: 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
76a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
76b0: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
76c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
76d0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
76e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
76f0: 73 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63  se the fdatasync
7700: 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74  () API only if t
7710: 68 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e  he HAVE_FDATASYN
7720: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
7730: 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
7740: 20 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20   use fsync() in 
7750: 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69  its place..*/.#i
7760: 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41  fndef HAVE_FDATA
7770: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64  SYNC.# define fd
7780: 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
7790: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
77a0: 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
77b0: 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
77c0: 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
77d0: 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
77e0: 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
77f0: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
7800: 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
7810: 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
7820: 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
7830: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
7840: 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
7850: 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
7860: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
7870: 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
7880: 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
7890: 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
78a0: 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
78b0: 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
78c0: 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
78d0: 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
78e0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
78f0: 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
7900: 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
7910: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
7920: 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
7930: 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
7940: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
7950: 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
7960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7970: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7980: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
7990: 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
79a0: 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
79b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
79c0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
79d0: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
79e0: 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
79f0: 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
7a00: 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
7a10: 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
7a20: 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
7a30: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
7a40: 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
7a50: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
7a60: 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
7a70: 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
7a80: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
7a90: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
7aa0: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
7ab0: 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
7ac0: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
7ad0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
7ae0: 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
7af0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
7b00: 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
7b10: 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
7b20: 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
7b30: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
7b40: 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
7b50: 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 64 65  OK;.#else..#ifde
7b60: 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  f F_FULLFSYNC.  
7b70: 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
7b80: 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66      rc = fcntl(f
7b90: 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
7ba0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
7bb0: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
7bc0: 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 53 59 4e  * If the FULLSYN
7bd0: 43 20 66 61 69 6c 65 64 2c 20 74 72 79 20 74 6f  C failed, try to
7be0: 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
7bf0: 6e 63 28 29 20 2a 2f 0a 20 20 69 66 28 20 72 63  nc() */.  if( rc
7c00: 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
7c10: 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  );..#else /* if 
7c20: 21 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c 53  !defined(F_FULLS
7c30: 59 4e 43 29 20 2a 2f 0a 20 20 69 66 28 20 64 61  YNC) */.  if( da
7c40: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
7c50: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
7c60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7c70: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
7c80: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
7c90: 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e 43  ined(F_FULLFSYNC
7ca0: 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ) */.#endif /* d
7cb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
7cc0: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
7cd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7ce0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
7cf0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
7d00: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
7d10: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
7d20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
7d30: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
7d40: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
7d50: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
7d60: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
7d70: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
7d80: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
7d90: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
7da0: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
7db0: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
7dc0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
7dd0: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
7de0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
7df0: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
7e00: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
7e10: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
7e20: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
7e30: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
7e40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
7e50: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
7e60: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
7e70: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
7e80: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
7e90: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
7ea0: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
7eb0: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
7ec0: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
7ed0: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
7ee0: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
7ef0: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
7f00: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
7f10: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
7f20: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
7f30: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7f40: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
7f50: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
7f60: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
7f70: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
7f80: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
7f90: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
7fa0: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
7fb0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
7fc0: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
7fd0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
7fe0: 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 75 6e   dataOnly){.  un
7ff0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
8000: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
8010: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
8020: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
8030: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
8040: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e  );.  TRACE2("SYN
8050: 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
8060: 69 6c 65 2d 3e 68 29 3b 0a 20 20 69 66 28 20 66  ile->h);.  if( f
8070: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
8080: 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  >h, pFile->fullS
8090: 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 20 29  ync, dataOnly) )
80a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
80b0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20  ITE_IOERR;.  }. 
80c0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
80d0: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43  d>=0 ){.    TRAC
80e0: 45 32 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E2("DIRSYNC %-3d
80f0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
8100: 64 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d);.#ifndef SQLI
8110: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
8120: 4e 43 0a 20 20 20 20 69 66 28 20 66 75 6c 6c 5f  NC.    if( full_
8130: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
8140: 66 64 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  fd, pFile->fullS
8150: 79 6e 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ync, 0) ){.     
8160: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8170: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 23 65  _IOERR;.    }.#e
8180: 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73 65 28 70  ndif.    close(p
8190: 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20 20 2f  File->dirfd);  /
81a0: 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  * Only need to s
81b0: 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f  ync once, so clo
81c0: 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  se the directory
81d0: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   */.    pFile->d
81e0: 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a  irfd = -1;    /*
81f0: 20 77 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e   when we are don
8200: 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  e. */.  }.  retu
8210: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8220: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
8230: 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61  directory zDirna
8240: 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  me. This is a no
8250: 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67  -op on operating
8260: 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a   systems other.*
8270: 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2a 0a  * than UNIX..**.
8280: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
8290: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
82a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
82b0: 66 69 6c 65 20 68 61 73 20 74 72 75 65 6c 79 20  file has truely 
82c0: 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 2a 2a 20  been deleted.** 
82d0: 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 63 68  before making ch
82e0: 61 6e 67 65 73 20 74 6f 20 69 6e 64 69 76 69 64  anges to individ
82f0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 6f 6e 20  ual journals on 
8300: 61 20 6d 75 6c 74 69 2d 64 61 74 61 62 61 73 65  a multi-database
8310: 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54 68 65 20   commit..** The 
8320: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f 70 74 69  F_FULLFSYNC opti
8330: 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  on is not needed
8340: 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   here..*/.int sq
8350: 6c 69 74 65 33 55 6e 69 78 53 79 6e 63 44 69 72  lite3UnixSyncDir
8360: 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
8370: 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 23 69  r *zDirname){.#i
8380: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
8390: 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 72 65  BLE_DIRSYNC.  re
83a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
83b0: 23 65 6c 73 65 0a 20 20 69 6e 74 20 66 64 3b 0a  #else.  int fd;.
83c0: 20 20 69 6e 74 20 72 3b 0a 20 20 53 69 6d 75 6c    int r;.  Simul
83d0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
83e0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66 64 20 3d  E_IOERR);.  fd =
83f0: 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20   open(zDirname, 
8400: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
8410: 59 2c 20 30 29 3b 0a 20 20 54 52 41 43 45 33 28  Y, 0);.  TRACE3(
8420: 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20 28 25  "DIRSYNC %-3d (%
8430: 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  s)\n", fd, zDirn
8440: 61 6d 65 29 3b 0a 20 20 69 66 28 20 66 64 3c 30  ame);.  if( fd<0
8450: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8460: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
8470: 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63  .  }.  r = fsync
8480: 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64  (fd);.  close(fd
8490: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 3d  );.  return ((r=
84a0: 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51  =0)?SQLITE_OK:SQ
84b0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 23 65 6e  LITE_IOERR);.#en
84c0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  dif.}../*.** Tru
84d0: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
84e0: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
84f0: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
8500: 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
8510: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
8520: 34 20 6e 42 79 74 65 29 7b 0a 20 20 61 73 73 65  4 nByte){.  asse
8530: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
8540: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
8550: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 72 65 74  TE_IOERR);.  ret
8560: 75 72 6e 20 66 74 72 75 6e 63 61 74 65 28 28 28  urn ftruncate(((
8570: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
8580: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
8590: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
85a0: 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _IOERR;.}../*.**
85b0: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
85c0: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
85d0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
85e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
85f0: 78 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65  xFileSize(OsFile
8600: 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
8610: 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  ){.  struct stat
8620: 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
8630: 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  id );.  Simulate
8640: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
8650: 4f 45 52 52 29 3b 0a 20 20 69 66 28 20 66 73 74  OERR);.  if( fst
8660: 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
8670: 64 29 2d 3e 68 2c 20 26 62 75 66 29 21 3d 30 20  d)->h, &buf)!=0 
8680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8690: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
86a0: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
86b0: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
86c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
86d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
86e0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
86f0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
8700: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
8710: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
8720: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
8730: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
8740: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
8750: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
8760: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ** non-zero.  If
8770: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
8780: 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f  ocked or holds o
8790: 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  nly SHARED locks
87a0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
87b0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
87c0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
87d0: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
87e0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
87f0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
8800: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
8810: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
8820: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 73 71  t( pFile );.  sq
8830: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
8840: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
8850: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
8860: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
8870: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
8880: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
8890: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
88a0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
88b0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
88c0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
88d0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
88e0: 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d  {.    r = 1;.  }
88f0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
8900: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
8910: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
8920: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8930: 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  !r ){.    struct
8940: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
8950: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
8960: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
8970: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
8980: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
8990: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
89a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
89b0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
89c0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
89d0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_GETLK, &lock);
89e0: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  .    if( lock.l_
89f0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
8a00: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
8a10: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
8a20: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
8a30: 28 29 3b 0a 20 20 54 52 41 43 45 33 28 22 54 45  ();.  TRACE3("TE
8a40: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
8a50: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
8a60: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a  );..  return r;.
8a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
8a80: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
8a90: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
8aa0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
8ab0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
8ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
8ad0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
8ae0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
8af0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
8b00: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
8b10: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
8b20: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
8b30: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
8b40: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
8b50: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
8b60: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
8b70: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
8b80: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
8b90: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
8ba0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
8bb0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
8bc0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
8bd0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
8be0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
8bf0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
8c00: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
8c10: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
8c20: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
8c30: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
8c40: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
8c50: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
8c60: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
8c70: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
8c80: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
8c90: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
8ca0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
8cb0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
8cc0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
8cd0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
8ce0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
8cf0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
8d00: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
8d10: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
8d20: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
8d30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
8d40: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
8d50: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
8d60: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
8d70: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
8d80: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
8d90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
8da0: 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65   unixLock(OsFile
8db0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
8dc0: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
8dd0: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
8de0: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
8df0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
8e00: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
8e10: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
8e20: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
8e30: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
8e40: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
8e50: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
8e60: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
8e70: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
8e80: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
8e90: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
8ea0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
8eb0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
8ec0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
8ed0: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
8ee0: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
8ef0: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
8f00: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
8f10: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
8f20: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
8f30: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
8f40: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
8f50: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
8f60: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
8f70: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
8f80: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
8f90: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
8fa0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
8fb0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
8fc0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
8fd0: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
8fe0: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
8ff0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
9000: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
9010: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
9020: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
9030: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
9040: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
9050: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
9060: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
9070: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
9080: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
9090: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
90a0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
90b0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
90c0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
90d0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
90e0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
90f0: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
9100: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
9110: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
9120: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
9130: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
9140: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
9150: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
9160: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
9170: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
9180: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
9190: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
91a0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
91b0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
91c0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
91d0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
91e0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
91f0: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
9200: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
9210: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
9220: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
9230: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
9240: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
9250: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
9260: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
9270: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
9280: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
9290: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
92a0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
92b0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
92c0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
92d0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
92e0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
92f0: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
9300: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
9310: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
9320: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
9330: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
9340: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
9350: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
9360: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
9370: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
9380: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
9390: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
93a0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
93b0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
93c0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
93d0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
93e0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
93f0: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
9400: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
9410: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
9420: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
9430: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
9440: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
9450: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
9460: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
9470: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
9480: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
9490: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
94a0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
94b0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
94c0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
94d0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
94e0: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
94f0: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
9500: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
9510: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
9520: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
9530: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
9540: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
9550: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
9560: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
9570: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
9580: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
9590: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
95a0: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
95b0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
95c0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
95d0: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
95e0: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
95f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
9600: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
9610: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
9620: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9630: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72  xFile*)id;.  str
9640: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
9650: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
9660: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
9670: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73  ck lock;.  int s
9680: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
9690: 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22  le );.  TRACE7("
96a0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
96b0: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
96c0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
96d0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
96e0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
96f0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
9700: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
9710: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9720: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
9730: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
9740: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
9750: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
9760: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
9770: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
9780: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
9790: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
97a0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
97b0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
97c0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
97d0: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
97e0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
97f0: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
9800: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
9810: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
9820: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
9830: 20 20 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20    TRACE3("LOCK  
9840: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
9850: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
9860: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
9870: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
9880: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
9890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
98a0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
98b0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
98c0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
98d0: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
98e0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
98f0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
9900: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
9910: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9920: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
9930: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
9940: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
9950: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
9960: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
9970: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9980: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
9990: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
99a0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
99b0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
99c0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
99d0: 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  /.  sqlite3OsEnt
99e0: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
99f0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
9a00: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
9a10: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
9a20: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
9a30: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
9a40: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9a50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
9a60: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
9a70: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
9a80: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
9a90: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
9aa0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
9ab0: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
9ac0: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
9ad0: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
9ae0: 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  OsFile*.  ** han
9af0: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
9b00: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
9b10: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
9b20: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
9b30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
9b40: 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
9b50: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
9b60: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
9b70: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
9b80: 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44   locktype>SHARED
9b90: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
9ba0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
9bb0: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
9bc0: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
9bd0: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
9be0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
9bf0: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
9c00: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
9c10: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
9c20: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
9c30: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
9c40: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
9c50: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
9c60: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9c70: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
9c80: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9c90: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
9ca0: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
9cb0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
9cc0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
9cd0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
9ce0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9cf0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9d00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
9d10: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
9d20: 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  type==0 );.    a
9d30: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
9d40: 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  t>0 );.    pFile
9d50: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
9d60: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  RED_LOCK;.    pL
9d70: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
9d80: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
9d90: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
9da0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
9db0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
9dc0: 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  ;..  lock.l_when
9dd0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a  ce = SEEK_SET;..
9de0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
9df0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
9e00: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
9e10: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
9e20: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
9e30: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
9e40: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
9e50: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
9e60: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
9e70: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
9e80: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
9e90: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9ea0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
9eb0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
9ec0: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
9ed0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
9ee0: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
9ef0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9f00: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
9f10: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
9f20: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
9f30: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
9f40: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
9f50: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
9f60: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9f70: 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a  );.    if( s ){.
9f80: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
9f90: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
9fa0: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
9fb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
9fc0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
9fd0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
9fe0: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
9ff0: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
a000: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
a010: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
a020: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
a030: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
a040: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
a050: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
a060: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a070: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
a080: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20  ( pLock->cnt==0 
a090: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a0a0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
a0b0: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  0 );..    /* Now
a0c0: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
a0d0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
a0e0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
a0f0: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
a100: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
a110: 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  IZE;.    s = fcn
a120: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a130: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20  ETLK, &lock);.. 
a140: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
a150: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
a160: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
a170: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
a180: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
a190: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
a1a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
a1b0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
a1c0: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
a1d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
a1e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )!=0 ){.      rc
a1f0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
a200: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
a210: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
a220: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
a230: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lock;.    }.    
a240: 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72  if( s ){.      r
a250: 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56  c = (errno==EINV
a260: 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c  AL) ? SQLITE_NOL
a270: 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  FS : SQLITE_BUSY
a280: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a290: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a2a0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
a2b0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70  ;.      pFile->p
a2c0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
a2d0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
a2e0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
a2f0: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
a300: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a310: 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20  && pLock->cnt>1 
a320: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
a330: 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
a340: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
a350: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
a360: 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
a370: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
a380: 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
a390: 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
a3a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a3b0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
a3c0: 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
a3d0: 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
a3e0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
a3f0: 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
a400: 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
a410: 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
a420: 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
a430: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
a440: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
a450: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
a460: 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f  rt( 0!=pFile->lo
a470: 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f  cktype );.    lo
a480: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
a490: 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28  LCK;.    switch(
a4a0: 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20   locktype ){.   
a4b0: 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44     case RESERVED
a4c0: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
a4d0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a4e0: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a4f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a500: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
a510: 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c  _LOCK:.        l
a520: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
a530: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
a540: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a550: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
a560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a570: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
a580: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
a590: 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e     }.    s = fcn
a5a0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a5b0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
a5c0: 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20    if( s ){.     
a5d0: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
a5e0: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
a5f0: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
a600: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
a610: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
a620: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
a630: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
a640: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
a650: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
a660: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
a670: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
a680: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
a690: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
a6a0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
a6b0: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
a6c0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a6d0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
a6e0: 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33  _lock:.  sqlite3
a6f0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
a700: 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20    TRACE4("LOCK  
a710: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70    %d %s %s\n", p
a720: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
a730: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
a740: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
a750: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
a760: 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75  failed");.  retu
a770: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a780: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
a790: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
a7a0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
a7b0: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
a7c0: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
a7d0: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
a7e0: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
a7f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
a800: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
a810: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
a820: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
a830: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
a840: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
a850: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
a860: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
a870: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a880: 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46  t unixUnlock(OsF
a890: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a8a0: 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74  ktype){.  struct
a8b0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
a8c0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
a8d0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
a8e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
a8f0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a900: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a910: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
a920: 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 55 4e   );.  TRACE7("UN
a930: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
a940: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
a950: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
a960: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70  ocktype,.      p
a970: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
a980: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
a990: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70  cktype, pFile->p
a9a0: 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69  Lock->cnt, getpi
a9b0: 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  d());..  assert(
a9c0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
a9d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
a9e0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
a9f0: 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
aa00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
aa10: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45  K;.  }.  if( CHE
aa20: 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c  CK_THREADID(pFil
aa30: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
aa40: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
aa50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45    }.  sqlite3OsE
aa60: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
aa70: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
aa80: 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ock;.  assert( p
aa90: 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a  Lock->cnt!=0 );.
aaa0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
aab0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
aac0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
aad0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
aae0: 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ==pFile->locktyp
aaf0: 65 20 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  e );.    if( loc
ab00: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ab10: 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  CK ){.      lock
ab20: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
ab30: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
ab40: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ab50: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
ab60: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ab70: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
ab80: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ab90: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
aba0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
abb0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21  F_SETLK, &lock)!
abc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
abd0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
abe0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
abf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ac00: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a  _IOERR;.      }.
ac10: 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c      }.    lock.l
ac20: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
ac30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
ac40: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
ac50: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ac60: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
ac70: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
ac80: 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45   2L;  assert( PE
ac90: 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45  NDING_BYTE+1==RE
aca0: 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20  SERVED_BYTE );. 
acb0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
acc0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
acd0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
ace0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
acf0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
ad00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ad10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ad20: 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73  OERR;  /* This s
ad30: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
ad40: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  en */.    }.  }.
ad50: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ad60: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
ad70: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
ad80: 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  Open;..    /* De
ad90: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
ada0: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
adb0: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
adc0: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
add0: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
ade0: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
adf0: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
ae00: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
ae10: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
ae20: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
ae30: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
ae40: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74    if( pLock->cnt
ae50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
ae60: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ae70: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
ae80: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ae90: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
aea0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
aeb0: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
aec0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
aed0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
aee0: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
aef0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
af00: 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  e = NO_LOCK;.   
af10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
af30: 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  ERR;  /* This sh
af40: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
af50: 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
af60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   }..    /* Decre
af70: 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f  ment the count o
af80: 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20  f locks against 
af90: 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20  this same file. 
afa0: 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   When the.    **
afb0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
afc0: 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f  ero, close any o
afd0: 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
afe0: 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73  ptors whose clos
aff0: 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66  e.    ** was def
b000: 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66  erred because of
b010: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
b020: 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ks..    */.    p
b030: 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f  Open = pFile->pO
b040: 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e  pen;.    pOpen->
b050: 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73  nLock--;.    ass
b060: 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ert( pOpen->nLoc
b070: 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
b080: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
b090: 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  && pOpen->nPendi
b0a0: 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ng>0 ){.      in
b0b0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
b0c0: 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65  =0; i<pOpen->nPe
b0d0: 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nding; i++){.   
b0e0: 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e       close(pOpen
b0f0: 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a  ->aPending[i]);.
b100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
b110: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
b120: 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ng);.      pOpen
b130: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
b140: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b150: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d  nding = 0;.    }
b160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
b170: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
b180: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b190: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
b1a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b1b0: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
b1c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b1d0: 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a  ixClose(OsFile *
b1e0: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
b1f0: 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c  e *id = (unixFil
b200: 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20  e*)*pId;..  if( 
b210: 21 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !id ) return SQL
b220: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e  ITE_OK;.  unixUn
b230: 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f  lock(*pId, NO_LO
b240: 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64  CK);.  if( id->d
b250: 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
b260: 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64  id->dirfd);.  id
b270: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
b280: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
b290: 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 69 64  tex();..  if( id
b2a0: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
b2b0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
b2c0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
b2d0: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
b2e0: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
b2f0: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
b300: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
b310: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
b320: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
b330: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
b340: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
b350: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
b360: 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
b370: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
b380: 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
b390: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  .    ** the last
b3a0: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
b3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
b3c0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75   *aNew;.    stru
b3d0: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
b3e0: 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20  n = id->pOpen;. 
b3f0: 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f     aNew = reallo
b400: 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  c( pOpen->aPendi
b410: 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ng, (pOpen->nPen
b420: 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69  ding+1)*sizeof(i
b430: 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61  nt) );.    if( a
b440: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
b450: 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66  /* If a malloc f
b460: 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20  ails, just leak 
b470: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
b480: 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  tor */.    }else
b490: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  {.      pOpen->a
b4a0: 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a  Pending = aNew;.
b4b0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
b4c0: 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65  nding[pOpen->nPe
b4d0: 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a  nding] = id->h;.
b4e0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65        pOpen->nPe
b4f0: 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nding++;.    }. 
b500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
b510: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
b520: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f  tanding locks so
b530: 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68   we can close th
b540: 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  e file immediate
b550: 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28  ly */.    close(
b560: 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65  id->h);.  }.  re
b570: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 69 64  leaseLockInfo(id
b580: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65  ->pLock);.  rele
b590: 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d 3e 70  aseOpenCnt(id->p
b5a0: 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65  Open);..  sqlite
b5b0: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
b5c0: 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
b5d0: 30 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f  0;.  TRACE2("CLO
b5e0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SE   %-3d\n", id
b5f0: 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
b600: 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
b610: 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  eFree(id);.  *pI
b620: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
b630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b640: 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
b650: 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
b660: 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
b670: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
b680: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  nter.** to the f
b690: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f  ull pathname sto
b6a0: 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74  red in space obt
b6b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
b6c0: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  eMalloc()..** Th
b6d0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
b6e0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
b6f0: 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
b700: 69 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74  is space once it
b710: 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
b720: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72   needed..*/.char
b730: 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 46 75 6c   *sqlite3UnixFul
b740: 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20  lPathname(const 
b750: 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 29  char *zRelative)
b760: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  {.  char *zFull 
b770: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61  = 0;.  if( zRela
b780: 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  tive[0]=='/' ){.
b790: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
b7a0: 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65  ring(&zFull, zRe
b7b0: 6c 61 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30  lative, (char*)0
b7c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b7d0: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c  char *zBuf = sql
b7e0: 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b  iteMalloc(5000);
b7f0: 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30  .    if( zBuf==0
b800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b810: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   0;.    }.    zB
b820: 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73  uf[0] = 0;.    s
b830: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
b840: 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a  &zFull, getcwd(z
b850: 42 75 66 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c  Buf, 5000), "/",
b860: 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20   zRelative,.    
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
b890: 71 6c 69 74 65 46 72 65 65 28 7a 42 75 66 29 3b  qliteFree(zBuf);
b8a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
b8b0: 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ull;.}../*.** Ch
b8c0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
b8d0: 66 20 74 68 65 20 66 75 6c 6c 73 79 6e 63 20 66  f the fullsync f
b8e0: 6c 61 67 20 69 6e 20 74 68 65 20 67 69 76 65 6e  lag in the given
b8f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b910: 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63   unixSetFullSync
b920: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
b930: 20 76 29 7b 0a 20 20 28 28 75 6e 69 78 46 69 6c   v){.  ((unixFil
b940: 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53 79 6e 63  e*)id)->fullSync
b950: 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = v;.}../*.** R
b960: 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72 6c  eturn the underl
b970: 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c 65  ying file handle
b980: 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a 2a   for an OsFile.*
b990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
b9a0: 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46 69  xFileHandle(OsFi
b9b0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
b9c0: 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  n ((unixFile*)id
b9d0: 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  )->h;.}../*.** R
b9e0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
b9f0: 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 74 68   that indices th
ba00: 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  e type of lock c
ba10: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a  urrently held.**
ba20: 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   by this handle.
ba30: 20 20 28 55 73 65 64 20 66 6f 72 20 74 65 73 74    (Used for test
ba40: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
ba50: 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74 69   only.).*/.stati
ba60: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 74  c int unixLockSt
ba70: 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  ate(OsFile *id){
ba80: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78  .  return ((unix
ba90: 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74  File*)id)->lockt
baa0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ype;.}../*.** Th
bab0: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
bac0: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
bad0: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
bae0: 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
baf0: 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  ** for unix..*/.
bb00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d  static const IoM
bb10: 65 74 68 6f 64 20 73 71 6c 69 74 65 33 55 6e 69  ethod sqlite3Uni
bb20: 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
bb30: 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  unixClose,.  uni
bb40: 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  xOpenDirectory,.
bb50: 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
bb60: 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 53  ixWrite,.  unixS
bb70: 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63  eek,.  unixTrunc
bb80: 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c  ate,.  unixSync,
bb90: 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79  .  unixSetFullSy
bba0: 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48 61  nc,.  unixFileHa
bbb0: 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65  ndle,.  unixFile
bbc0: 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b  Size,.  unixLock
bbd0: 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  ,.  unixUnlock,.
bbe0: 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
bbf0: 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
bc00: 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a  rvedLock,.};../*
bc10: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d  .** Allocate mem
bc20: 6f 72 79 20 66 6f 72 20 61 20 75 6e 69 78 46 69  ory for a unixFi
bc30: 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  le.  Initialize 
bc40: 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  the new unixFile
bc50: 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65  .** to the value
bc60: 20 67 69 76 65 6e 20 69 6e 20 70 49 6e 69 74 20   given in pInit 
bc70: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
bc80: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a  nter to the new.
bc90: 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49 66 20 77  ** OsFile.  If w
bca0: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
bcb0: 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  ory, close the f
bcc0: 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ile and return N
bcd0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL..*/.static i
bce0: 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  nt allocateUnixF
bcf0: 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 49  ile(unixFile *pI
bd00: 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  nit, OsFile **pI
bd10: 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
bd20: 70 4e 65 77 3b 0a 20 20 70 49 6e 69 74 2d 3e 64  pNew;.  pInit->d
bd30: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 70 49 6e  irfd = -1;.  pIn
bd40: 69 74 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30  it->fullSync = 0
bd50: 3b 0a 20 20 70 49 6e 69 74 2d 3e 6c 6f 63 6b 74  ;.  pInit->lockt
bd60: 79 70 65 20 3d 20 30 3b 0a 20 20 53 45 54 5f 54  ype = 0;.  SET_T
bd70: 48 52 45 41 44 49 44 28 70 49 6e 69 74 29 3b 0a  HREADID(pInit);.
bd80: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
bd90: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e  alloc( sizeof(un
bda0: 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  ixFile) );.  if(
bdb0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
bdc0: 63 6c 6f 73 65 28 70 49 6e 69 74 2d 3e 68 29 3b  close(pInit->h);
bdd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  .    sqlite3OsEn
bde0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
bdf0: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
be00: 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  pInit->pLock);. 
be10: 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
be20: 74 28 70 49 6e 69 74 2d 3e 70 4f 70 65 6e 29 3b  t(pInit->pOpen);
be30: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
be40: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
be50: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  *pId = 0;.    re
be60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
be70: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
be80: 2a 70 4e 65 77 20 3d 20 2a 70 49 6e 69 74 3b 0a  *pNew = *pInit;.
be90: 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
bea0: 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78  d = &sqlite3Unix
beb0: 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 2a 70  IoMethod;.    *p
bec0: 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e  Id = (OsFile*)pN
bed0: 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ew;.    OpenCoun
bee0: 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74  ter(+1);.    ret
bef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
bf00: 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a   }.}...#endif /*
bf10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
bf20: 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
bf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf70: 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
bf80: 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
bf90: 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
bfa0: 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
bfb0: 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
bfc0: 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
bfd0: 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
bfe0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
bff0: 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
c000: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
c010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
c050: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72  ./*.** Get infor
c060: 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74  mation to seed t
c070: 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
c080: 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65   generator.  The
c090: 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74   seed.** is writ
c0a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ten into the buf
c0b0: 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20  fer zBuf[256].  
c0c0: 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
c0d0: 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70  tion must.** sup
c0e0: 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74  ply a sufficient
c0f0: 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e  ly large buffer.
c100: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
c110: 6e 69 78 52 61 6e 64 6f 6d 53 65 65 64 28 63 68  nixRandomSeed(ch
c120: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
c130: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
c140: 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
c150: 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
c160: 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
c170: 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
c180: 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
c190: 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
c1a0: 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
c1b0: 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
c1c0: 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
c1d0: 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
c1e0: 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
c1f0: 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
c200: 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
c210: 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
c220: 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
c230: 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
c240: 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
c250: 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
c260: 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
c270: 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
c280: 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
c290: 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
c2a0: 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
c2b0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
c2c0: 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
c2d0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
c2e0: 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
c2f0: 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
c300: 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
c310: 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
c320: 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
c330: 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
c340: 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
c350: 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
c360: 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
c370: 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
c380: 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
c390: 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
c3a0: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32  emset(zBuf, 0, 2
c3b0: 35 36 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  56);.#if !define
c3c0: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
c3d0: 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20   {.    int pid, 
c3e0: 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65  fd;.    fd = ope
c3f0: 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
c400: 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20  , O_RDONLY);.   
c410: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
c420: 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
c430: 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
c440: 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
c450: 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
c460: 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74 70        pid = getp
c470: 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  id();.      memc
c480: 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
c490: 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20  time_t)], &pid, 
c4a0: 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
c4b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
c4c0: 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 32 35  ead(fd, zBuf, 25
c4d0: 36 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28  6);.      close(
c4e0: 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  fd);.    }.  }.#
c4f0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
c500: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c510: 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
c520: 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
c530: 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
c540: 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
c550: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
c560: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c570: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 77 65 20  milliseconds we 
c580: 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a  want to sleep..*
c590: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
c5a0: 78 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  xSleep(int ms){.
c5b0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
c5c0: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
c5d0: 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
c5e0: 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  (ms*1000);.  ret
c5f0: 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20  urn ms;.#else.  
c600: 73 6c 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31  sleep((ms+999)/1
c610: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
c620: 30 30 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30  000*((ms+999)/10
c630: 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  00);.#endif.}../
c640: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69  *.** Static vari
c650: 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74  ables used for t
c660: 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a  hread synchroniz
c670: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
c680: 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b  int inMutex = 0;
c690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
c6a0: 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74  NIX_THREADS.stat
c6b0: 69 63 20 70 74 68 72 65 61 64 5f 74 20 6d 75 74  ic pthread_t mut
c6c0: 65 78 4f 77 6e 65 72 3b 0a 73 74 61 74 69 63 20  exOwner;.static 
c6d0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
c6e0: 6d 75 74 65 78 31 20 3d 20 50 54 48 52 45 41 44  mutex1 = PTHREAD
c6f0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
c700: 45 52 3b 0a 73 74 61 74 69 63 20 70 74 68 72 65  ER;.static pthre
c710: 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78  ad_mutex_t mutex
c720: 32 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45  2 = PTHREAD_MUTE
c730: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23  X_INITIALIZER;.#
c740: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
c750: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20   following pair 
c760: 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  of routine imple
c770: 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c  ment mutual excl
c780: 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c  usion for.** mul
c790: 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63  ti-threaded proc
c7a0: 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73  esses.  Only a s
c7b0: 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20  ingle thread is 
c7c0: 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78  allowed to.** ex
c7d0: 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74  ecuted code that
c7e0: 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62   is surrounded b
c7f0: 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61  y EnterMutex() a
c800: 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e  nd LeaveMutex().
c810: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
c820: 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  es only a single
c830: 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69   Mutex.  There i
c840: 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69  s not much criti
c850: 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20  cal.** code and 
c860: 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72  what little ther
c870: 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75  e is executes qu
c880: 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75  ickly and withou
c890: 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  t blocking..**.*
c8a0: 2a 20 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20  * As of version 
c8b0: 33 2e 33 2e 32 2c 20 74 68 69 73 20 6d 75 74 65  3.3.2, this mute
c8c0: 78 20 6d 75 73 74 20 62 65 20 72 65 63 75 72 73  x must be recurs
c8d0: 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ive..*/.void sql
c8e0: 69 74 65 33 55 6e 69 78 45 6e 74 65 72 4d 75 74  ite3UnixEnterMut
c8f0: 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ex(){.#ifdef SQL
c900: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
c910: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
c920: 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 31 29 3b 0a  _lock(&mutex1);.
c930: 20 20 69 66 28 20 69 6e 4d 75 74 65 78 3d 3d 30    if( inMutex==0
c940: 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
c950: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
c960: 78 32 29 3b 0a 20 20 20 20 6d 75 74 65 78 4f 77  x2);.    mutexOw
c970: 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65  ner = pthread_se
c980: 6c 66 28 29 3b 0a 20 20 7d 0a 20 20 70 74 68 72  lf();.  }.  pthr
c990: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
c9a0: 28 26 6d 75 74 65 78 31 29 3b 0a 23 65 6e 64 69  (&mutex1);.#endi
c9b0: 66 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a 7d  f.  inMutex++;.}
c9c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
c9d0: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20  xLeaveMutex(){. 
c9e0: 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
c9f0: 3e 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  >0 );.#ifdef SQL
ca00: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
ca10: 0a 20 20 61 73 73 65 72 74 28 20 70 74 68 72 65  .  assert( pthre
ca20: 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77  ad_equal(mutexOw
ca30: 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c  ner, pthread_sel
ca40: 66 28 29 29 20 29 3b 0a 20 20 70 74 68 72 65 61  f()) );.  pthrea
ca50: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
ca60: 74 65 78 31 29 3b 0a 20 20 69 6e 4d 75 74 65 78  tex1);.  inMutex
ca70: 2d 2d 3b 0a 20 20 69 66 28 20 69 6e 4d 75 74 65  --;.  if( inMute
ca80: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68 72  x==0 ){.    pthr
ca90: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
caa0: 28 26 6d 75 74 65 78 32 29 3b 0a 20 20 7d 0a 20  (&mutex2);.  }. 
cab0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
cac0: 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 31 29 3b 0a  nlock(&mutex1);.
cad0: 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d  #else.  inMutex-
cae0: 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  -;.#endif.}../*.
caf0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
cb00: 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63  f the mutex is c
cb10: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a  urrently held..*
cb20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73  *.** If the this
cb30: 54 68 72 65 61 64 4f 6e 6c 79 20 70 61 72 61 6d  ThreadOnly param
cb40: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 72 65  eter is true, re
cb50: 74 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20 69  turn true only i
cb60: 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  f the.** calling
cb70: 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68   thread holds th
cb80: 65 20 6d 75 74 65 78 2e 20 20 49 66 20 74 68 65  e mutex.  If the
cb90: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
cba0: 6c 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  lse, return.** t
cbb0: 72 75 65 20 69 66 20 61 6e 79 20 74 68 72 65 61  rue if any threa
cbc0: 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  d holds the mute
cbd0: 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
cbe0: 33 55 6e 69 78 49 6e 4d 75 74 65 78 28 69 6e 74  3UnixInMutex(int
cbf0: 20 74 68 69 73 54 68 72 65 61 64 4f 6e 6c 79 29   thisThreadOnly)
cc00: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cc10: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 72  UNIX_THREADS.  r
cc20: 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30 20  eturn inMutex>0 
cc30: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 28  && .           (
cc40: 74 68 69 73 54 68 72 65 61 64 4f 6e 6c 79 3d 3d  thisThreadOnly==
cc50: 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65 71 75  0 || pthread_equ
cc60: 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70  al(mutexOwner, p
cc70: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29 3b  thread_self()));
cc80: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
cc90: 69 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e 64 69  inMutex>0;.#endi
cca0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  f.}../*.** Remem
ccb0: 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ber the number o
ccc0: 66 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  f thread-specifi
ccd0: 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c  c-data blocks al
cce0: 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20  located..** Use 
ccf0: 74 68 69 73 20 74 6f 20 76 65 72 69 66 79 20 74  this to verify t
cd00: 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 6c  hat we are not l
cd10: 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73 70  eaking thread-sp
cd20: 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20  ecific-data..** 
cd30: 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a  Ticket #1601.*/.
cd40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
cd50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  ST.int sqlite3_t
cd60: 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20  sd_count = 0;.# 
cd70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
cd80: 58 5f 54 48 52 45 41 44 53 0a 20 20 20 20 73 74  X_THREADS.    st
cd90: 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74  atic pthread_mut
cda0: 65 78 5f 74 20 74 73 64 5f 63 6f 75 6e 74 65 72  ex_t tsd_counter
cdb0: 5f 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44  _mutex = PTHREAD
cdc0: 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a  _MUTEX_INITIALIZ
cdd0: 45 52 3b 0a 23 20 20 20 64 65 66 69 6e 65 20 54  ER;.#   define T
cde0: 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 5c 0a  SD_COUNTER(N) \.
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 74 68               pth
ce00: 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
ce10: 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74  &tsd_counter_mut
ce20: 65 78 29 3b 20 5c 0a 20 20 20 20 20 20 20 20 20  ex); \.         
ce30: 20 20 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f      sqlite3_tsd_
ce40: 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20  count += N; \.  
ce50: 20 20 20 20 20 20 20 20 20 20 20 70 74 68 72 65             pthre
ce60: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
ce70: 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74  &tsd_counter_mut
ce80: 65 78 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 20  ex);.# else.#   
ce90: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
cea0: 45 52 28 4e 29 20 20 73 71 6c 69 74 65 33 5f 74  ER(N)  sqlite3_t
ceb0: 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20  sd_count += N.# 
cec0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64 65  endif.#else.# de
ced0: 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52  fine TSD_COUNTER
cee0: 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  (N)  /* no-op */
cef0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
cf00: 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
cf10: 6c 6f 63 61 74 65 46 6c 61 67 3e 30 2c 20 74 68  locateFlag>0, th
cf20: 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
cf30: 74 65 72 20 74 6f 20 74 68 72 65 61 64 0a 2a 2a  ter to thread.**
cf40: 20 73 70 65 63 69 66 69 63 20 64 61 74 61 20 66   specific data f
cf50: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
cf60: 68 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61 74 65  hread.  Allocate
cf70: 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a 2a 2a   and zero the.**
cf80: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
cf90: 20 64 61 74 61 20 69 66 20 69 74 20 64 6f 65 73   data if it does
cfa0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
cfb0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  st..**.** If cal
cfc0: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
cfd0: 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63  eFlag==0, then c
cfe0: 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
cff0: 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
d000: 66 69 63 20 64 61 74 61 2e 20 20 52 65 74 75 72  fic data.  Retur
d010: 6e 20 69 74 20 69 66 20 69 74 20 65 78 69 73 74  n it if it exist
d020: 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  s.  If it does n
d030: 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68 65  ot exist,.** the
d040: 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  n return NULL..*
d050: 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77  *.** If called w
d060: 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  ith allocateFlag
d070: 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  <0, check to see
d080: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 73   if the thread s
d090: 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
d0a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
d0b0: 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49   is all zero.  I
d0c0: 66 20 69 74 20 69 73 20 74 68 65 6e 20 64 65 61  f it is then dea
d0d0: 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20 52  llocate it..** R
d0e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
d0f0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 73 70  to the thread sp
d100: 65 63 69 66 69 63 20 64 61 74 61 20 6f 72 20 4e  ecific data or N
d110: 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  ULL if it is.** 
d120: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 67  unallocated or g
d130: 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  ets deallocated.
d140: 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61 20 2a  .*/.ThreadData *
d150: 73 71 6c 69 74 65 33 55 6e 69 78 54 68 72 65 61  sqlite3UnixThrea
d160: 64 53 70 65 63 69 66 69 63 44 61 74 61 28 69 6e  dSpecificData(in
d170: 74 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29 7b  t allocateFlag){
d180: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d190: 54 68 72 65 61 64 44 61 74 61 20 7a 65 72 6f 44  ThreadData zeroD
d1a0: 61 74 61 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ata;.#ifdef SQLI
d1b0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
d1c0: 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61 64    static pthread
d1d0: 5f 6b 65 79 5f 74 20 6b 65 79 3b 0a 20 20 73 74  _key_t key;.  st
d1e0: 61 74 69 63 20 69 6e 74 20 6b 65 79 49 6e 69 74  atic int keyInit
d1f0: 20 3d 20 30 3b 0a 20 20 54 68 72 65 61 64 44 61   = 0;.  ThreadDa
d200: 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28  ta *pTsd;..  if(
d210: 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20   !keyInit ){.   
d220: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
d230: 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
d240: 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20  !keyInit ){.    
d250: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
d260: 72 63 20 3d 20 70 74 68 72 65 61 64 5f 6b 65 79  rc = pthread_key
d270: 5f 63 72 65 61 74 65 28 26 6b 65 79 2c 20 30 29  _create(&key, 0)
d280: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d290: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d2a0: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
d2b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d2c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
d2d0: 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20   keyInit = 1;.  
d2e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
d2f0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
d300: 20 7d 0a 0a 20 20 70 54 73 64 20 3d 20 70 74 68   }..  pTsd = pth
d310: 72 65 61 64 5f 67 65 74 73 70 65 63 69 66 69 63  read_getspecific
d320: 28 6b 65 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c  (key);.  if( all
d330: 6f 63 61 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20  ocateFlag>0 ){. 
d340: 20 20 20 69 66 28 20 70 54 73 64 3d 3d 30 20 29     if( pTsd==0 )
d350: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
d360: 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61  ite3TestMallocFa
d370: 69 6c 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  il() ){.        
d380: 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73  pTsd = sqlite3Os
d390: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65  Malloc(sizeof(ze
d3a0: 72 6f 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  roData));.      
d3b0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
d3c0: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20 20 73  MEMDEBUG.      s
d3d0: 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20 3d 20  qlite3_isFail = 
d3e0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  0;.#endif.      
d3f0: 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20  if( pTsd ){.    
d400: 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f      *pTsd = zero
d410: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 74  Data;.        pt
d420: 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69  hread_setspecifi
d430: 63 28 6b 65 79 2c 20 70 54 73 64 29 3b 0a 20 20  c(key, pTsd);.  
d440: 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45        TSD_COUNTE
d450: 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  R(+1);.      }. 
d460: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
d470: 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f   pTsd!=0 && allo
d480: 63 61 74 65 46 6c 61 67 3c 30 20 0a 20 20 20 20  cateFlag<0 .    
d490: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
d4a0: 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74  p(pTsd, &zeroDat
d4b0: 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64  a, sizeof(Thread
d4c0: 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Data))==0 ){.   
d4d0: 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70   sqlite3OsFree(p
d4e0: 54 73 64 29 3b 0a 20 20 20 20 70 74 68 72 65 61  Tsd);.    pthrea
d4f0: 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b 65  d_setspecific(ke
d500: 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44 5f 43  y, 0);.    TSD_C
d510: 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20  OUNTER(-1);.    
d520: 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
d530: 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6c  return pTsd;.#el
d540: 73 65 0a 20 20 73 74 61 74 69 63 20 54 68 72 65  se.  static Thre
d550: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 30  adData *pTsd = 0
d560: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
d570: 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
d580: 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20  ( pTsd==0 ){.   
d590: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54     if( !sqlite3T
d5a0: 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20  estMallocFail() 
d5b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64 20  ){.        pTsd 
d5c0: 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  = sqlite3OsMallo
d5d0: 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61  c( sizeof(zeroDa
d5e0: 74 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ta) );.      }.#
d5f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
d600: 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
d610: 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a  te3_isFail = 0;.
d620: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
d630: 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
d640: 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
d650: 61 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f 43  a;.        TSD_C
d660: 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20 20 20 20  OUNTER(+1);.    
d670: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
d680: 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26 26  e if( pTsd!=0 &&
d690: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 0a   allocateFlag<0.
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6d              && m
d6b0: 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a 65 72  emcmp(pTsd, &zer
d6c0: 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 54 68  oData, sizeof(Th
d6d0: 72 65 61 64 44 61 74 61 29 29 3d 3d 30 20 29 7b  readData))==0 ){
d6e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72  .    sqlite3OsFr
d6f0: 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 54 53  ee(pTsd);.    TS
d700: 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20  D_COUNTER(-1);. 
d710: 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d     pTsd = 0;.  }
d720: 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a  .  return pTsd;.
d730: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d740: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
d750: 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
d760: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
d770: 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
d780: 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
d790: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
d7a0: 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
d7b0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
d7c0: 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
d7d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d7e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
d7f0: 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
d800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
d810: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
d820: 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
d830: 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
d840: 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
d850: 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
d860: 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
d870: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
d880: 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
d890: 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
d8a0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
d8b0: 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
d8c0: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
d8d0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 43 75  nt sqlite3UnixCu
d8e0: 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65  rrentTime(double
d8f0: 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66   *prNow){.#ifdef
d900: 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d   NO_GETTOD.  tim
d910: 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
d920: 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f  );.  *prNow = t/
d930: 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
d940: 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  7.5;.#else.  str
d950: 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
d960: 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 7a  ;.  struct timez
d970: 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f 74  one sTz;  /* Not
d980: 20 75 73 65 64 20 2a 2f 0a 20 20 67 65 74 74 69   used */.  getti
d990: 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 26  meofday(&sNow, &
d9a0: 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  sTz);.  *prNow =
d9b0: 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
d9c0: 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
d9d0: 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
d9e0: 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23  86400000000.0;.#
d9f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
da00: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
da10: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
da20: 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
da30: 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
da40: 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
da50: 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
da60: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
da70: 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  n 0;.}..#endif /
da80: 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a           * OS_UNIX */.