System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 17d91581a0ab478a06cb6f257b707a4c4a93e5a7:


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 66 2e 68 20 3d  =*pId );.  f.h =
6350: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
6360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6370: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c   O_RDWR|O_CREAT|
6380: 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
6390: 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f  W|O_LARGEFILE|O_
63a0: 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20  BINARY,.        
63b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
63c0: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
63d0: 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
63e0: 66 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  f.h<0 ){.    ret
63f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6400: 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PEN;.  }.  sqlit
6410: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
6420: 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63  ;.  rc = findLoc
6430: 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70 4c  kInfo(f.h, &f.pL
6440: 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a  ock, &f.pOpen);.
6450: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
6460: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
6470: 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 66  c ){.    close(f
6480: 2e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  .h);.    unlink(
6490: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
64a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
64b0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  MEM;.  }.  if( d
64c0: 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e  elFlag ){.    un
64d0: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
64e0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f  .  }.  TRACE3("O
64f0: 50 45 4e 2d 45 58 20 25 2d 33 64 20 25 73 5c 6e  PEN-EX %-3d %s\n
6500: 22 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d  ", f.h, zFilenam
6510: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c  e);.  return all
6520: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66  ocateUnixFile(&f
6530: 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pId);.}../*.**
6540: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
6550: 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20   a new file for 
6560: 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73  read-only access
6570: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
6580: 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69  ss, write the fi
6590: 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a  le handle into *
65a0: 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  id and return SQ
65b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f  LITE_OK..**.** O
65c0: 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72  n failure, retur
65d0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
65e0: 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  N..*/.int sqlite
65f0: 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f 6e 6c  3UnixOpenReadOnl
6600: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
6610: 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20  ilename, OsFile 
6620: 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 72 63  **pId){.  int rc
6630: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 66 3b 0a  ;.  unixFile f;.
6640: 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f 4f 56  .  CRASH_TEST_OV
6650: 45 52 52 49 44 45 28 73 71 6c 69 74 65 33 43 72  ERRIDE(sqlite3Cr
6660: 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 2c  ashOpenReadOnly,
6670: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c   zFilename, pId,
6680: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30   0);.  assert( 0
6690: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e 68 20  ==*pId );.  f.h 
66a0: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
66b0: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
66c0: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
66d0: 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b  ;.  if( f.h<0 ){
66e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66f0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
6700: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
6710: 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
6720: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e   findLockInfo(f.
6730: 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e  h, &f.pLock, &f.
6740: 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pOpen);.  sqlite
6750: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
6760: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6770: 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20   close(f.h);.   
6780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6790: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43  OMEM;.  }.  TRAC
67a0: 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64  E3("OPEN-RO %-3d
67b0: 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69   %s\n", f.h, zFi
67c0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
67d0: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
67e0: 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a  le(&f, pId);.}..
67f0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
6800: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   open a file des
6810: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
6820: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
6830: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c  ontains a.** fil
6840: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65  e.  This file de
6850: 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20  scriptor can be 
6860: 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20  used to fsync() 
6870: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
6880: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
6890: 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74  e sure the creat
68a0: 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c  ion of a new fil
68b0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72  e is actually wr
68c0: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b  itten.** to disk
68d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
68e0: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61  tine is only mea
68f0: 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78  ningful for Unix
6900: 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70  .  It is a no-op
6910: 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77   under.** window
6920: 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20  s since windows 
6930: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
6940: 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a   hard links..**.
6950: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
6960: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72   handle for a pr
6970: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69  eviously open fi
6980: 6c 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20  le at *id is.** 
6990: 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
69a0: 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66   new directory f
69b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
69c0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a  nd SQLITE_OK is.
69d0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
69e0: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74  ** On failure, t
69f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
6a00: 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rns SQLITE_CANTO
6a10: 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a  PEN and leaves.*
6a20: 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e  * *id unchanged.
6a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
6a40: 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  nixOpenDirectory
6a50: 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a  (.  OsFile *id,.
6a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
6a70: 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78  irname.){.  unix
6a80: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
6a90: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
6aa0: 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( pFile==0 ){. 
6ab0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65     /* Do not ope
6ac0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
6ad0: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
6ae0: 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74  ding file is not
6af0: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
6b00: 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  open. */.    ret
6b10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6b20: 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54  PEN;.  }.  SET_T
6b30: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a  HREADID(pFile);.
6b40: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6b50: 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46  >dirfd<0 );.  pF
6b60: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65  ile->dirfd = ope
6b70: 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
6b80: 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
6b90: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
6ba0: 64 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  dirfd<0 ){.    r
6bb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6bc0: 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52  TOPEN; .  }.  TR
6bd0: 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE3("OPENDIR %-
6be0: 33 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  3d %s\n", pFile-
6bf0: 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65  >dirfd, zDirname
6c00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6c10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6c20: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
6c30: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
6c40: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
6c50: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
6c60: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
6c70: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
6c80: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
6c90: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
6ca0: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
6cb0: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
6cc0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
6cd0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
6ce0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
6cf0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
6d00: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
6d10: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
6d20: 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
6d30: 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
6d40: 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
6d50: 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
6d60: 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65  to.** hold at le
6d70: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
6d80: 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74  AME_SIZE charact
6d90: 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ers..*/.int sqli
6da0: 74 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e  te3UnixTempFileN
6db0: 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b  ame(char *zBuf){
6dc0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6dd0: 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d  char *azDirs[] =
6de0: 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20   {.     0,.     
6df0: 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
6e00: 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
6e10: 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
6e20: 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  .",.  };.  stati
6e30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
6e40: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
6e50: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
6e60: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
6e70: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
6e80: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
6e90: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
6ea0: 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  89";.  int i, j;
6eb0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
6ec0: 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
6ed0: 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20   *zDir = ".";.  
6ee0: 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69  azDirs[0] = sqli
6ef0: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
6f00: 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ry;.  for(i=0; i
6f10: 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
6f20: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
6f30: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
6f40: 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20   azDirs[i]==0 ) 
6f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
6f60: 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d  ( stat(azDirs[i]
6f70: 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
6f80: 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
6f90: 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
6fa0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
6fb0: 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44    if( access(azD
6fc0: 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f  irs[i], 07) ) co
6fd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72  ntinue;.    zDir
6fe0: 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20   = azDirs[i];.  
6ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64    break;.  }.  d
7000: 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  o{.    sprintf(z
7010: 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46  Buf, "%s/"TEMP_F
7020: 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72  ILE_PREFIX, zDir
7030: 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
7040: 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
7050: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31  ite3Randomness(1
7060: 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
7070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
7080: 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
7090: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
70a0: 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
70b0: 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
70c0: 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
70d0: 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
70e0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
70f0: 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73    }while( access
7100: 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
7110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7120: 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  K; .}../*.** Che
7130: 63 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20  ck that a given 
7140: 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69  pathname is a di
7150: 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77  rectory and is w
7160: 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69  ritable .**.*/.i
7170: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73  nt sqlite3UnixIs
7180: 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72  DirWritable(char
7190: 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66   *zBuf){.#ifndef
71a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
71b0: 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72  ER_PRAGMAS.  str
71c0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
71d0: 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65  if( zBuf==0 ) re
71e0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42  turn 0;.  if( zB
71f0: 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72  uf[0]==0 ) retur
7200: 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28  n 0;.  if( stat(
7210: 7a 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65  zBuf, &buf) ) re
7220: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53  turn 0;.  if( !S
7230: 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
7240: 64 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  de) ) return 0;.
7250: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75    if( access(zBu
7260: 66 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20  f, 07) ) return 
7270: 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  0;.#endif /* SQL
7280: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
7290: 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75  RAGMAS */.  retu
72a0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 1;.}../*.** S
72b0: 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
72c0: 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
72d0: 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
72e0: 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
72f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7300: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
7310: 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
7320: 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
7330: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
7340: 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
7350: 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42  le *id, void *pB
7360: 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
7370: 69 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20  int got;.#ifdef 
7380: 55 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20  USE_PREAD.  got 
7390: 3d 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70  = pread(id->h, p
73a0: 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66  Buf, cnt, id->of
73b0: 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6c  fset);.#else.  l
73c0: 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e  seek(id->h, id->
73d0: 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
73e0: 29 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28  );.  got = read(
73f0: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
7400: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
7410: 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d  got>0 ){.    id-
7420: 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a  >offset += got;.
7430: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74    }.  return got
7440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
7450: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
7460: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
7470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7480: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
7490: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
74a0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
74b0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
74c0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
74d0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
74e0: 6e 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69  nt unixRead(OsFi
74f0: 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42  le *id, void *pB
7500: 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20  uf, int amt){.  
7510: 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
7520: 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c  t( id );.  Simul
7530: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
7540: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45  E_IOERR);.  TIME
7550: 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d  R_START;.  got =
7560: 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
7570: 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66  ixFile*)id, pBuf
7580: 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f  , amt);.  TIMER_
7590: 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52  END;.  TRACE5("R
75a0: 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
75b0: 25 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69  %7d %d\n", ((uni
75c0: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67  xFile*)id)->h, g
75d0: 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ot,.          la
75e0: 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45  st_page, TIMER_E
75f0: 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28  LAPSED);.  SEEK(
7600: 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74  0);.  /* if( got
7610: 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f  <0 ) got = 0; */
7620: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
7630: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7640: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
7650: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7660: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 7d  ITE_IOERR;.  }.}
7670: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
7680: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
7690: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
76a0: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
76b0: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
76c0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
76d0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
76e0: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
76f0: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
7700: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
7710: 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
7720: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
7730: 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
7740: 69 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20  int got;.#ifdef 
7750: 55 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20  USE_PREAD.  got 
7760: 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20  = pwrite(id->h, 
7770: 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f  pBuf, cnt, id->o
7780: 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ffset);.#else.  
7790: 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d  lseek(id->h, id-
77a0: 3e 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45  >offset, SEEK_SE
77b0: 54 29 3b 0a 20 20 67 6f 74 20 3d 20 77 72 69 74  T);.  got = writ
77c0: 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  e(id->h, pBuf, c
77d0: 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  nt);.#endif.  if
77e0: 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( got>0 ){.    i
77f0: 64 2d 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74  d->offset += got
7800: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67  ;.  }.  return g
7810: 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  ot;.}.../*.** Wr
7820: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
7830: 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
7840: 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
7850: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
7860: 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
7870: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
7880: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
7890: 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
78a0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e  (OsFile *id, con
78b0: 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
78c0: 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77  nt amt){.  int w
78d0: 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  rote = 0;.  asse
78e0: 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
78f0: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 53  rt( amt>0 );.  S
7900: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
7910: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
7920: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
7930: 45 72 72 6f 72 3b 0a 20 20 54 49 4d 45 52 5f 53  Error;.  TIMER_S
7940: 54 41 52 54 3b 0a 20 20 77 68 69 6c 65 28 20 61  TART;.  while( a
7950: 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
7960: 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75   seekAndWrite((u
7970: 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42 75  nixFile*)id, pBu
7980: 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
7990: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
79a0: 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
79b0: 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
79c0: 3b 0a 20 20 7d 0a 20 20 54 49 4d 45 52 5f 45 4e  ;.  }.  TIMER_EN
79d0: 44 3b 0a 20 20 54 52 41 43 45 35 28 22 57 52 49  D;.  TRACE5("WRI
79e0: 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
79f0: 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46  d %d\n", ((unixF
7a00: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 77 72 6f  ile*)id)->h, wro
7a10: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61  te,.          la
7a20: 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45  st_page, TIMER_E
7a30: 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28  LAPSED);.  SEEK(
7a40: 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  0);.  if( amt>0 
7a50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7a60: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
7a70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7a80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  K;.}../*.** Move
7a90: 20 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20   the read/write 
7aa0: 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c  pointer in a fil
7ab0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7ac0: 20 75 6e 69 78 53 65 65 6b 28 4f 73 46 69 6c 65   unixSeek(OsFile
7ad0: 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
7ae0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  ){.  assert( id 
7af0: 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74  );.  SEEK(offset
7b00: 2f 31 30 32 34 20 2b 20 31 29 3b 0a 23 69 66 64  /1024 + 1);.#ifd
7b10: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
7b20: 20 69 66 28 20 6f 66 66 73 65 74 20 29 20 53 69   if( offset ) Si
7b30: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
7b40: 72 6f 72 0a 23 65 6e 64 69 66 0a 20 20 28 28 75  ror.#endif.  ((u
7b50: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f 66  nixFile*)id)->of
7b60: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7b90: 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
7ba0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
7bb0: 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
7bc0: 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
7bd0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
7be0: 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
7bf0: 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
7c00: 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
7c10: 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
7c20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7c30: 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
7c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
7c50: 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
7c60: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
7c70: 73 65 20 74 68 65 20 66 64 61 74 61 73 79 6e 63  se the fdatasync
7c80: 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74  () API only if t
7c90: 68 65 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e  he HAVE_FDATASYN
7ca0: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
7cb0: 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
7cc0: 20 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20   use fsync() in 
7cd0: 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69  its place..*/.#i
7ce0: 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54 41  fndef HAVE_FDATA
7cf0: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64  SYNC.# define fd
7d00: 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
7d10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
7d20: 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
7d30: 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
7d40: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
7d50: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
7d60: 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
7d70: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
7d80: 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
7d90: 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
7da0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
7db0: 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
7dc0: 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
7dd0: 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
7de0: 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
7df0: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
7e00: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
7e10: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
7e20: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
7e30: 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
7e40: 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
7e50: 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
7e60: 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
7e70: 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
7e80: 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
7e90: 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
7ea0: 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
7eb0: 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
7ec0: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
7ed0: 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
7ee0: 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
7ef0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
7f00: 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
7f10: 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
7f20: 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
7f30: 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
7f40: 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
7f50: 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
7f60: 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
7f70: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
7f80: 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
7f90: 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
7fa0: 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
7fb0: 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
7fc0: 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
7fd0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
7fe0: 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
7ff0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8000: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
8010: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
8020: 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
8030: 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
8040: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
8050: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
8060: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
8070: 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
8080: 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
8090: 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
80a0: 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
80b0: 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
80c0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
80d0: 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
80e0: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
80f0: 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
8100: 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
8110: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8120: 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
8130: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
8140: 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
8150: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
8160: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
8170: 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
8180: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
8190: 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
81a0: 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
81b0: 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
81c0: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
81d0: 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  C.  rc = SQLITE_
81e0: 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48  OK;.#else..#if H
81f0: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  AVE_FULLFSYNC.  
8200: 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  if( fullSync ){.
8210: 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66      rc = fcntl(f
8220: 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
8230: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
8240: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
8250: 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 53 59 4e  * If the FULLSYN
8260: 43 20 66 61 69 6c 65 64 2c 20 74 72 79 20 74 6f  C failed, try to
8270: 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
8280: 6e 63 28 29 20 2a 2f 0a 20 20 69 66 28 20 72 63  nc() */.  if( rc
8290: 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
82a0: 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  );..#else /* if 
82b0: 21 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c 53  !defined(F_FULLS
82c0: 59 4e 43 29 20 2a 2f 0a 20 20 69 66 28 20 64 61  YNC) */.  if( da
82d0: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
82e0: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
82f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8300: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
8310: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
8320: 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e 43  ined(F_FULLFSYNC
8330: 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ) */.#endif /* d
8340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
8350: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
8360: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8370: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
8380: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
8390: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
83a0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
83b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
83c0: 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
83d0: 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
83e0: 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
83f0: 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
8400: 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
8410: 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
8420: 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
8430: 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
8440: 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
8450: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
8460: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
8470: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
8480: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
8490: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
84a0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
84b0: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
84c0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
84d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
84e0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
84f0: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
8500: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
8510: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
8520: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
8530: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
8540: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
8550: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
8560: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
8570: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
8580: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
8590: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
85b0: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
85c0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
85d0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
85e0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
85f0: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
8600: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
8610: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
8620: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
8630: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
8640: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
8650: 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
8660: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
8670: 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 75 6e   dataOnly){.  un
8680: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
8690: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
86a0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
86b0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
86c0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
86d0: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e  );.  TRACE2("SYN
86e0: 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  C    %-3d\n", pF
86f0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 69 66 28 20 66  ile->h);.  if( f
8700: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
8710: 3e 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53  >h, pFile->fullS
8720: 79 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 20 29  ync, dataOnly) )
8730: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8740: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20  ITE_IOERR;.  }. 
8750: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
8760: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43  d>=0 ){.    TRAC
8770: 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64  E4("DIRSYNC %-3d
8780: 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
8790: 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
87a0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
87b0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  d,.            H
87c0: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 70  AVE_FULLFSYNC, p
87d0: 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b  File->fullSync);
87e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
87f0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
8800: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
8810: 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c  tory sync is onl
8820: 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 66  y attempted if f
8830: 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a 20 20 20  ull_fsync is.   
8840: 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   ** turned off o
8850: 72 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  r unavailable.  
8860: 49 66 20 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20  If a full_fsync 
8870: 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 0a  occurred above,.
8880: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
8890: 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69  directory sync i
88a0: 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20  s superfluous.. 
88b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
88c0: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c  HAVE_FULLFSYNC |
88d0: 7c 20 21 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79  | !pFile->fullSy
88e0: 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66 73 79 6e  nc) && full_fsyn
88f0: 63 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 30  c(pFile->dirfd,0
8900: 2c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a  ,0) ){.       /*
8910: 0a 20 20 20 20 20 20 20 2a 2a 20 57 65 20 68 61  .       ** We ha
8920: 76 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  ve received mult
8930: 69 70 6c 65 20 72 65 70 6f 72 74 73 20 6f 66 20  iple reports of 
8940: 66 73 79 6e 63 28 29 20 72 65 74 75 72 6e 69 6e  fsync() returnin
8950: 67 0a 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f  g.       ** erro
8960: 72 73 20 77 68 65 6e 20 61 70 70 6c 69 65 64 20  rs when applied 
8970: 74 6f 20 64 69 72 65 63 74 6f 72 69 65 73 20 6f  to directories o
8980: 6e 20 63 65 72 74 61 69 6e 20 66 69 6c 65 20 73  n certain file s
8990: 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 20 2a  ystems..       *
89a0: 2a 20 41 20 66 61 69 6c 65 64 20 64 69 72 65 63  * A failed direc
89b0: 74 6f 72 79 20 73 79 6e 63 20 69 73 20 6e 6f 74  tory sync is not
89c0: 20 61 20 62 69 67 20 64 65 61 6c 2e 20 20 53 6f   a big deal.  So
89d0: 20 69 74 20 73 65 65 6d 73 0a 20 20 20 20 20 20   it seems.      
89e0: 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 69 67   ** better to ig
89f0: 6e 6f 72 65 20 74 68 65 20 65 72 72 6f 72 2e 20  nore the error. 
8a00: 20 54 69 63 6b 65 74 20 23 31 36 35 37 0a 20 20   Ticket #1657.  
8a10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 2f       */.       /
8a20: 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
8a30: 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a  IOERR; */.    }.
8a40: 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f 73 65  #endif.    close
8a50: 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 3b 20  (pFile->dirfd); 
8a60: 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f   /* Only need to
8a70: 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63   sync once, so c
8a80: 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63 74 6f  lose the directo
8a90: 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ry */.    pFile-
8aa0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20 20 20  >dirfd = -1;    
8ab0: 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65 20 64  /* when we are d
8ac0: 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  one. */.  }.  re
8ad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
8af0: 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44 69 72  e directory zDir
8b00: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 61 20  name. This is a 
8b10: 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61 74 69  no-op on operati
8b20: 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68 65 72  ng systems other
8b30: 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e 0a 2a  .** than UNIX..*
8b40: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
8b50: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
8b60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8b70: 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75 65 6c  l file has truel
8b80: 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 0a 2a  y been deleted.*
8b90: 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20  * before making 
8ba0: 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64 69 76  changes to indiv
8bb0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73 20 6f  idual journals o
8bc0: 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61 62 61  n a multi-databa
8bd0: 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20 54 68  se commit..** Th
8be0: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6f 70  e F_FULLFSYNC op
8bf0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65 65 64  tion is not need
8c00: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ed here..*/.int 
8c10: 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e 63 44  sqlite3UnixSyncD
8c20: 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63  irectory(const c
8c30: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a  har *zDirname){.
8c40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
8c50: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
8c60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8c70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 66 64  ;.#else.  int fd
8c80: 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53 69 6d  ;.  int r;.  Sim
8c90: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
8ca0: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 66 64  ITE_IOERR);.  fd
8cb0: 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
8cc0: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
8cd0: 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41 43 45  ARY, 0);.  TRACE
8ce0: 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 20  3("DIRSYNC %-3d 
8cf0: 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  (%s)\n", fd, zDi
8d00: 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 66 64  rname);.  if( fd
8d10: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
8d20: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
8d30: 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66 73 79  ; .  }.  r = fsy
8d40: 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73 65 28  nc(fd);.  close(
8d50: 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fd);.  return ((
8d60: 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f 4b 3a  r==0)?SQLITE_OK:
8d70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 23  SQLITE_IOERR);.#
8d80: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
8d90: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
8da0: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
8db0: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
8dc0: 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
8dd0: 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ate(OsFile *id, 
8de0: 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 61 73  i64 nByte){.  as
8df0: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69  sert( id );.  Si
8e00: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
8e10: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 72  LITE_IOERR);.  r
8e20: 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74 65 28  eturn ftruncate(
8e30: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
8e40: 3e 68 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20  >h, nByte)==0 ? 
8e50: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
8e60: 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_IOERR;.}../*.
8e70: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
8e80: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
8e90: 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
8ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8eb0: 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46 69  nixFileSize(OsFi
8ec0: 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
8ed0: 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ze){.  struct st
8ee0: 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74  at buf;.  assert
8ef0: 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75 6c 61  ( id );.  Simula
8f00: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
8f10: 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20 66  _IOERR);.  if( f
8f20: 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
8f30: 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 21 3d  )id)->h, &buf)!=
8f40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8f50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
8f60: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
8f70: 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75  .st_size;.  retu
8f80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8f90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8fa0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
8fb0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
8fc0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
8fd0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
8fe0: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
8ff0: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
9000: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
9010: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
9020: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  n.** non-zero.  
9030: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
9040: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
9050: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
9060: 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  ks, then.** retu
9070: 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  rn zero..*/.stat
9080: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
9090: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46  ReservedLock(OsF
90a0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
90b0: 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  r = 0;.  unixFil
90c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
90d0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
90e0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
90f0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
9100: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
9110: 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69  e pFile->pLock i
9120: 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
9130: 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a  threads */..  /*
9140: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
9150: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
9160: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
9170: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
9180: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
9190: 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  type>SHARED_LOCK
91a0: 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20   ){.    r = 1;. 
91b0: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
91c0: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
91d0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
91e0: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ds it..  */.  if
91f0: 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75  ( !r ){.    stru
9200: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
9210: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
9220: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
9230: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9240: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
9250: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
9260: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
9270: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
9280: 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68    fcntl(pFile->h
9290: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
92a0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e  );.    if( lock.
92b0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
92c0: 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a  ){.      r = 1;.
92d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
92e0: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
92f0: 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28 22  ex();.  TRACE3("
9300: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
9310: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
9320: 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72   r);..  return r
9330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
9340: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
9350: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
9360: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
9370: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
9380: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
93a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
93b0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
93c0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
93d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
93e0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
93f0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
9400: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
9410: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
9420: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
9430: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
9440: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
9450: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
9460: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
9470: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
9480: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
9490: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
94a0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
94b0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
94c0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
94d0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
94e0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
94f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
9500: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
9510: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
9520: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
9530: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
9540: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
9550: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
9560: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
9570: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
9580: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
9590: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
95a0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
95b0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
95c0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
95d0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
95e0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
95f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
9600: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
9610: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
9620: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
9630: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
9640: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
9650: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
9660: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  nt unixLock(OsFi
9670: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
9680: 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20  type){.  /* The 
9690: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
96a0: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
96b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
96c0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
96d0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
96e0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
96f0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
9700: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
9710: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
9720: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
9730: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
9740: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
9750: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
9760: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
9770: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
9780: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
9790: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
97a0: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
97b0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
97c0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
97d0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
97e0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
97f0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
9800: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
9810: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
9820: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
9830: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
9840: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
9850: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
9860: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
9870: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
9880: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
9890: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
98a0: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
98b0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
98c0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
98d0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
98e0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
98f0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
9900: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
9910: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
9920: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
9930: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
9940: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
9950: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
9960: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
9970: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
9980: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
9990: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
99a0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
99b0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
99c0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
99d0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
99e0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
99f0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
9a00: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
9a10: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
9a20: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
9a30: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
9a40: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
9a50: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
9a60: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
9a70: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
9a80: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
9a90: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
9aa0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
9ab0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
9ac0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
9ad0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
9ae0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
9af0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
9b00: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
9b10: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
9b20: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
9b30: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
9b40: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
9b50: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
9b60: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
9b70: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
9b80: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
9b90: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
9ba0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
9bb0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
9bc0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
9bd0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
9be0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
9bf0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
9c00: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
9c10: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
9c20: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
9c30: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
9c40: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
9c50: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
9c60: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
9c70: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
9c80: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
9c90: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
9ca0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
9cb0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
9cc0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
9cd0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
9ce0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
9cf0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
9d00: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
9d10: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
9d20: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
9d30: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
9d40: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
9d50: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
9d60: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
9d70: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
9d80: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
9d90: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
9da0: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
9db0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
9dc0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
9dd0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
9de0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
9df0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
9e00: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
9e10: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
9e20: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
9e30: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
9e40: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
9e50: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
9e60: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
9e70: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
9e80: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
9e90: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
9ea0: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
9eb0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
9ec0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
9ed0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
9ee0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
9ef0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
9f00: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
9f10: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
9f20: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
9f30: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
9f40: 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   s;..  assert( p
9f50: 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37  File );.  TRACE7
9f60: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
9f70: 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
9f80: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
9f90: 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70  h,.      locktyp
9fa0: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
9fb0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
9fc0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
9fd0: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
9fe0: 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  me(pLock->lockty
9ff0: 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20  pe), pLock->cnt 
a000: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
a010: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
a020: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
a030: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
a040: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
a050: 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
a060: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
a070: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
a080: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
a090: 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
a0a0: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
a0b0: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
a0c0: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
a0d0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
a0e0: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
a0f0: 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43 4b      TRACE3("LOCK
a100: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
a110: 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
a120: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
a130: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
a140: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
a150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a160: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
a170: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
a180: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
a190: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
a1a0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
a1b0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
a1c0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
a1d0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
a1e0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
a1f0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a200: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
a210: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
a220: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
a230: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a240: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
a250: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
a260: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
a270: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
a280: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
a290: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45   */.  sqlite3OsE
a2a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20  nterMutex();..  
a2b0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
a2c0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
a2d0: 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a  owns the pFile..
a2e0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
a2f0: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
a300: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
a310: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a320: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
a330: 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
a340: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f  rn rc;.  }.  pLo
a350: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
a360: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  k;..  /* If some
a370: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
a380: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
a390: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
a3a0: 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  t OsFile*.  ** h
a3b0: 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
a3c0: 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
a3d0: 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
a3e0: 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
a3f0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
a400: 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e!=pLock->lockty
a410: 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  pe && .         
a420: 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70   (pLock->locktyp
a430: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
a440: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  || locktype>SHAR
a450: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
a460: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a470: 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
a480: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
a490: 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
a4a0: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
a4b0: 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
a4c0: 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
a4d0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
a4e0: 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
a4f0: 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
a500: 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
a510: 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
a520: 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
a530: 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
a540: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
a550: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
a560: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
a570: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a580: 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  || pLock->lockty
a590: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
a5a0: 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
a5b0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
a5c0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
a5d0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
a5e0: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
a5f0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
a600: 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69  cnt>0 );.    pFi
a610: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
a620: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
a630: 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20  pLock->cnt++;.  
a640: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
a650: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74  nLock++;.    got
a660: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
a670: 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
a680: 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68  1L;..  lock.l_wh
a690: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a6a0: 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47  ..  /* A PENDING
a6b0: 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
a6c0: 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
a6d0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
a6e0: 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
a6f0: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
a700: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
a710: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
a720: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
a730: 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
a740: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
a750: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
a760: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
a770: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
a780: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
a790: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
a7a0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
a7b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
a7c0: 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  = (locktype==SHA
a7d0: 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
a7e0: 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
a7f0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
a800: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
a810: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
a820: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a830: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29  ck);.    if( s )
a840: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
a850: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
a860: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
a870: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
a880: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
a890: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
a8a0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
a8b0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
a8c0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
a8d0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
a8e0: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
a8f0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
a900: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
a910: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ck..  */.  if( l
a920: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
a930: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
a940: 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d  rt( pLock->cnt==
a950: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a960: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
a970: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  ==0 );..    /* N
a980: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
a990: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
a9a0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
a9b0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
a9c0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
a9d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66  _SIZE;.    s = f
a9e0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
a9f0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
aa00: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
aa10: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
aa20: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
aa30: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
aa40: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
aa50: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
aa60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
aa70: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
aa80: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
aa90: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
aaa0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
aab0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
aac0: 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  R;  /* This shou
aad0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
aae0: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  */.      goto en
aaf0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
ab00: 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20    if( s ){.     
ab10: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
ab20: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
ab30: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
ab40: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
ab50: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
ab60: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
ab70: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
ab80: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
ab90: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
aba0: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
abb0: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
abc0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
abd0: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
abe0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
abf0: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
ac00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
ac10: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
ac20: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
ac30: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
ac40: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
ac50: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
ac60: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ac70: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ac80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
ac90: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
aca0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
acb0: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
acc0: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
acd0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
ace0: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
acf0: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
ad00: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
ad10: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
ad20: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
ad30: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
ad40: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ad50: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
ad60: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
ad70: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
ad80: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
ad90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ada0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
adb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
adc0: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
add0: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
ade0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
adf0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ae00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ae10: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
ae20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ae30: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
ae40: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
ae50: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66  .    }.    s = f
ae60: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
ae70: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
ae80: 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20      if( s ){.   
ae90: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
aea0: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
aeb0: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
aec0: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
aed0: 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
aee0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
aef0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
af00: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c  locktype;.    pL
af10: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
af20: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
af30: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
af40: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
af50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
af60: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
af70: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
af80: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
af90: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65  ING_LOCK;.  }..e
afa0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74  nd_lock:.  sqlit
afb0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
afc0: 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b  ;.  TRACE4("LOCK
afd0: 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
afe0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
aff0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b000: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
b010: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
b020: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
b030: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b040: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
b050: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
b060: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
b070: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
b080: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
b090: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
b0a0: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
b0b0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
b0c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
b0d0: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
b0e0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
b0f0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
b100: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
b110: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
b120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
b130: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
b140: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 4f  int unixUnlock(O
b150: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
b160: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75  ocktype){.  stru
b170: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
b180: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
b190: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
b1a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b1b0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b1c0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b1d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
b1e0: 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22  le );.  TRACE7("
b1f0: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
b200: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
b210: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
b220: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
b230: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b240: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
b250: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
b260: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74  >pLock->cnt, get
b270: 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65 72  pid());..  asser
b280: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
b290: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  RED_LOCK );.  if
b2a0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b2b0: 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e<=locktype ){. 
b2c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b2d0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43  _OK;.  }.  if( C
b2e0: 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70 46  HECK_THREADID(pF
b2f0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ile) ){.    retu
b300: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
b310: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
b320: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
b330: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
b340: 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74 28  pLock;.  assert(
b350: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29   pLock->cnt!=0 )
b360: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
b370: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
b380: 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
b390: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
b3a0: 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe==pFile->lockt
b3b0: 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28 20 6c  ype );.    if( l
b3c0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b3d0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f  LOCK ){.      lo
b3e0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
b3f0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
b400: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b410: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
b420: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
b430: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
b440: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b450: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66  D_SIZE;.      if
b460: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
b470: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b480: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
b490: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
b4a0: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
b4b0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b4c0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
b4d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b  }.    }.    lock
b4e0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
b4f0: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
b500: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b510: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
b520: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
b530: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
b540: 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20   = 2L;  assert( 
b550: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d  PENDING_BYTE+1==
b560: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b  RESERVED_BYTE );
b570: 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70  .    if( fcntl(p
b580: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b590: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
b5a0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b       pLock->lock
b5b0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b5c0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
b5d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b5e0: 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73  _IOERR;  /* This
b5f0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
b600: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ppen */.    }.  
b610: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
b620: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
b630: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
b640: 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20  *pOpen;..    /* 
b650: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
b660: 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
b670: 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
b680: 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
b690: 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
b6a0: 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
b6b0: 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
b6c0: 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
b6d0: 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
b6e0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
b6f0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a    pLock->cnt--;.
b700: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63      if( pLock->c
b710: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  nt==0 ){.      l
b720: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
b730: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
b740: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b750: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
b760: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
b770: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
b780: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
b790: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
b7a0: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
b7b0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
b7c0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
b7d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b7e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b7f0: 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20  IOERR;  /* This 
b800: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
b810: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
b820: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
b830: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
b840: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
b850: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
b860: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
b870: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
b880: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
b890: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
b8a0: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
b8b0: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
b8c0: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
b8d0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
b8e0: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
b8f0: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
b900: 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e  pOpen;.    pOpen
b910: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
b920: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c  ssert( pOpen->nL
b930: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
b940: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
b950: 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
b960: 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
b970: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
b980: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
b990: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
b9a0: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70         close(pOp
b9b0: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29  en->aPending[i])
b9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b9d0: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
b9e0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70  ding);.      pOp
b9f0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
ba00: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
ba10: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
ba20: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
ba30: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
ba40: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
ba50: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
ba60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ba70: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
ba80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ba90: 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  unixClose(OsFile
baa0: 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46   **pId){.  unixF
bab0: 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
bac0: 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66  ile*)*pId;..  if
bad0: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
bae0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
baf0: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
bb00: 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d  LOCK);.  if( id-
bb10: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
bb20: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
bb30: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
bb40: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
bb50: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20  Mutex();..  if( 
bb60: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
bb70: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
bb80: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
bb90: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
bba0: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
bbb0: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
bbc0: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
bbd0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
bbe0: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
bbf0: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
bc00: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
bc10: 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65  scriptor to pOpe
bc20: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  n->aPending.  It
bc30: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
bc40: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
bc50: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
bc60: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
bc70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
bc80: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74  nt *aNew;.    st
bc90: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
bca0: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b  pen = id->pOpen;
bcb0: 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c  .    aNew = real
bcc0: 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  loc( pOpen->aPen
bcd0: 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50  ding, (pOpen->nP
bce0: 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66  ending+1)*sizeof
bcf0: 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28  (int) );.    if(
bd00: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
bd10: 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63    /* If a malloc
bd20: 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61   fails, just lea
bd30: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
bd40: 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c  iptor */.    }el
bd50: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
bd60: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
bd70: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
bd80: 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e  Pending[pOpen->n
bd90: 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68  Pending] = id->h
bda0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
bdb0: 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d  Pending++;.    }
bdc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
bdd0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   There are no ou
bde0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
bdf0: 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20  so we can close 
be00: 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  the file immedia
be10: 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  tely */.    clos
be20: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20  e(id->h);.  }.  
be30: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
be40: 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65  id->pLock);.  re
be50: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d  leaseOpenCnt(id-
be60: 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69  >pOpen);..  sqli
be70: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
be80: 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20  );.  id->isOpen 
be90: 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22 43  = 0;.  TRACE2("C
bea0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
beb0: 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
bec0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
bed0: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
bee0: 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d  ee(id);.  *pId =
bef0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
bf00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bf10: 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
bf20: 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
bf30: 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
bf40: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
bf50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c  r.** to the full
bf60: 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64   pathname stored
bf70: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
bf80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
bf90: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63  lloc()..** The c
bfa0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
bfb0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
bfc0: 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73 20  or freeing this 
bfd0: 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a  space once it.**
bfe0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65   is no longer ne
bff0: 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  eded..*/.char *s
c000: 71 6c 69 74 65 33 55 6e 69 78 46 75 6c 6c 50 61  qlite3UnixFullPa
c010: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
c020: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20  r *zRelative){. 
c030: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30   char *zFull = 0
c040: 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  ;.  if( zRelativ
c050: 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  e[0]=='/' ){.   
c060: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
c070: 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74  g(&zFull, zRelat
c080: 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ive, (char*)0);.
c090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
c0a0: 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74 65  r *zBuf = sqlite
c0b0: 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20 20  Malloc(5000);.  
c0c0: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b    if( zBuf==0 ){
c0d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
c0f0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  0] = 0;.    sqli
c100: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46  te3SetString(&zF
c110: 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66  ull, getcwd(zBuf
c120: 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a 52  , 5000), "/", zR
c130: 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20  elative,.       
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
c150: 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
c160: 74 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  teFree(zBuf);.  
c170: 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20  }..#if 0.  /*.  
c180: 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20  ** Remove "/./" 
c190: 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e  path elements an
c1a0: 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f  d convert "/A/./
c1b0: 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a  " path elements.
c1c0: 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22    ** to just "/"
c1d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
c1e0: 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  ll ){.    int i,
c1f0: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   j;.    for(i=j=
c200: 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b  0; zFull[i]; i++
c210: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  ){.      if( zFu
c220: 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ll[i]=='/' ){.  
c230: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
c240: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
c250: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
c260: 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e  ( zFull[i+1]=='.
c270: 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d  ' && zFull[i+2]=
c280: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
c290: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
c2a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
c2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c2c0: 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
c2d0: 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32  '.' && zFull[i+2
c2e0: 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b  ]=='.' && zFull[
c2f0: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
c300: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
c310: 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21  0 && zFull[j-1]!
c320: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
c330: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b           i += 3;
c340: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
c350: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
c360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75       }.      zFu
c370: 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b  ll[j++] = zFull[
c380: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i];.    }.    zF
c390: 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ull[j] = 0;.  }.
c3a0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
c3b0: 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zFull;.}../*.**
c3c0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
c3d0: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e  e of the fullsyn
c3e0: 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69  c flag in the gi
c3f0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
c400: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
c410: 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  oid unixSetFullS
c420: 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ync(OsFile *id, 
c430: 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78  int v){.  ((unix
c440: 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53  File*)id)->fullS
c450: 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = v;.}../*.*
c460: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64  * Return the und
c470: 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e  erlying file han
c480: 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c  dle for an OsFil
c490: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
c4a0: 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f  unixFileHandle(O
c4b0: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
c4c0: 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a  turn ((unixFile*
c4d0: 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  )id)->h;.}../*.*
c4e0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  * Return an inte
c4f0: 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73  ger that indices
c500: 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63   the type of loc
c510: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
c520: 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64  .** by this hand
c530: 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74  le.  (Used for t
c540: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
c550: 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74  sis only.).*/.st
c560: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
c570: 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  kState(OsFile *i
c580: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  d){.  return ((u
c590: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  nixFile*)id)->lo
c5a0: 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  cktype;.}../*.**
c5b0: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
c5c0: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
c5d0: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
c5e0: 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
c5f0: 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a  le.** for unix..
c600: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
c610: 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
c620: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
c630: 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  .  unixClose,.  
c640: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
c650: 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20  y,.  unixRead,. 
c660: 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e   unixWrite,.  un
c670: 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72  ixSeek,.  unixTr
c680: 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79  uncate,.  unixSy
c690: 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c  nc,.  unixSetFul
c6a0: 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c  lSync,.  unixFil
c6b0: 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46  eHandle,.  unixF
c6c0: 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c  ileSize,.  unixL
c6d0: 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  ock,.  unixUnloc
c6e0: 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  k,.  unixLockSta
c6f0: 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52  te,.  unixCheckR
c700: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
c710: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c720: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e 69  memory for a uni
c730: 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69  xFile.  Initiali
c740: 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  ze the new unixF
c750: 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  ile.** to the va
c760: 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49 6e  lue given in pIn
c770: 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  it and return a 
c780: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
c790: 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49  ew.** OsFile.  I
c7a0: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
c7b0: 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68  memory, close th
c7c0: 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72  e file and retur
c7d0: 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
c7e0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
c7f0: 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
c800: 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a  *pInit, OsFile *
c810: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c  *pId){.  unixFil
c820: 65 20 2a 70 4e 65 77 3b 0a 20 20 70 49 6e 69 74  e *pNew;.  pInit
c830: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
c840: 70 49 6e 69 74 2d 3e 66 75 6c 6c 53 79 6e 63 20  pInit->fullSync 
c850: 3d 20 30 3b 0a 20 20 70 49 6e 69 74 2d 3e 6c 6f  = 0;.  pInit->lo
c860: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 70 49  cktype = 0;.  pI
c870: 6e 69 74 2d 3e 6f 66 66 73 65 74 20 3d 20 30 3b  nit->offset = 0;
c880: 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
c890: 70 49 6e 69 74 29 3b 0a 20 20 70 4e 65 77 20 3d  pInit);.  pNew =
c8a0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
c8b0: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
c8c0: 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20 20  (unixFile) );.  
c8d0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
c8e0: 20 20 20 63 6c 6f 73 65 28 70 49 6e 69 74 2d 3e     close(pInit->
c8f0: 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  h);.    sqlite3O
c900: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
c910: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
c920: 66 6f 28 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b 29  fo(pInit->pLock)
c930: 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
c940: 6e 43 6e 74 28 70 49 6e 69 74 2d 3e 70 4f 70 65  nCnt(pInit->pOpe
c950: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  n);.    sqlite3O
c960: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
c970: 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20     *pId = 0;.   
c980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c990: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
c9a0: 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49 6e 69     *pNew = *pIni
c9b0: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  t;.    pNew->pMe
c9c0: 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55  thod = &sqlite3U
c9d0: 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
c9e0: 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a   *pId = (OsFile*
c9f0: 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43  )pNew;.    OpenC
ca00: 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
ca10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ca20: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66  ;.  }.}...#endif
ca30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ca40: 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  DISKIO */./*****
ca50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74  ******.** Everyt
caa0: 68 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c 73  hing above deals
cab0: 20 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20   with file I/O. 
cac0: 20 45 76 65 72 79 74 68 69 6e 67 20 74 68 61 74   Everything that
cad0: 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a   follows deals.*
cae0: 2a 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69 73  * with other mis
caf0: 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63 74  cellanous aspect
cb00: 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
cb10: 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
cb20: 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ace.************
cb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb70: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e  /.../*.** Get in
cb80: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65  formation to see
cb90: 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  d the random num
cba0: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20  ber generator.  
cbb0: 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77  The seed.** is w
cbc0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
cbd0: 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d  buffer zBuf[256]
cbe0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
cbf0: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20  unction must.** 
cc00: 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63 69  supply a suffici
cc10: 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66  ently large buff
cc20: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
cc30: 65 33 55 6e 69 78 52 61 6e 64 6f 6d 53 65 65 64  e3UnixRandomSeed
cc40: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
cc50: 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
cc60: 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
cc70: 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
cc80: 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
cc90: 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
cca0: 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
ccb0: 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
ccc0: 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
ccd0: 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
cce0: 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
ccf0: 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
cd00: 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
cd10: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
cd20: 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
cd30: 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
cd40: 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
cd50: 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
cd60: 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
cd70: 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
cd80: 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
cd90: 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
cda0: 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
cdb0: 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
cdc0: 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
cdd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
cde0: 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
cdf0: 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
ce00: 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
ce10: 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
ce20: 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
ce30: 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
ce40: 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
ce50: 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
ce60: 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
ce70: 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
ce80: 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
ce90: 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
cea0: 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
ceb0: 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
cec0: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
ced0: 2c 20 32 35 36 29 3b 0a 23 69 66 20 21 64 65 66  , 256);.#if !def
cee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
cef0: 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  ).  {.    int pi
cf00: 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20  d, fd;.    fd = 
cf10: 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
cf20: 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a  om", O_RDONLY);.
cf30: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
cf40: 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
cf50: 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
cf60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
cf70: 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
cf80: 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67  );.      pid = g
cf90: 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d  etpid();.      m
cfa0: 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
cfb0: 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69  of(time_t)], &pi
cfc0: 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b  d, sizeof(pid));
cfd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cfe0: 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c    read(fd, zBuf,
cff0: 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c 6f   256);.      clo
d000: 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
d010: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
d020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d030: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
d040: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
d050: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
d060: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
d070: 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
d080: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
d090: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
d0a0: 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
d0b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d0c0: 55 6e 69 78 53 6c 65 65 70 28 69 6e 74 20 6d 73  UnixSleep(int ms
d0d0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
d0e0: 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
d0f0: 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
d100: 65 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20  eep(ms*1000);.  
d110: 72 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65  return ms;.#else
d120: 0a 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39 39  .  sleep((ms+999
d130: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
d140: 6e 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39 29  n 1000*((ms+999)
d150: 2f 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  /1000);.#endif.}
d160: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76  ../*.** Static v
d170: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f  ariables used fo
d180: 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f  r thread synchro
d190: 6e 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nization..**.** 
d1a0: 69 6e 4d 75 74 65 78 20 20 20 20 20 20 74 68 65  inMutex      the
d1b0: 20 6e 65 73 74 69 6e 67 20 64 65 70 74 68 20 6f   nesting depth o
d1c0: 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  f the recursive 
d1d0: 6d 75 74 65 78 2e 20 20 54 68 65 20 74 68 72 65  mutex.  The thre
d1e0: 61 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ad.**           
d1f0: 20 20 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78     holding mutex
d200: 4d 61 69 6e 20 63 61 6e 20 72 65 61 64 20 74 68  Main can read th
d210: 69 73 20 76 61 72 69 61 62 6c 65 20 61 74 20 61  is variable at a
d220: 6e 79 20 74 69 6d 65 2e 0a 2a 2a 20 20 20 20 20  ny time..**     
d230: 20 20 20 20 20 20 20 20 20 42 75 74 20 69 73 20           But is 
d240: 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74 65 78 41  must hold mutexA
d250: 75 78 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69  ux to change thi
d260: 73 20 76 61 72 69 61 62 6c 65 2e 20 20 4f 74 68  s variable.  Oth
d270: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
d280: 20 20 20 74 68 72 65 61 64 73 20 6d 75 73 74 20     threads must 
d290: 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f  hold mutexAux to
d2a0: 20 72 65 61 64 20 74 68 65 20 76 61 72 69 61 62   read the variab
d2b0: 6c 65 20 61 6e 64 20 63 61 6e 0a 2a 2a 20 20 20  le and can.**   
d2c0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 76 65 72             never
d2d0: 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75   write..**.** mu
d2e0: 74 65 78 4f 77 6e 65 72 20 20 20 54 68 65 20 74  texOwner   The t
d2f0: 68 72 65 61 64 20 69 64 20 6f 66 20 74 68 65 20  hread id of the 
d300: 74 68 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d  thread holding m
d310: 75 74 65 78 4d 61 69 6e 2e 20 20 53 61 6d 65 0a  utexMain.  Same.
d320: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d330: 61 63 63 65 73 73 20 72 75 6c 65 73 20 61 73 20  access rules as 
d340: 66 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a  for inMutex..**.
d350: 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  ** mutexOwnerVal
d360: 69 64 20 20 20 54 72 75 65 20 69 66 20 74 68 65  id   True if the
d370: 20 76 61 6c 75 65 20 69 6e 20 6d 75 74 65 78 4f   value in mutexO
d380: 77 6e 65 72 20 69 73 20 76 61 6c 69 64 2e 20 20  wner is valid.  
d390: 54 68 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20  The same.**     
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
d3b0: 63 65 73 73 20 72 75 6c 65 73 20 61 70 70 6c 79  cess rules apply
d3c0: 20 61 73 20 66 6f 72 20 69 6e 4d 75 74 65 78 2e   as for inMutex.
d3d0: 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4d 61 69 6e  .**.** mutexMain
d3e0: 20 20 20 20 54 68 65 20 6d 61 69 6e 20 6d 75 74      The main mut
d3f0: 65 78 2e 20 20 48 6f 6c 64 20 74 68 69 73 20 6d  ex.  Hold this m
d400: 75 74 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f  utex in order to
d410: 20 67 65 74 20 65 78 63 6c 75 73 69 76 65 0a 2a   get exclusive.*
d420: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
d430: 63 63 65 73 73 20 74 6f 20 53 51 4c 69 74 65 20  ccess to SQLite 
d440: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 2e  data structures.
d450: 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 41 75 78 20  .**.** mutexAux 
d460: 20 20 20 20 41 6e 20 61 75 78 69 6c 69 61 72 79      An auxiliary
d470: 20 6d 75 74 65 78 20 6e 65 65 64 65 64 20 74 6f   mutex needed to
d480: 20 61 63 63 65 73 73 20 76 61 72 69 61 62 6c 65   access variable
d490: 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e  s defined above.
d4a0: 0a 2a 2a 0a 2a 2a 20 4d 75 74 65 78 65 73 20 61  .**.** Mutexes a
d4b0: 72 65 20 61 6c 77 61 79 73 20 61 63 71 75 69 72  re always acquir
d4c0: 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72  ed in this order
d4d0: 3a 20 6d 75 74 65 78 4d 61 69 6e 20 6d 75 74 65  : mutexMain mute
d4e0: 78 41 75 78 2e 20 20 20 49 74 0a 2a 2a 20 69 73  xAux.   It.** is
d4f0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
d500: 6f 20 61 63 71 75 69 72 65 20 6d 75 74 65 78 4d  o acquire mutexM
d510: 61 69 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ain in order to 
d520: 67 65 74 20 6d 75 74 65 78 41 75 78 20 2d 20 6a  get mutexAux - j
d530: 75 73 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74  ust.** do not at
d540: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
d550: 20 74 68 65 6d 20 69 6e 20 74 68 65 20 72 65 76   them in the rev
d560: 65 72 73 65 20 6f 72 64 65 72 3a 20 6d 75 74 65  erse order: mute
d570: 78 41 75 78 20 6d 75 74 65 78 4d 61 69 6e 2e 0a  xAux mutexMain..
d580: 2a 2a 20 45 69 74 68 65 72 20 67 65 74 20 74 68  ** Either get th
d590: 65 20 6d 75 74 65 78 65 73 20 77 69 74 68 20 6d  e mutexes with m
d5a0: 75 74 65 78 4d 61 69 6e 20 66 69 72 73 74 20 6f  utexMain first o
d5b0: 72 20 67 65 74 20 6d 75 74 65 78 41 75 78 20 6f  r get mutexAux o
d5c0: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  nly..**.** When 
d5d0: 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 70 6c 61  running on a pla
d5e0: 74 66 6f 72 6d 20 77 68 65 72 65 20 74 68 65 20  tform where the 
d5f0: 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
d600: 69 6e 4d 75 74 65 78 2c 20 6d 75 74 65 78 4f 77  inMutex, mutexOw
d610: 6e 65 72 2c 0a 2a 2a 20 61 6e 64 20 6d 75 74 65  ner,.** and mute
d620: 78 4f 77 6e 65 72 56 61 6c 69 64 20 63 61 6e 20  xOwnerValid can 
d630: 62 65 20 73 65 74 20 61 74 6f 6d 69 63 61 6c 6c  be set atomicall
d640: 79 2c 20 74 68 65 20 6d 75 74 65 78 41 75 78 20  y, the mutexAux 
d650: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
d660: 0a 2a 2a 20 4f 6e 20 6d 61 6e 79 20 73 79 73 74  .** On many syst
d670: 65 6d 73 2c 20 61 6c 6c 20 74 68 72 65 65 20 61  ems, all three a
d680: 72 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  re 32-bit intege
d690: 72 73 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74  rs and writing t
d6a0: 6f 20 61 20 33 32 2d 62 69 74 0a 2a 2a 20 69 6e  o a 32-bit.** in
d6b0: 74 65 67 65 72 20 69 73 20 61 74 6f 6d 69 63 2e  teger is atomic.
d6c0: 20 20 49 20 74 68 69 6e 6b 2e 20 20 42 75 74 20    I think.  But 
d6d0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 67 75 61  there are no gua
d6e0: 72 61 6e 74 65 65 73 2e 20 20 53 6f 20 69 74 20  rantees.  So it 
d6f0: 73 65 65 6d 73 0a 2a 2a 20 73 61 66 65 72 20 74  seems.** safer t
d700: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 6d 20 75  o protect them u
d710: 73 69 6e 67 20 6d 75 74 65 78 41 75 78 2e 0a 2a  sing mutexAux..*
d720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
d730: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
d740: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
d750: 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68 72  EADS.static pthr
d760: 65 61 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65 72  ead_t mutexOwner
d770: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
d780: 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74  read holding mut
d790: 65 78 4d 61 69 6e 20 2a 2f 0a 73 74 61 74 69 63  exMain */.static
d7a0: 20 69 6e 74 20 6d 75 74 65 78 4f 77 6e 65 72 56   int mutexOwnerV
d7b0: 61 6c 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  alid = 0;       
d7c0: 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 74 65 78  /* True if mutex
d7d0: 4f 77 6e 65 72 20 69 73 20 76 61 6c 69 64 20 2a  Owner is valid *
d7e0: 2f 0a 73 74 61 74 69 63 20 70 74 68 72 65 61 64  /.static pthread
d7f0: 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 4d 61  _mutex_t mutexMa
d800: 69 6e 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54  in = PTHREAD_MUT
d810: 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20  EX_INITIALIZER; 
d820: 2f 2a 20 54 68 65 20 6d 75 74 65 78 20 2a 2f 0a  /* The mutex */.
d830: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
d840: 75 74 65 78 5f 74 20 6d 75 74 65 78 41 75 78 20  utex_t mutexAux 
d850: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
d860: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20 20 2f 2a  INITIALIZER;  /*
d870: 20 41 75 78 20 6d 75 74 65 78 20 2a 2f 0a 23 65   Aux mutex */.#e
d880: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
d890: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f  following pair o
d8a0: 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  f routine implem
d8b0: 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75  ent mutual exclu
d8c0: 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74  sion for.** mult
d8d0: 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65  i-threaded proce
d8e0: 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69  sses.  Only a si
d8f0: 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61  ngle thread is a
d900: 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65  llowed to.** exe
d910: 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20  cuted code that 
d920: 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79  is surrounded by
d930: 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e   EnterMutex() an
d940: 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a  d LeaveMutex()..
d950: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
d960: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
d970: 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73  Mutex.  There is
d980: 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63   not much critic
d990: 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77  al.** code and w
d9a0: 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65  hat little there
d9b0: 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69   is executes qui
d9c0: 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74  ckly and without
d9d0: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   blocking..**.**
d9e0: 20 41 73 20 6f 66 20 76 65 72 73 69 6f 6e 20 33   As of version 3
d9f0: 2e 33 2e 32 2c 20 74 68 69 73 20 6d 75 74 65 78  .3.2, this mutex
da00: 20 6d 75 73 74 20 62 65 20 72 65 63 75 72 73 69   must be recursi
da10: 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
da20: 74 65 33 55 6e 69 78 45 6e 74 65 72 4d 75 74 65  te3UnixEnterMute
da30: 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  x(){.#ifdef SQLI
da40: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
da50: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
da60: 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b  lock(&mutexAux);
da70: 0a 20 20 69 66 28 20 21 6d 75 74 65 78 4f 77 6e  .  if( !mutexOwn
da80: 65 72 56 61 6c 69 64 20 7c 7c 20 21 70 74 68 72  erValid || !pthr
da90: 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
daa0: 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
dab0: 6c 66 28 29 29 20 29 7b 0a 20 20 20 20 70 74 68  lf()) ){.    pth
dac0: 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
dad0: 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
dae0: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
daf0: 6c 6f 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29  lock(&mutexMain)
db00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
db10: 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
db20: 61 73 73 65 72 74 28 20 21 6d 75 74 65 78 4f 77  assert( !mutexOw
db30: 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  nerValid );.    
db40: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
db50: 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20  ck(&mutexAux);. 
db60: 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20     mutexOwner = 
db70: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a  pthread_self();.
db80: 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56 61      mutexOwnerVa
db90: 6c 69 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  lid = 1;.  }.  i
dba0: 6e 4d 75 74 65 78 2b 2b 3b 0a 20 20 70 74 68 72  nMutex++;.  pthr
dbb0: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
dbc0: 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23 65 6c  (&mutexAux);.#el
dbd0: 73 65 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a  se.  inMutex++;.
dbe0: 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 73 71  #endif.}.void sq
dbf0: 6c 69 74 65 33 55 6e 69 78 4c 65 61 76 65 4d 75  lite3UnixLeaveMu
dc00: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
dc10: 20 69 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23 69   inMutex>0 );.#i
dc20: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
dc30: 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65  _THREADS.  pthre
dc40: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
dc50: 75 74 65 78 41 75 78 29 3b 0a 20 20 69 6e 4d 75  utexAux);.  inMu
dc60: 74 65 78 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28  tex--;.  assert(
dc70: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d   pthread_equal(m
dc80: 75 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72 65  utexOwner, pthre
dc90: 61 64 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20 20  ad_self()) );.  
dca0: 69 66 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29  if( inMutex==0 )
dcb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 75  {.    assert( mu
dcc0: 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 29 3b  texOwnerValid );
dcd0: 0a 20 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56  .    mutexOwnerV
dce0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 74  alid = 0;.    pt
dcf0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
dd00: 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a  ck(&mutexMain);.
dd10: 20 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75    }.  pthread_mu
dd20: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
dd30: 78 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69  xAux);.#else.  i
dd40: 6e 4d 75 74 65 78 2d 2d 3b 0a 23 65 6e 64 69 66  nMutex--;.#endif
dd50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
dd60: 20 54 52 55 45 20 69 66 20 74 68 65 20 6d 75 74   TRUE if the mut
dd70: 65 78 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ex is currently 
dd80: 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  held..**.** If t
dd90: 68 65 20 74 68 69 73 54 68 72 64 20 70 61 72 61  he thisThrd para
dda0: 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 72  meter is true, r
ddb0: 65 74 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20  eturn true only 
ddc0: 69 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  if the.** callin
ddd0: 67 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74  g thread holds t
dde0: 68 65 20 6d 75 74 65 78 2e 20 20 49 66 20 74 68  he mutex.  If th
ddf0: 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  e parameter is f
de00: 61 6c 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  alse, return.** 
de10: 74 72 75 65 20 69 66 20 61 6e 79 20 74 68 72 65  true if any thre
de20: 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  ad holds the mut
de30: 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ex..*/.int sqlit
de40: 65 33 55 6e 69 78 49 6e 4d 75 74 65 78 28 69 6e  e3UnixInMutex(in
de50: 74 20 74 68 69 73 54 68 72 64 29 7b 0a 23 69 66  t thisThrd){.#if
de60: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
de70: 54 48 52 45 41 44 53 0a 20 20 69 6e 74 20 72 63  THREADS.  int rc
de80: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  ;.  pthread_mute
de90: 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  x_lock(&mutexAux
dea0: 29 3b 0a 20 20 72 63 20 3d 20 69 6e 4d 75 74 65  );.  rc = inMute
deb0: 78 3e 30 20 26 26 20 28 74 68 69 73 54 68 72 64  x>0 && (thisThrd
dec0: 3d 3d 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65  ==0 || pthread_e
ded0: 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
dee0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
def0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  ;.  pthread_mute
df00: 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41  x_unlock(&mutexA
df10: 75 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ux);.  return rc
df20: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
df30: 20 69 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e 64   inMutex>0;.#end
df40: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65  if.}../*.** Reme
df50: 6d 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20  mber the number 
df60: 6f 66 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  of thread-specif
df70: 69 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61  ic-data blocks a
df80: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65  llocated..** Use
df90: 20 74 68 69 73 20 74 6f 20 76 65 72 69 66 79 20   this to verify 
dfa0: 74 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20  that we are not 
dfb0: 6c 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73  leaking thread-s
dfc0: 70 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a  pecific-data..**
dfd0: 20 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f   Ticket #1601.*/
dfe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
dff0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
e000: 74 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  tsd_count = 0;.#
e010: 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e   ifdef SQLITE_UN
e020: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 20 20 73  IX_THREADS.    s
e030: 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75  tatic pthread_mu
e040: 74 65 78 5f 74 20 74 73 64 5f 63 6f 75 6e 74 65  tex_t tsd_counte
e050: 72 5f 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41  r_mutex = PTHREA
e060: 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49  D_MUTEX_INITIALI
e070: 5a 45 52 3b 0a 23 20 20 20 64 65 66 69 6e 65 20  ZER;.#   define 
e080: 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 5c  TSD_COUNTER(N) \
e090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 74  .             pt
e0a0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
e0b0: 28 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75  (&tsd_counter_mu
e0c0: 74 65 78 29 3b 20 5c 0a 20 20 20 20 20 20 20 20  tex); \.        
e0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 73 64       sqlite3_tsd
e0e0: 5f 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20 5c 0a 20  _count += N; \. 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 74 68 72              pthr
e100: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
e110: 28 26 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75  (&tsd_counter_mu
e120: 74 65 78 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20  tex);.# else.#  
e130: 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e   define TSD_COUN
e140: 54 45 52 28 4e 29 20 20 73 71 6c 69 74 65 33 5f  TER(N)  sqlite3_
e150: 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 0a 23  tsd_count += N.#
e160: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64   endif.#else.# d
e170: 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
e180: 52 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  R(N)  /* no-op *
e190: 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
e1a0: 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  If called with a
e1b0: 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 2c 20 74  llocateFlag>0, t
e1c0: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
e1d0: 6e 74 65 72 20 74 6f 20 74 68 72 65 61 64 0a 2a  nter to thread.*
e1e0: 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61 20  * specific data 
e1f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
e200: 74 68 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61 74  thread.  Allocat
e210: 65 20 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a 2a  e and zero the.*
e220: 2a 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  * thread-specifi
e230: 63 20 64 61 74 61 20 69 66 20 69 74 20 64 6f 65  c data if it doe
e240: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
e250: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61  ist..**.** If ca
e260: 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61  lled with alloca
e270: 74 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  teFlag==0, then 
e280: 63 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  check the curren
e290: 74 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63  t thread.** spec
e2a0: 69 66 69 63 20 64 61 74 61 2e 20 20 52 65 74 75  ific data.  Retu
e2b0: 72 6e 20 69 74 20 69 66 20 69 74 20 65 78 69 73  rn it if it exis
e2c0: 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  ts.  If it does 
e2d0: 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68  not exist,.** th
e2e0: 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  en return NULL..
e2f0: 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  **.** If called 
e300: 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
e310: 67 3c 30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  g<0, check to se
e320: 65 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  e if the thread 
e330: 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61  specific.** data
e340: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
e350: 64 20 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20  d is all zero.  
e360: 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 64 65  If it is then de
e370: 61 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20  allocate it..** 
e380: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
e390: 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 73   to the thread s
e3a0: 70 65 63 69 66 69 63 20 64 61 74 61 20 6f 72 20  pecific data or 
e3b0: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a  NULL if it is.**
e3c0: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20   unallocated or 
e3d0: 67 65 74 73 20 64 65 61 6c 6c 6f 63 61 74 65 64  gets deallocated
e3e0: 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61 74 61 20  ..*/.ThreadData 
e3f0: 2a 73 71 6c 69 74 65 33 55 6e 69 78 54 68 72 65  *sqlite3UnixThre
e400: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 28 69  adSpecificData(i
e410: 6e 74 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29  nt allocateFlag)
e420: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
e430: 20 54 68 72 65 61 64 44 61 74 61 20 7a 65 72 6f   ThreadData zero
e440: 44 61 74 61 20 3d 20 7b 30 7d 3b 20 20 2f 2a 20  Data = {0};  /* 
e450: 49 6e 69 74 69 61 6c 69 7a 65 72 20 74 6f 20 73  Initializer to s
e460: 69 6c 65 6e 63 65 20 77 61 72 6e 69 6e 67 73 0a  ilence warnings.
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72             ** fr
e4a0: 6f 6d 20 62 72 6f 6b 65 6e 20 63 6f 6d 70 69 6c  om broken compil
e4b0: 65 72 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ers */.#ifdef SQ
e4c0: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
e4d0: 53 0a 20 20 73 74 61 74 69 63 20 70 74 68 72 65  S.  static pthre
e4e0: 61 64 5f 6b 65 79 5f 74 20 6b 65 79 3b 0a 20 20  ad_key_t key;.  
e4f0: 73 74 61 74 69 63 20 69 6e 74 20 6b 65 79 49 6e  static int keyIn
e500: 69 74 20 3d 20 30 3b 0a 20 20 54 68 72 65 61 64  it = 0;.  Thread
e510: 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69  Data *pTsd;..  i
e520: 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20  f( !keyInit ){. 
e530: 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65     sqlite3OsEnte
e540: 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66  rMutex();.    if
e550: 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20  ( !keyInit ){.  
e560: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
e570: 20 20 72 63 20 3d 20 70 74 68 72 65 61 64 5f 6b    rc = pthread_k
e580: 65 79 5f 63 72 65 61 74 65 28 26 6b 65 79 2c 20  ey_create(&key, 
e590: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
e5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5b0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
e5c0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e5d0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
e5e0: 20 20 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a     keyInit = 1;.
e5f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e600: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
e610: 0a 20 20 7d 0a 0a 20 20 70 54 73 64 20 3d 20 70  .  }..  pTsd = p
e620: 74 68 72 65 61 64 5f 67 65 74 73 70 65 63 69 66  thread_getspecif
e630: 69 63 28 6b 65 79 29 3b 0a 20 20 69 66 28 20 61  ic(key);.  if( a
e640: 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29 7b  llocateFlag>0 ){
e650: 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d 30  .    if( pTsd==0
e660: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73   ){.      if( !s
e670: 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f 63  qlite3TestMalloc
e680: 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20 20  Fail() ){.      
e690: 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33    pTsd = sqlite3
e6a0: 4f 73 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  OsMalloc(sizeof(
e6b0: 7a 65 72 6f 44 61 74 61 29 29 3b 0a 20 20 20 20  zeroData));.    
e6c0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
e6d0: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20  E_MEMDEBUG.     
e6e0: 20 73 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20   sqlite3_isFail 
e6f0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
e700: 20 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20    if( pTsd ){.  
e710: 20 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65        *pTsd = ze
e720: 72 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  roData;.        
e730: 70 74 68 72 65 61 64 5f 73 65 74 73 70 65 63 69  pthread_setspeci
e740: 66 69 63 28 6b 65 79 2c 20 70 54 73 64 29 3b 0a  fic(key, pTsd);.
e750: 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e          TSD_COUN
e760: 54 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d  TER(+1);.      }
e770: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
e780: 66 28 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c  f( pTsd!=0 && al
e790: 6c 6f 63 61 74 65 46 6c 61 67 3c 30 20 0a 20 20  locateFlag<0 .  
e7a0: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
e7b0: 63 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44  cmp(pTsd, &zeroD
e7c0: 61 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65  ata, sizeof(Thre
e7d0: 61 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20  adData))==0 ){. 
e7e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65     sqlite3OsFree
e7f0: 28 70 54 73 64 29 3b 0a 20 20 20 20 70 74 68 72  (pTsd);.    pthr
e800: 65 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28  ead_setspecific(
e810: 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44  key, 0);.    TSD
e820: 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20  _COUNTER(-1);.  
e830: 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a    pTsd = 0;.  }.
e840: 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23    return pTsd;.#
e850: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 54 68  else.  static Th
e860: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
e870: 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61   0;.  if( alloca
e880: 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20  teFlag>0 ){.    
e890: 69 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20  if( pTsd==0 ){. 
e8a0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
e8b0: 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28  3TestMallocFail(
e8c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73  ) ){.        pTs
e8d0: 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  d = sqlite3OsMal
e8e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f  loc( sizeof(zero
e8f0: 44 61 74 61 29 20 29 3b 0a 20 20 20 20 20 20 7d  Data) );.      }
e900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
e910: 45 4d 44 45 42 55 47 0a 20 20 20 20 20 20 73 71  EMDEBUG.      sq
e920: 6c 69 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30  lite3_isFail = 0
e930: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
e940: 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20  f( pTsd ){.     
e950: 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44     *pTsd = zeroD
e960: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 54 53 44  ata;.        TSD
e970: 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20 20  _COUNTER(+1);.  
e980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
e990: 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30 20  lse if( pTsd!=0 
e9a0: 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c  && allocateFlag<
e9b0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  0.            &&
e9c0: 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a   memcmp(pTsd, &z
e9d0: 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28  eroData, sizeof(
e9e0: 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d 30 20  ThreadData))==0 
e9f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ea00: 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20  Free(pTsd);.    
ea10: 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b  TSD_COUNTER(-1);
ea20: 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20  .    pTsd = 0;. 
ea30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64   }.  return pTsd
ea40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ea50: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
ea60: 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
ea70: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
ea80: 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68  alue, becomes th
ea90: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75  e result.** retu
eaa0: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
eab0: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
eac0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
ead0: 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  for testing..*/.
eae0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
eaf0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
eb00: 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
eb10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
eb20: 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
eb30: 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
eb40: 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
eb50: 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
eb60: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
eb70: 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
eb80: 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
eb90: 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
eba0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
ebb0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
ebc0: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
ebd0: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
ebe0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
ebf0: 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62  CurrentTime(doub
ec00: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64  le *prNow){.#ifd
ec10: 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74  ef NO_GETTOD.  t
ec20: 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
ec30: 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &t);.  *prNow = 
ec40: 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30  t/86400.0 + 2440
ec50: 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73  587.5;.#else.  s
ec60: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
ec70: 6f 77 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d  ow;.  struct tim
ec80: 65 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20 4e  ezone sTz;  /* N
ec90: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 67 65 74  ot used */.  get
eca0: 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c  timeofday(&sNow,
ecb0: 20 26 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77   &sTz);.  *prNow
ecc0: 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73   = 2440587.5 + s
ecd0: 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30  Now.tv_sec/86400
ece0: 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65  .0 + sNow.tv_use
ecf0: 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b  c/86400000000.0;
ed00: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
ed10: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
ed20: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
ed30: 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72  _time ){.    *pr
ed40: 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75  Now = sqlite3_cu
ed50: 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30  rrent_time/86400
ed60: 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
ed70: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
ed80: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66  urn 0;.}..#endif
ed90: 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a      /* OS_UNIX */.