System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 73c5e722a661ed98d8919f204911e4e34e51fa41:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0230: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0240: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0250: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0260: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0270: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0280: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0290: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
02a0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
02b0: 75 70 70 6f 72 74 2c 20 74 68 65 73 65 20 73 68  upport, these sh
02c0: 6f 75 6c 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a  ould be no-ops..
02d0: 2a 2a 0a 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65  **.** Large file
02e0: 20 73 75 70 70 6f 72 74 20 63 61 6e 20 62 65 20   support can be 
02f0: 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 74  disabled using t
0300: 68 65 20 2d 44 53 51 4c 49 54 45 5f 44 49 53 41  he -DSQLITE_DISA
0310: 42 4c 45 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a  BLE_LFS switch.*
0320: 2a 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  * on the compile
0330: 72 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  r command line. 
0340: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
0350: 72 79 20 69 66 20 79 6f 75 20 61 72 65 20 63 6f  ry if you are co
0360: 6d 70 69 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20  mpiling.** on a 
0370: 72 65 63 65 6e 74 20 6d 61 63 68 69 6e 65 20 28  recent machine (
0380: 65 78 3a 20 52 65 64 48 61 74 20 37 2e 32 29 20  ex: RedHat 7.2) 
0390: 62 75 74 20 79 6f 75 20 77 61 6e 74 20 79 6f 75  but you want you
03a0: 72 20 63 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a  r code to work.*
03b0: 2a 20 6f 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61  * on an older ma
03c0: 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61  chine (ex: RedHa
03d0: 74 20 36 2e 30 29 2e 20 20 49 66 20 79 6f 75 20  t 6.0).  If you 
03e0: 63 6f 6d 70 69 6c 65 20 6f 6e 20 52 65 64 48 61  compile on RedHa
03f0: 74 20 37 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74  t 7.2.** without
0400: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46   this option, LF
0410: 53 20 69 73 20 65 6e 61 62 6c 65 2e 20 20 42 75  S is enable.  Bu
0420: 74 20 4c 46 53 20 64 6f 65 73 20 6e 6f 74 20 65  t LFS does not e
0430: 78 69 73 74 20 69 6e 20 74 68 65 20 6b 65 72 6e  xist in the kern
0440: 65 6c 0a 2a 2a 20 69 6e 20 52 65 64 48 61 74 20  el.** in RedHat 
0450: 36 2e 30 2c 20 73 6f 20 74 68 65 20 63 6f 64 65  6.0, so the code
0460: 20 77 6f 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65   won't work.  He
0470: 6e 63 65 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d  nce, for maximum
0480: 20 62 69 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61   binary.** porta
0490: 62 69 6c 69 74 79 20 79 6f 75 20 73 68 6f 75 6c  bility you shoul
04a0: 64 20 6f 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23  d omit LFS..*/.#
04b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
04c0: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69  SABLE_LFS.# defi
04d0: 6e 65 20 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20  ne _LARGE_FILE  
04e0: 20 20 20 20 20 31 0a 23 20 69 66 6e 64 65 66 20       1.# ifndef 
04f0: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
0500: 53 0a 23 20 20 20 64 65 66 69 6e 65 20 5f 46 49  S.#   define _FI
0510: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 20 36  LE_OFFSET_BITS 6
0520: 34 0a 23 20 65 6e 64 69 66 0a 23 20 64 65 66 69  4.# endif.# defi
0530: 6e 65 20 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f  ne _LARGEFILE_SO
0540: 55 52 43 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  URCE 1.#endif../
0550: 2a 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e  *.** standard in
0560: 63 6c 75 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  clude files..*/.
0570: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
0580: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
0590: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
05a0: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
05b0: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
05c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .h>.#include <ti
05d0: 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
05e0: 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63  sys/time.h>.#inc
05f0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a  lude <errno.h>..
0600: 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
0610: 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73 61 66  to be thread-saf
0620: 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70  e, include the p
0630: 74 68 72 65 61 64 73 20 68 65 61 64 65 72 20 61  threads header a
0640: 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65  nd define.** the
0650: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
0660: 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  EADS macro..*/.#
0670: 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  if defined(THREA
0680: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
0690: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
06a0: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
06b0: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
06c0: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
06d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20  ../*.** Default 
06e0: 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e  permissions when
06f0: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   creating a new 
0700: 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  file.*/.#ifndef 
0710: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0720: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a  ILE_PERMISSIONS.
0730: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
0740: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
0750: 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65  MISSIONS 0644.#e
0760: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif..../*.** Th
0770: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
0780: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
0790: 20 6f 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69   of OsFile speci
07a0: 66 69 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78  fic for the unix
07b0: 0a 2a 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20  .** protability 
07c0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
07d0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  f struct unixFil
07e0: 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75  e unixFile;.stru
07f0: 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20  ct unixFile {.  
0800: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0810: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
0820: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
0830: 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  try */.  struct 
0840: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20  openCnt *pOpen; 
0850: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0860: 20 61 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f   all open fd's o
0870: 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  n this inode */.
0880: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
0890: 6f 20 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49  o *pLock;   /* I
08a0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
08b0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
08c0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
08e0: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
08f0: 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tor */.  unsigne
0900: 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65 3b  d char locktype;
0910: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
0920: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
0930: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
0940: 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70 65 6e  gned char isOpen
0950: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
0960: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6c 6f   needs to be clo
0970: 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  sed */.  unsigne
0980: 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e 63 3b  d char fullSync;
0990: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
09a0: 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61 62 6c  SYNC if availabl
09b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64  e */.  int dirfd
09c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
09d0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
09e0: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
09f0: 63 74 6f 72 79 20 2a 2f 0a 23 69 66 64 65 66 20  ctory */.#ifdef 
0a00: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0a10: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0a20: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0a30: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0a40: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0a50: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0a60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0a70: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0a80: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0a90: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0aa0: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0ab0: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0ac0: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0ad0: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0ae0: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0af0: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0b00: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0b10: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0b20: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0b30: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0b40: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0b50: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0b60: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0b70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0b80: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0b90: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0ba0: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0bb0: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0bc0: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0bd0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0be0: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0bf0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0c00: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0c10: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0c20: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0c30: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0c40: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0c50: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0c60: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0c70: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0c80: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0c90: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0ca0: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0cb0: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0cc0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0cd0: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0ce0: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0cf0: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0d00: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0d10: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0d20: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0d30: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0d40: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0d50: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0d60: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0d70: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0d80: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0d90: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0da0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0db0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0dc0: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0dd0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0de0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0df0: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0e00: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0e10: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0e20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0e30: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0e40: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0e50: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0e60: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0e70: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
0e80: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
0e90: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
0ea0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
0eb0: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
0ec0: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
0ed0: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
0ee0: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
0ef0: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
0f00: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
0f10: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
0f20: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
0f30: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
0f40: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
0f50: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
0f60: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
0f70: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
0f80: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
0f90: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
0fa0: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
0fb0: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
0fc0: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
0fd0: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
0fe0: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
0ff0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1000: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
1010: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
1020: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
1030: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
1040: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
1050: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
1060: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1070: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1080: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1090: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
10a0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
10b0: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
10c0: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
10d0: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
10e0: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
10f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1100: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
1110: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
1120: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
1130: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
1140: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
1150: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
1160: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1170: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1180: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1190: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
11a0: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
11b0: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
11c0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
11d0: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
11e0: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
11f0: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1200: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
1210: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
1220: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
1230: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1240: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
1250: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
1260: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1270: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1280: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1290: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
12a0: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
12b0: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
12c0: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
12d0: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
12e0: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
12f0: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1300: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
1310: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
1320: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
1330: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
1340: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
1350: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
1360: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1370: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1380: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1390: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
13a0: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
13b0: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
13c0: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
13d0: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
13e0: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
13f0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1400: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
1410: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
1420: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
1430: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
1440: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
1450: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
1460: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1470: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1480: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1490: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
14a0: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
14b0: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
14c0: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
14d0: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
14e0: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
1510: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
1520: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
1530: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
1540: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
1550: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
1560: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1580: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1590: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
15a0: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
15b0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
15c0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
15d0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
15e0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
15f0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1600: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
1610: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
1620: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
1630: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
1640: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
1650: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
1660: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1670: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1680: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1690: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
16a0: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
16b0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
16c0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
16d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
16e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
16f0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1700: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
1710: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
1720: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
1730: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
1740: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
1750: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
1760: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1770: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1780: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1790: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
17a0: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
17b0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
17c0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
17d0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
17e0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
17f0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1800: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
1810: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
1820: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
1830: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1840: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
1850: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
1860: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1870: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1880: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1890: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
18a0: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
18b0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
18c0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
18d0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
18e0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
18f0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1900: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1910: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1920: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1930: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1940: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1950: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1960: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1970: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1980: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1990: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
19a0: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
19b0: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
19c0: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
19d0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
19e0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
19f0: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1a00: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1a10: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1a20: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1a30: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1a40: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1a50: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1a60: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1a70: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1a80: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1a90: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1aa0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1ab0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1ac0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1ad0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1ae0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1af0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1b00: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1b10: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1b20: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1b30: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1b40: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1b50: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1b60: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1b70: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1b80: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1b90: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1bb0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1bc0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1bd0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1be0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1bf0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1c00: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1c10: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1c20: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1c30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1c40: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1c50: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1c60: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1c70: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1c80: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1c90: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1ca0: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1cb0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1cc0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1cd0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1ce0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1cf0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1d00: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1d10: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1d20: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1d30: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1d40: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1d50: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1d60: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1d70: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1d80: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1d90: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1da0: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1db0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1dc0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1dd0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1de0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1df0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1e00: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1e10: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1e20: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1e30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1e40: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1e50: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1e60: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1e70: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1e80: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1e90: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1ea0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
1eb0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
1ec0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
1ed0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
1ee0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
1ef0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
1f00: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1f10: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1f20: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1f30: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1f40: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1f50: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1f60: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1f70: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1f80: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1f90: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1fa0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
1fb0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
1fc0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
1fd0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
1fe0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
1ff0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2000: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
2010: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
2020: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
2030: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
2040: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
2050: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
2060: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2070: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2080: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2090: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
20a0: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
20b0: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
20c0: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
20d0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
20e0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
20f0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2100: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
2110: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
2120: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
2130: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
2140: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
2150: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
2160: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2170: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2180: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2190: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
21a0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
21b0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
21c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
21d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
21e0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
21f0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
2210: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
2220: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
2230: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
2240: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
2250: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
2260: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2270: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2280: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2290: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
22a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
22b0: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
22c0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
22d0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
22e0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
22f0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2300: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2310: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
2320: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
2330: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
2340: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2350: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
2360: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2370: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2380: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2390: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
23a0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
23b0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
23c0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
23d0: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
23e0: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
23f0: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2400: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
2410: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
2420: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
2430: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
2440: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
2450: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
2460: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2470: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2480: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2490: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
24a0: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
24b0: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
24c0: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
24d0: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
24e0: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
24f0: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2500: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
2510: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
2520: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
2530: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
2540: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
2550: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
2560: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2570: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2580: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2590: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
25a0: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
25b0: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
25c0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
25d0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
25e0: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
25f0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2600: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
2610: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
2620: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
2630: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
2640: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
2650: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
2660: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2670: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2680: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2690: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
26a0: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
26b0: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
26c0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
26d0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
26e0: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
26f0: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2700: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
2710: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
2720: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
2730: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
2740: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
2750: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
2760: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2770: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2780: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2790: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
27a0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
27b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
27c0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
27d0: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
27e0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
27f0: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2800: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
2810: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
2820: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
2830: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
2840: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
2850: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
2860: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2870: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2880: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2890: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
28a0: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
28b0: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
28c0: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
28d0: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
28e0: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
28f0: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2900: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2910: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2920: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2930: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2940: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2950: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2960: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2970: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2980: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2990: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
29a0: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
29b0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
29c0: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
29d0: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
29e0: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
29f0: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2a00: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2a10: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2a20: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2a30: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2a40: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2a50: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2a60: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2a70: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2a80: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2a90: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2aa0: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2ab0: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2ac0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2ad0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2ae0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2af0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2b00: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2b10: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2b20: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2b30: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2b40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2b50: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2b60: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2b70: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2b80: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2b90: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2ba0: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2bb0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2bc0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2bd0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2be0: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2bf0: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2c00: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2c10: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2c20: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2c30: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2c40: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2c50: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2c60: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2c70: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2c80: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2c90: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2ca0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2cb0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2cc0: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2cd0: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2ce0: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2d10: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2d20: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2d30: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2d40: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2d50: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2d60: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2d70: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2d80: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2d90: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2da0: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2db0: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2dc0: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2dd0: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2de0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2df0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2e00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2e10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2e20: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2e30: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2e50: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2e60: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
2e70: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
2e80: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
2e90: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
2ea0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
2eb0: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
2ec0: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
2ed0: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
2ee0: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
2ef0: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
2f00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f10: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
2f20: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
2f30: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
2f40: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
2f50: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
2f60: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
2f70: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
2f80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f90: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
2fa0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
2fb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
2fc0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2fd0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2fe0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
2ff0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3000: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
3010: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
3020: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
3030: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
3040: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
3050: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
3060: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3070: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3080: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3090: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
30a0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
30b0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
30c0: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
30d0: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
30e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
30f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3100: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
3110: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
3120: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
3130: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
3140: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
3150: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3160: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3170: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3180: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3190: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
31a0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
31b0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
31c0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
31d0: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
31e0: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
31f0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3200: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
3210: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
3220: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
3230: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
3240: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
3250: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
3260: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3280: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3290: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
32a0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
32b0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
32c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
32d0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
32e0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
32f0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3300: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
3310: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
3320: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
3330: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
3340: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
3350: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
3360: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3370: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3380: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3390: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
33a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
33b0: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
33c0: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
33d0: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
33e0: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
33f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3400: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
3410: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
3420: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
3430: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
3440: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
3450: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c  lockHash = { SQL
3460: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3470: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
3480: 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70  ;.static Hash op
3490: 65 6e 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  enHash = { SQLIT
34a0: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
34b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
34c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34d0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a  UNIX_THREADS./*.
34e0: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
34f0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3500: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
3510: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
3520: 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b  h others.** lock
3530: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  s..**.**    0:  
3540: 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  No.  Threads can
3550: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
3560: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
3570: 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20  **    1:  Yes.  
3580: 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  Threads can over
3590: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
35a0: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a   locks..**   -1:
35b0: 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20    We don't know 
35c0: 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  yet..**.** This 
35d0: 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61 6c 6c  variable normall
35e0: 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65  y has file scope
35f0: 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75 72 69   only.  But duri
3600: 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65 20 6d  ng testing, we m
3610: 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c 6f 62  ake.** it a glob
3620: 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 74  al so that the t
3630: 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63 68 61  est code can cha
3640: 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20 69 6e  nge its value in
3650: 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69 66 79   order to verify
3660: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 69 67  .** that the rig
3670: 68 74 20 73 74 75 66 66 20 68 61 70 70 65 6e 73  ht stuff happens
3680: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
3690: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
36a0: 45 5f 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61  E_TEST.int threa
36b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
36c0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a  hersLocks = -1;.
36d0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
36e0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
36f0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
3700: 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  = -1;.#endif../*
3710: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
3720: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
3730: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
3740: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
3750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
3760: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
3770: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
3780: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
3790: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
37a0: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37c0: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
37d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
37e0: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
37f0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
3800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
3810: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
3820: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
3830: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
3840: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
3850: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
3860: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
3870: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
3880: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
3890: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
38a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
38c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
38d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
38e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
38f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
3900: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
3910: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
3920: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
3930: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
3940: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
3950: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
3960: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
3970: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
3980: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
3990: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
39a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
39b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
39c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
39d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
39e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
39f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
3a00: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
3a10: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
3a20: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
3a30: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
3a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
3a50: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
3a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
3a70: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
3a80: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
3a90: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
3aa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
3ab0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
3ac0: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
3ad0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
3ae0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
3af0: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
3b00: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
3b10: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
3b20: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
3b30: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
3b40: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
3b50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
3b60: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
3b70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
3b80: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
3b90: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
3ba0: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
3bb0: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
3bc0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
3bd0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
3be0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
3bf0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
3c00: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
3c10: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
3c20: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
3c30: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
3c40: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
3c50: 73 29 3b 0a 20 20 69 66 28 20 73 20 26 26 20 6f  s);.  if( s && o
3c60: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
3c70: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
3c80: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
3c90: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
3ca0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
3cb0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
3cc0: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
3cd0: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
3ce0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
3cf0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
3d00: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
3d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
3d20: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
3d30: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
3d40: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
3d50: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
3d60: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
3d70: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
3d80: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
3d90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
3da0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
3db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
3dc0: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
3dd0: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
3de0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
3df0: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
3e00: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
3e10: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
3e20: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
3e30: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
3e40: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
3e50: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
3e60: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
3e70: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
3e80: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
3e90: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
3ea0: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
3eb0: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
3ec0: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
3ed0: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
3ee0: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
3ef0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
3f00: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
3f10: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
3f20: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
3f30: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
3f40: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
3f50: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
3f60: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
3f70: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
3f80: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
3f90: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
3fa0: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
3fb0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
3fc0: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
3fd0: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
3fe0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
3ff0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
4000: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4010: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
4020: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4030: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
4040: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
4050: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
4060: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
4070: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
4080: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4090: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
40a0: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
40b0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
40c0: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
40d0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
40e0: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
40f0: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
4100: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
4110: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
4120: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
4130: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
4140: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
4150: 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20  ingBehavior(int 
4160: 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20  fd_orig){.  int 
4170: 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72  fd;.  struct thr
4180: 65 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d  eadTestData d[2]
4190: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b  ;.  pthread_t t[
41a0: 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28  2];..  fd = dup(
41b0: 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20  fd_orig);.  if( 
41c0: 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  fd<0 ) return;. 
41d0: 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69   memset(d, 0, si
41e0: 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d  zeof(d));.  d[0]
41f0: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d  .fd = fd;.  d[0]
4200: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4210: 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c  _RDLCK;.  d[0].l
4220: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
4230: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61   d[0].lock.l_sta
4240: 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c  rt = 0;.  d[0].l
4250: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
4260: 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20  EEK_SET;.  d[1] 
4270: 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c  = d[0];.  d[1].l
4280: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
4290: 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f  RLCK;.  pthread_
42a0: 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c  create(&t[0], 0,
42b0: 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65   threadLockingTe
42c0: 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74  st, &d[0]);.  pt
42d0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
42e0: 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  1], 0, threadLoc
42f0: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29  kingTest, &d[1])
4300: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4310: 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68  (t[0], 0);.  pth
4320: 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20  read_join(t[1], 
4330: 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  0);.  close(fd);
4340: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
4350: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
4360: 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74  s =  d[0].result
4370: 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75  ==0 && d[1].resu
4380: 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  lt==0;.}.#endif 
4390: 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  /* SQLITE_UNIX_T
43a0: 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  HREADS */../*.**
43b0: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49   Release a lockI
43c0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
43d0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
43e0: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
43f0: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4400: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
4410: 49 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b  Info(struct lock
4420: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  Info *pLock){.  
4430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4440: 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20  sInMutex(1) );. 
4450: 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a   pLock->nRef--;.
4460: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
4470: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
4480: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
4490: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
44a0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f  >key, sizeof(pLo
44b0: 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20  ck->key), 0);.  
44c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f    sqliteFree(pLo
44d0: 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ck);.  }.}../*.*
44e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e  * Release a open
44f0: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70 72  Cnt structure pr
4500: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4510: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4520: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4530: 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e  void releaseOpen
4540: 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43  Cnt(struct openC
4550: 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 61 73  nt *pOpen){.  as
4560: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73 49  sert( sqlite3OsI
4570: 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20 20 70  nMutex(1) );.  p
4580: 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Open->nRef--;.  
4590: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d  if( pOpen->nRef=
45a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
45b0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65  3HashInsert(&ope
45c0: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b  nHash, &pOpen->k
45d0: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e  ey, sizeof(pOpen
45e0: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
45f0: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
4600: 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ding);.    sqlit
4610: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
4620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
4630: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
4640: 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49  or, locate lockI
4650: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
4660: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a  structures that.
4670: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
4680: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
4690: 72 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f  r.  Create new o
46a0: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
46b0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
46c0: 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65   values might be
46d0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
46e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
46f0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
4700: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
4710: 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rors..*/.static 
4720: 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  int findLockInfo
4730: 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20  (.  int fd,     
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
4760: 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20  criptor used in 
4770: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  the key */.  str
4780: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70  uct lockInfo **p
4790: 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74  pLock,    /* Ret
47a0: 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f  urn the lockInfo
47b0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
47c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e  */.  struct open
47d0: 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20  Cnt **ppOpen    
47e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
47f0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
4800: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
4810: 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
4820: 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20  lockKey key1;.  
4830: 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b  struct openKey k
4840: 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74  ey2;.  struct st
4850: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74  at statbuf;.  st
4860: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
4870: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f  Lock;.  struct o
4880: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20  penCnt *pOpen;. 
4890: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
48a0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
48b0: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
48c0: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  1;..  assert( sq
48d0: 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31  lite3OsInMutex(1
48e0: 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b  ) );.  memset(&k
48f0: 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey1, 0, sizeof(k
4900: 65 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65  ey1));.  key1.de
4910: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
4920: 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d  ev;.  key1.ino =
4930: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
4940: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
4950: 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 69 66  NIX_THREADS.  if
4960: 28 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  ( threadsOverrid
4970: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
4980: 3c 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68  <0 ){.    testTh
4990: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
49a0: 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b  ior(fd);.  }.  k
49b0: 65 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61 64  ey1.tid = thread
49c0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
49d0: 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70  ersLocks ? 0 : p
49e0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23  thread_self();.#
49f0: 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28 26  endif.  memset(&
4a00: 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28  key2, 0, sizeof(
4a10: 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64  key2));.  key2.d
4a20: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
4a30: 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20  dev;.  key2.ino 
4a40: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f  = statbuf.st_ino
4a50: 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72  ;.  pLock = (str
4a60: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71  uct lockInfo*)sq
4a70: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c  lite3HashFind(&l
4a80: 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20  ockHash, &key1, 
4a90: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20  sizeof(key1));. 
4aa0: 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b   if( pLock==0 ){
4ab0: 0a 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  .    struct lock
4ac0: 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  Info *pOld;.    
4ad0: 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61  pLock = sqliteMa
4ae0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
4af0: 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 69  *pLock) );.    i
4b00: 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  f( pLock==0 ){. 
4b10: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
4b20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
4b30: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d  dlockinfo;.    }
4b40: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20  .    pLock->key 
4b50: 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f 63  = key1;.    pLoc
4b60: 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  k->nRef = 1;.   
4b70: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b   pLock->cnt = 0;
4b80: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
4b90: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
4ba0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
4bb0: 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68  Insert(&lockHash
4bc0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73  , &pLock->key, s
4bd0: 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c 6f  izeof(key1), pLo
4be0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ck);.    if( pOl
4bf0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  d!=0 ){.      as
4c00: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63  sert( pOld==pLoc
4c10: 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  k );.      sqlit
4c20: 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  eFree(pLock);.  
4c30: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
4c40: 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64    goto exit_find
4c50: 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a  lockinfo;.    }.
4c60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f    }else{.    pLo
4c70: 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  ck->nRef++;.  }.
4c80: 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63    *ppLock = pLoc
4c90: 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21  k;.  if( ppOpen!
4ca0: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20  =0 ){.    pOpen 
4cb0: 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  = (struct openCn
4cc0: 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  t*)sqlite3HashFi
4cd0: 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b  nd(&openHash, &k
4ce0: 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  ey2, sizeof(key2
4cf0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65  ));.    if( pOpe
4d00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  n==0 ){.      st
4d10: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
4d20: 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20  ld;.      pOpen 
4d30: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
4d40: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e  w( sizeof(*pOpen
4d50: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
4d60: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
4d70: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
4d80: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
4d90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
4da0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
4db0: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20  dlockinfo;.     
4dc0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e   }.      pOpen->
4dd0: 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20 20 20  key = key2;.    
4de0: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20    pOpen->nRef = 
4df0: 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  1;.      pOpen->
4e00: 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  nLock = 0;.     
4e10: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
4e20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 0;.      pOpe
4e30: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->aPending = 0;
4e40: 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  .      pOld = sq
4e50: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4e60: 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65  &openHash, &pOpe
4e70: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b  n->key, sizeof(k
4e80: 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b 0a 20 20  ey2), pOpen);.  
4e90: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20      if( pOld!=0 
4ea0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4eb0: 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65 6e 20 29  t( pOld==pOpen )
4ec0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4ed0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20  Free(pOpen);.   
4ee0: 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b       releaseLock
4ef0: 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  Info(pLock);.   
4f00: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
4f10: 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66       goto exit_f
4f20: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20  indlockinfo;.   
4f30: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
4f40: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
4f50: 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  f++;.    }.    *
4f60: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
4f70: 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f    }..exit_findlo
4f80: 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e  ckinfo:.  return
4f90: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
4fa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
4fb0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4fc0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
4fd0: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
4fe0: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
4ff0: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
5000: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
5010: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
5020: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5030: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5040: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5050: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5060: 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  r *locktypeName(
5070: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
5080: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
5090: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
50a0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
50b0: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
50c0: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
50d0: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
50e0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
50f0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
5100: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
5110: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
5120: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
5130: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5140: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5150: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5160: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5170: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  if../*.** If we 
5180: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
5190: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
51a0: 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72  ead than the thr
51b0: 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ead that the.** 
51c0: 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e  unixFile argumen
51d0: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68  t belongs to, th
51e0: 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65  en transfer owne
51f0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69  rship of the uni
5200: 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f  xFile.** over to
5210: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
5220: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69  ead..**.** A uni
5230: 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77  xFile is only ow
5240: 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20  ned by a thread 
5250: 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65  on systems where
5260: 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a   one thread is.*
5270: 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72  * unable to over
5280: 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74  ride locks creat
5290: 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  ed by a differen
52a0: 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61  t thread.  RedHa
52b0: 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d  t9 is.** an exam
52c0: 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79  ple of such a sy
52d0: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65  stem..**.** Owne
52e0: 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69  rship transfer i
52f0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69  s only allowed i
5300: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69  f the unixFile i
5310: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
5320: 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  cked..** If the 
5330: 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b  unixFile is lock
5340: 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73  ed and an owners
5350: 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68  hip is wrong, th
5360: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  en return.** SQL
5370: 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c  ITE_MISUSE.  SQL
5380: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5390: 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
53a0: 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64 65   works..*/.#ifde
53b0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
53c0: 52 45 41 44 53 0a 73 74 61 74 69 63 20 69 6e 74  READS.static int
53d0: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
53e0: 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ip(unixFile *pFi
53f0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  le){.  int rc;. 
5400: 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66   pthread_t hSelf
5410: 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f  ;.  if( threadsO
5420: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
5430: 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a  sLocks ){.    /*
5440: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
5450: 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20  fers not needed 
5460: 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a  on this system *
5470: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
5480: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53  ITE_OK;.  }.  hS
5490: 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65  elf = pthread_se
54a0: 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72  lf();.  if( pthr
54b0: 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d  ead_equal(pFile-
54c0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a  >tid, hSelf) ){.
54d0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74      /* We are st
54e0: 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ill in the same 
54f0: 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 54 52  thread */.    TR
5500: 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65  ACE1("No-transfe
5510: 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e  r, same thread\n
5520: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
5530: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
5540: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
5550: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
5560: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74      /* We cannot
5570: 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69   change ownershi
5580: 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68  p while we are h
5590: 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a  olding a lock! *
55a0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
55b0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
55c0: 20 20 54 52 41 43 45 34 28 22 54 72 61 6e 73 66    TRACE4("Transf
55d0: 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  er ownership of 
55e0: 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  %d from %d to %d
55f0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 70 46  \n", pFile->h,pF
5600: 69 6c 65 2d 3e 74 69 64 2c 68 53 65 6c 66 29 3b  ile->tid,hSelf);
5610: 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20  .  pFile->tid = 
5620: 68 53 65 6c 66 3b 0a 20 20 72 65 6c 65 61 73 65  hSelf;.  release
5630: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
5640: 70 4c 6f 63 6b 29 3b 0a 20 20 72 63 20 3d 20 66  pLock);.  rc = f
5650: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  indLockInfo(pFil
5660: 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c  e->h, &pFile->pL
5670: 6f 63 6b 2c 20 30 29 3b 0a 20 20 54 52 41 43 45  ock, 0);.  TRACE
5680: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
5690: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
56a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
56b0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
56c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
56d0: 0a 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61  .     locktypeNa
56e0: 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  me(pFile->pLock-
56f0: 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c  >locktype), pFil
5700: 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a  e->pLock->cnt);.
5710: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
5720: 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e  else.  /* On sin
5730: 67 6c 65 2d 74 68 72 65 61 64 65 64 20 62 75 69  gle-threaded bui
5740: 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69 70 20 74  lds, ownership t
5750: 72 61 6e 73 66 65 72 20 69 73 20 61 20 6e 6f 2d  ransfer is a no-
5760: 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 74  op */.# define t
5770: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
5780: 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (X) SQLITE_OK.#e
5790: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  ndif../*.** Dele
57a0: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
57b0: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
57c0: 55 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e 73 74  UnixDelete(const
57d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
57e0: 29 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  ){.  unlink(zFil
57f0: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
5800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5810: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
5820: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
5830: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  le exists..*/.in
5840: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 46 69 6c  t sqlite3UnixFil
5850: 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68  eExists(const ch
5860: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
5870: 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 28    return access(
5880: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30  zFilename, 0)==0
5890: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
58a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
58b0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
58c0: 74 65 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  teUnixFile(unixF
58d0: 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69  ile *pInit, OsFi
58e0: 6c 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f 2a 0a 2a  le **pId);../*.*
58f0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
5900: 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74  n a file for bot
5910: 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  h reading and wr
5920: 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a  iting.  If that.
5930: 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70  ** fails, try op
5940: 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e  ening it read-on
5950: 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ly.  If the file
5960: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
5970: 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74  .** try to creat
5980: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  e it..**.** On s
5990: 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65  uccess, a handle
59a0: 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69   for the open fi
59b0: 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  le is written to
59c0: 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65   *id.** and *pRe
59d0: 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f  adonly is set to
59e0: 20 30 20 69 66 20 74 68 65 20 66 69 6c 65 20 77   0 if the file w
59f0: 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  as opened for re
5a00: 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69  ading and.** wri
5a10: 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65  ting or 1 if the
5a20: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
5a30: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65   read-only.  The
5a40: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5a50: 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  s.** SQLITE_OK..
5a60: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
5a70: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
5a80: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41  eturns SQLITE_CA
5a90: 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65  NTOPEN and leave
5aa0: 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52  s.** *id and *pR
5ab0: 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65  eadonly unchange
5ac0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5ad0: 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72 69  3UnixOpenReadWri
5ae0: 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te(.  const char
5af0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f   *zFilename,.  O
5b00: 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20 20 69  sFile **pId,.  i
5b10: 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt *pReadonly.){
5b20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
5b30: 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53  xFile f;..  CRAS
5b40: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
5b50: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
5b60: 52 65 61 64 57 72 69 74 65 2c 20 7a 46 69 6c 65  ReadWrite, zFile
5b70: 6e 61 6d 65 2c 20 70 49 64 2c 20 70 52 65 61 64  name, pId, pRead
5b80: 6f 6e 6c 79 29 3b 0a 20 20 61 73 73 65 72 74 28  only);.  assert(
5b90: 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e   0==*pId );.  f.
5ba0: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
5bb0: 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
5bc0: 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  AT|O_LARGEFILE|O
5bd0: 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20  _BINARY,.       
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
5c00: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5c10: 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30  NS);.  if( f.h<0
5c20: 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53 44 49   ){.#ifdef EISDI
5c30: 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  R.    if( errno=
5c40: 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20 20 20  =EISDIR ){.     
5c50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
5c60: 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 23  ANTOPEN;.    }.#
5c70: 65 6e 64 69 66 0a 20 20 20 20 66 2e 68 20 3d 20  endif.    f.h = 
5c80: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
5c90: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
5ca0: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
5cb0: 20 20 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b      if( f.h<0 ){
5cc0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5cd0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
5ce0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
5cf0: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
5d00: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
5d10: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  y = 0;.  }.  sql
5d20: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
5d30: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
5d40: 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e  ockInfo(f.h, &f.
5d50: 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29  pLock, &f.pOpen)
5d60: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
5d70: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
5d80: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
5d90: 28 66 2e 68 29 3b 0a 20 20 20 20 72 65 74 75 72  (f.h);.    retur
5da0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5db0: 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50    }.  TRACE3("OP
5dc0: 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
5dd0: 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  , f.h, zFilename
5de0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f  );.  return allo
5df0: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66 2c  cateUnixFile(&f,
5e00: 20 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pId);.}.../*.**
5e10: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
5e20: 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20   a new file for 
5e30: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
5e40: 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73   by this process
5e50: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77 69  ..** The file wi
5e60: 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72  ll be opened for
5e70: 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
5e80: 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20 61  d writing.  To a
5e90: 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74  void.** a potent
5ea0: 69 61 6c 20 73 65 63 75 72 69 74 79 20 70 72 6f  ial security pro
5eb0: 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20  blem, we do not 
5ec0: 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74  allow the file t
5ed0: 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  o have.** previo
5ee0: 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 4e  usly existed.  N
5ef0: 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74  or do we allow t
5f00: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61 20  he file to be a 
5f10: 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b  symbolic.** link
5f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c  ..**.** If delFl
5f30: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
5f40: 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   make arrangemen
5f50: 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ts to automatica
5f60: 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  lly delete.** th
5f70: 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  e file when it i
5f80: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
5f90: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74  On success, writ
5fa0: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  e the file handl
5fb0: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72  e into *id and r
5fc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
5fd0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
5fe0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5ff0: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
6000: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65  t sqlite3UnixOpe
6010: 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74  nExclusive(const
6020: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
6030: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20  , OsFile **pId, 
6040: 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20  int delFlag){.  
6050: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
6060: 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53 48 5f 54  le f;..  CRASH_T
6070: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c  EST_OVERRIDE(sql
6080: 69 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63  ite3CrashOpenExc
6090: 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65 6e 61 6d  lusive, zFilenam
60a0: 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c 61 67 29  e, pId, delFlag)
60b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a  ;.  assert( 0==*
60c0: 70 49 64 20 29 3b 0a 20 20 69 66 28 20 61 63 63  pId );.  if( acc
60d0: 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  ess(zFilename, 0
60e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
60f0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
6100: 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e 68 20 3d 20  EN;.  }.  f.h = 
6110: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a  open(zFilename,.
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
6140: 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
6150: 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  |O_LARGEFILE|O_B
6160: 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20 20  INARY,.         
6170: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
6180: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
6190: 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
61a0: 2e 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  .h<0 ){.    retu
61b0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
61c0: 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EN;.  }.  sqlite
61d0: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
61e0: 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b  .  rc = findLock
61f0: 49 6e 66 6f 28 66 2e 68 2c 20 26 66 2e 70 4c 6f  Info(f.h, &f.pLo
6200: 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a 20  ck, &f.pOpen);. 
6210: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
6220: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
6230: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 66 2e   ){.    close(f.
6240: 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  h);.    unlink(z
6250: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Filename);.    r
6260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6270: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 65  EM;.  }.  if( de
6280: 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e 6c  lFlag ){.    unl
6290: 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
62a0: 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50    }.  TRACE3("OP
62b0: 45 4e 2d 45 58 20 25 2d 33 64 20 25 73 5c 6e 22  EN-EX %-3d %s\n"
62c0: 2c 20 66 2e 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  , f.h, zFilename
62d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f  );.  return allo
62e0: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 26 66 2c  cateUnixFile(&f,
62f0: 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pId);.}../*.** 
6300: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
6310: 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 72  a new file for r
6320: 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e  ead-only access.
6330: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6340: 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  s, write the fil
6350: 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69  e handle into *i
6360: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  d and return SQL
6370: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
6380: 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   failure, return
6390: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
63a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
63b0: 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  UnixOpenReadOnly
63c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
63d0: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
63e0: 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pId){.  int rc;
63f0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 66 3b 0a 0a  .  unixFile f;..
6400: 20 20 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45    CRASH_TEST_OVE
6410: 52 52 49 44 45 28 73 71 6c 69 74 65 33 43 72 61  RRIDE(sqlite3Cra
6420: 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20  shOpenReadOnly, 
6430: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20  zFilename, pId, 
6440: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  0);.  assert( 0=
6450: 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e 68 20 3d  =*pId );.  f.h =
6460: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
6470: 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47   O_RDONLY|O_LARG
6480: 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
6490: 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a  .  if( f.h<0 ){.
64a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
64b0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
64c0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
64d0: 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20  Mutex();.  rc = 
64e0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68  findLockInfo(f.h
64f0: 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70  , &f.pLock, &f.p
6500: 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  Open);.  sqlite3
6510: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
6520: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
6530: 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20  close(f.h);.    
6540: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6550: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  MEM;.  }.  TRACE
6560: 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64 20  3("OPEN-RO %-3d 
6570: 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c  %s\n", f.h, zFil
6580: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
6590: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
65a0: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
65b0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
65c0: 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  open a file desc
65d0: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64  riptor for the d
65e0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
65f0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65  ntains a.** file
6600: 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73  .  This file des
6610: 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75  criptor can be u
6620: 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74  sed to fsync() t
6630: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
6640: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
6650: 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69   sure the creati
6660: 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65  on of a new file
6670: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69   is actually wri
6680: 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  tten.** to disk.
6690: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
66a0: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e  ine is only mean
66b0: 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e  ingful for Unix.
66c0: 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20    It is a no-op 
66d0: 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73  under.** windows
66e0: 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64   since windows d
66f0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
6700: 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a  hard links..**.*
6710: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
6720: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
6730: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
6740: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
6750: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
6760: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
6770: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
6780: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
6790: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
67a0: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
67b0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
67c0: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
67d0: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
67e0: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
67f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
6800: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
6810: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
6820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
6830: 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46  rname.){.  unixF
6840: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
6850: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
6860: 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( pFile==0 ){.  
6870: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e    /* Do not open
6880: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
6890: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
68a0: 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ing file is not 
68b0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f  already.    ** o
68c0: 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  pen. */.    retu
68d0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
68e0: 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48  EN;.  }.  SET_TH
68f0: 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20  READID(pFile);. 
6900: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
6910: 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69  dirfd<0 );.  pFi
6920: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e  le->dirfd = open
6930: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
6940: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
6950: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
6960: 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  irfd<0 ){.    re
6970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
6980: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41  OPEN; .  }.  TRA
6990: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
69a0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
69b0: 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  dirfd, zDirname)
69c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
69d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
69e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
69f0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
6a00: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
6a10: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
6a20: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
6a30: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
6a40: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
6a50: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
6a60: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
6a70: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
6a80: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
6a90: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
6aa0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
6ab0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
6ac0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
6ad0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
6ae0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
6af0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
6b00: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
6b10: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
6b20: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
6b30: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
6b40: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
6b50: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
6b60: 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61  e3UnixTempFileNa
6b70: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
6b80: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
6b90: 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
6ba0: 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
6bb0: 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
6bc0: 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
6bd0: 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
6be0: 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
6bf0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6c00: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
6c10: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
6c20: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
6c30: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
6c40: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
6c50: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
6c60: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
6c70: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
6c80: 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
6c90: 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
6ca0: 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
6cb0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
6cc0: 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
6cd0: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
6ce0: 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
6cf0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
6d00: 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
6d10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
6d20: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
6d30: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
6d40: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
6d50: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
6d60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d70: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
6d80: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
6d90: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
6da0: 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
6db0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
6dc0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
6dd0: 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49  uf, "%s/"TEMP_FI
6de0: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
6df0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
6e00: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
6e10: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
6e20: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
6e30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
6e40: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
6e50: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
6e60: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
6e70: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
6e80: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
6e90: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
6ea0: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
6eb0: 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
6ec0: 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
6ed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6ee0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ; .}../*.** Chec
6ef0: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
6f00: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
6f10: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
6f20: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
6f30: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
6f40: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
6f50: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
6f60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
6f70: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
6f80: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
6f90: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
6fa0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
6fb0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
6fc0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
6fd0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
6fe0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
6ff0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
7000: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
7010: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
7020: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
7030: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
7040: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
7050: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
7060: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
7070: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
7080: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
7090: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
70a0: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
70b0: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
70c0: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
70d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
70e0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
70f0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
7100: 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28 4f  c int unixRead(O
7110: 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20  sFile *id, void 
7120: 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b  *pBuf, int amt){
7130: 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
7140: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69  sert( id );.  Si
7150: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
7160: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
7170: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f  IMER_START;.  go
7180: 74 20 3d 20 72 65 61 64 28 28 28 75 6e 69 78 46  t = read(((unixF
7190: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75  ile*)id)->h, pBu
71a0: 66 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52  f, amt);.  TIMER
71b0: 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22  _END;.  TRACE5("
71c0: 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
71d0: 20 25 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e   %7d %d\n", ((un
71e0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
71f0: 67 6f 74 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  got,.          l
7200: 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f  ast_page, TIMER_
7210: 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b  ELAPSED);.  SEEK
7220: 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f  (0);.  /* if( go
7230: 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a  t<0 ) got = 0; *
7240: 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  /.  if( got==amt
7250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7260: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
7270: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
7280: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a  LITE_IOERR;.  }.
7290: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
72a0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
72b0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
72c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
72d0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
72e0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
72f0: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
7300: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
7310: 74 20 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69  t unixWrite(OsFi
7320: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
7330: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
7340: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
7350: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
7360: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
7370: 6d 74 3e 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  mt>0 );.  Simula
7380: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
7390: 5f 49 4f 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c  _IOERR);.  Simul
73a0: 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
73b0: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
73c0: 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
73d0: 26 26 20 28 77 72 6f 74 65 20 3d 20 77 72 69 74  && (wrote = writ
73e0: 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  e(((unixFile*)id
73f0: 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 29  )->h, pBuf, amt)
7400: 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  )>0 ){.    amt -
7410: 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
7420: 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
7430: 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
7440: 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52   TIMER_END;.  TR
7450: 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25 2d  ACE5("WRITE   %-
7460: 33 64 20 25 35 64 20 25 37 64 20 25 64 5c 6e 22  3d %5d %7d %d\n"
7470: 2c 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  , ((unixFile*)id
7480: 29 2d 3e 68 2c 20 77 72 6f 74 65 2c 0a 20 20 20  )->h, wrote,.   
7490: 20 20 20 20 20 20 20 6c 61 73 74 5f 70 61 67 65         last_page
74a0: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
74b0: 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20 69  ;.  SEEK(0);.  i
74c0: 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
74d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
74e0: 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
74f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7500: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65  *.** Move the re
7510: 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72  ad/write pointer
7520: 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   in a file..*/.s
7530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
7540: 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ek(OsFile *id, i
7550: 36 34 20 6f 66 66 73 65 74 29 7b 0a 20 20 61 73  64 offset){.  as
7560: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 45  sert( id );.  SE
7570: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
7580: 20 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   1);.#ifdef SQLI
7590: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66  TE_TEST.  if( of
75a0: 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44  fset ) SimulateD
75b0: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65 6e  iskfullError.#en
75c0: 64 69 66 0a 20 20 6c 73 65 65 6b 28 28 28 75 6e  dif.  lseek(((un
75d0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
75e0: 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
75f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7600: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7610: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
7620: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
7630: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
7640: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
7650: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
7660: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
7670: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
7680: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
7690: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
76a0: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
76b0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
76c0: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
76d0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
76e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
76f0: 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61  ** Use the fdata
7700: 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20  sync() API only 
7710: 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54  if the HAVE_FDAT
7720: 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  ASYNC macro is d
7730: 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  efined..** Other
7740: 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29  wise use fsync()
7750: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a   in its place..*
7760: 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46  /.#ifndef HAVE_F
7770: 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
7780: 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
7790: 63 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  c.#endif.../*.**
77a0: 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
77b0: 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
77c0: 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
77d0: 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
77e0: 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
77f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
7800: 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
7810: 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
7820: 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
7830: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
7840: 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
7850: 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
7860: 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
7870: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
7880: 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
7890: 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
78a0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
78b0: 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
78c0: 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
78d0: 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
78e0: 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
78f0: 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
7900: 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
7910: 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
7920: 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
7930: 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
7940: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
7950: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
7960: 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
7970: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
7980: 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
7990: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
79a0: 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
79b0: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
79c0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
79d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
79e0: 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
79f0: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
7a00: 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
7a10: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
7a20: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
7a30: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
7a40: 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
7a50: 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
7a60: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
7a70: 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
7a80: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
7a90: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
7aa0: 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
7ab0: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
7ac0: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
7ad0: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
7ae0: 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
7af0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
7b00: 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
7b10: 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
7b20: 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
7b30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
7b40: 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
7b50: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23  ITE_OK;.#else..#
7b60: 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
7b70: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
7b80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
7b90: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
7ba0: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  NC, 0);.  }else{
7bb0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
7bc0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c  .  /* If the FUL
7bd0: 4c 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 74 72  LSYNC failed, tr
7be0: 79 20 74 6f 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  y to do a normal
7bf0: 20 66 73 79 6e 63 28 29 20 2a 2f 0a 20 20 69 66   fsync() */.  if
7c00: 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e  ( rc ) rc = fsyn
7c10: 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a  c(fd);..#else /*
7c20: 20 69 66 20 21 64 65 66 69 6e 65 64 28 46 5f 46   if !defined(F_F
7c30: 55 4c 4c 53 59 4e 43 29 20 2a 2f 0a 20 20 69 66  ULLSYNC) */.  if
7c40: 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20  ( dataOnly ){.  
7c50: 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
7c60: 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (fd);.  }else{. 
7c70: 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
7c80: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
7c90: 20 64 65 66 69 6e 65 64 28 46 5f 46 55 4c 4c 46   defined(F_FULLF
7ca0: 53 59 4e 43 29 20 2a 2f 0a 23 65 6e 64 69 66 20  SYNC) */.#endif 
7cb0: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
7cc0: 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20  E_NO_SYNC) */.. 
7cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7ce0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
7cf0: 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
7d00: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
7d10: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
7d20: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  disk..**.** If d
7d30: 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20  ataOnly==0 then 
7d40: 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74  both the file it
7d50: 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74  self and its met
7d60: 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73  adata (file.** s
7d70: 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65  ize, access time
7d80: 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65  , etc) are synce
7d90: 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21  d.  If dataOnly!
7da0: 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  =0 then only the
7db0: 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73  .** file data is
7dc0: 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55   synced..**.** U
7dd0: 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20  nder Unix, also 
7de0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
7df0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74  he directory ent
7e00: 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a  ry for the file.
7e10: 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
7e20: 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67  ted by fsync-ing
7e30: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
7e40: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
7e50: 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20   file..** If we 
7e60: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61  do not do this a
7e70: 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20  nd we encounter 
7e80: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
7e90: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
7ea0: 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
7eb0: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
7ec0: 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65  t exist after we
7ed0: 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65   reboot.  The ne
7ee0: 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20  xt.** SQLite to 
7ef0: 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
7f00: 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68  will not know th
7f10: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  at the journal e
7f20: 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a  xists (because.*
7f30: 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  * the directory 
7f40: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
7f50: 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20  urnal was never 
7f60: 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65  created) and the
7f70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
7f80: 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61  will not roll ba
7f90: 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65  ck - possibly le
7fa0: 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  ading to databas
7fb0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  e corruption..*/
7fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
7fd0: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
7fe0: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
7ff0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
8000: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
8010: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
8020: 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
8030: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
8040: 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28  OERR);.  TRACE2(
8050: 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
8060: 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 69  , pFile->h);.  i
8070: 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46  f( full_fsync(pF
8080: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 66  ile->h, pFile->f
8090: 75 6c 6c 53 79 6e 63 2c 20 64 61 74 61 4f 6e 6c  ullSync, dataOnl
80a0: 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
80b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
80c0: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
80d0: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
80e0: 54 52 41 43 45 32 28 22 44 49 52 53 59 4e 43 20  TRACE2("DIRSYNC 
80f0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
8100: 64 69 72 66 64 29 3b 0a 23 69 66 6e 64 65 66 20  dirfd);.#ifndef 
8110: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
8120: 49 52 53 59 4e 43 0a 20 20 20 20 69 66 28 20 66  IRSYNC.    if( f
8130: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
8140: 3e 64 69 72 66 64 2c 20 70 46 69 6c 65 2d 3e 66  >dirfd, pFile->f
8150: 75 6c 6c 53 79 6e 63 2c 20 30 29 20 29 7b 0a 20  ullSync, 0) ){. 
8160: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8170: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
8180: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c 6f  }.#endif.    clo
8190: 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29  se(pFile->dirfd)
81a0: 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20  ;  /* Only need 
81b0: 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f  to sync once, so
81c0: 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65 63   close the direc
81d0: 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tory */.    pFil
81e0: 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20 20  e->dirfd = -1;  
81f0: 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72 65    /* when we are
8200: 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20 20   done. */.  }.  
8210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
8230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a 44  the directory zD
8240: 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  irname. This is 
8250: 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72 61  a no-op on opera
8260: 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74 68  ting systems oth
8270: 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58 2e  er.** than UNIX.
8280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
8290: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
82a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
82b0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72 75  nal file has tru
82c0: 65 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ely been deleted
82d0: 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  .** before makin
82e0: 67 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e 64  g changes to ind
82f0: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 73  ividual journals
8300: 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74 61   on a multi-data
8310: 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a 20  base commit..** 
8320: 54 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  The F_FULLFSYNC 
8330: 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e 65  option is not ne
8340: 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69 6e  eded here..*/.in
8350: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79 6e  t sqlite3UnixSyn
8360: 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  cDirectory(const
8370: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 29   char *zDirname)
8380: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
8390: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
83a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
83b0: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
83c0: 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53  fd;.  int r;.  S
83d0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
83e0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
83f0: 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
8400: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
8410: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41  INARY, 0);.  TRA
8420: 43 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE3("DIRSYNC %-3
8430: 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a  d (%s)\n", fd, z
8440: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  Dirname);.  if( 
8450: 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
8460: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
8470: 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66  EN; .  }.  r = f
8480: 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73  sync(fd);.  clos
8490: 65 28 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(fd);.  return 
84a0: 28 28 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f  ((r==0)?SQLITE_O
84b0: 4b 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  K:SQLITE_IOERR);
84c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
84d0: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
84e0: 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
84f0: 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
8500: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
8510: 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  ncate(OsFile *id
8520: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
8530: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
8540: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8550: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
8560: 20 72 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74   return ftruncat
8570: 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  e(((unixFile*)id
8580: 29 2d 3e 68 2c 20 6e 42 79 74 65 29 3d 3d 30 20  )->h, nByte)==0 
8590: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
85a0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f  LITE_IOERR;.}../
85b0: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
85c0: 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
85d0: 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
85e0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
85f0: 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73   unixFileSize(Os
8600: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  File *id, i64 *p
8610: 53 69 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Size){.  struct 
8620: 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
8630: 72 74 28 20 69 64 20 29 3b 0a 20 20 53 69 6d 75  rt( id );.  Simu
8640: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
8650: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28  TE_IOERR);.  if(
8660: 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c   fstat(((unixFil
8670: 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29  e*)id)->h, &buf)
8680: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
8690: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
86a0: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
86b0: 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65  uf.st_size;.  re
86c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
86d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
86e0: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
86f0: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
8700: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
8710: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
8720: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
8730: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
8740: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
8750: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
8760: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
8770: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
8780: 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c   unlocked or hol
8790: 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c  ds only SHARED l
87a0: 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  ocks, then.** re
87b0: 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
87c0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
87d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
87e0: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
87f0: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
8800: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
8810: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
8820: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
8830: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
8840: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
8850: 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
8860: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
8870: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
8880: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
8890: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
88a0: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
88b0: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
88c0: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
88d0: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
88e0: 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b  CK ){.    r = 1;
88f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
8900: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
8910: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
8920: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  olds it..  */.  
8930: 69 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74  if( !r ){.    st
8940: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
8950: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
8960: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
8970: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
8980: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
8990: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
89a0: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
89b0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
89c0: 20 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d      fcntl(pFile-
89d0: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
89e0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ck);.    if( loc
89f0: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
8a00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31  K ){.      r = 1
8a10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
8a20: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
8a30: 75 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33  utex();.  TRACE3
8a40: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
8a50: 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
8a60: 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  h, r);..  return
8a70: 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   r;.}../*.** Loc
8a80: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
8a90: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
8aa0: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
8ab0: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
8ac0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
8ad0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
8ae0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
8af0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
8b00: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
8b10: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
8b20: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
8b30: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
8b40: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
8b50: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
8b60: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
8b70: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
8b80: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
8b90: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
8ba0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
8bb0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
8bc0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
8bd0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
8be0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
8bf0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
8c00: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
8c10: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
8c20: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
8c30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
8c40: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
8c50: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
8c60: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
8c70: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
8c80: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
8c90: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
8ca0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
8cb0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
8cc0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
8cd0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
8ce0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
8cf0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
8d00: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
8d10: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
8d20: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
8d30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
8d40: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
8d50: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
8d60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
8d70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
8d80: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
8d90: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
8da0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73   int unixLock(Os
8db0: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
8dc0: 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68  cktype){.  /* Th
8dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
8de0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
8df0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
8e00: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
8e10: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
8e20: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
8e30: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
8e40: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
8e50: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
8e60: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
8e70: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
8e80: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
8e90: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
8ea0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
8eb0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
8ec0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
8ed0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
8ee0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
8ef0: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
8f00: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
8f10: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
8f20: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
8f30: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
8f40: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
8f50: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
8f60: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
8f70: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
8f80: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
8f90: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
8fa0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
8fb0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
8fc0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
8fd0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
8fe0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
8ff0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
9000: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
9010: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
9020: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
9030: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
9040: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
9050: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
9060: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
9070: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
9080: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
9090: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
90a0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
90b0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
90c0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
90d0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
90e0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
90f0: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
9100: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
9110: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
9120: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
9130: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
9140: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
9150: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
9160: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
9170: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
9180: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
9190: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
91a0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
91b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
91c0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
91d0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
91e0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
91f0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
9200: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
9210: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
9220: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
9230: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
9240: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
9250: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
9260: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
9270: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
9280: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
9290: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
92a0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
92b0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
92c0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
92d0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
92e0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
92f0: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
9300: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
9310: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
9320: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
9330: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
9340: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
9350: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
9360: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
9370: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
9380: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
9390: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
93a0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
93b0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
93c0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
93d0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
93e0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
93f0: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
9400: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
9410: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
9420: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
9430: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
9440: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
9450: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
9460: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
9470: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
9480: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
9490: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
94a0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
94b0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
94c0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
94d0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
94e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
94f0: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
9500: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
9510: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
9520: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
9530: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
9540: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
9550: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
9560: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
9570: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
9580: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
9590: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
95a0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
95b0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
95c0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
95d0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
95e0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
95f0: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
9600: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
9610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
9620: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
9630: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
9640: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
9650: 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d   *pLock = pFile-
9660: 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  >pLock;.  struct
9670: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
9680: 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt s;..  assert(
9690: 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43   pFile );.  TRAC
96a0: 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E7("LOCK    %d %
96b0: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
96c0: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
96d0: 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  ->h,.      lockt
96e0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
96f0: 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  ), locktypeName(
9700: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
9710: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
9720: 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  Name(pLock->lock
9730: 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e  type), pLock->cn
9740: 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  t , getpid());..
9750: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
9760: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
9770: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
9780: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
9790: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
97a0: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
97b0: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
97c0: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
97d0: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
97e0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
97f0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
9800: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
9810: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
9820: 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
9830: 7b 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f  {.    TRACE3("LO
9840: 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
9850: 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22  already held)\n"
9860: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
9870: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9880: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b  Name(locktype));
9890: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
98a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
98b0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
98c0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
98d0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
98e0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
98f0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
9900: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
9910: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9920: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
9930: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
9940: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
9950: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
9960: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
9970: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
9980: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
9990: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
99a0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
99b0: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
99c0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
99d0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f  .  */.  sqlite3O
99e0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  sEnterMutex();..
99f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
9a00: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
9a10: 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65  d owns the pFile
9a20: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72  ..  */.  rc = tr
9a30: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
9a40: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
9a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9a60: 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76     sqlite3OsLeav
9a70: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  eMutex();.    re
9a80: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
9a90: 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c  Lock = pFile->pL
9aa0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ock;..  /* If so
9ab0: 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
9ac0: 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
9ad0: 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
9ae0: 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a  ent OsFile*.  **
9af0: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
9b00: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
9b10: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
9b20: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
9b30: 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  f( (pFile->lockt
9b40: 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ype!=pLock->lock
9b50: 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20  type && .       
9b60: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
9b70: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
9b80: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48  K || locktype>SH
9b90: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
9ba0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9bb0: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
9bc0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
9bd0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
9be0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
9bf0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
9c00: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
9c10: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
9c20: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
9c30: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
9c40: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
9c50: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
9c60: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
9c70: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
9c80: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
9c90: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
9ca0: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
9cb0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
9cc0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  K || pLock->lock
9cd0: 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
9ce0: 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
9cf0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  rt( locktype==SH
9d00: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
9d10: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
9d20: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20  locktype==0 );. 
9d30: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
9d40: 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70  ->cnt>0 );.    p
9d50: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
9d60: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
9d70: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a    pLock->cnt++;.
9d80: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e      pFile->pOpen
9d90: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
9da0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
9db0: 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  }..  lock.l_len 
9dc0: 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  = 1L;..  lock.l_
9dd0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
9de0: 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  T;..  /* A PENDI
9df0: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
9e00: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
9e10: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
9e20: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
9e30: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
9e40: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
9e50: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
9e60: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
9e70: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
9e80: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
9e90: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
9ea0: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
9eb0: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
9ec0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
9ed0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50  File->locktype<P
9ee0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29  ENDING_LOCK).  )
9ef0: 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  {.    lock.l_typ
9f00: 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53  e = (locktype==S
9f10: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
9f20: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
9f30: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9f40: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
9f50: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
9f60: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
9f70: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
9f80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28   ){.      rc = (
9f90: 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f  errno==EINVAL) ?
9fa0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20   SQLITE_NOLFS : 
9fb0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9fc0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
9fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
9fe0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
9ff0: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
a000: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
a010: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
a020: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
a030: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
a040: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
a050: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
a060: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
a070: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
a080: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
a090: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
a0a0: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
a0b0: 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  pe==0 );..    /*
a0c0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
a0d0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
a0e0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
a0f0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
a100: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
a110: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d  ED_SIZE;.    s =
a120: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a130: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a140: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ;..    /* Drop t
a150: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
a160: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
a170: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a180: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
a190: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
a1a0: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
a1b0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
a1c0: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
a1d0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
a1e0: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
a1f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
a200: 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  ERR;  /* This sh
a210: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
a220: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
a230: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
a240: 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20      if( s ){.   
a250: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
a260: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
a270: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
a280: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
a290: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
a2a0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
a2b0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c  LOCK;.      pFil
a2c0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
a2d0: 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  +;.      pLock->
a2e0: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  cnt = 1;.    }. 
a2f0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
a300: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
a310: 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e  OCK && pLock->cn
a320: 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  t>1 ){.    /* We
a330: 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
a340: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a350: 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
a360: 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
a370: 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
a380: 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
a390: 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
a3a0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
a3b0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
a3c0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
a3d0: 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
a3e0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
a3f0: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
a400: 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
a410: 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
a420: 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
a430: 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
a440: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
a450: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
a460: 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65  assert( 0!=pFile
a470: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20  ->locktype );.  
a480: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
a490: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69  F_WRLCK;.    swi
a4a0: 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b  tch( locktype ){
a4b0: 0a 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45  .      case RESE
a4c0: 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  RVED_LOCK:.     
a4d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
a4e0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
a4f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a500: 20 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55        case EXCLU
a510: 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20  SIVE_LOCK:.     
a520: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
a530: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
a540: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
a550: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
a560: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
a570: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
a580: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30          assert(0
a590: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  );.    }.    s =
a5a0: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a5b0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a5c0: 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20  ;.    if( s ){. 
a5d0: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
a5e0: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
a5f0: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
a600: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
a610: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
a620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a630: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
a640: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
a650: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
a660: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
a670: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
a680: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a690: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
a6a0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
a6b0: 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  G_LOCK;.    pLoc
a6c0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45  k->locktype = PE
a6d0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
a6e0: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c  .end_lock:.  sql
a6f0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
a700: 28 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f  ();.  TRACE4("LO
a710: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
a720: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
a730: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
a740: 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  pe), .      rc==
a750: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
a760: 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
a770: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a780: 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
a790: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
a7a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
a7b0: 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
a7c0: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
a7d0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
a7e0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
a7f0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
a800: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
a810: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
a820: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
a830: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
a840: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
a850: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
a860: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a870: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
a880: 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
a890: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
a8a0: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74   locktype){.  st
a8b0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
a8c0: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
a8d0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
a8e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a8f0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
a900: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
a910: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
a920: 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37  File );.  TRACE7
a930: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
a940: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
a950: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
a960: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
a970: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
a980: 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  pe, pFile->pLock
a990: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
a9a0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67  e->pLock->cnt, g
a9b0: 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73  etpid());..  ass
a9c0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
a9d0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
a9e0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
a9f0: 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype<=locktype ){
aa00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
aa10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
aa20: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
aa30: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  pFile) ){.    re
aa40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
aa50: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
aa60: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
aa70: 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
aa80: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72  ->pLock;.  asser
aa90: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30  t( pLock->cnt!=0
aaa0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
aab0: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
aac0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
aad0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ert( pLock->lock
aae0: 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63  type==pFile->loc
aaf0: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28  ktype );.    if(
ab00: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ab10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
ab20: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ab30: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  RDLCK;.      loc
ab40: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
ab50: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
ab60: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ab70: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
ab80: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
ab90: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
aba0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
abb0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
abc0: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
abd0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
abe0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
abf0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ac00: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
ac10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
ac20: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
ac30: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
ac40: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ac50: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
ac60: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
ac70: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
ac80: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
ac90: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
aca0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
acb0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
acc0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
acd0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  LK, &lock)==0 ){
ace0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
acf0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
ad00: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
ad10: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ad20: 54 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68  TE_IOERR;  /* Th
ad30: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
ad40: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a  happen */.    }.
ad50: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
ad60: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe==NO_LOCK ){. 
ad70: 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e     struct openCn
ad80: 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f  t *pOpen;..    /
ad90: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
ada0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
adb0: 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
adc0: 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
add0: 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
ade0: 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
adf0: 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
ae00: 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
ae10: 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
ae20: 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
ae30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d      pLock->cnt--
ae40: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
ae50: 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >cnt==0 ){.     
ae60: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ae70: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
ae80: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ae90: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
aea0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
aeb0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
aec0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
aed0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
aee0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
aef0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
af00: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
af10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
af20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
af30: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
af40: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
af50: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
af60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
af70: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
af80: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
af90: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
afa0: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
afb0: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
afc0: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
afd0: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
afe0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
aff0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
b000: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
b010: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
b020: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
b030: 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65     pOpen = pFile
b040: 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70  ->pOpen;.    pOp
b050: 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  en->nLock--;.   
b060: 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e   assert( pOpen->
b070: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
b080: 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  if( pOpen->nLock
b090: 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50  ==0 && pOpen->nP
b0a0: 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20  ending>0 ){.    
b0b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
b0c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d  or(i=0; i<pOpen-
b0d0: 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b  >nPending; i++){
b0e0: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
b0f0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69  Open->aPending[i
b100: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
b110: 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50    free(pOpen->aP
b120: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  ending);.      p
b130: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
b140: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
b150: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
b160: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
b170: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
b180: 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ;.  pFile->lockt
b190: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
b1a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b1b0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
b1c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b1d0: 74 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  t unixClose(OsFi
b1e0: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69  le **pId){.  uni
b1f0: 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69  xFile *id = (uni
b200: 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20  xFile*)*pId;..  
b210: 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e  if( !id ) return
b220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
b230: 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e  ixUnlock(*pId, N
b240: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69  O_LOCK);.  if( i
b250: 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
b260: 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
b270: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
b280: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
b290: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66  erMutex();..  if
b2a0: 28 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  ( id->pOpen->nLo
b2b0: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
b2c0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
b2d0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
b2e0: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
b2f0: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
b300: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
b310: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
b320: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
b330: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
b340: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
b350: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
b360: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
b370: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
b380: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
b390: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
b3a0: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
b3b0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
b3c0: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
b3d0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
b3e0: 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65  pOpen = id->pOpe
b3f0: 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65  n;.    aNew = re
b400: 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50  alloc( pOpen->aP
b410: 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e  ending, (pOpen->
b420: 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65  nPending+1)*size
b430: 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69  of(int) );.    i
b440: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
b450: 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c      /* If a mall
b460: 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c  oc fails, just l
b470: 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73  eak the file des
b480: 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d  criptor */.    }
b490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65  else{.      pOpe
b4a0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e  n->aPending = aN
b4b0: 65 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  ew;.      pOpen-
b4c0: 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d  >aPending[pOpen-
b4d0: 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d  >nPending] = id-
b4e0: 3e 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  >h;.      pOpen-
b4f0: 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20  >nPending++;.   
b500: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b510: 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
b520: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
b530: 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73  s so we can clos
b540: 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64  e the file immed
b550: 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c  iately */.    cl
b560: 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a  ose(id->h);.  }.
b570: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
b580: 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20  o(id->pLock);.  
b590: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69  releaseOpenCnt(i
b5a0: 64 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71  d->pOpen);..  sq
b5b0: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
b5c0: 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  x();.  id->isOpe
b5d0: 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28  n = 0;.  TRACE2(
b5e0: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
b5f0: 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  , id->h);.  Open
b600: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
b610: 71 6c 69 74 65 46 72 65 65 28 69 64 29 3b 0a 20  qliteFree(id);. 
b620: 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74   *pId = 0;.  ret
b630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b640: 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
b650: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
b660: 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
b670: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61  hname.  Return a
b680: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
b690: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
b6a0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
b6b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
b6c0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  qliteMalloc()..*
b6d0: 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
b6e0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
b6f0: 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
b700: 67 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63  g this space onc
b710: 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f  e it.** is no lo
b720: 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  nger needed..*/.
b730: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 55 6e 69  char *sqlite3Uni
b740: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f  xFullPathname(co
b750: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
b760: 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  ive){.  char *zF
b770: 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ull = 0;.  if( z
b780: 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27  Relative[0]=='/'
b790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
b7a0: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c  etString(&zFull,
b7b0: 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61   zRelative, (cha
b7c0: 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r*)0);.  }else{.
b7d0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d      char *zBuf =
b7e0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30   sqliteMalloc(50
b7f0: 30 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75  00);.    if( zBu
b800: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  f==0 ){.      re
b810: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
b820: 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20    zBuf[0] = 0;. 
b830: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
b840: 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63  ing(&zFull, getc
b850: 77 64 28 7a 42 75 66 2c 20 35 30 30 30 29 2c 20  wd(zBuf, 5000), 
b860: 22 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a  "/", zRelative,.
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
b890: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42     sqliteFree(zB
b8a0: 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
b8b0: 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zFull;.}../*.*
b8c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
b8d0: 75 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79  ue of the fullsy
b8e0: 6e 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67  nc flag in the g
b8f0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b900: 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
b910: 76 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c  void unixSetFull
b920: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
b930: 20 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69   int v){.  ((uni
b940: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c  xFile*)id)->full
b950: 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a  Sync = v;.}../*.
b960: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  ** Return the un
b970: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
b980: 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69  ndle for an OsFi
b990: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
b9a0: 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28   unixFileHandle(
b9b0: 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
b9c0: 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65  eturn ((unixFile
b9d0: 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a  *)id)->h;.}../*.
b9e0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
b9f0: 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65  eger that indice
ba00: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  s the type of lo
ba10: 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
ba20: 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e  d.** by this han
ba30: 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20  dle.  (Used for 
ba40: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
ba50: 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73  ysis only.).*/.s
ba60: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
ba70: 63 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a  ckState(OsFile *
ba80: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  id){.  return ((
ba90: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
baa0: 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ocktype;.}../*.*
bab0: 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
bac0: 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
bad0: 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
bae0: 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
baf0: 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e  ile.** for unix.
bb00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
bb10: 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
bb20: 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  3UnixIoMethod = 
bb30: 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20  {.  unixClose,. 
bb40: 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
bb50: 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
bb60: 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
bb70: 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
bb80: 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
bb90: 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
bba0: 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
bbb0: 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
bbc0: 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78  FileSize,.  unix
bbd0: 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f  Lock,.  unixUnlo
bbe0: 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
bbf0: 61 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b  ate,.  unixCheck
bc00: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b  ReservedLock,.};
bc10: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
bc20: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 75 6e   memory for a un
bc30: 69 78 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c  ixFile.  Initial
bc40: 69 7a 65 20 74 68 65 20 6e 65 77 20 75 6e 69 78  ize the new unix
bc50: 46 69 6c 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76  File.** to the v
bc60: 61 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 70 49  alue given in pI
bc70: 6e 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  nit and return a
bc80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
bc90: 6e 65 77 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20  new.** OsFile.  
bca0: 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  If we run out of
bcb0: 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74   memory, close t
bcc0: 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75  he file and retu
bcd0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
bce0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55  ic int allocateU
bcf0: 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
bd00: 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20   *pInit, OsFile 
bd10: 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69  **pId){.  unixFi
bd20: 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70 49 6e 69  le *pNew;.  pIni
bd30: 74 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  t->dirfd = -1;. 
bd40: 20 70 49 6e 69 74 2d 3e 66 75 6c 6c 53 79 6e 63   pInit->fullSync
bd50: 20 3d 20 30 3b 0a 20 20 70 49 6e 69 74 2d 3e 6c   = 0;.  pInit->l
bd60: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 53  ocktype = 0;.  S
bd70: 45 54 5f 54 48 52 45 41 44 49 44 28 70 49 6e 69  ET_THREADID(pIni
bd80: 74 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  t);.  pNew = sql
bd90: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
bda0: 66 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20  f(unixFile) );. 
bdb0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
bdc0: 20 20 20 20 63 6c 6f 73 65 28 70 49 6e 69 74 2d      close(pInit-
bdd0: 3e 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >h);.    sqlite3
bde0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
bdf0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
be00: 6e 66 6f 28 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b  nfo(pInit->pLock
be10: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
be20: 65 6e 43 6e 74 28 70 49 6e 69 74 2d 3e 70 4f 70  enCnt(pInit->pOp
be30: 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  en);.    sqlite3
be40: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
be50: 20 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20      *pId = 0;.  
be60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
be70: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
be80: 20 20 20 20 2a 70 4e 65 77 20 3d 20 2a 70 49 6e      *pNew = *pIn
be90: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  it;.    pNew->pM
bea0: 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
beb0: 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
bec0: 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65    *pId = (OsFile
bed0: 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e  *)pNew;.    Open
bee0: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
bef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bf00: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69  K;.  }.}...#endi
bf10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
bf20: 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a  _DISKIO */./****
bf30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf70: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79  *******.** Every
bf80: 74 68 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c  thing above deal
bf90: 73 20 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e  s with file I/O.
bfa0: 20 20 45 76 65 72 79 74 68 69 6e 67 20 74 68 61    Everything tha
bfb0: 74 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a  t follows deals.
bfc0: 2a 2a 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69  ** with other mi
bfd0: 73 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63  scellanous aspec
bfe0: 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ts of the operat
bff0: 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
c000: 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  face.***********
c010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c050: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69  */.../*.** Get i
c060: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65  nformation to se
c070: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
c080: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20  mber generator. 
c090: 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20   The seed.** is 
c0a0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
c0b0: 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36   buffer zBuf[256
c0c0: 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ].  The calling 
c0d0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a  function must.**
c0e0: 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63   supply a suffic
c0f0: 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66  iently large buf
c100: 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fer..*/.int sqli
c110: 74 65 33 55 6e 69 78 52 61 6e 64 6f 6d 53 65 65  te3UnixRandomSee
c120: 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  d(char *zBuf){. 
c130: 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
c140: 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
c150: 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
c160: 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
c170: 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
c180: 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
c190: 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
c1a0: 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
c1b0: 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
c1c0: 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
c1d0: 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
c1e0: 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
c1f0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
c200: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
c210: 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
c220: 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
c230: 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
c240: 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
c250: 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
c260: 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
c270: 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
c280: 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
c290: 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
c2a0: 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
c2b0: 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
c2c0: 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
c2d0: 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
c2e0: 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
c2f0: 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
c300: 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
c310: 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
c320: 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
c330: 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
c340: 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
c350: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
c360: 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
c370: 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
c380: 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
c390: 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
c3a0: 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
c3b0: 30 2c 20 32 35 36 29 3b 0a 23 69 66 20 21 64 65  0, 256);.#if !de
c3c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
c3d0: 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70  T).  {.    int p
c3e0: 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64 20 3d  id, fd;.    fd =
c3f0: 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e   open("/dev/uran
c400: 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  dom", O_RDONLY);
c410: 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
c420: 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
c430: 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
c440: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
c450: 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
c460: 29 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  ));.      pid = 
c470: 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
c480: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
c490: 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70  eof(time_t)], &p
c4a0: 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
c4b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c4c0: 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66     read(fd, zBuf
c4d0: 2c 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c  , 256);.      cl
c4e0: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20  ose(fd);.    }. 
c4f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
c500: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c510: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
c520: 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
c530: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
c540: 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
c550: 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
c560: 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
c570: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
c580: 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
c590: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
c5a0: 33 55 6e 69 78 53 6c 65 65 70 28 69 6e 74 20 6d  3UnixSleep(int m
c5b0: 73 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  s){.#if defined(
c5c0: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
c5d0: 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73  HAVE_USLEEP.  us
c5e0: 6c 65 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20  leep(ms*1000);. 
c5f0: 20 72 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73   return ms;.#els
c600: 65 0a 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39  e.  sleep((ms+99
c610: 39 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  9)/1000);.  retu
c620: 72 6e 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39  rn 1000*((ms+999
c630: 29 2f 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a  )/1000);.#endif.
c640: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20  }../*.** Static 
c650: 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66  variables used f
c660: 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72  or thread synchr
c670: 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  onization.*/.sta
c680: 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20  tic int inMutex 
c690: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
c6a0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
c6b0: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 74  static pthread_t
c6c0: 20 6d 75 74 65 78 4f 77 6e 65 72 3b 0a 73 74 61   mutexOwner;.sta
c6d0: 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
c6e0: 78 5f 74 20 6d 75 74 65 78 31 20 3d 20 50 54 48  x_t mutex1 = PTH
c6f0: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
c700: 41 4c 49 5a 45 52 3b 0a 73 74 61 74 69 63 20 70  ALIZER;.static p
c710: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
c720: 75 74 65 78 32 20 3d 20 50 54 48 52 45 41 44 5f  utex2 = PTHREAD_
c730: 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
c740: 52 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  R;.#endif../*.**
c750: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
c760: 61 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69  air of routine i
c770: 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20  mplement mutual 
c780: 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a  exclusion for.**
c790: 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20   multi-threaded 
c7a0: 70 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79  processes.  Only
c7b0: 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64   a single thread
c7c0: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a   is allowed to.*
c7d0: 2a 20 65 78 65 63 75 74 65 64 20 63 6f 64 65 20  * executed code 
c7e0: 74 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64  that is surround
c7f0: 65 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78  ed by EnterMutex
c800: 28 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65  () and LeaveMute
c810: 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  x()..**.** SQLit
c820: 65 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69  e uses only a si
c830: 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65  ngle Mutex.  The
c840: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63  re is not much c
c850: 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20  ritical.** code 
c860: 61 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20  and what little 
c870: 74 68 65 72 65 20 69 73 20 65 78 65 63 75 74 65  there is execute
c880: 73 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69  s quickly and wi
c890: 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a  thout blocking..
c8a0: 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20 76 65 72 73  **.** As of vers
c8b0: 69 6f 6e 20 33 2e 33 2e 32 2c 20 74 68 69 73 20  ion 3.3.2, this 
c8c0: 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 72 65  mutex must be re
c8d0: 63 75 72 73 69 76 65 2e 0a 2a 2f 0a 76 6f 69 64  cursive..*/.void
c8e0: 20 73 71 6c 69 74 65 33 55 6e 69 78 45 6e 74 65   sqlite3UnixEnte
c8f0: 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66  rMutex(){.#ifdef
c900: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
c910: 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d  EADS.  pthread_m
c920: 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78  utex_lock(&mutex
c930: 31 29 3b 0a 20 20 69 66 28 20 69 6e 4d 75 74 65  1);.  if( inMute
c940: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 70 74 68 72  x==0 ){.    pthr
c950: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
c960: 6d 75 74 65 78 32 29 3b 0a 20 20 20 20 6d 75 74  mutex2);.    mut
c970: 65 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65 61  exOwner = pthrea
c980: 64 5f 73 65 6c 66 28 29 3b 0a 20 20 7d 0a 20 20  d_self();.  }.  
c990: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
c9a0: 6c 6f 63 6b 28 26 6d 75 74 65 78 31 29 3b 0a 23  lock(&mutex1);.#
c9b0: 65 6e 64 69 66 0a 20 20 69 6e 4d 75 74 65 78 2b  endif.  inMutex+
c9c0: 2b 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  +;.}.void sqlite
c9d0: 33 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28  3UnixLeaveMutex(
c9e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d  ){.  assert( inM
c9f0: 75 74 65 78 3e 30 20 29 3b 0a 23 69 66 64 65 66  utex>0 );.#ifdef
ca00: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
ca10: 45 41 44 53 0a 20 20 61 73 73 65 72 74 28 20 70  EADS.  assert( p
ca20: 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74  thread_equal(mut
ca30: 65 78 4f 77 6e 65 72 2c 20 70 74 68 72 65 61 64  exOwner, pthread
ca40: 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20 20 70 74  _self()) );.  pt
ca50: 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
ca60: 28 26 6d 75 74 65 78 31 29 3b 0a 20 20 69 6e 4d  (&mutex1);.  inM
ca70: 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 69 6e  utex--;.  if( in
ca80: 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
ca90: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
caa0: 6c 6f 63 6b 28 26 6d 75 74 65 78 32 29 3b 0a 20  lock(&mutex2);. 
cab0: 20 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74   }.  pthread_mut
cac0: 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
cad0: 31 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75  1);.#else.  inMu
cae0: 74 65 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a  tex--;.#endif.}.
caf0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
cb00: 55 45 20 69 66 20 74 68 65 20 6d 75 74 65 78 20  UE if the mutex 
cb10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  is currently hel
cb20: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
cb30: 74 68 69 73 54 68 72 65 61 64 4f 6e 6c 79 20 70  thisThreadOnly p
cb40: 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65  arameter is true
cb50: 2c 20 72 65 74 75 72 6e 20 74 72 75 65 20 6f 6e  , return true on
cb60: 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ly if the.** cal
cb70: 6c 69 6e 67 20 74 68 72 65 61 64 20 68 6f 6c 64  ling thread hold
cb80: 73 20 74 68 65 20 6d 75 74 65 78 2e 20 20 49 66  s the mutex.  If
cb90: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
cba0: 73 20 66 61 6c 73 65 2c 20 72 65 74 75 72 6e 0a  s false, return.
cbb0: 2a 2a 20 74 72 75 65 20 69 66 20 61 6e 79 20 74  ** true if any t
cbc0: 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20  hread holds the 
cbd0: 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mutex..*/.int sq
cbe0: 6c 69 74 65 33 55 6e 69 78 49 6e 4d 75 74 65 78  lite3UnixInMutex
cbf0: 28 69 6e 74 20 74 68 69 73 54 68 72 65 61 64 4f  (int thisThreadO
cc00: 6e 6c 79 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nly){.#ifdef SQL
cc10: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
cc20: 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65  .  return inMute
cc30: 78 3e 30 20 26 26 20 0a 20 20 20 20 20 20 20 20  x>0 && .        
cc40: 20 20 20 28 74 68 69 73 54 68 72 65 61 64 4f 6e     (thisThreadOn
cc50: 6c 79 3d 3d 30 20 7c 7c 20 70 74 68 72 65 61 64  ly==0 || pthread
cc60: 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65  _equal(mutexOwne
cc70: 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  r, pthread_self(
cc80: 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  )));.#else.  ret
cc90: 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30 3b 0a 23  urn inMutex>0;.#
cca0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
ccb0: 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d 62  emember the numb
ccc0: 65 72 20 6f 66 20 74 68 72 65 61 64 2d 73 70 65  er of thread-spe
ccd0: 63 69 66 69 63 2d 64 61 74 61 20 62 6c 6f 63 6b  cific-data block
cce0: 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20  s allocated..** 
ccf0: 55 73 65 20 74 68 69 73 20 74 6f 20 76 65 72 69  Use this to veri
cd00: 66 79 20 74 68 61 74 20 77 65 20 61 72 65 20 6e  fy that we are n
cd10: 6f 74 20 6c 65 61 6b 69 6e 67 20 74 68 72 65 61  ot leaking threa
cd20: 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 2e  d-specific-data.
cd30: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 36 30 31  .** Ticket #1601
cd40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
cd50: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
cd60: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 3d 20 30  e3_tsd_count = 0
cd70: 3b 0a 23 20 69 66 64 65 66 20 53 51 4c 49 54 45  ;.# ifdef SQLITE
cd80: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
cd90: 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61 64    static pthread
cda0: 5f 6d 75 74 65 78 5f 74 20 74 73 64 5f 63 6f 75  _mutex_t tsd_cou
cdb0: 6e 74 65 72 5f 6d 75 74 65 78 20 3d 20 50 54 48  nter_mutex = PTH
cdc0: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
cdd0: 41 4c 49 5a 45 52 3b 0a 23 20 20 20 64 65 66 69  ALIZER;.#   defi
cde0: 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e  ne TSD_COUNTER(N
cdf0: 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) \.            
ce00: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
ce10: 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72  ock(&tsd_counter
ce20: 5f 6d 75 74 65 78 29 3b 20 5c 0a 20 20 20 20 20  _mutex); \.     
ce30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ce40: 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 3b 20  tsd_count += N; 
ce50: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  \.             p
ce60: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
ce70: 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e 74 65 72  ock(&tsd_counter
ce80: 5f 6d 75 74 65 78 29 3b 0a 23 20 65 6c 73 65 0a  _mutex);.# else.
ce90: 23 20 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43  #   define TSD_C
cea0: 4f 55 4e 54 45 52 28 4e 29 20 20 73 71 6c 69 74  OUNTER(N)  sqlit
ceb0: 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20  e3_tsd_count += 
cec0: 4e 0a 23 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a  N.# endif.#else.
ced0: 23 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55  # define TSD_COU
cee0: 4e 54 45 52 28 4e 29 20 20 2f 2a 20 6e 6f 2d 6f  NTER(N)  /* no-o
cef0: 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  p */.#endif../*.
cf00: 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74  ** If called wit
cf10: 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30  h allocateFlag>0
cf20: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
cf30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 72 65 61  pointer to threa
cf40: 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61  d.** specific da
cf50: 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
cf60: 6e 74 20 74 68 72 65 61 64 2e 20 20 41 6c 6c 6f  nt thread.  Allo
cf70: 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20 74 68  cate and zero th
cf80: 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73 70 65 63  e.** thread-spec
cf90: 69 66 69 63 20 64 61 74 61 20 69 66 20 69 74 20  ific data if it 
cfa0: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
cfb0: 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   exist..**.** If
cfc0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c   called with all
cfd0: 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74 68  ocateFlag==0, th
cfe0: 65 6e 20 63 68 65 63 6b 20 74 68 65 20 63 75 72  en check the cur
cff0: 72 65 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20 73  rent thread.** s
d000: 70 65 63 69 66 69 63 20 64 61 74 61 2e 20 20 52  pecific data.  R
d010: 65 74 75 72 6e 20 69 74 20 69 66 20 69 74 20 65  eturn it if it e
d020: 78 69 73 74 73 2e 20 20 49 66 20 69 74 20 64 6f  xists.  If it do
d030: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a  es not exist,.**
d040: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55 4c   then return NUL
d050: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c  L..**.** If call
d060: 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65  ed with allocate
d070: 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b 20 74 6f  Flag<0, check to
d080: 20 73 65 65 20 69 66 20 74 68 65 20 74 68 72 65   see if the thre
d090: 61 64 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad specific.** d
d0a0: 61 74 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ata is allocated
d0b0: 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72 6f   and is all zero
d0c0: 2e 20 20 49 66 20 69 74 20 69 73 20 74 68 65 6e  .  If it is then
d0d0: 20 64 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e 0a   deallocate it..
d0e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
d0f0: 74 65 72 20 74 6f 20 74 68 65 20 74 68 72 65 61  ter to the threa
d100: 64 20 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d specific data 
d110: 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  or NULL if it is
d120: 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20  .** unallocated 
d130: 6f 72 20 67 65 74 73 20 64 65 61 6c 6c 6f 63 61  or gets dealloca
d140: 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44 61  ted..*/.ThreadDa
d150: 74 61 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 54  ta *sqlite3UnixT
d160: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
d170: 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74 65 46 6c  a(int allocateFl
d180: 61 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ag){.  static co
d190: 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 7a  nst ThreadData z
d1a0: 65 72 6f 44 61 74 61 20 3d 20 7b 30 7d 3b 20 20  eroData = {0};  
d1b0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 72 20 74  /* Initializer t
d1c0: 6f 20 73 69 6c 65 6e 63 65 20 77 61 72 6e 69 6e  o silence warnin
d1d0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  gs.             
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
d200: 20 66 72 6f 6d 20 62 72 6f 6b 65 6e 20 63 6f 6d   from broken com
d210: 70 69 6c 65 72 73 20 2a 2f 0a 23 69 66 64 65 66  pilers */.#ifdef
d220: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
d230: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 70 74  EADS.  static pt
d240: 68 72 65 61 64 5f 6b 65 79 5f 74 20 6b 65 79 3b  hread_key_t key;
d250: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65  .  static int ke
d260: 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54 68 72  yInit = 0;.  Thr
d270: 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b 0a 0a  eadData *pTsd;..
d280: 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29    if( !keyInit )
d290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45  {.    sqlite3OsE
d2a0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
d2b0: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
d2c0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
d2d0: 20 20 20 20 20 72 63 20 3d 20 70 74 68 72 65 61       rc = pthrea
d2e0: 64 5f 6b 65 79 5f 63 72 65 61 74 65 28 26 6b 65  d_key_create(&ke
d2f0: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  y, 0);.      if(
d300: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73   rc ){.        s
d310: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
d320: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ex();.        re
d330: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
d340: 20 20 20 20 20 20 6b 65 79 49 6e 69 74 20 3d 20        keyInit = 
d350: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  1;.    }.    sql
d360: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
d370: 28 29 3b 0a 20 20 7d 0a 0a 20 20 70 54 73 64 20  ();.  }..  pTsd 
d380: 3d 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65  = pthread_getspe
d390: 63 69 66 69 63 28 6b 65 79 29 3b 0a 20 20 69 66  cific(key);.  if
d3a0: 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30  ( allocateFlag>0
d3b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64   ){.    if( pTsd
d3c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
d3d0: 20 21 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c   !sqlite3TestMal
d3e0: 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20  locFail() ){.   
d3f0: 20 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69       pTsd = sqli
d400: 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 73 69 7a 65  te3OsMalloc(size
d410: 6f 66 28 7a 65 72 6f 44 61 74 61 29 29 3b 0a 20  of(zeroData));. 
d420: 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
d430: 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
d440: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73 46 61      sqlite3_isFa
d450: 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
d460: 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29 7b       if( pTsd ){
d470: 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d  .        *pTsd =
d480: 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20   zeroData;.     
d490: 20 20 20 70 74 68 72 65 61 64 5f 73 65 74 73 70     pthread_setsp
d4a0: 65 63 69 66 69 63 28 6b 65 79 2c 20 70 54 73 64  ecific(key, pTsd
d4b0: 29 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f 43  );.        TSD_C
d4c0: 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20 20 20 20  OUNTER(+1);.    
d4d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
d4e0: 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26 26  e if( pTsd!=0 &&
d4f0: 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 20   allocateFlag<0 
d500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
d510: 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a 65  memcmp(pTsd, &ze
d520: 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 54  roData, sizeof(T
d530: 68 72 65 61 64 44 61 74 61 29 29 3d 3d 30 20 29  hreadData))==0 )
d540: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  {.    sqlite3OsF
d550: 72 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 70  ree(pTsd);.    p
d560: 74 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66  thread_setspecif
d570: 69 63 28 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ic(key, 0);.    
d580: 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b  TSD_COUNTER(-1);
d590: 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20  .    pTsd = 0;. 
d5a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64   }.  return pTsd
d5b0: 3b 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63  ;.#else.  static
d5c0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
d5d0: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  d = 0;.  if( all
d5e0: 6f 63 61 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20  ocateFlag>0 ){. 
d5f0: 20 20 20 69 66 28 20 70 54 73 64 3d 3d 30 20 29     if( pTsd==0 )
d600: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
d610: 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61  ite3TestMallocFa
d620: 69 6c 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  il() ){.        
d630: 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73  pTsd = sqlite3Os
d640: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 7a  Malloc( sizeof(z
d650: 65 72 6f 44 61 74 61 29 20 29 3b 0a 20 20 20 20  eroData) );.    
d660: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d670: 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20  E_MEMDEBUG.     
d680: 20 73 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20   sqlite3_isFail 
d690: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
d6a0: 20 20 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20    if( pTsd ){.  
d6b0: 20 20 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65        *pTsd = ze
d6c0: 72 6f 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  roData;.        
d6d0: 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b  TSD_COUNTER(+1);
d6e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d6f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64 21   }else if( pTsd!
d700: 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c  =0 && allocateFl
d710: 61 67 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20  ag<0.           
d720: 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c   && memcmp(pTsd,
d730: 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65   &zeroData, size
d740: 6f 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d  of(ThreadData))=
d750: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d760: 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20  3OsFree(pTsd);. 
d770: 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d     TSD_COUNTER(-
d780: 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30  1);.    pTsd = 0
d790: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
d7a0: 54 73 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  Tsd;.#endif.}../
d7b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d7c0: 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
d7d0: 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
d7e0: 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73  o value, becomes
d7f0: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72   the result.** r
d800: 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c  eturned from sql
d810: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
d820: 65 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73  e().  This is us
d830: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a  ed for testing..
d840: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d850: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
d860: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
d870: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
d880: 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
d890: 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
d8a0: 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
d8b0: 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
d8c0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
d8d0: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
d8e0: 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
d8f0: 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
d900: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
d910: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
d920: 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
d930: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
d940: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
d950: 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 28 64  nixCurrentTime(d
d960: 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23  ouble *prNow){.#
d970: 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a  ifdef NO_GETTOD.
d980: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
d990: 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
d9a0: 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
d9b0: 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a  440587.5;.#else.
d9c0: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
d9d0: 20 73 4e 6f 77 3b 0a 20 20 73 74 72 75 63 74 20   sNow;.  struct 
d9e0: 74 69 6d 65 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f  timezone sTz;  /
d9f0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
da00: 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
da10: 6f 77 2c 20 26 73 54 7a 29 3b 0a 20 20 2a 70 72  ow, &sTz);.  *pr
da20: 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20  Now = 2440587.5 
da30: 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36  + sNow.tv_sec/86
da40: 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f  400.0 + sNow.tv_
da50: 75 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30  usec/86400000000
da60: 2e 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .0;.#endif.#ifde
da70: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
da80: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
da90: 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
daa0: 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33  *prNow = sqlite3
dab0: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36  _current_time/86
dac0: 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
dad0: 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  5;.  }.#endif.  
dae0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e  return 0;.}..#en
daf0: 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a  dif /* OS_UNIX *
db00: 2f 0a                                            /.