/ Hex Artifact Content
Login

Artifact 35ad4d81c90800f509d28580742b67906d289223:


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 20 20 69 36 34 20 6f  ctory */.  i64 o
0a00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
0a10: 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f 66 66       /* Seek off
0a20: 73 65 74 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  set */.#ifdef SQ
0a30: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
0a40: 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69  S.  pthread_t ti
0a50: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
0a60: 20 54 68 65 20 74 68 72 65 61 64 20 74 68 61 74   The thread that
0a70: 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f 73 46   "owns" this OsF
0a80: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ile */.#endif.};
0a90: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
0aa0: 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  the ability to o
0ab0: 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f 53 2d  verride some OS-
0ac0: 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  layer functions 
0ad0: 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e  during.** testin
0ae0: 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
0af0: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f 53 20   to simulate OS 
0b00: 63 72 61 73 68 65 73 20 74 6f 20 76 65 72 69 66  crashes to verif
0b10: 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d 6d 69  y that .** commi
0b20: 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20 65 76  ts are atomic ev
0b30: 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  en in the event 
0b40: 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68 2e 0a  of an OS crash..
0b50: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0b60: 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20 65 78  _CRASH_TEST.  ex
0b70: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0b80: 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c 65 3b  CrashTestEnable;
0b90: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
0ba0: 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 52 65  lite3CrashOpenRe
0bb0: 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20 63 68  adWrite(const ch
0bc0: 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69  ar*, OsFile**, i
0bd0: 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  nt*);.  extern i
0be0: 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73 68 4f  nt sqlite3CrashO
0bf0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
0c00: 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65  st char*, OsFile
0c10: 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78 74 65  **, int);.  exte
0c20: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0c30: 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  ashOpenReadOnly(
0c40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46  const char*, OsF
0c50: 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23 20 64  ile**, int);.# d
0c60: 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45 53 54  efine CRASH_TEST
0c70: 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c 42 2c  _OVERRIDE(X,A,B,
0c80: 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71 6c 69  C) \.    if(sqli
0c90: 74 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62  te3CrashTestEnab
0ca0: 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28 41 2c  le){ return X(A,
0cb0: 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20  B,C); }.#else.# 
0cc0: 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45 53  define CRASH_TES
0cd0: 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c 42  T_OVERRIDE(X,A,B
0ce0: 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ,C)  /* no-op */
0cf0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
0d00: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
0d10: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
0d20: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
0d30: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
0d40: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
0d50: 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20   Do not include 
0d60: 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65 20  any of the File 
0d70: 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70 72  I/O interface pr
0d80: 6f 63 65 64 75 72 65 73 20 69 66 20 74 68 65 0a  ocedures if the.
0d90: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ** SQLITE_OMIT_D
0da0: 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20 64  ISKIO macro is d
0db0: 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74 69  efined (indicati
0dc0: 6e 67 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ng that the data
0dd0: 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  base.** will be 
0de0: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 29 0a  in-memory only).
0df0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0e00: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 0a 0a  E_OMIT_DISKIO...
0e10: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
0e20: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
0e30: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
0e40: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
0e50: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
0e60: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
0e70: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
0e80: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0e90: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
0ea0: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
0eb0: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
0ec0: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
0ed0: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
0ee0: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
0ef0: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
0f00: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
0f10: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
0f20: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
0f30: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
0f40: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
0f50: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
0f60: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
0f70: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
0f80: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
0f90: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
0fa0: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
0fb0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
0fc0: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
0fd0: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
0fe0: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
0ff0: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
1000: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
1010: 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64  t's DOS - what d
1020: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
1030: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
1040: 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74  __.# define fcnt
1050: 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69  l(A,B,C) 0.#endi
1060: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72  f../*.** The thr
1070: 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f  eadid macro reso
1080: 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65  lves to the thre
1090: 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20  ad-id or to 0.  
10a0: 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  Used for.** test
10b0: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
10c0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
10d0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
10e0: 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20 74 68  READS.#define th
10f0: 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73  readid pthread_s
1100: 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66  elf().#else.#def
1110: 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23  ine threadid 0.#
1120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
1130: 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 4f 73   or check the Os
1140: 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20  File.tid field. 
1150: 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73   This field is s
1160: 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46 69 6c  et when an OsFil
1170: 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70  e.** is first op
1180: 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  ened.  All subse
1190: 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68  quent uses of th
11a0: 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66 79 20  e OsFile verify 
11b0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  that the.** same
11c0: 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61   thread is opera
11d0: 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73 46 69  ting on the OsFi
11e0: 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74  le.  Some operat
11f0: 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a  ing systems do.*
1200: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b  * not allow lock
1210: 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64  s to be overridd
1220: 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65  en by other thre
1230: 61 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73  ads and that res
1240: 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e  triction.** mean
1250: 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20  s that sqlite3* 
1260: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
1270: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64   cannot be moved
1280: 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64   from one thread
1290: 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  .** to another. 
12a0: 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65   This logic make
12b0: 73 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f  s sure a user do
12c0: 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f  es not try to do
12d0: 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74   that.** by mist
12e0: 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72 73 69  ake..**.** Versi
12f0: 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36 2d 30  on 3.3.1 (2006-0
1300: 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65 73 20  1-15):  OsFiles 
1310: 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66 72 6f  can be moved fro
1320: 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74 6f 0a  m one thread to.
1330: 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ** another as lo
1340: 6e 67 20 61 73 20 77 65 20 61 72 65 20 72 75 6e  ng as we are run
1350: 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74 65 6d  ning on a system
1360: 20 74 68 61 74 20 73 75 70 70 6f 72 74 73 20 74   that supports t
1370: 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72 72 69  hreads.** overri
1380: 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65 72 73  ding each others
1390: 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20 6e 6f   locks (which no
13a0: 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  w the most commo
13b0: 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a 20 6f  n behavior).** o
13c0: 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  r if no locks ar
13d0: 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74 68 65  e held.  But the
13e0: 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20 66 69   OsFile.pLock fi
13f0: 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  eld needs to be.
1400: 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20 62 65  ** recomputed be
1410: 63 61 75 73 65 20 69 74 73 20 6b 65 79 20 69 6e  cause its key in
1420: 63 6c 75 64 65 73 20 74 68 65 20 74 68 72 65 61  cludes the threa
1430: 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65 20 0a  d-id.  See the .
1440: 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ** transferOwner
1450: 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  ship() function 
1460: 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74 69  below for additi
1470: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1480: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1490: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
14a0: 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20 53 45  ADS).# define SE
14b0: 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20 20  T_THREADID(X)   
14c0: 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72 65  (X)->tid = pthre
14d0: 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66 69  ad_self().# defi
14e0: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
14f0: 44 28 58 29 20 28 74 68 72 65 61 64 73 4f 76 65  D(X) (threadsOve
1500: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
1510: 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20 20 20  ocks==0 && \.   
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 21 70 74 68 72 65 61           !pthrea
1540: 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64  d_equal((X)->tid
1550: 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  , pthread_self()
1560: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
1570: 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 58  e SET_THREADID(X
1580: 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b  ).# define CHECK
1590: 5f 54 48 52 45 41 44 49 44 28 58 29 20 30 0a 23  _THREADID(X) 0.#
15a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  endif../*.** Her
15b0: 65 20 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e  e is the dirt on
15c0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
15d0: 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44  locks:  ANSI STD
15e0: 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a   1003.1 (1996).*
15f0: 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e  * section 6.5.2.
1600: 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f  2 lines 483 thro
1610: 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20  ugh 490 specify 
1620: 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63  that when a proc
1630: 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63  ess.** sets or c
1640: 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68  lears a lock, th
1650: 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65  at operation ove
1660: 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72  rrides any prior
1670: 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79   locks set.** by
1680: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1690: 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  s.  It does not 
16a0: 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73  explicitly say s
16b0: 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c  o, but this impl
16c0: 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f  ies.** that it o
16d0: 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73  verrides locks s
16e0: 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70  et by the same p
16f0: 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64  rocess using a d
1700: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
1710: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f   descriptor.  Co
1720: 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74  nsider this test
1730: 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   case:.**.**    
1740: 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65     int fd1 = ope
1750: 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52  n("./file1", O_R
1760: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
1770: 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  4);.**       int
1780: 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd2 = open("./f
1790: 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile2", O_RDWR|O_
17a0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
17b0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69  .** Suppose ./fi
17c0: 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20  le1 and ./file2 
17d0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73  are really the s
17e0: 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73  ame file (becaus
17f0: 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61  e.** one is a ha
1800: 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c  rd or symbolic l
1810: 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72  ink to the other
1820: 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65  ) then if you se
1830: 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76  t.** an exclusiv
1840: 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74  e lock on fd1, t
1850: 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61  hen try to get a
1860: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1870: 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77  .** on fd2, it w
1880: 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68  orks.  I would h
1890: 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65  ave expected the
18a0: 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a   second lock to.
18b0: 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68  ** fail since th
18c0: 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  ere was already 
18d0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
18e0: 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a  le due to fd1..*
18f0: 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53  * But not so.  S
1900: 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20  ince both locks 
1910: 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61  came from the sa
1920: 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a  me process, the.
1930: 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69  ** second overri
1940: 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65  des the first, e
1950: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20  ven though they 
1960: 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e  were on differen
1970: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
1980: 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20  ptors opened on 
1990: 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e  different file n
19a0: 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d  ames..**.** Bumm
19b0: 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20  er.  If you ask 
19c0: 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b  me, this is brok
19d0: 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65  en.  Badly broke
19e0: 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20  n.  It means.** 
19f0: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
1a00: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
1a10: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
1a20: 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a  le access among.
1a30: 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ** competing thr
1a40: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
1a50: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
1a60: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
1a70: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
1a80: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
1a90: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
1aa0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
1ab0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
1ac0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
1ad0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
1ae0: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
1af0: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
1b00: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
1b10: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
1b20: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
1b30: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
1b40: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
1b50: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
1b60: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
1b70: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
1b80: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
1b90: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
1ba0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
1bb0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
1bc0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
1bd0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
1be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1bf0: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
1c00: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
1c10: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
1c20: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
1c30: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
1c40: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
1c50: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
1c60: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
1c70: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
1c80: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
1c90: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
1ca0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
1cb0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
1cc0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
1cd0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
1ce0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ode..**.** The O
1cf0: 73 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  sFile structure 
1d00: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
1d10: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
1d20: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
1d30: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
1d40: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
1d50: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
1d60: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1d70: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
1d80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
1d90: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1da0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
1db0: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
1dc0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1dd0: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
1de0: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
1df0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
1e00: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
1e10: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
1e20: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
1e30: 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74  th OsFile struct
1e40: 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  ures.** point to
1e50: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e   the same lockin
1e60: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  g structure.  Th
1e70: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
1e80: 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72  ure keeps.** a r
1e90: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28  eference count (
1ea0: 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  so we will know 
1eb0: 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69  when to delete i
1ec0: 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a  t) and a "cnt".*
1ed0: 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c  * field that tel
1ee0: 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e  ls us its intern
1ef0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20  al lock status. 
1f00: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
1f10: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c  e.** file is unl
1f20: 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20  ocked.  cnt==-1 
1f30: 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68  means the file h
1f40: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
1f50: 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d  lock..** cnt>0 m
1f60: 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63  eans there are c
1f70: 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  nt shared locks 
1f80: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
1f90: 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  ** Any attempt t
1fa0: 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b  o lock or unlock
1fb0: 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68   a file first ch
1fc0: 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ecks the locking
1fd0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
1fe0: 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  The fcntl() syst
1ff0: 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20  em call is only 
2000: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61  invoked to set a
2010: 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20   .** POSIX lock 
2020: 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
2030: 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74  lock structure t
2040: 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65  ransitions betwe
2050: 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61  en.** a locked a
2060: 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73  nd an unlocked s
2070: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  tate..**.** 2004
2080: 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65  -Jan-11:.** More
2090: 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72   recent discover
20a0: 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20  ies about POSIX 
20b0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20  advisory locks. 
20c0: 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20   (The more.** I 
20d0: 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f  discover, the mo
20e0: 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65  re I realize the
20f0: 20 61 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72   a POSIX advisor
2100: 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61  y locks are.** a
2110: 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a  n abomination.).
2120: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
2130: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
2140: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
2150: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
2160: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
2170: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
2180: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
2190: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
21a0: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
21b0: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
21c0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
21d0: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 4f   problem, each O
21e0: 73 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  sFile structure 
21f0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f  contains.** a po
2200: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e  inter to an open
2210: 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  Cnt structure.  
2220: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65  There is one ope
2230: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a  nCnt structure.*
2240: 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65  * per open inode
2250: 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  , which means th
2260: 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73 46 69  at multiple OsFi
2270: 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f  les can point to
2280: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65   a single.** ope
2290: 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61  nCnt.  When an a
22a0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
22b0: 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46 69 6c  o close an OsFil
22c0: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
22d0: 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c 65 73  ** other OsFiles
22e0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
22f0: 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65  e inode that are
2300: 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20   holding locks, 
2310: 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63  the call.** to c
2320: 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20  lose() the file 
2330: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65  descriptor is de
2340: 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c  ferred until all
2350: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c   of the locks cl
2360: 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e  ear..** The open
2370: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 6b 65  Cnt structure ke
2380: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
2390: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
23a0: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
23b0: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
23c0: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
23d0: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
23e0: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
23f0: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
2400: 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20  ** First, under 
2410: 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62  Linux threads, b
2420: 65 63 61 75 73 65 20 65 61 63 68 20 74 68 72 65  ecause each thre
2430: 61 64 20 68 61 73 20 61 20 73 65 70 61 72 61 74  ad has a separat
2440: 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c  e.** process ID,
2450: 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73   lock operations
2460: 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64   in one thread d
2470: 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c  o not override l
2480: 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ocks.** to the s
2490: 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65  ame file in othe
24a0: 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75  r threads.  Linu
24b0: 78 20 74 68 72 65 61 64 73 20 62 65 68 61 76 65  x threads behave
24c0: 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74   like.** separat
24d0: 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74  e processes in t
24e0: 68 69 73 20 72 65 73 70 65 63 74 2e 20 20 42 75  his respect.  Bu
24f0: 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20  t, if you close 
2500: 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  a file.** descri
2510: 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68  ptor in linux th
2520: 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73  reads, all locks
2530: 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76   are cleared, ev
2540: 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f  en locks.** on o
2550: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
2560: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
2570: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 68   other threads h
2580: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
2590: 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c   process IDs.  L
25a0: 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20  inux threads is 
25b0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20  inconsistent in 
25c0: 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a  this respect..**
25d0: 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20   (I'm beginning 
25e0: 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69  to think that li
25f0: 6e 75 78 20 74 68 72 65 61 64 73 20 69 73 20 61  nux threads is a
2600: 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f  n abomination to
2610: 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65  o.).** The conse
2620: 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61  quence of this a
2630: 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65 20 68  ll is that the h
2640: 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68  ash table for th
2650: 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74  e lockInfo.** st
2660: 72 75 63 74 75 72 65 20 68 61 73 20 74 6f 20 69  ructure has to i
2670: 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65  nclude the proce
2680: 73 73 20 69 64 20 61 73 20 70 61 72 74 20 6f 66  ss id as part of
2690: 20 69 74 73 20 6b 65 79 20 62 65 63 61 75 73 65   its key because
26a0: 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66  .** locks in dif
26b0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 73 20 61  ferent threads a
26c0: 72 65 20 74 72 65 61 74 65 64 20 61 73 20 64 69  re treated as di
26d0: 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65  stinct.  But the
26e0: 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72   .** openCnt str
26f0: 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f  ucture should no
2700: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72  t include the pr
2710: 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a  ocess id in its.
2720: 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65 20 63  ** key because c
2730: 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f  lose() clears lo
2740: 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64  ck on all thread
2750: 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  s, not just the 
2760: 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61  current.** threa
2770: 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20  d.  Were it not 
2780: 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65  for this goofine
2790: 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65  ss in linux thre
27a0: 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a  ads, we could.**
27b0: 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63   combine the loc
27c0: 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e  kInfo and openCn
27d0: 74 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 74  t structures int
27e0: 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63  o a single struc
27f0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  ture..**.** 2004
2800: 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73  -Jun-28:.** On s
2810: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
2820: 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63  linux, threads c
2830: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
2840: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
2850: 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e  * On others not.
2860: 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20    Sometimes you 
2870: 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62  can change the b
2880: 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73  ehavior on the s
2890: 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79  ame.** system by
28a0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f   setting the LD_
28b0: 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e  ASSUME_KERNEL en
28c0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
28d0: 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49  le.  The.** POSI
28e0: 58 20 73 74 61 6e 64 61 72 64 20 69 73 20 73 69  X standard is si
28f0: 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68  lent as to which
2900: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
2910: 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20  rect, as far.** 
2920: 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73  as I can tell, s
2930: 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73  o other versions
2940: 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73   of unix might s
2950: 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  how the same.** 
2960: 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20  inconsistency.  
2970: 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74  There is no litt
2980: 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d  le doubt in my m
2990: 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a  ind that posix.*
29a0: 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  * advisory locks
29b0: 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61   and linux threa
29c0: 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c  ds are profoundl
29d0: 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  y broken..**.** 
29e0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
29f0: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69  he inconsistenci
2a00: 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74  es, we have to t
2a10: 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a  est at runtime .
2a20: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
2a30: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
2a40: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
2a50: 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20  rs locks.  This 
2a60: 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f  test.** is run o
2a70: 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74 20 74  nce, the first t
2a80: 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20  ime any lock is 
2a90: 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74  attempted.  A st
2aa0: 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c  atic .** variabl
2ab0: 65 20 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f  e is set to reco
2ac0: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  rd the results o
2ad0: 66 20 74 68 69 73 20 74 65 73 74 20 66 6f 72 20  f this test for 
2ae0: 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a  future.** use..*
2af0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
2b00: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2b10: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2b20: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2b30: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
2b40: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
2b50: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
2b60: 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e  ure given its in
2b70: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
2b80: 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65  reads cannot ove
2b90: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2ba0: 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65  s locks, then we
2bb0: 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b   set the.** lock
2bc0: 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f  Key.tid field to
2bd0: 20 74 68 65 20 74 68 72 65 61 64 20 49 44 2e 20   the thread ID. 
2be0: 20 49 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   If threads can 
2bf0: 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68  override.** each
2c00: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68   others locks th
2c10: 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73  en tid is always
2c20: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74   set to zero.  t
2c30: 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  id is omitted.**
2c40: 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77   if we compile w
2c50: 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67  ithout threading
2c60: 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74 72   support..*/.str
2c70: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20 20  uct lockKey {.  
2c80: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
2c90: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
2ca0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
2cb0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65  ;       /* Inode
2cc0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 64 65   number */.#ifde
2cd0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
2ce0: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
2cf0: 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72 65  t tid;   /* Thre
2d00: 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69 66  ad ID or zero if
2d10: 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65   threads can ove
2d20: 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72  rride each other
2d30: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
2d40: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2d50: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2d60: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2d70: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2d80: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 20  h open.** inode 
2d90: 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20 77  on each thread w
2da0: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
2db0: 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54 68  process ID.  (Th
2dc0: 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64 69  reads have.** di
2dd0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2de0: 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62 75  IDs on linux, bu
2df0: 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f 74  t not on most ot
2e00: 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a 0a  her unixes.).**.
2e10: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
2e20: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
2e30: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
2e40: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 4f 73  tors, so each Os
2e50: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
2e60: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
2e70: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
2e80: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
2e90: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
2ea0: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
2eb0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
2ec0: 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70 6f 69  r of OsFiles poi
2ed0: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
2ee0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
2ef0: 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b  {.  struct lockK
2f00: 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65 20  ey key;  /* The 
2f10: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
2f20: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
2f30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f40: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
2f50: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  eld */.  int loc
2f60: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a  ktype;        /*
2f70: 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c   One of SHARED_L
2f80: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
2f90: 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74  CK etc. */.  int
2fa0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2fb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2fc0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
2fd0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d 3b 0a  structure */.};.
2fe0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2ff0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
3000: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
3010: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
3020: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
3030: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f  e a particular o
3040: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
3050: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
3060: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68  .  This.** is th
3070: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c 6f  e same as the lo
3080: 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68 61  ckKey except tha
3090: 74 20 74 68 65 20 74 68 72 65 61 64 20 49 44 20  t the thread ID 
30a0: 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73  is omitted..*/.s
30b0: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 7b 0a  truct openKey {.
30c0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f    dev_t dev;   /
30d0: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
30e0: 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  */.  ino_t ino; 
30f0: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
3100: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
3110: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
3120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
3130: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
3140: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
3150: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  .** inode.  This
3160: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
3170: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6e 75   track of the nu
3180: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 6f 6e  mber of locks on
3190: 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65 2e 20   that.** inode. 
31a0: 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73 20 61   If a close is a
31b0: 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e 73 74  ttempted against
31c0: 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74 20 69   an inode that i
31d0: 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c 6f 63  s holding.** loc
31e0: 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20 69 73  ks, the close is
31f0: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
3200: 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61 72 20  all locks clear 
3210: 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a 2a 2a  by adding the.**
3220: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3230: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 74 6f   to be closed to
3240: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 69 73   the pending lis
3250: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65  t..*/.struct ope
3260: 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63 74 20  nCnt {.  struct 
3270: 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20 20 2f  openKey key;   /
3280: 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79  * The lookup key
3290: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32b0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
32c0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
32d0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ure */.  int nLo
32e0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck;            /
32f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
3300: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 2a 2f  tanding locks */
3310: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 3b  .  int nPending;
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3330: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 63 6c  er of pending cl
3340: 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ose() operations
3350: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 6e 64   */.  int *aPend
3360: 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ing;        /* M
3370: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 68 6f  alloced space ho
3380: 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61 69 74  lding fd's await
3390: 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20 2a 2f  ing a close() */
33a0: 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 73  .};../* .** Thes
33b0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 6d 61  e hash tables ma
33c0: 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66 69 6c  p inodes and fil
33d0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 28 72  e descriptors (r
33e0: 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79 20 61  eally, lockKey a
33f0: 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20 73 74  nd.** openKey st
3400: 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f 20 6c  ructures) into l
3410: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
3420: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  Cnt structures. 
3430: 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a 20 74   Access to .** t
3440: 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  hese hash tables
3450: 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65 63 74   must be protect
3460: 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e 0a 2a  ed by a mutex..*
3470: 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20 6c 6f  /.static Hash lo
3480: 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49 54 45  ckHash = {SQLITE
3490: 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c  _HASH_BINARY, 0,
34a0: 20 30 2c 20 30 2c 20 0a 20 20 20 20 73 71 6c 69   0, 0, .    sqli
34b0: 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
34c0: 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54 68 72 65  loc, sqlite3Thre
34d0: 61 64 53 61 66 65 46 72 65 65 2c 20 30 2c 20 30  adSafeFree, 0, 0
34e0: 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f  };.static Hash o
34f0: 70 65 6e 48 61 73 68 20 3d 20 7b 53 51 4c 49 54  penHash = {SQLIT
3500: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
3510: 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 73 71 6c  , 0, 0, .    sql
3520: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61  ite3ThreadSafeMa
3530: 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54 68 72  lloc, sqlite3Thr
3540: 65 61 64 53 61 66 65 46 72 65 65 2c 20 30 2c 20  eadSafeFree, 0, 
3550: 30 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  0};..#ifdef SQLI
3560: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
3570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
3580: 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74  ble records whet
3590: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
35a0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
35b0: 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c  each others.** l
35c0: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30  ocks..**.**    0
35d0: 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20  :  No.  Threads 
35e0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
35f0: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
3600: 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73  s..**    1:  Yes
3610: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f  .  Threads can o
3620: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3630: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20  ers locks..**   
3640: 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e  -1:  We don't kn
3650: 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ow yet..**.** On
3660: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 77   some systems, w
3670: 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  e know at compil
3680: 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61 64  e-time if thread
3690: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
36a0: 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c 6f  ach.** others lo
36b0: 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20 73  cks.  On those s
36c0: 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c 49  ystems, the SQLI
36d0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
36e0: 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a 2a  DE_LOCK macro.**
36f0: 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70 70   will be set app
3700: 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e 20  ropriately.  On 
3710: 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20 77  other systems, w
3720: 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b 20  e have to check 
3730: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20 20  at.** runtime.  
3740: 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72 20  On these latter 
3750: 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45 5f  systems, SQLTIE_
3760: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3770: 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65 66  LOCK is.** undef
3780: 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ined..**.** This
3790: 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c   variable normal
37a0: 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70  ly has file scop
37b0: 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72  e only.  But dur
37c0: 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20  ing testing, we 
37d0: 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f  make.** it a glo
37e0: 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  bal so that the 
37f0: 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68  test code can ch
3800: 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69  ange its value i
3810: 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66  n order to verif
3820: 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69  y.** that the ri
3830: 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e  ght stuff happen
3840: 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65  s in either case
3850: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
3860: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3870: 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IDE_LOCK.# defin
3880: 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f  e SQLITE_THREAD_
3890: 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d 31  OVERRIDE_LOCK -1
38a0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
38b0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 74  QLITE_TEST.int t
38c0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
38d0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
38e0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
38f0: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6c  ERRIDE_LOCK;.#el
3900: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74 68  se.static int th
3910: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3920: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 53  hOthersLocks = S
3930: 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45  QLITE_THREAD_OVE
3940: 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e 64  RRIDE_LOCK;.#end
3950: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73  if../*.** This s
3960: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
3970: 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65  nformation passe
3980: 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75 61  d into individua
3990: 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61 64  l test.** thread
39a0: 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68 72  s by the testThr
39b0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
39c0: 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  or() routine..*/
39d0: 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65  .struct threadTe
39e0: 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 66  stData {.  int f
39f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3a00: 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65 20    /* File to be 
3a10: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75  locked */.  stru
3a20: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20  ct flock lock;  
3a30: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e     /* The lockin
3a40: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  g operation */. 
3a50: 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20 20   int result;    
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
3a70: 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  t of the locking
3a80: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b   operation */.};
3a90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3aa0: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
3ab0: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
3ac0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
3ad0: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
3ae0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
3af0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3b00: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
3b10: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
3b20: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
3b30: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
3b40: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
3b50: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
3b60: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
3b70: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
3b80: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
3b90: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
3ba0: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
3bb0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
3bc0: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
3bd0: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
3be0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
3bf0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
3c00: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
3c10: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
3c20: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
3c30: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
3c40: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
3c50: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
3c60: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
3c70: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
3c80: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
3c90: 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20    s = fcntl(fd, 
3ca0: 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69  op, p);.    sqli
3cb0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
3cc0: 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64  fcntl unknown %d
3cd0: 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f   %d %d\n", fd, o
3ce0: 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72  p, s);.    retur
3cf0: 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n s;.  }.  if( p
3d00: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
3d10: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
3d20: 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "RDLCK";.  }els
3d30: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
3d40: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
3d50: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
3d60: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3d70: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
3d80: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
3d90: 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b  UNLCK";.  }else{
3da0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29  .    assert( 0 )
3db0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
3dc0: 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45  p->l_whence==SEE
3dd0: 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66  K_SET );.  s = f
3de0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
3df0: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
3e00: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
3e10: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
3e20: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
3e30: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
3e40: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
3e50: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
3e60: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
3e70: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
3e80: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
3e90: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
3ea0: 73 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  s && op==F_SETLK
3eb0: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
3ec0: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
3ed0: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
3ee0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
3ef0: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
3f00: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
3f10: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
3f20: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
3f30: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
3f40: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
3f50: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
3f60: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
3f70: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
3f80: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
3f90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
3fa0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
3fb0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
3fc0: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
3fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
3fe0: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
3ff0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4000: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
4010: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
4020: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4030: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
4040: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
4050: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
4060: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
4070: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
4080: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
4090: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
40a0: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
40b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
40c0: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
40d0: 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61 64  * The testThread
40e0: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
40f0: 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68  ) routine launch
4100: 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 0a  es two separate.
4110: 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74 68  ** threads on th
4120: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69  is routine.  Thi
4130: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
4140: 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c  ts to lock a fil
4150: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
4160: 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20 54  then returns.  T
4170: 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66 61  he success or fa
4180: 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61 74  ilure of that at
4190: 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20  tempt.** allows 
41a0: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
41b0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
41c0: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65 74  procedure to det
41d0: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
41e0: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
41f0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4200: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4220: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
4230: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
4240: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
4250: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
4260: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
4270: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
4280: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
4290: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
42a0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74  , F_SETLK, &pDat
42b0: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
42c0: 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pArg;.}../*.*
42d0: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
42e0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
42f0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
4300: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a  r not threads.**
4310: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4320: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
4330: 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a  then sets the .*
4340: 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  * threadsOverrid
4350: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
4360: 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70   variable approp
4370: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
4380: 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65  ic void testThre
4390: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
43a0: 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a  r(int fd_orig){.
43b0: 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75    int fd;.  stru
43c0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
43d0: 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61  a d[2];.  pthrea
43e0: 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20  d_t t[2];..  fd 
43f0: 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a  = dup(fd_orig);.
4400: 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74    if( fd<0 ) ret
4410: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c  urn;.  memset(d,
4420: 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a   0, sizeof(d));.
4430: 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a    d[0].fd = fd;.
4440: 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79    d[0].lock.l_ty
4450: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
4460: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  d[0].lock.l_len 
4470: 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b  = 1;.  d[0].lock
4480: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
4490: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  d[0].lock.l_when
44a0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
44b0: 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20   d[1] = d[0];.  
44c0: 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  d[1].lock.l_type
44d0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74   = F_WRLCK;.  pt
44e0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
44f0: 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  0], 0, threadLoc
4500: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d 29  kingTest, &d[0])
4510: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
4520: 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72  te(&t[1], 0, thr
4530: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
4540: 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[1]);.  pthrea
4550: 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b  d_join(t[0], 0);
4560: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
4570: 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73  t[1], 0);.  clos
4580: 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64 73  e(fd);.  threads
4590: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
45a0: 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e  rsLocks =  d[0].
45b0: 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31  result==0 && d[1
45c0: 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23  ].result==0;.}.#
45d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
45e0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a  UNIX_THREADS */.
45f0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4600: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
4610: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
4620: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
4630: 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73  LockInfo()..*/.s
4640: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
4650: 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63  seLockInfo(struc
4660: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
4670: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  k){.  assert( sq
4680: 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31  lite3OsInMutex(1
4690: 29 20 29 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52  ) );.  pLock->nR
46a0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63  ef--;.  if( pLoc
46b0: 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  k->nRef==0 ){.  
46c0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
46d0: 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26  ert(&lockHash, &
46e0: 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65  pLock->key, size
46f0: 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20  of(pLock->key), 
4700: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
4710: 68 72 65 61 64 53 61 66 65 46 72 65 65 28 70 4c  hreadSafeFree(pL
4720: 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ock);.  }.}../*.
4730: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65  ** Release a ope
4740: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70  nCnt structure p
4750: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
4760: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
4770: 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nfo()..*/.static
4780: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65   void releaseOpe
4790: 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e  nCnt(struct open
47a0: 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 61  Cnt *pOpen){.  a
47b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73  ssert( sqlite3Os
47c0: 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20 20  InMutex(1) );.  
47d0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pOpen->nRef--;. 
47e0: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66   if( pOpen->nRef
47f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4800: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70  e3HashInsert(&op
4810: 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e  enHash, &pOpen->
4820: 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65  key, sizeof(pOpe
4830: 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20  n->key), 0);.   
4840: 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65   free(pOpen->aPe
4850: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  nding);.    sqli
4860: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
4870: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  e(pOpen);.  }.}.
4880: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
4890: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
48a0: 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20  locate lockInfo 
48b0: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
48c0: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
48d0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
48e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
48f0: 43 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20  Create new ones 
4900: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
4910: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
4920: 75 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69  ues might be uni
4930: 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e  nitialized if an
4940: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
4950: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4960: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
4970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4980: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20  findLockInfo(.  
4990: 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49b0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
49c0: 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20  tor used in the 
49d0: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
49e0: 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  lockInfo **ppLoc
49f0: 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  k,    /* Return 
4a00: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  the lockInfo str
4a10: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
4a20: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
4a30: 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a  **ppOpen      /*
4a40: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e   Return the open
4a50: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
4a60: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
4a70: 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  c;.  struct lock
4a80: 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75  Key key1;.  stru
4a90: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b  ct openKey key2;
4aa0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
4ab0: 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74  tatbuf;.  struct
4ac0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
4ad0: 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  ;.  struct openC
4ae0: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20  nt *pOpen;.  rc 
4af0: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
4b00: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
4b10: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a  =0 ) return 1;..
4b20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4b30: 33 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b  3OsInMutex(1) );
4b40: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c  .  memset(&key1,
4b50: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29   0, sizeof(key1)
4b60: 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20  );.  key1.dev = 
4b70: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
4b80: 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61    key1.ino = sta
4b90: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66  tbuf.st_ino;.#if
4ba0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
4bb0: 54 48 52 45 41 44 53 0a 20 20 69 66 28 20 74 68  THREADS.  if( th
4bc0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
4bd0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29  hOthersLocks<0 )
4be0: 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64  {.    testThread
4bf0: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
4c00: 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e  fd);.  }.  key1.
4c10: 74 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65  tid = threadsOve
4c20: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
4c30: 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65  ocks ? 0 : pthre
4c40: 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69  ad_self();.#endi
4c50: 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32  f.  memset(&key2
4c60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  , 0, sizeof(key2
4c70: 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d  ));.  key2.dev =
4c80: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
4c90: 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74  .  key2.ino = st
4ca0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20  atbuf.st_ino;.  
4cb0: 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20  pLock = (struct 
4cc0: 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65  lockInfo*)sqlite
4cd0: 33 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48  3HashFind(&lockH
4ce0: 61 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65  ash, &key1, size
4cf0: 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28  of(key1));.  if(
4d00: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
4d10: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
4d20: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63   *pOld;.    pLoc
4d30: 6b 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  k = sqlite3Threa
4d40: 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  dSafeMalloc( siz
4d50: 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20  eof(*pLock) );. 
4d60: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
4d70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
4d80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
4d90: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
4da0: 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e     }.    pLock->
4db0: 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20  key = key1;.    
4dc0: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b  pLock->nRef = 1;
4dd0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  .    pLock->cnt 
4de0: 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = 0;.    pLock->
4df0: 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20  locktype = 0;.  
4e00: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
4e10: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
4e20: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
4e30: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c  y, sizeof(key1),
4e40: 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   pLock);.    if(
4e50: 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20   pOld!=0 ){.    
4e60: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
4e70: 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73  pLock );.      s
4e80: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
4e90: 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  Free(pLock);.   
4ea0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
4eb0: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
4ec0: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20  ockinfo;.    }. 
4ed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
4ee0: 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  k->nRef++;.  }. 
4ef0: 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b   *ppLock = pLock
4f00: 3b 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d  ;.  if( ppOpen!=
4f10: 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d  0 ){.    pOpen =
4f20: 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74   (struct openCnt
4f30: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
4f40: 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65  d(&openHash, &ke
4f50: 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29  y2, sizeof(key2)
4f60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e  );.    if( pOpen
4f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
4f80: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c  uct openCnt *pOl
4f90: 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d  d;.      pOpen =
4fa0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
4fb0: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
4fc0: 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  (*pOpen) );.    
4fd0: 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29    if( pOpen==0 )
4fe0: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
4ff0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
5000: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
5010: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
5020: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5040: 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79  pOpen->key = key
5050: 32 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  2;.      pOpen->
5060: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
5070: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30  pOpen->nLock = 0
5080: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
5090: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
50a0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
50b0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  ng = 0;.      pO
50c0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
50d0: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68  Insert(&openHash
50e0: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73  , &pOpen->key, s
50f0: 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70  izeof(key2), pOp
5100: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  en);.      if( p
5110: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
5120: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
5130: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
5140: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
5150: 66 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20  feFree(pOpen);. 
5160: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f         releaseLo
5170: 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20  ckInfo(pLock);. 
5180: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
5190: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
51a0: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
51b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
51c0: 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  {.      pOpen->n
51d0: 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref++;.    }.   
51e0: 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e   *ppOpen = pOpen
51f0: 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64  ;.  }..exit_find
5200: 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75  lockinfo:.  retu
5210: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
5220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
5230: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5240: 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ion for printing
5250: 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72   out trace infor
5260: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75  mation from debu
5270: 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65  gging.** binarie
5280: 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20  s. This returns 
5290: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
52a0: 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  setation of the 
52b0: 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65  supplied.** inte
52c0: 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a  ger lock-type..*
52d0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
52e0: 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d  har *locktypeNam
52f0: 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  e(int locktype){
5300: 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74  .  switch( lockt
5310: 79 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f  ype ){.  case NO
5320: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5330: 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41  ONE";.  case SHA
5340: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5350: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73   "SHARED";.  cas
5360: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
5370: 20 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45   return "RESERVE
5380: 44 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49  D";.  case PENDI
5390: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
53a0: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73  "PENDING";.  cas
53b0: 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e EXCLUSIVE_LOCK
53c0: 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53  : return "EXCLUS
53d0: 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75  IVE";.  }.  retu
53e0: 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65  rn "ERROR";.}.#e
53f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77  ndif../*.** If w
5400: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
5410: 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  in a different t
5420: 68 72 65 61 64 20 74 68 61 6e 20 74 68 65 20 74  hread than the t
5430: 68 72 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a  hread that the.*
5440: 2a 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d  * unixFile argum
5450: 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20  ent belongs to, 
5460: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77  then transfer ow
5470: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 75  nership of the u
5480: 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20  nixFile.** over 
5490: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
54a0: 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75  hread..**.** A u
54b0: 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20  nixFile is only 
54c0: 6f 77 6e 65 64 20 62 79 20 61 20 74 68 72 65 61  owned by a threa
54d0: 64 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65  d on systems whe
54e0: 72 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73  re one thread is
54f0: 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76  .** unable to ov
5500: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65  erride locks cre
5510: 61 74 65 64 20 62 79 20 61 20 64 69 66 66 65 72  ated by a differ
5520: 65 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65 64  ent thread.  Red
5530: 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78  Hat9 is.** an ex
5540: 61 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20  ample of such a 
5550: 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77  system..**.** Ow
5560: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
5570: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
5580: 20 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   if the unixFile
5590: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
55a0: 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68  locked..** If th
55b0: 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f  e unixFile is lo
55c0: 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65  cked and an owne
55d0: 72 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20  rship is wrong, 
55e0: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53  then return.** S
55f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53  QLITE_MISUSE.  S
5600: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
5610: 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
5620: 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66  ng works..*/.#if
5630: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
5640: 54 48 52 45 41 44 53 0a 73 74 61 74 69 63 20 69  THREADS.static i
5650: 6e 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  nt transferOwner
5660: 73 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70  ship(unixFile *p
5670: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  File){.  int rc;
5680: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65  .  pthread_t hSe
5690: 6c 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64  lf;.  if( thread
56a0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
56b0: 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20  ersLocks ){.    
56c0: 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61  /* Ownership tra
56d0: 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65  nsfers not neede
56e0: 64 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d  d on this system
56f0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
5710: 68 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f  hSelf = pthread_
5720: 73 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74  self();.  if( pt
5730: 68 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c  hread_equal(pFil
5740: 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29  e->tid, hSelf) )
5750: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
5760: 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d  still in the sam
5770: 65 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20  e thread */.    
5780: 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73  TRACE1("No-trans
5790: 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64  fer, same thread
57a0: 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  \n");.    return
57b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
57c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
57d0: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype!=NO_LOCK )
57e0: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e  {.    /* We cann
57f0: 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73  ot change owners
5800: 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65  hip while we are
5810: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21   holding a lock!
5820: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5830: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
5840: 7d 0a 20 20 54 52 41 43 45 34 28 22 54 72 61 6e  }.  TRACE4("Tran
5850: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
5860: 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20  f %d from %d to 
5870: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
5880: 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53 65 6c 66  pFile->tid,hSelf
5890: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20  );.  pFile->tid 
58a0: 3d 20 68 53 65 6c 66 3b 0a 20 20 72 65 6c 65 61  = hSelf;.  relea
58b0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  seLockInfo(pFile
58c0: 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 63 20 3d  ->pLock);.  rc =
58d0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46   findLockInfo(pF
58e0: 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e  ile->h, &pFile->
58f0: 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 54 52 41  pLock, 0);.  TRA
5900: 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE5("LOCK    %d 
5910: 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29  is now %s(%s,%d)
5920: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
5930: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
5940: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
5950: 29 2c 0a 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ),.     locktype
5960: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Name(pFile->pLoc
5970: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46  k->locktype), pF
5980: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29  ile->pLock->cnt)
5990: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
59a0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73  .#else.  /* On s
59b0: 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62  ingle-threaded b
59c0: 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70  uilds, ownership
59d0: 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e   transfer is a n
59e0: 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65  o-op */.# define
59f0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
5a00: 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ip(X) SQLITE_OK.
5a10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
5a20: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
5a30: 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ile.*/.int sqlit
5a40: 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e  e3UnixDelete(con
5a50: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
5a60: 6d 65 29 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46  me){.  unlink(zF
5a70: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
5a80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5a90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5aa0: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
5ab0: 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  file exists..*/.
5ac0: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 46  int sqlite3UnixF
5ad0: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
5ae0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
5af0: 7b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  {.  return acces
5b00: 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d  s(zFilename, 0)=
5b10: 3d 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  =0;.}../* Forwar
5b20: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
5b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
5b40: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 75 6e 69  cateUnixFile(uni
5b50: 78 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73  xFile *pInit, Os
5b60: 46 69 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f 2a  File **pId);../*
5b70: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
5b80: 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62  pen a file for b
5b90: 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20  oth reading and 
5ba0: 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61  writing.  If tha
5bb0: 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20  t.** fails, try 
5bc0: 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d  opening it read-
5bd0: 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69  only.  If the fi
5be0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
5bf0: 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65  t,.** try to cre
5c00: 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ate it..**.** On
5c10: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
5c20: 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  le for the open 
5c30: 66 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20  file is written 
5c40: 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70  to *id.** and *p
5c50: 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20  Readonly is set 
5c60: 74 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c 65  to 0 if the file
5c70: 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20   was opened for 
5c80: 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77  reading and.** w
5c90: 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74  riting or 1 if t
5ca0: 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
5cb0: 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54  ed read-only.  T
5cc0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
5cd0: 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  rns.** SQLITE_OK
5ce0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
5cf0: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  re, the function
5d00: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
5d10: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61  CANTOPEN and lea
5d20: 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a  ves.** *id and *
5d30: 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e  pReadonly unchan
5d40: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
5d50: 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57  te3UnixOpenReadW
5d60: 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  rite(.  const ch
5d70: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  ar *zFilename,. 
5d80: 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20   OsFile **pId,. 
5d90: 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a   int *pReadonly.
5da0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
5db0: 6e 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52  nixFile f;..  CR
5dc0: 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44  ASH_TEST_OVERRID
5dd0: 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70  E(sqlite3CrashOp
5de0: 65 6e 52 65 61 64 57 72 69 74 65 2c 20 7a 46 69  enReadWrite, zFi
5df0: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 70 52 65  lename, pId, pRe
5e00: 61 64 6f 6e 6c 79 29 3b 0a 20 20 61 73 73 65 72  adonly);.  asser
5e10: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
5e20: 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65  f.h = open(zFile
5e30: 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  name, O_RDWR|O_C
5e40: 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  REAT|O_LARGEFILE
5e50: 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20  |O_BINARY,.     
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
5e80: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
5e90: 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e 68  IONS);.  if( f.h
5ea0: 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53  <0 ){.#ifdef EIS
5eb0: 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e  DIR.    if( errn
5ec0: 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20  o==EISDIR ){.   
5ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5ee0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
5ef0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 2e 68 20  .#endif.    f.h 
5f00: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
5f10: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
5f20: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
5f30: 3b 0a 20 20 20 20 69 66 28 20 66 2e 68 3c 30 20  ;.    if( f.h<0 
5f40: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5f50: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
5f60: 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65   .    }.    *pRe
5f70: 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65  adonly = 1;.  }e
5f80: 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f  lse{.    *pReado
5f90: 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  nly = 0;.  }.  s
5fa0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
5fb0: 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e  ex();.  rc = fin
5fc0: 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26  dLockInfo(f.h, &
5fd0: 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65  f.pLock, &f.pOpe
5fe0: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  n);.  sqlite3OsL
5ff0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
6000: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f  f( rc ){.    clo
6010: 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65 74  se(f.h);.    ret
6020: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
6030: 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22  ;.  }.  TRACE3("
6040: 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
6050: 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61  n", f.h, zFilena
6060: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c  me);.  return al
6070: 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26  locateUnixFile(&
6080: 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  f, pId);.}.../*.
6090: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
60a0: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
60b0: 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
60c0: 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ss by this proce
60d0: 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ss..** The file 
60e0: 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66  will be opened f
60f0: 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
6100: 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f  and writing.  To
6110: 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65   avoid.** a pote
6120: 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 70  ntial security p
6130: 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f  roblem, we do no
6140: 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  t allow the file
6150: 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76   to have.** prev
6160: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
6170: 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77   Nor do we allow
6180: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
6190: 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69  a symbolic.** li
61a0: 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c  nk..**.** If del
61b0: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
61c0: 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d  en make arrangem
61d0: 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69  ents to automati
61e0: 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20  cally delete.** 
61f0: 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74  the file when it
6200: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
6210: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72  * On success, wr
6220: 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e  ite the file han
6230: 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64  dle into *id and
6240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6250: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
6260: 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ure, return SQLI
6270: 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a  TE_CANTOPEN..*/.
6280: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f  int sqlite3UnixO
6290: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
62a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
62b0: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
62c0: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
62d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
62e0: 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53 48  File f;..  CRASH
62f0: 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73  _TEST_OVERRIDE(s
6300: 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 45  qlite3CrashOpenE
6310: 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65 6e  xclusive, zFilen
6320: 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c 61  ame, pId, delFla
6330: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  g);.  assert( 0=
6340: 3d 2a 70 49 64 20 29 3b 0a 20 20 69 66 28 20 61  =*pId );.  if( a
6350: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
6360: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   0)==0 ){.    re
6370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
6380: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e 68 20  OPEN;.  }.  f.h 
6390: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
63a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
63b0: 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54    O_RDWR|O_CREAT
63c0: 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  |O_EXCL|O_NOFOLL
63d0: 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  OW|O_LARGEFILE|O
63e0: 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20  _BINARY,.       
63f0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6400: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
6410: 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
6420: 20 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72 65   f.h<0 ){.    re
6430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
6440: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OPEN;.  }.  sqli
6450: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
6460: 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f  );.  rc = findLo
6470: 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70  ckInfo(f.h, &f.p
6480: 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b  Lock, &f.pOpen);
6490: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
64a0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
64b0: 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  rc ){.    close(
64c0: 66 2e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  f.h);.    unlink
64d0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
64e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
64f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
6500: 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75  delFlag ){.    u
6510: 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
6520: 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22  ;.  }.  TRACE3("
6530: 4f 50 45 4e 2d 45 58 20 25 2d 33 64 20 25 73 5c  OPEN-EX %-3d %s\
6540: 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61  n", f.h, zFilena
6550: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c  me);.  return al
6560: 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26  locateUnixFile(&
6570: 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  f, pId);.}../*.*
6580: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
6590: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72  n a new file for
65a0: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73   read-only acces
65b0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  s..**.** On succ
65c0: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
65d0: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
65e0: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
65f0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
6600: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
6610: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
6620: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EN..*/.int sqlit
6630: 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f 6e  e3UnixOpenReadOn
6640: 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ly(const char *z
6650: 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65  Filename, OsFile
6660: 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 72   **pId){.  int r
6670: 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66 3b  c;.  unixFile f;
6680: 0a 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f 4f  ..  CRASH_TEST_O
6690: 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33 43  VERRIDE(sqlite3C
66a0: 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  rashOpenReadOnly
66b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64  , zFilename, pId
66c0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
66d0: 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e 68  0==*pId );.  f.h
66e0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
66f0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
6700: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6710: 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29  );.  if( f.h<0 )
6720: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6730: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
6740: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  }.  sqlite3OsEnt
6750: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
6760: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66  = findLockInfo(f
6770: 2e 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66  .h, &f.pLock, &f
6780: 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74  .pOpen);.  sqlit
6790: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
67a0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
67b0: 20 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20 20    close(f.h);.  
67c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
67d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
67e0: 43 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33  CE3("OPEN-RO %-3
67f0: 64 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46  d %s\n", f.h, zF
6800: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
6810: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
6820: 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a  ile(&f, pId);.}.
6830: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6840: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  o open a file de
6850: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
6860: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
6870: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69  contains a.** fi
6880: 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64  le.  This file d
6890: 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65  escriptor can be
68a0: 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29   used to fsync()
68b0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
68c0: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  * in order to ma
68d0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61  ke sure the crea
68e0: 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69  tion of a new fi
68f0: 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77  le is actually w
6900: 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73  ritten.** to dis
6910: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
6920: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65  utine is only me
6930: 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69  aningful for Uni
6940: 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  x.  It is a no-o
6950: 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f  p under.** windo
6960: 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73  ws since windows
6970: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
6980: 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a  t hard links..**
6990: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
69a0: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70  a handle for a p
69b0: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66  reviously open f
69c0: 69 6c 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a  ile at *id is.**
69d0: 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
69e0: 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20  e new directory 
69f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6a00: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
6a10: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
6a20: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
6a30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
6a40: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
6a50: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
6a60: 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64  ** *id unchanged
6a70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6a80: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
6a90: 79 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c  y(.  OsFile *id,
6aa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ab0: 44 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69  Dirname.){.  uni
6ac0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
6ad0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
6ae0: 69 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( pFile==0 ){.
6af0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70      /* Do not op
6b00: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
6b10: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
6b20: 6e 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f  nding file is no
6b30: 74 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  t already.    **
6b40: 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65   open. */.    re
6b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
6b60: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OPEN;.  }.  SET_
6b70: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b  THREADID(pFile);
6b80: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
6b90: 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70  ->dirfd<0 );.  p
6ba0: 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70  File->dirfd = op
6bb0: 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
6bc0: 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
6bd0: 30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  0);.  if( pFile-
6be0: 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20  >dirfd<0 ){.    
6bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
6c00: 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54  NTOPEN; .  }.  T
6c10: 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25  RACE3("OPENDIR %
6c20: 2d 33 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  -3d %s\n", pFile
6c30: 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d  ->dirfd, zDirnam
6c40: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
6c50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6c60: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
6c70: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
6c80: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
6c90: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
6ca0: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
6cb0: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
6cc0: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
6cd0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
6ce0: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
6cf0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
6d00: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
6d10: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
6d20: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
6d30: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
6d40: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
6d50: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
6d60: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
6d70: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
6d80: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
6d90: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
6da0: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c   to.** hold at l
6db0: 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50  east SQLITE_TEMP
6dc0: 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63  NAME_SIZE charac
6dd0: 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ters..*/.int sql
6de0: 69 74 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65  ite3UnixTempFile
6df0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29  Name(char *zBuf)
6e00: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
6e10: 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
6e20: 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
6e30: 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
6e40: 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
6e50: 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
6e60: 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ".",.  };.  stat
6e70: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
6e80: 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
6e90: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
6ea0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
6eb0: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
6ec0: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
6ed0: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
6ee0: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
6ef0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
6f00: 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
6f10: 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20  r *zDir = ".";. 
6f20: 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
6f30: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
6f40: 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ory;.  for(i=0; 
6f50: 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
6f60: 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
6f70: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
6f80: 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
6f90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
6fa0: 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
6fb0: 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
6fc0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
6fd0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
6fe0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
6ff0: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
7000: 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
7010: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
7020: 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
7030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
7040: 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  do{.    sprintf(
7050: 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f  zBuf, "%s/"TEMP_
7060: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
7070: 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  r);.    j = strl
7080: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
7090: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
70a0: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
70b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
70c0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
70d0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
70e0: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
70f0: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
7100: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
7110: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
7120: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
7130: 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
7140: 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
7150: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7160: 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  OK; .}../*.** Ch
7170: 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e  eck that a given
7180: 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64   pathname is a d
7190: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20  irectory and is 
71a0: 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a  writable .**.*/.
71b0: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49  int sqlite3UnixI
71c0: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61  sDirWritable(cha
71d0: 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65  r *zBuf){.#ifnde
71e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
71f0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74  GER_PRAGMAS.  st
7200: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
7210: 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72   if( zBuf==0 ) r
7220: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
7230: 42 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  Buf[0]==0 ) retu
7240: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74  rn 0;.  if( stat
7250: 28 7a 42 75 66 2c 20 26 62 75 66 29 20 29 20 72  (zBuf, &buf) ) r
7260: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
7270: 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
7280: 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ode) ) return 0;
7290: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 42  .  if( access(zB
72a0: 75 66 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e  uf, 07) ) return
72b0: 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
72c0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
72d0: 50 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74  PRAGMAS */.  ret
72e0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
72f0: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
7300: 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
7310: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
7320: 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
7330: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7340: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
7350: 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
7360: 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
7370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
7380: 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
7390: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
73a0: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
73b0: 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66   int got;.#ifdef
73c0: 20 55 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74   USE_PREAD.  got
73d0: 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20   = pread(id->h, 
73e0: 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f  pBuf, cnt, id->o
73f0: 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ffset);.#else.  
7400: 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d  lseek(id->h, id-
7410: 3e 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45  >offset, SEEK_SE
7420: 54 29 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64  T);.  got = read
7430: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
7440: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  t);.#endif.  if(
7450: 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64   got>0 ){.    id
7460: 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b  ->offset += got;
7470: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f  .  }.  return go
7480: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
7490: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
74a0: 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
74b0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
74c0: 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
74d0: 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
74e0: 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
74f0: 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
7500: 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
7510: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7520: 69 6e 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46  int unixRead(OsF
7530: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
7540: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
7550: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
7560: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
7570: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
7580: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d  TE_IOERR);.  TIM
7590: 45 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20  ER_START;.  got 
75a0: 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75  = seekAndRead((u
75b0: 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42 75  nixFile*)id, pBu
75c0: 66 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52  f, amt);.  TIMER
75d0: 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22  _END;.  TRACE5("
75e0: 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
75f0: 20 25 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e   %7d %d\n", ((un
7600: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
7610: 67 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  got,.          l
7620: 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f  ast_page, TIMER_
7630: 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b  ELAPSED);.  SEEK
7640: 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f  (0);.  /* if( go
7650: 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a  t<0 ) got = 0; *
7660: 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  /.  if( got==amt
7670: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7680: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
7690: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
76a0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
76b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  }../*.** Seek to
76c0: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69   the offset in i
76d0: 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72  d->offset then r
76e0: 65 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e  ead cnt bytes in
76f0: 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75  to pBuf..** Retu
7700: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7710: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
7720: 72 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68  read.  Update th
7730: 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61  e offset..*/.sta
7740: 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
7750: 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
7760: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
7770: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
7780: 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66   int got;.#ifdef
7790: 20 55 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74   USE_PREAD.  got
77a0: 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c   = pwrite(id->h,
77b0: 20 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e   pBuf, cnt, id->
77c0: 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20  offset);.#else. 
77d0: 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64   lseek(id->h, id
77e0: 2d 3e 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  ->offset, SEEK_S
77f0: 45 54 29 3b 0a 20 20 67 6f 74 20 3d 20 77 72 69  ET);.  got = wri
7800: 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  te(id->h, pBuf, 
7810: 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  cnt);.#endif.  i
7820: 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
7830: 69 64 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f  id->offset += go
7840: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
7850: 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  got;.}.../*.** W
7860: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
7870: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
7880: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
7890: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
78a0: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
78b0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
78c0: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
78d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74  tic int unixWrit
78e0: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f  e(OsFile *id, co
78f0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
7900: 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20  int amt){.  int 
7910: 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
7920: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
7930: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
7940: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
7950: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
7960: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
7970: 6c 45 72 72 6f 72 3b 0a 20 20 54 49 4d 45 52 5f  lError;.  TIMER_
7980: 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65 28 20  START;.  while( 
7990: 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
79a0: 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
79b0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42  unixFile*)id, pB
79c0: 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
79d0: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
79e0: 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
79f0: 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
7a00: 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45 52 5f 45  ];.  }.  TIMER_E
7a10: 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 57 52  ND;.  TRACE5("WR
7a20: 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
7a30: 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78  7d %d\n", ((unix
7a40: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 77 72  File*)id)->h, wr
7a50: 6f 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  ote,.          l
7a60: 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f  ast_page, TIMER_
7a70: 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b  ELAPSED);.  SEEK
7a80: 28 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30  (0);.  if( amt>0
7a90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7aa0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
7ab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ac0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  OK;.}../*.** Mov
7ad0: 65 20 74 68 65 20 72 65 61 64 2f 77 72 69 74 65  e the read/write
7ae0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69   pointer in a fi
7af0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
7b00: 74 20 75 6e 69 78 53 65 65 6b 28 4f 73 46 69 6c  t unixSeek(OsFil
7b10: 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
7b20: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  t){.  assert( id
7b30: 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65   );.  SEEK(offse
7b40: 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 23 69 66  t/1024 + 1);.#if
7b50: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
7b60: 20 20 69 66 28 20 6f 66 66 73 65 74 20 29 20 53    if( offset ) S
7b70: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
7b80: 72 72 6f 72 0a 23 65 6e 64 69 66 0a 20 20 28 28  rror.#endif.  ((
7b90: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f  unixFile*)id)->o
7ba0: 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
7bb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7bc0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
7bd0: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
7be0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
7bf0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
7c00: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
7c10: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
7c20: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
7c30: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
7c40: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
7c50: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
7c60: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
7c70: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
7c80: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
7c90: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
7ca0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
7cb0: 55 73 65 20 74 68 65 20 66 64 61 74 61 73 79 6e  Use the fdatasyn
7cc0: 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20  c() API only if 
7cd0: 74 68 65 20 48 41 56 45 5f 46 44 41 54 41 53 59  the HAVE_FDATASY
7ce0: 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
7cf0: 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
7d00: 65 20 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e  e use fsync() in
7d10: 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23   its place..*/.#
7d20: 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54  ifndef HAVE_FDAT
7d30: 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
7d40: 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
7d50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
7d60: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
7d70: 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
7d80: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
7d90: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
7da0: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
7db0: 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
7dc0: 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
7dd0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
7de0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
7df0: 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
7e00: 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
7e10: 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
7e20: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
7e30: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
7e40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
7e50: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
7e60: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
7e70: 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
7e80: 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
7e90: 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
7ea0: 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
7eb0: 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
7ec0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
7ed0: 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
7ee0: 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
7ef0: 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
7f00: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
7f10: 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
7f20: 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
7f30: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
7f40: 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
7f50: 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
7f60: 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
7f70: 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
7f80: 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
7f90: 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
7fa0: 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
7fb0: 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
7fc0: 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
7fd0: 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
7fe0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
7ff0: 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
8000: 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
8010: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
8020: 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
8030: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
8040: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
8050: 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
8060: 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
8070: 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
8080: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
8090: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
80a0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
80b0: 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
80c0: 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
80d0: 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
80e0: 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
80f0: 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
8100: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
8110: 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
8120: 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
8130: 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
8140: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
8150: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
8160: 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
8170: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
8180: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
8190: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
81a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
81b0: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
81c0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
81d0: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
81e0: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
81f0: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
8200: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
8210: 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
8220: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20  _OK;.#else..#if 
8230: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
8240: 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
8250: 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  .    rc = fcntl(
8260: 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
8270: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
8280: 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
8290: 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 53 59  /* If the FULLSY
82a0: 4e 43 20 66 61 69 6c 65 64 2c 20 74 72 79 20 74  NC failed, try t
82b0: 6f 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  o do a normal fs
82c0: 79 6e 63 28 29 20 2a 2f 0a 20 20 69 66 28 20 72  ync() */.  if( r
82d0: 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66  c ) rc = fsync(f
82e0: 64 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  d);..#else /* if
82f0: 20 21 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c   !defined(F_FULL
8300: 53 59 4e 43 29 20 2a 2f 0a 20 20 69 66 28 20 64  SYNC) */.  if( d
8310: 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  ataOnly ){.    r
8320: 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
8330: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8340: 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
8350: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65    }.#endif /* de
8360: 66 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e  fined(F_FULLFSYN
8370: 43 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  C) */.#endif /* 
8380: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
8390: 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65  O_SYNC) */..  re
83a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
83b0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
83c0: 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
83d0: 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
83e0: 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
83f0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  k..**.** If data
8400: 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74  Only==0 then bot
8410: 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c  h the file itsel
8420: 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61  f and its metada
8430: 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65  ta (file.** size
8440: 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65  , access time, e
8450: 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20  tc) are synced. 
8460: 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20   If dataOnly!=0 
8470: 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  then only the.**
8480: 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79   file data is sy
8490: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65  nced..**.** Unde
84a0: 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b  r Unix, also mak
84b0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
84c0: 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
84d0: 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  for the file.** 
84e0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
84f0: 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68   by fsync-ing th
8500: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
8510: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69   contains the fi
8520: 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20  le..** If we do 
8530: 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20  not do this and 
8540: 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70  we encounter a p
8550: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
8560: 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65  e directory.** e
8570: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
8580: 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65  rnal might not e
8590: 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65  xist after we re
85a0: 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a  boot.  The next.
85b0: 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63  ** SQLite to acc
85c0: 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ess the file wil
85d0: 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20  l not know that 
85e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  the journal exis
85f0: 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ts (because.** t
8600: 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
8610: 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
8620: 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65  al was never cre
8630: 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72  ated) and the tr
8640: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
8650: 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20  l not roll back 
8660: 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69  - possibly leadi
8670: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
8680: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
8690: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e  atic int unixSyn
86a0: 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  c(OsFile *id, in
86b0: 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 75  t dataOnly){.  u
86c0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
86d0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
86e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
86f0: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
8700: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
8710: 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59  R);.  TRACE2("SY
8720: 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
8730: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 69 66 28 20  File->h);.  if( 
8740: 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65  full_fsync(pFile
8750: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c  ->h, pFile->full
8760: 53 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 20  Sync, dataOnly) 
8770: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8780: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
8790: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
87a0: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 54 52 41  fd>=0 ){.    TRA
87b0: 43 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE4("DIRSYNC %-3
87c0: 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
87d0: 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
87e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
87f0: 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
8800: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
8810: 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 29  pFile->fullSync)
8820: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8830: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
8840: 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65  .    /* The dire
8850: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e  ctory sync is on
8860: 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
8870: 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20  full_fsync is.  
8880: 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20    ** turned off 
8890: 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  or unavailable. 
88a0: 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63   If a full_fsync
88b0: 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
88c0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
88d0: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
88e0: 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a  is superfluous..
88f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
8900: 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20  !HAVE_FULLFSYNC 
8910: 7c 7c 20 21 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  || !pFile->fullS
8920: 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79  ync) && full_fsy
8930: 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  nc(pFile->dirfd,
8940: 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  0,0) ){.       /
8950: 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68  *.       ** We h
8960: 61 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c  ave received mul
8970: 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66  tiple reports of
8980: 20 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69   fsync() returni
8990: 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72  ng.       ** err
89a0: 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64  ors when applied
89b0: 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20   to directories 
89c0: 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20  on certain file 
89d0: 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20  systems..       
89e0: 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65  ** A failed dire
89f0: 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f  ctory sync is no
8a00: 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53  t a big deal.  S
8a10: 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20  o it seems.     
8a20: 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69    ** better to i
8a30: 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e  gnore the error.
8a40: 20 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20    Ticket #1657. 
8a50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8a60: 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  /* return SQLITE
8a70: 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d  _IOERR; */.    }
8a80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73  .#endif.    clos
8a90: 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b  e(pFile->dirfd);
8aa0: 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74    /* Only need t
8ab0: 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20  o sync once, so 
8ac0: 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74  close the direct
8ad0: 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ory */.    pFile
8ae0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20  ->dirfd = -1;   
8af0: 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20   /* when we are 
8b00: 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  done. */.  }.  r
8b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
8b30: 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69  he directory zDi
8b40: 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61  rname. This is a
8b50: 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74   no-op on operat
8b60: 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65  ing systems othe
8b70: 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a  r.** than UNIX..
8b80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
8b90: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
8ba0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8bb0: 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75 65  al file has true
8bc0: 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a  ly been deleted.
8bd0: 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ** before making
8be0: 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69   changes to indi
8bf0: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20  vidual journals 
8c00: 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62  on a multi-datab
8c10: 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54  ase commit..** T
8c20: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f  he F_FULLFSYNC o
8c30: 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65  ption is not nee
8c40: 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  ded here..*/.int
8c50: 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63   sqlite3UnixSync
8c60: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
8c70: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b  char *zDirname){
8c80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8c90: 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20  ISABLE_DIRSYNC. 
8ca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8cb0: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66  K;.#else.  int f
8cc0: 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53 69  d;.  int r;.  Si
8cd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
8ce0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66  LITE_IOERR);.  f
8cf0: 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
8d00: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
8d10: 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41 43  NARY, 0);.  TRAC
8d20: 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E3("DIRSYNC %-3d
8d30: 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44   (%s)\n", fd, zD
8d40: 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 66  irname);.  if( f
8d50: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
8d60: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
8d70: 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73  N; .  }.  r = fs
8d80: 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65  ync(fd);.  close
8d90: 28 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  (fd);.  return (
8da0: 28 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b  (r==0)?SQLITE_OK
8db0: 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  :SQLITE_IOERR);.
8dc0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8dd0: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
8de0: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
8df0: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
8e00: 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
8e10: 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  cate(OsFile *id,
8e20: 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 61   i64 nByte){.  a
8e30: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53  ssert( id );.  S
8e40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
8e50: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
8e60: 72 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74 65  return ftruncate
8e70: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
8e80: 2d 3e 68 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f  ->h, nByte)==0 ?
8e90: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
8ea0: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
8eb0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
8ec0: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
8ed0: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
8ee0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ef0: 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46  unixFileSize(OsF
8f00: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
8f10: 69 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ize){.  struct s
8f20: 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
8f30: 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
8f40: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
8f50: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20  E_IOERR);.  if( 
8f60: 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65  fstat(((unixFile
8f70: 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 21  *)id)->h, &buf)!
8f80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8f90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8fa0: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
8fb0: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
8fc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8fd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8fe0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
8ff0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9000: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9010: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9020: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9030: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9040: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9050: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
9060: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
9070: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
9080: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
9090: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
90a0: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
90b0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
90c0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
90d0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
90e0: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
90f0: 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69   r = 0;.  unixFi
9100: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9110: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
9120: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
9130: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
9140: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
9150: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
9160: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
9170: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
9180: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
9190: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
91a0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
91b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
91c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
91d0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
91e0: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
91f0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
9200: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
9210: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
9220: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
9230: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
9240: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
9250: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
9260: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
9270: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
9280: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
9290: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
92a0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
92b0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
92c0: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
92d0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
92e0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
92f0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
9300: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
9310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
9320: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
9330: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28  tex();.  TRACE3(
9340: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
9350: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
9360: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
9370: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
9380: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
9390: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
93a0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
93b0: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
93c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
93d0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
93e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
93f0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
9400: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
9410: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
9420: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
9430: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
9440: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
9450: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
9460: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
9470: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
9480: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
9490: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
94a0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
94b0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
94c0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
94d0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
94e0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
94f0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
9500: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
9510: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
9520: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
9530: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
9540: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
9550: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
9560: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
9570: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
9580: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
9590: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
95a0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
95b0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
95c0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
95d0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
95e0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
95f0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
9600: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
9610: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
9620: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
9630: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9640: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
9650: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
9660: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
9670: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
9680: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
9690: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
96a0: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
96b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
96c0: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
96d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
96e0: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
96f0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
9700: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
9710: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
9720: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
9730: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
9740: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
9750: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
9760: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
9770: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
9780: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
9790: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
97a0: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
97b0: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
97c0: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
97d0: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
97e0: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
97f0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
9800: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
9810: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
9820: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
9830: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
9840: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
9850: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
9860: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
9870: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
9880: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
9890: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
98a0: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
98b0: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
98c0: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
98d0: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
98e0: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
98f0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
9900: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
9910: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
9920: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
9930: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
9940: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
9950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
9960: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
9970: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
9980: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
9990: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
99a0: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
99b0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
99c0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
99d0: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
99e0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
99f0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
9a00: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
9a10: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
9a20: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
9a30: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
9a40: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
9a50: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9a60: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
9a70: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
9a80: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
9a90: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9aa0: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
9ab0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
9ac0: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
9ad0: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
9ae0: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
9af0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
9b00: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
9b10: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
9b20: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
9b30: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
9b40: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
9b50: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
9b60: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
9b70: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
9b80: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
9b90: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
9ba0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
9bb0: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
9bc0: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
9bd0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
9be0: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
9bf0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
9c00: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
9c10: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
9c20: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
9c30: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
9c40: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
9c50: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
9c60: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
9c70: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
9c80: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
9c90: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
9ca0: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
9cb0: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
9cc0: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
9cd0: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
9ce0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
9cf0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
9d00: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
9d10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
9d20: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
9d30: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
9d40: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
9d50: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
9d60: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
9d70: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
9d80: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
9d90: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
9da0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
9db0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
9dc0: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
9dd0: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
9de0: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
9df0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
9e00: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
9e10: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
9e20: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
9e30: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
9e40: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
9e50: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
9e60: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
9e70: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
9e80: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
9e90: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
9ea0: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
9eb0: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
9ec0: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
9ed0: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
9ee0: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
9ef0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
9f00: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
9f10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
9f20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9f30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
9f40: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
9f50: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
9f60: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
9f70: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
9f80: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
9f90: 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45  pFile );.  TRACE
9fa0: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
9fb0: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
9fc0: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
9fd0: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
9fe0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
9ff0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
a000: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
a010: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
a020: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
a030: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
a040: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
a050: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
a060: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
a070: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
a080: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
a090: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
a0a0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
a0b0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
a0c0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
a0d0: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
a0e0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
a0f0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
a100: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
a110: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
a120: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
a130: 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43  .    TRACE3("LOC
a140: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
a150: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
a160: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
a170: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
a180: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
a190: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a1a0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
a1b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
a1c0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
a1d0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
a1e0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
a1f0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
a200: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
a210: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a220: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
a230: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
a240: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
a250: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
a260: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
a270: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
a280: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
a290: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
a2a0: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
a2b0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
a2c0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
a2d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
a2e0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
a2f0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
a300: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
a310: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
a320: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
a330: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
a340: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
a350: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a360: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
a370: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
a380: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
a390: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
a3a0: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
a3b0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
a3c0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
a3d0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
a3e0: 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20  nt OsFile*.  ** 
a3f0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
a400: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
a410: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
a420: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
a430: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
a440: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
a450: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
a460: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
a470: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
a480: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
a490: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
a4a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a4b0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
a4c0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
a4d0: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
a4e0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
a4f0: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
a500: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
a510: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
a520: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
a530: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
a540: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
a550: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
a560: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
a570: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
a580: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
a590: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
a5a0: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
a5b0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a5c0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
a5d0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
a5e0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
a5f0: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
a600: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a610: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
a620: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
a630: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
a640: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
a650: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
a660: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
a670: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
a680: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
a690: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
a6a0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
a6b0: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
a6c0: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
a6d0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
a6e0: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
a6f0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
a700: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
a710: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
a720: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
a730: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
a740: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
a750: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
a760: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
a770: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
a780: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
a790: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
a7a0: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
a7b0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
a7c0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
a7d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
a7e0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
a7f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a800: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
a810: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
a820: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
a830: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
a840: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
a850: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
a860: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
a870: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20  ock);.    if( s 
a880: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
a890: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
a8a0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
a8b0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a8c0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
a8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
a8e0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
a8f0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
a900: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
a910: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
a920: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
a930: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
a940: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
a950: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
a960: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a970: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
a980: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
a990: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a9a0: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
a9b0: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
a9c0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
a9d0: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
a9e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
a9f0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
aa00: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
aa10: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20  D_SIZE;.    s = 
aa20: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
aa30: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
aa40: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
aa50: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
aa60: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
aa70: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
aa80: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
aa90: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
aaa0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
aab0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
aac0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
aad0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
aae0: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
aaf0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ab00: 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  RR;  /* This sho
ab10: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
ab20: 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
ab30: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
ab40: 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20     if( s ){.    
ab50: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
ab60: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
ab70: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
ab80: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
ab90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
aba0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
abb0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
abc0: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
abd0: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
abe0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
abf0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
ac00: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
ac10: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
ac20: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
ac30: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
ac40: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
ac50: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
ac60: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
ac70: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
ac80: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
ac90: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
aca0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
acb0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
acc0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
acd0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
ace0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
acf0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
ad00: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
ad10: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
ad20: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
ad30: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
ad40: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
ad50: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
ad60: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
ad70: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
ad80: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ad90: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
ada0: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
adb0: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
adc0: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
add0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ade0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
adf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae00: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
ae10: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
ae20: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ae30: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ae40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
ae50: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
ae60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ae70: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
ae80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
ae90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
aea0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
aeb0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
aec0: 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20  .    if( s ){.  
aed0: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
aee0: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
aef0: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
af00: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
af10: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
af20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
af30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
af40: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
af50: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
af60: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
af70: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
af80: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
af90: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
afa0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
afb0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
afc0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
afd0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
afe0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
aff0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
b000: 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f 43  );.  TRACE4("LOC
b010: 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22  K    %d %s %s\n"
b020: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
b030: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
b040: 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  e), .      rc==S
b050: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
b060: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
b070: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b080: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
b090: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
b0a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
b0b0: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
b0c0: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
b0d0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
b0e0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
b0f0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
b100: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
b110: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
b120: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
b130: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
b140: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
b150: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
b160: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
b170: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
b180: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
b190: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
b1a0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72  locktype){.  str
b1b0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
b1c0: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
b1d0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
b1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b1f0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b200: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b210: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
b220: 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28  ile );.  TRACE7(
b230: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
b240: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
b250: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
b260: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
b270: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b280: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
b290: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
b2a0: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
b2b0: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
b2c0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
b2d0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
b2e0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
b2f0: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
b300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b310: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
b320: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
b330: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
b340: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
b350: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
b360: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
b370: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
b380: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
b390: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
b3a0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
b3b0: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
b3c0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
b3d0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
b3e0: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
b3f0: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28 20  type );.    if( 
b400: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b410: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
b420: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
b430: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  DLCK;.      lock
b440: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b450: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
b460: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
b470: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
b480: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
b490: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  ED_SIZE;.      i
b4a0: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
b4b0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b4c0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
b4d0: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
b4e0: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
b4f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
b500: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
b510: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
b520: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
b530: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
b540: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b550: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b560: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
b570: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
b580: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
b590: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
b5a0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
b5b0: 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28  ;.    if( fcntl(
b5c0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
b5d0: 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  K, &lock)==0 ){.
b5e0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
b5f0: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
b600: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
b610: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b620: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
b630: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
b640: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  appen */.    }. 
b650: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
b660: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
b670: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
b680: 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a   *pOpen;..    /*
b690: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73   Decrement the s
b6a0: 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74  hared lock count
b6b0: 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65  er.  Release the
b6c0: 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20   lock using an. 
b6d0: 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e     ** OS call on
b6e0: 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65  ly when all thre
b6f0: 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65  ads in this same
b700: 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65   process have re
b710: 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68  leased.    ** th
b720: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  e lock..    */. 
b730: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b     pLock->cnt--;
b740: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
b750: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  cnt==0 ){.      
b760: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
b770: 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
b780: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
b790: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
b7a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
b7b0: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
b7c0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
b7d0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
b7e0: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
b7f0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
b800: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
b810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b820: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b830: 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73  _IOERR;  /* This
b840: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
b850: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  ppen */.      }.
b860: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
b870: 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
b880: 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
b890: 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
b8a0: 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
b8b0: 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
b8c0: 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
b8d0: 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
b8e0: 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
b8f0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
b900: 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
b910: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
b920: 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
b930: 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d    pOpen = pFile-
b940: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65  >pOpen;.    pOpe
b950: 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  n->nLock--;.    
b960: 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e  assert( pOpen->n
b970: 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69  Lock>=0 );.    i
b980: 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d  f( pOpen->nLock=
b990: 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65  =0 && pOpen->nPe
b9a0: 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nding>0 ){.     
b9b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
b9c0: 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e  r(i=0; i<pOpen->
b9d0: 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a  nPending; i++){.
b9e0: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f          close(pO
b9f0: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d  pen->aPending[i]
ba00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba10: 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65   free(pOpen->aPe
ba20: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f  nding);.      pO
ba30: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
ba40: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
ba50: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
ba60: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
ba70: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
ba80: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
ba90: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
baa0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bab0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
bac0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
bad0: 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c   unixClose(OsFil
bae0: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  e **pId){.  unix
baf0: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
bb00: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69  File*)*pId;..  i
bb10: 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20  f( !id ) return 
bb20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
bb30: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
bb40: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64  _LOCK);.  if( id
bb50: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
bb60: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
bb70: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
bb80: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
bb90: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28  rMutex();..  if(
bba0: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
bbb0: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
bbc0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
bbd0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
bbe0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
bbf0: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
bc00: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
bc10: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
bc20: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
bc30: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
bc40: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
bc50: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
bc60: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
bc70: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
bc80: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
bc90: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
bca0: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
bcb0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
bcc0: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
bcd0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
bce0: 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e  Open = id->pOpen
bcf0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61  ;.    aNew = rea
bd00: 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65  lloc( pOpen->aPe
bd10: 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e  nding, (pOpen->n
bd20: 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f  Pending+1)*sizeo
bd30: 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66  f(int) );.    if
bd40: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
bd50: 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f     /* If a mallo
bd60: 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65  c fails, just le
bd70: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
bd80: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65  riptor */.    }e
bd90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
bda0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65  ->aPending = aNe
bdb0: 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  w;.      pOpen->
bdc0: 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e  aPending[pOpen->
bdd0: 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e  nPending] = id->
bde0: 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  h;.      pOpen->
bdf0: 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20  nPending++;.    
be00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
be10: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * There are no o
be20: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
be30: 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65   so we can close
be40: 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69   the file immedi
be50: 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f  ately */.    clo
be60: 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20  se(id->h);.  }. 
be70: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
be80: 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72  (id->pLock);.  r
be90: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64  eleaseOpenCnt(id
bea0: 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c  ->pOpen);..  sql
beb0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
bec0: 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
bed0: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22   = 0;.  TRACE2("
bee0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
bef0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
bf00: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
bf10: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
bf20: 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20  ree(id);.  *pId 
bf30: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
bf40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bf50: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
bf60: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
bf70: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
bf80: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
bf90: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c  er.** to the ful
bfa0: 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65  l pathname store
bfb0: 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
bfc0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
bfd0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20  alloc()..** The 
bfe0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
bff0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
c000: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73  for freeing this
c010: 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a   space once it.*
c020: 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  * is no longer n
c030: 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eeded..*/.char *
c040: 73 71 6c 69 74 65 33 55 6e 69 78 46 75 6c 6c 50  sqlite3UnixFullP
c050: 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  athname(const ch
c060: 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a  ar *zRelative){.
c070: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
c080: 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  0;.  if( zRelati
c090: 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ve[0]=='/' ){.  
c0a0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
c0b0: 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61  ng(&zFull, zRela
c0c0: 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  tive, (char*)0);
c0d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
c0e0: 61 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74  ar *zBuf = sqlit
c0f0: 65 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20  eMalloc(5000);. 
c100: 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29     if( zBuf==0 )
c110: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
c130: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [0] = 0;.    sql
c140: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
c150: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
c160: 66 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a  f, 5000), "/", z
c170: 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20  Relative,.      
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
c190: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c  har*)0);.    sql
c1a0: 69 74 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20  iteFree(zBuf);. 
c1b0: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20   }..#if 0.  /*. 
c1c0: 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22   ** Remove "/./"
c1d0: 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61   path elements a
c1e0: 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e  nd convert "/A/.
c1f0: 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
c200: 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f  .  ** to just "/
c210: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  "..  */.  if( zF
c220: 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ull ){.    int i
c230: 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a  , j;.    for(i=j
c240: 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b  =0; zFull[i]; i+
c250: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  +){.      if( zF
c260: 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ull[i]=='/' ){. 
c270: 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
c280: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
c290: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
c2a0: 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
c2b0: 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
c2c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
c2d0: 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
c2e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
c2f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c300: 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
c310: 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
c320: 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  2]=='.' && zFull
c330: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
c340: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
c350: 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d  >0 && zFull[j-1]
c360: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
c370: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33            i += 3
c380: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
c390: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
c3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
c3b0: 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c  ull[j++] = zFull
c3c0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [i];.    }.    z
c3d0: 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  Full[j] = 0;.  }
c3e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
c3f0: 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zFull;.}../*.*
c400: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
c410: 75 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79  ue of the fullsy
c420: 6e 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67  nc flag in the g
c430: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
c440: 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
c450: 76 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c  void unixSetFull
c460: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
c470: 20 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69   int v){.  ((uni
c480: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c  xFile*)id)->full
c490: 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a  Sync = v;.}../*.
c4a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  ** Return the un
c4b0: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
c4c0: 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69  ndle for an OsFi
c4d0: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
c4e0: 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28   unixFileHandle(
c4f0: 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
c500: 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65  eturn ((unixFile
c510: 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a  *)id)->h;.}../*.
c520: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
c530: 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65  eger that indice
c540: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  s the type of lo
c550: 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
c560: 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e  d.** by this han
c570: 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20  dle.  (Used for 
c580: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
c590: 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73  ysis only.).*/.s
c5a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
c5b0: 63 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a  ckState(OsFile *
c5c0: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  id){.  return ((
c5d0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
c5e0: 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ocktype;.}../*.*
c5f0: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
c600: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
c610: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
c620: 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
c630: 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e  ile.** for unix.
c640: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
c650: 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
c660: 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  3UnixIoMethod = 
c670: 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20  {.  unixClose,. 
c680: 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
c690: 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
c6a0: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
c6b0: 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
c6c0: 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
c6d0: 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
c6e0: 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
c6f0: 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
c700: 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78  FileSize,.  unix
c710: 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f  Lock,.  unixUnlo
c720: 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
c730: 61 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b  ate,.  unixCheck
c740: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b  ReservedLock,.};
c750: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
c760: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e   memory for a un
c770: 69 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c  ixFile.  Initial
c780: 69 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78  ize the new unix
c790: 46 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76  File.** to the v
c7a0: 61 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49  alue given in pI
c7b0: 6e 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  nit and return a
c7c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c7d0: 6e 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20  new.** OsFile.  
c7e0: 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  If we run out of
c7f0: 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74   memory, close t
c800: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75  he file and retu
c810: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
c820: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55  ic int allocateU
c830: 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
c840: 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20   *pInit, OsFile 
c850: 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69  **pId){.  unixFi
c860: 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70 49 6e 69  le *pNew;.  pIni
c870: 74 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  t->dirfd = -1;. 
c880: 20 70 49 6e 69 74 2d 3e 66 75 6c 6c 53 79 6e 63   pInit->fullSync
c890: 20 3d 20 30 3b 0a 20 20 70 49 6e 69 74 2d 3e 6c   = 0;.  pInit->l
c8a0: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 70  ocktype = 0;.  p
c8b0: 49 6e 69 74 2d 3e 6f 66 66 73 65 74 20 3d 20 30  Init->offset = 0
c8c0: 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
c8d0: 28 70 49 6e 69 74 29 3b 0a 20 20 70 4e 65 77 20  (pInit);.  pNew 
c8e0: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53  = sqlite3ThreadS
c8f0: 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  afeMalloc( sizeo
c900: 66 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20  f(unixFile) );. 
c910: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
c920: 20 20 20 20 63 6c 6f 73 65 28 70 49 6e 69 74 2d      close(pInit-
c930: 3e 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >h);.    sqlite3
c940: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
c950: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
c960: 6e 66 6f 28 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b  nfo(pInit->pLock
c970: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
c980: 65 6e 43 6e 74 28 70 49 6e 69 74 2d 3e 70 4f 70  enCnt(pInit->pOp
c990: 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  en);.    sqlite3
c9a0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
c9b0: 20 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20      *pId = 0;.  
c9c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
c9e0: 20 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49 6e      *pNew = *pIn
c9f0: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  it;.    pNew->pM
ca00: 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
ca10: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
ca20: 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65    *pId = (OsFile
ca30: 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e  *)pNew;.    Open
ca40: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
ca50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ca60: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69  K;.  }.}...#endi
ca70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ca80: 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a  _DISKIO */./****
ca90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cad0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79  *******.** Every
cae0: 74 68 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c  thing above deal
caf0: 73 20 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e  s with file I/O.
cb00: 20 20 45 76 65 72 79 74 68 69 6e 67 20 74 68 61    Everything tha
cb10: 74 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a  t follows deals.
cb20: 2a 2a 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69  ** with other mi
cb30: 73 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63  scellanous aspec
cb40: 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ts of the operat
cb50: 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
cb60: 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  face.***********
cb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbb0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69  */.../*.** Get i
cbc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65  nformation to se
cbd0: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
cbe0: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20  mber generator. 
cbf0: 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20   The seed.** is 
cc00: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
cc10: 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36   buffer zBuf[256
cc20: 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ].  The calling 
cc30: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a  function must.**
cc40: 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63   supply a suffic
cc50: 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66  iently large buf
cc60: 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fer..*/.int sqli
cc70: 74 65 33 55 6e 69 78 52 61 6e 64 6f 6d 53 65 65  te3UnixRandomSee
cc80: 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  d(char *zBuf){. 
cc90: 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
cca0: 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
ccb0: 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
ccc0: 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
ccd0: 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
cce0: 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
ccf0: 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
cd00: 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
cd10: 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
cd20: 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
cd30: 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
cd40: 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
cd50: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
cd60: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
cd70: 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
cd80: 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
cd90: 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
cda0: 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
cdb0: 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
cdc0: 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
cdd0: 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
cde0: 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
cdf0: 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
ce00: 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
ce10: 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
ce20: 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
ce30: 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
ce40: 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
ce50: 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
ce60: 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
ce70: 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
ce80: 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
ce90: 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
cea0: 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
ceb0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
cec0: 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
ced0: 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
cee0: 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
cef0: 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
cf00: 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
cf10: 30 2c 20 32 35 36 29 3b 0a 23 69 66 20 21 64 65  0, 256);.#if !de
cf20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
cf30: 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
cf40: 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
cf50: 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
cf60: 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
cf70: 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
cf80: 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
cf90: 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
cfa0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
cfb0: 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
cfc0: 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
cfd0: 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
cfe0: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
cff0: 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70  eof(time_t)], &p
d000: 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
d010: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d020: 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66     read(fd, zBuf
d030: 2c 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c  , 256);.      cl
d040: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20  ose(fd);.    }. 
d050: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
d060: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d070: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
d080: 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
d090: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
d0a0: 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
d0b0: 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
d0c0: 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
d0d0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
d0e0: 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
d0f0: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
d100: 33 55 6e 69 78 53 6c 65 65 70 28 69 6e 74 20 6d  3UnixSleep(int m
d110: 73 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s){.#if defined(
d120: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
d130: 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
d140: 6c 65 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20  leep(ms*1000);. 
d150: 20 72 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73   return ms;.#els
d160: 65 0a 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39  e.  sleep((ms+99
d170: 39 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  9)/1000);.  retu
d180: 72 6e 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39  rn 1000*((ms+999
d190: 29 2f 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a  )/1000);.#endif.
d1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20  }../*.** Static 
d1b0: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66  variables used f
d1c0: 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72  or thread synchr
d1d0: 6f 6e 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onization..**.**
d1e0: 20 69 6e 4d 75 74 65 78 20 20 20 20 20 20 74 68   inMutex      th
d1f0: 65 20 6e 65 73 74 69 6e 67 20 64 65 70 74 68 20  e nesting depth 
d200: 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
d210: 20 6d 75 74 65 78 2e 20 20 54 68 65 20 74 68 72   mutex.  The thr
d220: 65 61 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ead.**          
d230: 20 20 20 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65      holding mute
d240: 78 4d 61 69 6e 20 63 61 6e 20 72 65 61 64 20 74  xMain can read t
d250: 68 69 73 20 76 61 72 69 61 62 6c 65 20 61 74 20  his variable at 
d260: 61 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 20 20 20  any time..**    
d270: 20 20 20 20 20 20 20 20 20 20 42 75 74 20 69 73            But is
d280: 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74 65 78   must hold mutex
d290: 41 75 78 20 74 6f 20 63 68 61 6e 67 65 20 74 68  Aux to change th
d2a0: 69 73 20 76 61 72 69 61 62 6c 65 2e 20 20 4f 74  is variable.  Ot
d2b0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
d2c0: 20 20 20 20 74 68 72 65 61 64 73 20 6d 75 73 74      threads must
d2d0: 20 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74   hold mutexAux t
d2e0: 6f 20 72 65 61 64 20 74 68 65 20 76 61 72 69 61  o read the varia
d2f0: 62 6c 65 20 61 6e 64 20 63 61 6e 0a 2a 2a 20 20  ble and can.**  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 76 65              neve
d310: 72 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 6d  r write..**.** m
d320: 75 74 65 78 4f 77 6e 65 72 20 20 20 54 68 65 20  utexOwner   The 
d330: 74 68 72 65 61 64 20 69 64 20 6f 66 20 74 68 65  thread id of the
d340: 20 74 68 72 65 61 64 20 68 6f 6c 64 69 6e 67 20   thread holding 
d350: 6d 75 74 65 78 4d 61 69 6e 2e 20 20 53 61 6d 65  mutexMain.  Same
d360: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d370: 20 61 63 63 65 73 73 20 72 75 6c 65 73 20 61 73   access rules as
d380: 20 66 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a   for inMutex..**
d390: 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72 56 61  .** mutexOwnerVa
d3a0: 6c 69 64 20 20 20 54 72 75 65 20 69 66 20 74 68  lid   True if th
d3b0: 65 20 76 61 6c 75 65 20 69 6e 20 6d 75 74 65 78  e value in mutex
d3c0: 4f 77 6e 65 72 20 69 73 20 76 61 6c 69 64 2e 20  Owner is valid. 
d3d0: 20 54 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20   The same.**    
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
d3f0: 63 63 65 73 73 20 72 75 6c 65 73 20 61 70 70 6c  ccess rules appl
d400: 79 20 61 73 20 66 6f 72 20 69 6e 4d 75 74 65 78  y as for inMutex
d410: 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4d 61 69  ..**.** mutexMai
d420: 6e 20 20 20 20 54 68 65 20 6d 61 69 6e 20 6d 75  n    The main mu
d430: 74 65 78 2e 20 20 48 6f 6c 64 20 74 68 69 73 20  tex.  Hold this 
d440: 6d 75 74 65 78 20 69 6e 20 6f 72 64 65 72 20 74  mutex in order t
d450: 6f 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 0a  o get exclusive.
d460: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d470: 61 63 63 65 73 73 20 74 6f 20 53 51 4c 69 74 65  access to SQLite
d480: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
d490: 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 41 75 78  ..**.** mutexAux
d4a0: 20 20 20 20 20 41 6e 20 61 75 78 69 6c 69 61 72       An auxiliar
d4b0: 79 20 6d 75 74 65 78 20 6e 65 65 64 65 64 20 74  y mutex needed t
d4c0: 6f 20 61 63 63 65 73 73 20 76 61 72 69 61 62 6c  o access variabl
d4d0: 65 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  es defined above
d4e0: 2e 0a 2a 2a 0a 2a 2a 20 4d 75 74 65 78 65 73 20  ..**.** Mutexes 
d4f0: 61 72 65 20 61 6c 77 61 79 73 20 61 63 71 75 69  are always acqui
d500: 72 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65  red in this orde
d510: 72 3a 20 6d 75 74 65 78 4d 61 69 6e 20 6d 75 74  r: mutexMain mut
d520: 65 78 41 75 78 2e 20 20 20 49 74 0a 2a 2a 20 69  exAux.   It.** i
d530: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
d540: 74 6f 20 61 63 71 75 69 72 65 20 6d 75 74 65 78  to acquire mutex
d550: 4d 61 69 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  Main in order to
d560: 20 67 65 74 20 6d 75 74 65 78 41 75 78 20 2d 20   get mutexAux - 
d570: 6a 75 73 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61  just.** do not a
d580: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
d590: 65 20 74 68 65 6d 20 69 6e 20 74 68 65 20 72 65  e them in the re
d5a0: 76 65 72 73 65 20 6f 72 64 65 72 3a 20 6d 75 74  verse order: mut
d5b0: 65 78 41 75 78 20 6d 75 74 65 78 4d 61 69 6e 2e  exAux mutexMain.
d5c0: 0a 2a 2a 20 45 69 74 68 65 72 20 67 65 74 20 74  .** Either get t
d5d0: 68 65 20 6d 75 74 65 78 65 73 20 77 69 74 68 20  he mutexes with 
d5e0: 6d 75 74 65 78 4d 61 69 6e 20 66 69 72 73 74 20  mutexMain first 
d5f0: 6f 72 20 67 65 74 20 6d 75 74 65 78 41 75 78 20  or get mutexAux 
d600: 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  only..**.** When
d610: 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 70 6c   running on a pl
d620: 61 74 66 6f 72 6d 20 77 68 65 72 65 20 74 68 65  atform where the
d630: 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
d640: 20 69 6e 4d 75 74 65 78 2c 20 6d 75 74 65 78 4f   inMutex, mutexO
d650: 77 6e 65 72 2c 0a 2a 2a 20 61 6e 64 20 6d 75 74  wner,.** and mut
d660: 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 63 61 6e  exOwnerValid can
d670: 20 62 65 20 73 65 74 20 61 74 6f 6d 69 63 61 6c   be set atomical
d680: 6c 79 2c 20 74 68 65 20 6d 75 74 65 78 41 75 78  ly, the mutexAux
d690: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
d6a0: 2e 0a 2a 2a 20 4f 6e 20 6d 61 6e 79 20 73 79 73  ..** On many sys
d6b0: 74 65 6d 73 2c 20 61 6c 6c 20 74 68 72 65 65 20  tems, all three 
d6c0: 61 72 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  are 32-bit integ
d6d0: 65 72 73 20 61 6e 64 20 77 72 69 74 69 6e 67 20  ers and writing 
d6e0: 74 6f 20 61 20 33 32 2d 62 69 74 0a 2a 2a 20 69  to a 32-bit.** i
d6f0: 6e 74 65 67 65 72 20 69 73 20 61 74 6f 6d 69 63  nteger is atomic
d700: 2e 20 20 49 20 74 68 69 6e 6b 2e 20 20 42 75 74  .  I think.  But
d710: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 67 75   there are no gu
d720: 61 72 61 6e 74 65 65 73 2e 20 20 53 6f 20 69 74  arantees.  So it
d730: 20 73 65 65 6d 73 0a 2a 2a 20 73 61 66 65 72 20   seems.** safer 
d740: 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 6d 20  to protect them 
d750: 75 73 69 6e 67 20 6d 75 74 65 78 41 75 78 2e 0a  using mutexAux..
d760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
d770: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
d780: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
d790: 52 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68  READS.static pth
d7a0: 72 65 61 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65  read_t mutexOwne
d7b0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r;          /* T
d7c0: 68 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d 75  hread holding mu
d7d0: 74 65 78 4d 61 69 6e 20 2a 2f 0a 73 74 61 74 69  texMain */.stati
d7e0: 63 20 69 6e 74 20 6d 75 74 65 78 4f 77 6e 65 72  c int mutexOwner
d7f0: 56 61 6c 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Valid = 0;      
d800: 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 74 65   /* True if mute
d810: 78 4f 77 6e 65 72 20 69 73 20 76 61 6c 69 64 20  xOwner is valid 
d820: 2a 2f 0a 73 74 61 74 69 63 20 70 74 68 72 65 61  */.static pthrea
d830: 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 4d  d_mutex_t mutexM
d840: 61 69 6e 20 3d 20 50 54 48 52 45 41 44 5f 4d 55  ain = PTHREAD_MU
d850: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b  TEX_INITIALIZER;
d860: 20 2f 2a 20 54 68 65 20 6d 75 74 65 78 20 2a 2f   /* The mutex */
d870: 0a 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f  .static pthread_
d880: 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 41 75 78  mutex_t mutexAux
d890: 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58   = PTHREAD_MUTEX
d8a0: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20 20 2f  _INITIALIZER;  /
d8b0: 2a 20 41 75 78 20 6d 75 74 65 78 20 2a 2f 0a 23  * Aux mutex */.#
d8c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
d8d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20   following pair 
d8e0: 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  of routine imple
d8f0: 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c  ment mutual excl
d900: 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c  usion for.** mul
d910: 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63  ti-threaded proc
d920: 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73  esses.  Only a s
d930: 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20  ingle thread is 
d940: 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78  allowed to.** ex
d950: 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74  ecuted code that
d960: 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62   is surrounded b
d970: 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61  y EnterMutex() a
d980: 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e  nd LeaveMutex().
d990: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
d9a0: 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  es only a single
d9b0: 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69   Mutex.  There i
d9c0: 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69  s not much criti
d9d0: 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20  cal.** code and 
d9e0: 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72  what little ther
d9f0: 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75  e is executes qu
da00: 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75  ickly and withou
da10: 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  t blocking..**.*
da20: 2a 20 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20  * As of version 
da30: 33 2e 33 2e 32 2c 20 74 68 69 73 20 6d 75 74 65  3.3.2, this mute
da40: 78 20 6d 75 73 74 20 62 65 20 72 65 63 75 72 73  x must be recurs
da50: 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ive..*/.void sql
da60: 69 74 65 33 55 6e 69 78 45 6e 74 65 72 4d 75 74  ite3UnixEnterMut
da70: 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ex(){.#ifdef SQL
da80: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
da90: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
daa0: 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  _lock(&mutexAux)
dab0: 3b 0a 20 20 69 66 28 20 21 6d 75 74 65 78 4f 77  ;.  if( !mutexOw
dac0: 6e 65 72 56 61 6c 69 64 20 7c 7c 20 21 70 74 68  nerValid || !pth
dad0: 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78  read_equal(mutex
dae0: 4f 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73  Owner, pthread_s
daf0: 65 6c 66 28 29 29 20 29 7b 0a 20 20 20 20 70 74  elf()) ){.    pt
db00: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
db10: 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20  ck(&mutexAux);. 
db20: 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
db30: 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e  _lock(&mutexMain
db40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
db50: 6e 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  nMutex==0 );.   
db60: 20 61 73 73 65 72 74 28 20 21 6d 75 74 65 78 4f   assert( !mutexO
db70: 77 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20  wnerValid );.   
db80: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
db90: 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
dba0: 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d      mutexOwner =
dbb0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b   pthread_self();
dbc0: 0a 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56  .    mutexOwnerV
dbd0: 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  alid = 1;.  }.  
dbe0: 69 6e 4d 75 74 65 78 2b 2b 3b 0a 20 20 70 74 68  inMutex++;.  pth
dbf0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
dc00: 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23 65  k(&mutexAux);.#e
dc10: 6c 73 65 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b  lse.  inMutex++;
dc20: 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 73  .#endif.}.void s
dc30: 71 6c 69 74 65 33 55 6e 69 78 4c 65 61 76 65 4d  qlite3UnixLeaveM
dc40: 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74  utex(){.  assert
dc50: 28 20 69 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23  ( inMutex>0 );.#
dc60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
dc70: 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72  X_THREADS.  pthr
dc80: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
dc90: 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 69 6e 4d  mutexAux);.  inM
dca0: 75 74 65 78 2d 2d 3b 0a 20 20 61 73 73 65 72 74  utex--;.  assert
dcb0: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
dcc0: 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72  mutexOwner, pthr
dcd0: 65 61 64 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20  ead_self()) );. 
dce0: 20 69 66 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20   if( inMutex==0 
dcf0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  ){.    assert( m
dd00: 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 29  utexOwnerValid )
dd10: 3b 0a 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72  ;.    mutexOwner
dd20: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
dd30: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
dd40: 6f 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29 3b  ock(&mutexMain);
dd50: 0a 20 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d  .  }.  pthread_m
dd60: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
dd70: 65 78 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20  exAux);.#else.  
dd80: 69 6e 4d 75 74 65 78 2d 2d 3b 0a 23 65 6e 64 69  inMutex--;.#endi
dd90: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
dda0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 75  n TRUE if the mu
ddb0: 74 65 78 20 69 73 20 63 75 72 72 65 6e 74 6c 79  tex is currently
ddc0: 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   held..**.** If 
ddd0: 74 68 65 20 74 68 69 73 54 68 72 64 20 70 61 72  the thisThrd par
dde0: 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20  ameter is true, 
ddf0: 72 65 74 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79  return true only
de00: 20 69 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69   if the.** calli
de10: 6e 67 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20  ng thread holds 
de20: 74 68 65 20 6d 75 74 65 78 2e 20 20 49 66 20 74  the mutex.  If t
de30: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
de40: 66 61 6c 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a  false, return.**
de50: 20 74 72 75 65 20 69 66 20 61 6e 79 20 74 68 72   true if any thr
de60: 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  ead holds the mu
de70: 74 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tex..*/.int sqli
de80: 74 65 33 55 6e 69 78 49 6e 4d 75 74 65 78 28 69  te3UnixInMutex(i
de90: 6e 74 20 74 68 69 73 54 68 72 64 29 7b 0a 23 69  nt thisThrd){.#i
dea0: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
deb0: 5f 54 48 52 45 41 44 53 0a 20 20 69 6e 74 20 72  _THREADS.  int r
dec0: 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  c;.  pthread_mut
ded0: 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75  ex_lock(&mutexAu
dee0: 78 29 3b 0a 20 20 72 63 20 3d 20 69 6e 4d 75 74  x);.  rc = inMut
def0: 65 78 3e 30 20 26 26 20 28 74 68 69 73 54 68 72  ex>0 && (thisThr
df00: 64 3d 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f  d==0 || pthread_
df10: 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72  equal(mutexOwner
df20: 2c 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29  ,pthread_self())
df30: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  );.  pthread_mut
df40: 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
df50: 41 75 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Aux);.  return r
df60: 63 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  c;.#else.  retur
df70: 6e 20 69 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e  n inMutex>0;.#en
df80: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
df90: 65 6d 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72  ember the number
dfa0: 20 6f 66 20 74 68 72 65 61 64 2d 73 70 65 63 69   of thread-speci
dfb0: 66 69 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20  fic-data blocks 
dfc0: 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73  allocated..** Us
dfd0: 65 20 74 68 69 73 20 74 6f 20 76 65 72 69 66 79  e this to verify
dfe0: 20 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74   that we are not
dff0: 20 6c 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d   leaking thread-
e000: 73 70 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a  specific-data..*
e010: 2a 20 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a  * Ticket #1601.*
e020: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e030: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
e040: 5f 74 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  _tsd_count = 0;.
e050: 23 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  # ifdef SQLITE_U
e060: 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 20 20  NIX_THREADS.    
e070: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
e080: 75 74 65 78 5f 74 20 74 73 64 5f 63 6f 75 6e 74  utex_t tsd_count
e090: 65 72 5f 6d 75 74 65 78 20 3d 20 50 54 48 52 45  er_mutex = PTHRE
e0a0: 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
e0b0: 49 5a 45 52 3b 0a 23 20 20 20 64 65 66 69 6e 65  IZER;.#   define
e0c0: 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
e0d0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  \.             p
e0e0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
e0f0: 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d  k(&tsd_counter_m
e100: 75 74 65 78 29 3b 20 5c 0a 20 20 20 20 20 20 20  utex); \.       
e110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 73        sqlite3_ts
e120: 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20 5c 0a  d_count += N; \.
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 74 68               pth
e140: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
e150: 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d  k(&tsd_counter_m
e160: 75 74 65 78 29 3b 0a 23 20 65 6c 73 65 0a 23 20  utex);.# else.# 
e170: 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55    define TSD_COU
e180: 4e 54 45 52 28 4e 29 20 20 73 71 6c 69 74 65 33  NTER(N)  sqlite3
e190: 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 0a  _tsd_count += N.
e1a0: 23 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20  # endif.#else.# 
e1b0: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
e1c0: 45 52 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ER(N)  /* no-op 
e1d0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
e1e0: 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
e1f0: 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 2c 20  allocateFlag>0, 
e200: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
e210: 69 6e 74 65 72 20 74 6f 20 74 68 72 65 61 64 0a  inter to thread.
e220: 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61  ** specific data
e230: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
e240: 20 74 68 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61   thread.  Alloca
e250: 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a  te and zero the.
e260: 2a 2a 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ** thread-specif
e270: 69 63 20 64 61 74 61 20 69 66 20 69 74 20 64 6f  ic data if it do
e280: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
e290: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  xist..**.** If c
e2a0: 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63  alled with alloc
e2b0: 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e  ateFlag==0, then
e2c0: 20 63 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   check the curre
e2d0: 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65  nt thread.** spe
e2e0: 63 69 66 69 63 20 64 61 74 61 2e 20 20 52 65 74  cific data.  Ret
e2f0: 75 72 6e 20 69 74 20 69 66 20 69 74 20 65 78 69  urn it if it exi
e300: 73 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sts.  If it does
e310: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
e320: 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  hen return NULL.
e330: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64  .**.** If called
e340: 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c   with allocateFl
e350: 61 67 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73  ag<0, check to s
e360: 65 65 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ee if the thread
e370: 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74   specific.** dat
e380: 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  a is allocated a
e390: 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20  nd is all zero. 
e3a0: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 64   If it is then d
e3b0: 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a  eallocate it..**
e3c0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
e3d0: 72 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20  r to the thread 
e3e0: 73 70 65 63 69 66 69 63 20 64 61 74 61 20 6f 72  specific data or
e3f0: 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a   NULL if it is.*
e400: 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72  * unallocated or
e410: 20 67 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65   gets deallocate
e420: 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61  d..*/.ThreadData
e430: 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 54 68 72   *sqlite3UnixThr
e440: 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61 28  eadSpecificData(
e450: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67  int allocateFlag
e460: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
e470: 74 20 54 68 72 65 61 64 44 61 74 61 20 7a 65 72  t ThreadData zer
e480: 6f 44 61 74 61 20 3d 20 7b 30 7d 3b 20 20 2f 2a  oData = {0};  /*
e490: 20 49 6e 69 74 69 61 6c 69 7a 65 72 20 74 6f 20   Initializer to 
e4a0: 73 69 6c 65 6e 63 65 20 77 61 72 6e 69 6e 67 73  silence warnings
e4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
e4e0: 72 6f 6d 20 62 72 6f 6b 65 6e 20 63 6f 6d 70 69  rom broken compi
e4f0: 6c 65 72 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  lers */.#ifdef S
e500: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
e510: 44 53 0a 20 20 73 74 61 74 69 63 20 70 74 68 72  DS.  static pthr
e520: 65 61 64 5f 6b 65 79 5f 74 20 6b 65 79 3b 0a 20  ead_key_t key;. 
e530: 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 49   static int keyI
e540: 6e 69 74 20 3d 20 30 3b 0a 20 20 54 68 72 65 61  nit = 0;.  Threa
e550: 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20  dData *pTsd;..  
e560: 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a  if( !keyInit ){.
e570: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74      sqlite3OsEnt
e580: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
e590: 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20  f( !keyInit ){. 
e5a0: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
e5b0: 20 20 20 72 63 20 3d 20 70 74 68 72 65 61 64 5f     rc = pthread_
e5c0: 6b 65 79 5f 63 72 65 61 74 65 28 26 6b 65 79 2c  key_create(&key,
e5d0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
e5e0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
e5f0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
e600: 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
e610: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
e620: 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b      keyInit = 1;
e630: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e640: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
e650: 3b 0a 20 20 7d 0a 0a 20 20 70 54 73 64 20 3d 20  ;.  }..  pTsd = 
e660: 70 74 68 72 65 61 64 5f 67 65 74 73 70 65 63 69  pthread_getspeci
e670: 66 69 63 28 6b 65 79 29 3b 0a 20 20 69 66 28 20  fic(key);.  if( 
e680: 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29  allocateFlag>0 )
e690: 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d  {.    if( pTsd==
e6a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
e6b0: 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f  sqlite3TestMallo
e6c0: 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20  cFail() ){.     
e6d0: 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65     pTsd = sqlite
e6e0: 33 4f 73 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  3OsMalloc(sizeof
e6f0: 28 7a 65 72 6f 44 61 74 61 29 29 3b 0a 20 20 20  (zeroData));.   
e700: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
e710: 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20  TE_MEMDEBUG.    
e720: 20 20 73 71 6c 69 74 65 33 5f 69 73 46 61 69 6c    sqlite3_isFail
e730: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
e740: 20 20 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20     if( pTsd ){. 
e750: 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a         *pTsd = z
e760: 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20  eroData;.       
e770: 20 70 74 68 72 65 61 64 5f 73 65 74 73 70 65 63   pthread_setspec
e780: 69 66 69 63 28 6b 65 79 2c 20 70 54 73 64 29 3b  ific(key, pTsd);
e790: 0a 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55  .        TSD_COU
e7a0: 4e 54 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20  NTER(+1);.      
e7b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
e7c0: 69 66 28 20 70 54 73 64 21 3d 30 20 26 26 20 61  if( pTsd!=0 && a
e7d0: 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 20 0a 20  llocateFlag<0 . 
e7e0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65             && me
e7f0: 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f  mcmp(pTsd, &zero
e800: 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72  Data, sizeof(Thr
e810: 65 61 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a  eadData))==0 ){.
e820: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65      sqlite3OsFre
e830: 65 28 70 54 73 64 29 3b 0a 20 20 20 20 70 74 68  e(pTsd);.    pth
e840: 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69 63  read_setspecific
e850: 28 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53  (key, 0);.    TS
e860: 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20  D_COUNTER(-1);. 
e870: 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d     pTsd = 0;.  }
e880: 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a  .  return pTsd;.
e890: 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 54  #else.  static T
e8a0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
e8b0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63  = 0;.  if( alloc
e8c0: 61 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20  ateFlag>0 ){.   
e8d0: 20 69 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a   if( pTsd==0 ){.
e8e0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
e8f0: 65 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c  e3TestMallocFail
e900: 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  () ){.        pT
e910: 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61  sd = sqlite3OsMa
e920: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72  lloc( sizeof(zer
e930: 6f 44 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20  oData) );.      
e940: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e950: 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20 20 73  MEMDEBUG.      s
e960: 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20 3d 20  qlite3_isFail = 
e970: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  0;.#endif.      
e980: 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20  if( pTsd ){.    
e990: 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f      *pTsd = zero
e9a0: 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 54 53  Data;.        TS
e9b0: 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20  D_COUNTER(+1);. 
e9c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e9d0: 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30  else if( pTsd!=0
e9e0: 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67   && allocateFlag
e9f0: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  <0.            &
ea00: 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26  & memcmp(pTsd, &
ea10: 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66  zeroData, sizeof
ea20: 28 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d 30  (ThreadData))==0
ea30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ea40: 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20  sFree(pTsd);.   
ea50: 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29   TSD_COUNTER(-1)
ea60: 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a  ;.    pTsd = 0;.
ea70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73    }.  return pTs
ea80: 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
ea90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
eaa0: 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
eab0: 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
eac0: 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74  value, becomes t
ead0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74  he result.** ret
eae0: 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  urned from sqlit
eaf0: 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
eb00: 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  ).  This is used
eb10: 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f   for testing..*/
eb20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
eb30: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
eb40: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
eb50: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
eb60: 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
eb70: 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
eb80: 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
eb90: 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
eba0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
ebb0: 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
ebc0: 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
ebd0: 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
ebe0: 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
ebf0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
ec00: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
ec10: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
ec20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
ec30: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75  xCurrentTime(dou
ec40: 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66  ble *prNow){.#if
ec50: 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20  def NO_GETTOD.  
ec60: 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
ec70: 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
ec80: 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
ec90: 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20  0587.5;.#else.  
eca0: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
ecb0: 4e 6f 77 3b 0a 20 20 73 74 72 75 63 74 20 74 69  Now;.  struct ti
ecc0: 6d 65 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20  mezone sTz;  /* 
ecd0: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 67 65  Not used */.  ge
ece0: 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
ecf0: 2c 20 26 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f  , &sTz);.  *prNo
ed00: 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
ed10: 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
ed20: 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
ed30: 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
ed40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
ed50: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
ed60: 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
ed70: 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
ed80: 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  rNow = sqlite3_c
ed90: 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30  urrent_time/8640
eda0: 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
edb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
edc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69  turn 0;.}..#endi
edd0: 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a  f /* OS_UNIX */.