System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact a4fa8871c85e4daf90867c3f83fd1f1c36b80d60:


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 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
0740: 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
0750: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0760: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0770: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0780: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0790: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
07a0: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
07b0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07c0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07e0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
0800: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0810: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0820: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if..../*.** The 
0830: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
0840: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
0850: 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69 66 69  f OsFile specifi
0860: 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a  c for the unix.*
0870: 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61  * protability la
0880: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0890: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
08a0: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
08b0: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 49 6f   unixFile {.  Io
08c0: 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d  Method const *pM
08d0: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
08e0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
08f0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70  y */.  struct op
0900: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0910: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0920: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0930: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0940: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
0950: 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66  *pLock;   /* Inf
0960: 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e  o about locks on
0970: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23   this inode */.#
0980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0990: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
09a0: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
09b0: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
09c0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
09d0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
09e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
09f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0a00: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 69 6e 74 20  _STYLE */.  int 
0a10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
0a30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
0a40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0a50: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54  locktype;   /* T
0a60: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
0a70: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
0a80: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0a90: 61 72 20 69 73 4f 70 65 6e 3b 20 20 20 20 20 2f  ar isOpen;     /
0aa0: 2a 20 54 72 75 65 20 69 66 20 6e 65 65 64 73 20  * True if needs 
0ab0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
0ac0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0ad0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 2f 2a 20 55  fullSync;   /* U
0ae0: 73 65 20 46 5f 46 55 4c 4c 53 59 4e 43 20 69 66  se F_FULLSYNC if
0af0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
0b00: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0b30: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0b40: 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 20  /.  i64 offset; 
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b60: 20 53 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   Seek offset */.
0b70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
0b80: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
0b90: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0bb0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0bc0: 20 74 68 69 73 20 4f 73 46 69 6c 65 20 2a 2f 0a   this OsFile */.
0bd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
0be0: 20 50 72 6f 76 69 64 65 20 74 68 65 20 61 62 69   Provide the abi
0bf0: 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
0c00: 20 73 6f 6d 65 20 4f 53 2d 6c 61 79 65 72 20 66   some OS-layer f
0c10: 75 6e 63 74 69 6f 6e 73 20 64 75 72 69 6e 67 0a  unctions during.
0c20: 2a 2a 20 74 65 73 74 69 6e 67 2e 20 20 54 68 69  ** testing.  Thi
0c30: 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 69 6d  s is used to sim
0c40: 75 6c 61 74 65 20 4f 53 20 63 72 61 73 68 65 73  ulate OS crashes
0c50: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
0c60: 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 61 72 65 20  .** commits are 
0c70: 61 74 6f 6d 69 63 20 65 76 65 6e 20 69 6e 20 74  atomic even in t
0c80: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 4f  he event of an O
0c90: 53 20 63 72 61 73 68 2e 0a 2a 2f 0a 23 69 66 64  S crash..*/.#ifd
0ca0: 65 66 20 53 51 4c 49 54 45 5f 43 52 41 53 48 5f  ef SQLITE_CRASH_
0cb0: 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
0cc0: 74 20 73 71 6c 69 74 65 33 43 72 61 73 68 54 65  t sqlite3CrashTe
0cd0: 73 74 45 6e 61 62 6c 65 3b 0a 20 20 65 78 74 65  stEnable;.  exte
0ce0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0cf0: 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65  ashOpenReadWrite
0d00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73  (const char*, Os
0d10: 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20  File**, int*);. 
0d20: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
0d30: 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c  te3CrashOpenExcl
0d40: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
0d50: 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74  *, OsFile**, int
0d60: 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
0d70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d80: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
0d90: 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20  har*, OsFile**, 
0da0: 69 6e 74 29 3b 0a 23 20 64 65 66 69 6e 65 20 43  int);.# define C
0db0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
0dc0: 44 45 28 58 2c 41 2c 42 2c 43 29 20 5c 0a 20 20  DE(X,A,B,C) \.  
0dd0: 20 20 69 66 28 73 71 6c 69 74 65 33 43 72 61 73    if(sqlite3Cras
0de0: 68 54 65 73 74 45 6e 61 62 6c 65 29 7b 20 72 65  hTestEnable){ re
0df0: 74 75 72 6e 20 58 28 41 2c 42 2c 43 29 3b 20 7d  turn X(A,B,C); }
0e00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0e10: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
0e20: 49 44 45 28 58 2c 41 2c 42 2c 43 29 20 20 2f 2a  IDE(X,A,B,C)  /*
0e30: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
0e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  .../*.** Include
0e50: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0e60: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0e70: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0e80: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0e90: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  h"../*.** Do not
0ea0: 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20   include any of 
0eb0: 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74  the File I/O int
0ec0: 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65  erface procedure
0ed0: 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49  s if the.** SQLI
0ee0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d  TE_OMIT_DISKIO m
0ef0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
0f00: 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
0f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0f20: 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f   will be in-memo
0f30: 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e  ry only).*/.#ifn
0f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0f50: 44 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  DISKIO.../*.** D
0f60: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
0f70: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
0f80: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
0f90: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
0fa0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
0fb0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
0fc0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
0fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
0fe0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
0ff0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
1000: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
1010: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1020: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
1030: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
1040: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1050: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
1060: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
1070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1080: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
1090: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
10a0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
10b0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
10c0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
10d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
10e0: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
10f0: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
1100: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
1110: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
1120: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
1130: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
1140: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
1150: 50 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53  P.  But it's DOS
1160: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1170: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1180: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1190: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
11a0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
11b0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
11c0: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
11d0: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
11e0: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
11f0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1200: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1220: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23  E_UNIX_THREADS.#
1230: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
1240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
1250: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
1260: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65  /*.** Set or che
1280: 63 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69  ck the OsFile.ti
1290: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
12a0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
12b0: 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73   an OsFile.** is
12c0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
12d0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
12e0: 73 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c  ses of the OsFil
12f0: 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1300: 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64  e.** same thread
1310: 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e   is operating on
1320: 20 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f   the OsFile.  So
1330: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
1340: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
1350: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
1360: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
1370: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
1380: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
1390: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
13a0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
13b0: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
13c0: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
13d0: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
13e0: 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c  another.  This l
13f0: 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20  ogic makes sure 
1400: 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  a user does not 
1410: 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a  try to do that.*
1420: 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a  * by mistake..**
1430: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
1440: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
1450: 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20   OsFiles can be 
1460: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
1470: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
1480: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
1490: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
14a0: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
14b0: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
14c0: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
14d0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
14e0: 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d  (which now the m
14f0: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
1500: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
1510: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
1520: 20 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65    But the OsFile
1530: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
1540: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
1550: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
1560: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
1570: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
1580: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
1590: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
15a0: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
15b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15c0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
15d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15e0: 55 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20  UNIX_THREADS).# 
15f0: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
1600: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
1610: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
1620: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
1630: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
1640: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1650: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
1660: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
1690: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
16a0: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
16b0: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
16c0: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
16d0: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
16e0: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
16f0: 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68  /*.** Here is th
1700: 65 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20  e dirt on POSIX 
1710: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20  advisory locks: 
1720: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
1730: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
1740: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
1750: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
1760: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
1770: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
1780: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
1790: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
17a0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
17b0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
17c0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
17d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
17e0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
17f0: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
1800: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
1810: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
1820: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
1830: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
1840: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
1850: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
1860: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
1870: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
1880: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
1890: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
18a0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
18b0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
18c0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
18d0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
18e0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
18f0: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
1900: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
1910: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
1920: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
1930: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
1940: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
1950: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
1960: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
1970: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
1980: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1990: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
19a0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
19b0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
19c0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
19d0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
19e0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
19f0: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
1a00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
1a10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
1a20: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
1a30: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
1a40: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
1a50: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
1a60: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
1a70: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
1a80: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
1a90: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
1aa0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
1ab0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1ac0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
1ad0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
1ae0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
1af0: 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66  *.** Bummer.  If
1b00: 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69   you ask me, thi
1b10: 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61  s is broken.  Ba
1b20: 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20  dly broken.  It 
1b30: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
1b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
1b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
1b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
1b70: 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70  ss among.** comp
1b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
1b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
1bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
1bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
1bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
1be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
1bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
1c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
1c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
1c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
1c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
1c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
1c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
1c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
1c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
1c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
1c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
1ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
1cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
1cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
1cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
1cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
1d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
1d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
1d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
1d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
1d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
1d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
1d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
1d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
1d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
1da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
1db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
1dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
1dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
1de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
1df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
1e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
1e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
1e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
1e30: 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73  .** The OsFile s
1e40: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1e50: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1e60: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1e70: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1e80: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1e90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ea0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1eb0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1ec0: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1ed0: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1ee0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1ef0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1f00: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1f10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1f20: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1f30: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1f40: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1f50: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1f60: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1f70: 74 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69  twice, both OsFi
1f80: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
1f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
1fa0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
1fb0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
1fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1fd0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
1fe0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
1ff0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
2000: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
2010: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
2020: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
2030: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
2040: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
2050: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
2060: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
2070: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
2080: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
2090: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
20a0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
20b0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
20c0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
20d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
20e0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
20f0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
2100: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
2110: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
2120: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
2130: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2140: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
2150: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
2160: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
2170: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
2180: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
2190: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
21a0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
21b0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
21c0: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
21d0: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
21e0: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
21f0: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
2200: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
2210: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
2220: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
2230: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
2240: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2250: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
2260: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
2270: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
2280: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2290: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
22a0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
22b0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
22c0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
22d0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
22e0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
22f0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2300: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2310: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2320: 6d 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73  m, each OsFile s
2330: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
2340: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
2350: 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72  o an openCnt str
2360: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
2370: 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74  s one openCnt st
2380: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f  ructure.** per o
2390: 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68  pen inode, which
23a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74   means that mult
23b0: 69 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e  iple OsFiles can
23c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
23d0: 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20  le.** openCnt.  
23e0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
23f0: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
2400: 20 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74   an OsFile, if t
2410: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
2420: 72 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f  r OsFiles open o
2430: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
2440: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
2450: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
2460: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
2470: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2480: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
2490: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
24a0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
24b0: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
24c0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
24d0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
24e0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
24f0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2500: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2510: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2520: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2530: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
2540: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
2550: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
2560: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
2570: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
2580: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
2590: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
25a0: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
25b0: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
25c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
25d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
25e0: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
25f0: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2600: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2610: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2620: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2630: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
2640: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
2650: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
2660: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
2670: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
2680: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
2690: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
26a0: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
26b0: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
26c0: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
26d0: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
26e0: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
26f0: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2700: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2710: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2720: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2730: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
2740: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
2750: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
2760: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
2770: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
2780: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
2790: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
27a0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
27b0: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
27c0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
27d0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
27e0: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
27f0: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2800: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2810: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2820: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2830: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2840: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
2850: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
2860: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
2870: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
2880: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
2890: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
28a0: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
28b0: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
28c0: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
28d0: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
28e0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
28f0: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2900: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2910: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2920: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2930: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
2940: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
2950: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
2960: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
2970: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2980: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2990: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
29a0: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
29b0: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
29c0: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
29d0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
29e0: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
29f0: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2a00: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2a10: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2a20: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2a30: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
2a40: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
2a50: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
2a60: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
2a70: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
2a80: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
2a90: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
2aa0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2ab0: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2ac0: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2ad0: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2ae0: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2af0: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2b00: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2b10: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2b20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2b30: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2b40: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
2b50: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
2b60: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
2b70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
2b80: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2b90: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2ba0: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2bb0: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2bc0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2bd0: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2be0: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2bf0: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2c00: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2c10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2c20: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2c30: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2c40: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c60: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2c70: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2c80: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2c90: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2ca0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2cb0: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2cc0: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2cd0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2ce0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2cf0: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2d00: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2d10: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2d20: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2d30: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2d40: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2d50: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2d60: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2d70: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2d80: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2d90: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2da0: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2db0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2dc0: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2dd0: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2de0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2df0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2e00: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2e10: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2e20: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
2e30: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
2e40: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
2e50: 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64  r zero if thread
2e60: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2e70: 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e  ach other */.#en
2e80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
2e90: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2ea0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2eb0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2ec0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
2ed0: 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68  ** inode on each
2ee0: 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64   thread with a d
2ef0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
2f00: 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68   ID.  (Threads h
2f10: 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ave.** different
2f20: 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20   process IDs on 
2f30: 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f  linux, but not o
2f40: 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69  n most other uni
2f50: 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69  xes.).**.** A si
2f60: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
2f70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
2f80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
2f90: 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a  o each OsFile.**
2fa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
2fb0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
2fc0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2fd0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
2fe0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
2ff0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
3000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73  the number of Os
3010: 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74  Files pointing t
3020: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
3030: 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72  lockInfo {.  str
3040: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b  uct lockKey key;
3050: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
3060: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
3070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3080: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
3090: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
30a0: 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20    int locktype; 
30b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
30d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
30e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3100: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3110: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
3120: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
3130: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3150: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
3160: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
3170: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
3180: 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20  ticular openCnt 
3190: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
31a0: 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  its inode.  This
31b0: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
31c0: 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65  as the lockKey e
31d0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
31e0: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
31f0: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ted..*/.struct o
3200: 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74  penKey {.  dev_t
3210: 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63   dev;   /* Devic
3220: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
3230: 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e  o_t ino;   /* In
3240: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b  ode number */.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3260: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3270: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
3280: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3290: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
32a0: 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  de.  This struct
32b0: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
32c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
32d0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a   locks on that.*
32e0: 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63  * inode.  If a c
32f0: 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65  lose is attempte
3300: 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f  d against an ino
3310: 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69  de that is holdi
3320: 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65  ng.** locks, the
3330: 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72   close is deferr
3340: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63  ed until all loc
3350: 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69  ks clear by addi
3360: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ng the.** file d
3370: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
3380: 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65  closed to the pe
3390: 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nding list..*/.s
33a0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a  truct openCnt {.
33b0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79    struct openKey
33c0: 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c   key;   /* The l
33d0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
33e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
33f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3400: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
3410: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3420: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
3430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3440: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
3450: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   locks */.  int 
3460: 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20  nPending;       
3470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3480: 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f  ending close() o
3490: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
34a0: 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20  nt *aPending;   
34b0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64       /* Malloced
34c0: 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66   space holding f
34d0: 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63  d's awaiting a c
34e0: 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lose() */.};../*
34f0: 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20   .** These hash 
3500: 74 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65  tables map inode
3510: 73 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72  s and file descr
3520: 69 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20  iptors (really, 
3530: 6c 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f  lockKey and.** o
3540: 70 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65  penKey structure
3550: 73 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  s) into lockInfo
3560: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72   and openCnt str
3570: 75 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73  uctures.  Access
3580: 20 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61   to .** these ha
3590: 73 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  sh tables must b
35a0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  e protected by a
35b0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
35c0: 63 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20  c Hash lockHash 
35d0: 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  = {SQLITE_HASH_B
35e0: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
3600: 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73 71  adSafeMalloc, sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
3620: 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 73 74 61 74  ree, 0, 0};.stat
3630: 69 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73 68  ic Hash openHash
3640: 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f   = {SQLITE_HASH_
3650: 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c  BINARY, 0, 0, 0,
3660: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72   .    sqlite3Thr
3670: 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73  eadSafeMalloc, s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 46 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  Free, 0, 0};..#i
36a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
36b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
36d0: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
36e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
36f0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
3700: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
3710: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
3720: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
3730: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
3740: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3750: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3760: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3770: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3780: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3790: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
37a0: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
37b0: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37c0: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
37d0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
37e0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
37f0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
3800: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
3810: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
3820: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
3830: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
3840: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3850: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3860: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3870: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3880: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3890: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
38a0: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
38b0: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
38c0: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
38d0: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
38e0: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
38f0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
3900: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3910: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3920: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3930: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
3940: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3950: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3960: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3970: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3980: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3990: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
39a0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
39b0: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
39c0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
39d0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
39e0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 70 6f 73  edef enum {..pos
39f0: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ixLockingStyle =
3a00: 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74 61   0,       /* sta
3a10: 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76 69  ndard posix-advi
3a20: 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 09 61  sory locks */..a
3a30: 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20  fpLockingStyle, 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75              /* u
3a50: 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a  se afp locks */.
3a60: 09 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  .flockLockingSty
3a70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le,           /*
3a80: 20 75 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a   use flock() */.
3a90: 09 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  .dotlockLockingS
3aa0: 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  tyle,         /*
3ab0: 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b   use <file>.lock
3ac0: 20 66 69 6c 65 73 20 2a 2f 0a 09 6e 6f 4c 6f 63   files */..noLoc
3ad0: 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20  kingStyle,      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75          /* usefu
3af0: 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  l for read-only 
3b00: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 09  file system */..
3b10: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
3b20: 6e 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20  ngStyle      /* 
3b30: 69 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70  indicates unsupp
3b40: 6f 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65  orted file syste
3b50: 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f  m */.} sqlite3Lo
3b60: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64  ckingStyle;.#end
3b70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
3b80: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3b90: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
3ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
3bb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
3bc0: 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65  able records whe
3bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
3be0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
3bf0: 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20   each others.** 
3c00: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  locks..**.**    
3c10: 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73  0:  No.  Threads
3c20: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
3c30: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
3c40: 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65  ks..**    1:  Ye
3c50: 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20  s.  Threads can 
3c60: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3c70: 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20  hers locks..**  
3c80: 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b   -1:  We don't k
3c90: 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f  now yet..**.** O
3ca0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
3cb0: 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  we know at compi
3cc0: 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61  le-time if threa
3cd0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3ce0: 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c  each.** others l
3cf0: 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20  ocks.  On those 
3d00: 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c  systems, the SQL
3d10: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3d20: 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a  IDE_LOCK macro.*
3d30: 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70  * will be set ap
3d40: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e  propriately.  On
3d50: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20   other systems, 
3d60: 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b  we have to check
3d70: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20   at.** runtime. 
3d80: 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72   On these latter
3d90: 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45   systems, SQLTIE
3da0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3db0: 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65  _LOCK is.** unde
3dc0: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  fined..**.** Thi
3dd0: 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61  s variable norma
3de0: 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f  lly has file sco
3df0: 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75  pe only.  But du
3e00: 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65  ring testing, we
3e10: 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c   make.** it a gl
3e20: 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  obal so that the
3e30: 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63   test code can c
3e40: 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20  hange its value 
3e50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
3e60: 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  fy.** that the r
3e70: 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65  ight stuff happe
3e80: 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  ns in either cas
3e90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
3ea0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3eb0: 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RIDE_LOCK.# defi
3ec0: 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ne SQLITE_THREAD
3ed0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d  _OVERRIDE_LOCK -
3ee0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  1.#endif.#ifdef 
3ef0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
3f00: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
3f10: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
3f20: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3f30: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65  VERRIDE_LOCK;.#e
3f40: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
3f50: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3f60: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3f70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3f80: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e  ERRIDE_LOCK;.#en
3f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3fa0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
3fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
3fc0: 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75  ed into individu
3fd0: 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61  al test.** threa
3fe0: 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68  ds by the testTh
3ff0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4000: 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ior() routine..*
4010: 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54  /.struct threadT
4020: 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  estData {.  int 
4030: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
4040: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65     /* File to be
4050: 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72   locked */.  str
4060: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20  uct flock lock; 
4070: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69      /* The locki
4080: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
4090: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20    int result;   
40a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
40b0: 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  lt of the lockin
40c0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d  g operation */.}
40d0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
40e0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
40f0: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
4100: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
4110: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
4120: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
4130: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4140: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
4150: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
4160: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
4170: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
4180: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
4190: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
41a0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
41b0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
41c0: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
41d0: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
41e0: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
41f0: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
4200: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
4210: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
4220: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
4230: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
4240: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
4250: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
4260: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
4270: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
4280: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
4290: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
42a0: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
42b0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
42c0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
42d0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c     s = fcntl(fd,
42e0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
42f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4300: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
4310: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
4320: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
4330: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
4340: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
4350: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
4360: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
4370: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
4380: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
4390: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
43a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
43b0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
43c0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
43d0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
43e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
43f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
4400: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
4410: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
4420: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4430: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
4440: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
4450: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4460: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
4470: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
4480: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
4490: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
44a0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
44b0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
44c0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
44d0: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
44e0: 20 73 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c   s && op==F_SETL
44f0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4500: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
4510: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
4520: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
4530: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
4540: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
4550: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4560: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4570: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4580: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4590: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
45a0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
45b0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
45c0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
45d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
45e0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
45f0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4600: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4620: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4630: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4640: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4650: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4660: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4670: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4680: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4690: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
46a0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
46b0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
46c0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
46d0: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
46e0: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
46f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4700: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
4710: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
4720: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4730: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
4740: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
4750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
4760: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4770: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4780: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4790: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
47a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
47b0: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
47c0: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
47d0: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
47e0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
47f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4800: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
4810: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
4820: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
4830: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
4840: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4870: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4880: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4890: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
48a0: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
48b0: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
48c0: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
48d0: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
48e0: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
48f0: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4900: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
4910: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4920: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
4930: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
4940: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
4950: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
4960: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4970: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4980: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4990: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49a0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
49b0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
49c0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
49d0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
49e0: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
49f0: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a00: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4a10: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4a20: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4a30: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4a40: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4a50: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4a60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4a70: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4a80: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4a90: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4aa0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4ab0: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4ac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4ad0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4ae0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4af0: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b00: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4b10: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4b20: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4b30: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4b40: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4b50: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4b60: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4b70: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4b80: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4b90: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4bb0: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4bc0: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4bd0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4be0: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4bf0: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c00: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4c10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4c20: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4c40: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4c50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4c60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4c70: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4c80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4c90: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4ca0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4cb0: 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ck){.  assert( s
4cc0: 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
4cd0: 31 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63  1) );.  if (pLoc
4ce0: 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72  k == NULL).    r
4cf0: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e  eturn;.  pLock->
4d00: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c  nRef--;.  if( pL
4d10: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
4d20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4d30: 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c  nsert(&lockHash,
4d40: 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69   &pLock->key, si
4d50: 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29  zeof(pLock->key)
4d60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4d70: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
4d80: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4d90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
4da0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4db0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4dc0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
4dd0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
4de0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
4df0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4e00: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4e10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4e20: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4e30: 20 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e    if (pOpen == N
4e40: 55 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b  ULL).    return;
4e50: 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d  .  pOpen->nRef--
4e60: 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e  ;.  if( pOpen->n
4e70: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Ref==0 ){.    sq
4e80: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4e90: 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65  &openHash, &pOpe
4ea0: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  n->key, sizeof(p
4eb0: 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Open->key), 0);.
4ec0: 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e      free(pOpen->
4ed0: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73  aPending);.    s
4ee0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
4ef0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d  Free(pOpen);.  }
4f00: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4f10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
4f20: 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73  _STYLE./*.** Tes
4f30: 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20  ts a byte-range 
4f40: 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f  locking query to
4f50: 20 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e   see if byte ran
4f60: 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a  ge locks are .**
4f70: 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e   supported, if n
4f80: 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  ot we fall back 
4f90: 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  to dotlockLockin
4fa0: 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  gStyle..*/.stati
4fb0: 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67  c sqlite3Locking
4fc0: 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73  Style sqlite3Tes
4fd0: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f  tLockingStyle(co
4fe0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
4ff0: 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b  th, .  int fd) {
5000: 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d  .  /* test byte-
5010: 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
5020: 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75   fcntl */.  stru
5030: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
5040: 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f  o;.  .  lockInfo
5050: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
5060: 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
5070: 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
5080: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
5090: 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
50a0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
50b0: 0a 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28  .  .  if (fcntl(
50c0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 28 69 6e  fd, F_GETLK, (in
50d0: 74 29 20 26 6c 6f 63 6b 49 6e 66 6f 29 20 21 3d  t) &lockInfo) !=
50e0: 20 2d 31 29 20 7b 0a 20 20 20 20 72 65 74 75 72   -1) {.    retur
50f0: 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74  n posixLockingSt
5100: 79 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f  yle;.  } .  .  /
5110: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c  * testing for fl
5120: 6f 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c  ock can give fal
5130: 73 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53  se positives.  S
5140: 6f 20 69 66 20 69 66 20 74 68 65 20 61 62 6f 76  o if if the abov
5150: 65 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c  e test.  ** fail
5160: 73 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20  s, then we fall 
5170: 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f  back to using do
5180: 74 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63  t-lock style loc
5190: 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72  king..  */  .  r
51a0: 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63  eturn dotlockLoc
51b0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a  kingStyle;.}../*
51c0: 20 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68   .** Examines th
51d0: 65 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65  e f_fstypename e
51e0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74  ntry in the stat
51f0: 66 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20  fs structure as 
5200: 72 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20  returned by .** 
5210: 73 74 61 74 28 29 20 66 6f 72 20 74 68 65 20 66  stat() for the f
5220: 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69  ile system hosti
5230: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
5240: 66 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68  file, assigns th
5250: 65 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  e .** appropriat
5260: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  e locking style 
5270: 62 61 73 65 64 20 6f 6e 20 69 74 27 73 20 76 61  based on it's va
5280: 6c 75 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75  lue.  These valu
5290: 65 73 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67  es and .** assig
52a0: 6e 6d 65 6e 74 73 20 61 72 65 20 62 61 73 65 64  nments are based
52b0: 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62   on Darwin/OSX b
52c0: 65 68 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65  ehavior and have
52d0: 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64   not been tested
52e0: 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79   on .** other sy
52f0: 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stems..*/.static
5300: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
5310: 74 79 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65  tyle sqlite3Dete
5320: 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63  ctLockingStyle(c
5330: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
5340: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20  ath, .  int fd) 
5350: 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  {..#ifdef SQLITE
5360: 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53  _FIXED_LOCKING_S
5370: 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28 73  TYLE.  return (s
5380: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
5390: 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  le)SQLITE_FIXED_
53a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23  LOCKING_STYLE;.#
53b0: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
53c0: 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20  atfs fsInfo;..  
53d0: 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65 50  if (statfs(fileP
53e0: 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
53f0: 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e 20   -1).    return 
5400: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5410: 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68  ngStyle(filePath
5420: 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20 28  , fd);.  .  if (
5430: 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
5440: 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20 20   MNT_RDONLY).   
5450: 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69 6e   return noLockin
5460: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
5470: 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f   (!strcmp(fsInfo
5480: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5490: 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28 21  hfs")) ||.    (!
54a0: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
54b0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66 73  fstypename, "ufs
54c0: 22 29 29 20 29 0a 09 09 72 65 74 75 72 6e 20 70  ")) )...return p
54d0: 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  osixLockingStyle
54e0: 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d  ;.  .  if(!strcm
54f0: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5500: 65 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29  ename, "afpfs"))
5510: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c  .    return afpL
5520: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5530: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
5540: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5550: 2c 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72  , "nfs")) .    r
5560: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73  eturn sqlite3Tes
5570: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69  tLockingStyle(fi
5580: 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a  lePath, fd);.  .
5590: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
55a0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
55b0: 2c 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20  , "smbfs")).    
55c0: 72 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b  return flockLock
55d0: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69  ingStyle;.  .  i
55e0: 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f(!strcmp(fsInfo
55f0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5600: 6d 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74  msdos")).    ret
5610: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
5620: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5630: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5640: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77  f_fstypename, "w
5650: 65 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74  ebdav")).    ret
5660: 75 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c  urn unsupportedL
5670: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5680: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5690: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
56a0: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20  (filePath, fd); 
56b0: 20 0a 23 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49   .#endif // SQLI
56c0: 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47  TE_FIXED_LOCKING
56d0: 5f 53 54 59 4c 45 0a 7d 0a 0a 23 65 6e 64 69 66  _STYLE.}..#endif
56e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
56f0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
5700: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
5710: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5720: 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e  r, locate lockIn
5730: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73  fo and openCnt s
5740: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a  tructures that.*
5750: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
5760: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5770: 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e  .  Create new on
5780: 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  es if necessary.
5790: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
57a0: 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20  values might be 
57b0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
57c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
57d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
57e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
57f0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ors..*/.static i
5800: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
5810: 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
5840: 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74  riptor used in t
5850: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
5860: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  ct lockInfo **pp
5870: 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75  Lock,    /* Retu
5880: 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20  rn the lockInfo 
5890: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
58a0: 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  /.  struct openC
58b0: 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20  nt **ppOpen     
58c0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f   /* Return the o
58d0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
58e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
58f0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 6c  t rc;.  struct l
5900: 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73  ockKey key1;.  s
5910: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
5920: 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  y2;.  struct sta
5930: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74 72  t statbuf;.  str
5940: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
5950: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f 70  ock;.  struct op
5960: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20  enCnt *pOpen;.  
5970: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
5980: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
5990: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc!=0 ) return 1
59a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
59b0: 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31 29  ite3OsInMutex(1)
59c0: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65   );.  memset(&ke
59d0: 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  y1, 0, sizeof(ke
59e0: 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76  y1));.  key1.dev
59f0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
5a00: 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  v;.  key1.ino = 
5a10: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
5a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
5a30: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 69 66 28  IX_THREADS.  if(
5a40: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
5a50: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c  EachOthersLocks<
5a60: 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72  0 ){.    testThr
5a70: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
5a80: 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65  or(fd);.  }.  ke
5a90: 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73  y1.tid = threads
5aa0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5ab0: 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74  rsLocks ? 0 : pt
5ac0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65  hread_self();.#e
5ad0: 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b  ndif.  memset(&k
5ae0: 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey2, 0, sizeof(k
5af0: 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65  ey2));.  key2.de
5b00: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5b10: 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d  ev;.  key2.ino =
5b20: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
5b30: 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75  .  pLock = (stru
5b40: 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c  ct lockInfo*)sql
5b50: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c 6f  ite3HashFind(&lo
5b60: 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20 73  ckHash, &key1, s
5b70: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
5b80: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5b90: 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49      struct lockI
5ba0: 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  nfo *pOld;.    p
5bb0: 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 54 68  Lock = sqlite3Th
5bc0: 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
5bd0: 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29  sizeof(*pLock) )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ;.    if( pLock=
5bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
5c00: 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
5c10: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
5c30: 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20  k->key = key1;. 
5c40: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
5c50: 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   1;.    pLock->c
5c60: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63  nt = 0;.    pLoc
5c70: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b  k->locktype = 0;
5c80: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
5c90: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
5ca0: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
5cb0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
5cc0: 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  1), pLock);.    
5cd0: 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20  if( pOld!=0 ){. 
5ce0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5cf0: 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  d==pLock );.    
5d00: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
5d10: 61 66 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  afeFree(pLock);.
5d20: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5d30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5d40: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5d50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
5d60: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
5d70: 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c  }.  *ppLock = pL
5d80: 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65  ock;.  if( ppOpe
5d90: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
5da0: 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e  n = (struct open
5db0: 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68  Cnt*)sqlite3Hash
5dc0: 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20  Find(&openHash, 
5dd0: 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65  &key2, sizeof(ke
5de0: 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  y2));.    if( pO
5df0: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
5e00: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5e10: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70 65  pOld;.      pOpe
5e20: 6e 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  n = sqlite3Threa
5e30: 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  dSafeMalloc( siz
5e40: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
5e50: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
5e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
5e70: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
5e80: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
5e90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
5ea0: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5eb0: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
5ec0: 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20     pOpen->key = 
5ed0: 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65  key2;.      pOpe
5ee0: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
5ef0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20     pOpen->nLock 
5f00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
5f10: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
5f20: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
5f30: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5f40: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5f50: 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48  ashInsert(&openH
5f60: 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79  ash, &pOpen->key
5f70: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20  , sizeof(key2), 
5f80: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  pOpen);.      if
5f90: 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20  ( pOld!=0 ){.   
5fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5fb0: 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  d==pOpen );.    
5fc0: 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
5fd0: 64 53 61 66 65 46 72 65 65 28 70 4f 70 65 6e 29  dSafeFree(pOpen)
5fe0: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
5ff0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
6000: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
6010: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
6020: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
6030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6040: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
6050: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
6060: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
6070: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
6080: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
6090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
60a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
60b0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
60c0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
60d0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
60e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
60f0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
6100: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
6110: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
6120: 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74  presetation of t
6130: 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69  he supplied.** i
6140: 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65  nteger lock-type
6150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
6160: 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65  t char *locktype
6170: 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70  Name(int locktyp
6180: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f  e){.  switch( lo
6190: 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65  cktype ){.  case
61a0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
61b0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20   "NONE";.  case 
61c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
61d0: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
61e0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
61f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
6200: 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45  RVED";.  case PE
6210: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
6220: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
6230: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6240: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6250: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
6260: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
6270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
6280: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
6290: 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ly in a differen
62a0: 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68  t thread than th
62b0: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68  e thread that th
62c0: 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72  e.** unixFile ar
62d0: 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74  gument belongs t
62e0: 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  o, then transfer
62f0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
6300: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76  e unixFile.** ov
6310: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
6320: 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  t thread..**.** 
6330: 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e  A unixFile is on
6340: 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68  ly owned by a th
6350: 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20  read on systems 
6360: 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64  where one thread
6370: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
6380: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
6390: 63 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66  created by a dif
63a0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  ferent thread.  
63b0: 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e  RedHat9 is.** an
63c0: 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68   example of such
63d0: 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a   a system..**.**
63e0: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
63f0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
6400: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
6410: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
6420: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
6430: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6440: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
6450: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
6460: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
6470: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
6480: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
6490: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
64a0: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
64b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
64c0: 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
64d0: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
64e0: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
64f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
6500: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
6510: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
6520: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
6530: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
6540: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
6550: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
6560: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
6570: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
6580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6590: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
65a0: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
65b0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
65c0: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
65d0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
65e0: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
65f0: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
6600: 20 20 20 54 52 41 43 45 31 28 22 4e 6f 2d 74 72     TRACE1("No-tr
6610: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
6620: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
6630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6640: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
6650: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
6660: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
6670: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
6680: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
6690: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
66a0: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
66b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
66c0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 34 28 22 54  .  }.  TRACE4("T
66d0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
66e0: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
66f0: 74 6f 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  to %d\n", pFile-
6700: 3e 68 2c 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53  >h,pFile->tid,hS
6710: 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74  elf);.  pFile->t
6720: 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66  id = hSelf;.  if
6730: 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21   (pFile->pLock !
6740: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65  = NULL) {.    re
6750: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
6760: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
6770: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
6780: 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46  fo(pFile->h, &pF
6790: 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a  ile->pLock, 0);.
67a0: 20 20 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b      TRACE5("LOCK
67b0: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
67c0: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
67d0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
67e0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
67f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
6800: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6810: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  ypeName(pFile->p
6820: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
6830: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
6840: 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nt);.    return 
6850: 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
6860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6870: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
6880: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
6890: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
68a0: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
68b0: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
68c0: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
68d0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
68e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
68f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
6900: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
6910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6920: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
6930: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6940: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
6950: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
6960: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6970: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
6980: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65  the named file e
6990: 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
69a0: 6c 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69  lite3UnixFileExi
69b0: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
69c0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
69d0: 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c  turn access(zFil
69e0: 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a  ename, 0)==0;.}.
69f0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
6a00: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
6a10: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
6a20: 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c  ixFile(.  int h,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
6a50: 72 69 70 74 6f 72 20 6f 66 20 74 68 65 20 6f 70  riptor of the op
6a60: 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  en file */.  OsF
6a70: 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20  ile **pId,      
6a80: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
6a90: 74 68 65 20 72 65 61 6c 20 66 69 6c 65 20 64 65  the real file de
6aa0: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
6ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ac0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
6ad0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
6ae0: 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
6af0: 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20  .  int delFlag  
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b10: 49 66 20 74 72 75 65 2c 20 6d 61 6b 65 20 73 75  If true, make su
6b20: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 6c 65  re the file dele
6b30: 74 65 73 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  tes on close */.
6b40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  );../*.** Attemp
6b50: 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65  t to open a file
6b60: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
6b70: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
6b80: 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73  If that.** fails
6b90: 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74  , try opening it
6ba0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20   read-only.  If 
6bb0: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
6bc0: 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20  t exist,.** try 
6bd0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a  to create it..**
6be0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
6bf0: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  a handle for the
6c00: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72   open file is wr
6c10: 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20  itten to *id.** 
6c20: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69  and *pReadonly i
6c30: 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68  s set to 0 if th
6c40: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
6c50: 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e  d for reading an
6c60: 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20  d.** writing or 
6c70: 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  1 if the file wa
6c80: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
6c90: 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  ly.  The functio
6ca0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  n returns.** SQL
6cb0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
6cc0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
6cd0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
6ce0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
6cf0: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
6d00: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
6d10: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
6d20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65  t sqlite3UnixOpe
6d30: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f  nReadWrite(.  co
6d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
6d50: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a  ame,.  OsFile **
6d60: 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61  pId,.  int *pRea
6d70: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68  donly.){.  int h
6d80: 3b 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53  ;.  .  CRASH_TES
6d90: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
6da0: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57  e3CrashOpenReadW
6db0: 72 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  rite, zFilename,
6dc0: 20 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29   pId, pReadonly)
6dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a  ;.  assert( 0==*
6de0: 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65  pId );.  h = ope
6df0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6e00: 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41  DWR|O_CREAT|O_LA
6e10: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6e20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6e30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6e40: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
6e50: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
6e60: 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20  ( h<0 ){.#ifdef 
6e70: 45 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65  EISDIR.    if( e
6e80: 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a  rrno==EISDIR ){.
6e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ea0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
6eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 68    }.#endif.    h
6ec0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
6ed0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
6ee0: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6ef0: 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20 29  );.    if( h<0 )
6f00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6f10: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
6f20: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61  .    }.    *pRea
6f30: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  donly = 1;.  }el
6f40: 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e  se{.    *pReadon
6f50: 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ly = 0;.  }.  re
6f60: 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69  turn allocateUni
6f70: 78 46 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46  xFile(h, pId, zF
6f80: 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  ilename, 0);.}..
6f90: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6fa0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
6fb0: 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  e for exclusive 
6fc0: 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70  access by this p
6fd0: 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66  rocess..** The f
6fe0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ile will be open
6ff0: 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
7000: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
7010: 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20    To avoid.** a 
7020: 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
7030: 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ty problem, we d
7040: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
7050: 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20  file to have.** 
7060: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
7070: 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61  ed.  Nor do we a
7080: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
7090: 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a   be a symbolic.*
70a0: 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * link..**.** If
70b0: 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65   delFlag is true
70c0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61  , then make arra
70d0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f  ngements to auto
70e0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
70f0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65  .** the file whe
7100: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
7110: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
7120: 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  , write the file
7130: 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64   handle into *id
7140: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
7150: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
7160: 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  failure, return 
7170: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
7180: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
7190: 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  nixOpenExclusive
71a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
71b0: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
71c0: 2a 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61  *pId, int delFla
71d0: 67 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  g){.  int h;..  
71e0: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
71f0: 49 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68  IDE(sqlite3Crash
7200: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a  OpenExclusive, z
7210: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64  Filename, pId, d
7220: 65 6c 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72  elFlag);.  asser
7230: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
7240: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
7250: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7260: 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45      O_RDWR|O_CRE
7270: 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  AT|O_EXCL|O_NOFO
7280: 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  LLOW|O_LARGEFILE
7290: 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20  |O_BINARY,.     
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
72c0: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
72d0: 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65  f( h<0 ){.    re
72e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
72f0: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OPEN;.  }.  retu
7300: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
7310: 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c  ile(h, pId, zFil
7320: 65 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b  ename, delFlag);
7330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
7340: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
7350: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e  file for read-on
7360: 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  ly access..**.**
7370: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
7380: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
7390: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
73a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
73b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
73c0: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
73d0: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
73e0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
73f0: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
7400: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7410: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
7420: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43  .  int h;.  .  C
7430: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
7440: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
7450: 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69  penReadOnly, zFi
7460: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b  lename, pId, 0);
7470: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
7480: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
7490: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
74a0: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
74b0: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
74c0: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( h<0 ){.    ret
74d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
74e0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PEN;.  }.  retur
74f0: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
7500: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7510: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  name, 0);.}../*.
7520: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
7530: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
7540: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
7550: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7560: 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20  ains a.** file. 
7570: 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   This file descr
7580: 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65  iptor can be use
7590: 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65  d to fsync() the
75a0: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e   directory.** in
75b0: 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
75c0: 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ure the creation
75d0: 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69   of a new file i
75e0: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
75f0: 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  en.** to disk..*
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e  e is only meanin
7620: 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20  gful for Unix.  
7630: 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
7640: 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73  der.** windows s
7650: 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65  ince windows doe
7660: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61  s not support ha
7670: 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20  rd links..**.** 
7680: 49 66 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73  If FULL_FSYNC is
7690: 20 65 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66   enabled, this f
76a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c  unction is not l
76b0: 6f 6e 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a  onger useful, .*
76c0: 2a 20 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73  * a FULL_FSYNC s
76d0: 79 6e 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ync applies to a
76e0: 6c 6c 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20  ll pending disk 
76f0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7700: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
7710: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
7720: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
7730: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
7740: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
7750: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
7760: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
7770: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
7780: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
7790: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
77a0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
77b0: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
77c0: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
77d0: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
77e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
77f0: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
7800: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
7810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
7820: 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46  rname.){.  unixF
7830: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
7840: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
7850: 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( pFile==0 ){.  
7860: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e    /* Do not open
7870: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
7880: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
7890: 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ing file is not 
78a0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f  already.    ** o
78b0: 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  pen. */.    retu
78c0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
78d0: 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48  EN;.  }.  SET_TH
78e0: 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20  READID(pFile);. 
78f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
7900: 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69  dirfd<0 );.  pFi
7910: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e  le->dirfd = open
7920: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
7930: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
7940: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
7950: 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  irfd<0 ){.    re
7960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
7970: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41  OPEN; .  }.  TRA
7980: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
7990: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
79a0: 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  dirfd, zDirname)
79b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
79c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
79d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
79e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
79f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
7a00: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
7a10: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
7a20: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
7a30: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
7a40: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
7a50: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
7a60: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
7a70: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
7a80: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
7a90: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
7aa0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
7ab0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
7ac0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
7ad0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
7ae0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
7af0: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
7b00: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
7b10: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
7b20: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
7b30: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
7b40: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
7b50: 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61  e3UnixTempFileNa
7b60: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
7b70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7b80: 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
7b90: 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
7ba0: 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
7bb0: 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
7bc0: 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
7bd0: 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
7be0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7bf0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
7c00: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
7c10: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
7c20: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
7c30: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
7c40: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
7c50: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
7c60: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
7c70: 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
7c80: 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
7c90: 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
7ca0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7cb0: 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
7cc0: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
7cd0: 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
7ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7cf0: 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
7d00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d10: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
7d20: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
7d30: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
7d40: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
7d50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d60: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
7d70: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
7d80: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
7d90: 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
7da0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
7db0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
7dc0: 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49  uf, "%s/"TEMP_FI
7dd0: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
7de0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
7df0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
7e00: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
7e10: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
7e20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
7e30: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
7e40: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
7e50: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
7e60: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
7e70: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
7e80: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
7e90: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
7ea0: 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
7eb0: 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
7ec0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7ed0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ; .}../*.** Chec
7ee0: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
7ef0: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
7f00: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
7f10: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
7f20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
7f30: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
7f40: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7f60: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
7f70: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
7f80: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
7f90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
7fa0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
7fb0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
7fc0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
7fd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
7fe0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
7ff0: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
8000: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
8010: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
8020: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
8030: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8040: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
8050: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 1;.}../*.** Se
8060: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
8070: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
8080: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
8090: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
80a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
80b0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
80c0: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
80d0: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
80e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
80f0: 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
8100: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
8110: 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
8120: 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20 55  nt got;.#ifdef U
8130: 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20 3d  SE_PREAD.  got =
8140: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
8150: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8160: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73  set);.#else.  ls
8170: 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f  eek(id->h, id->o
8180: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
8190: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
81a0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
81b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67  ;.#endif.  if( g
81c0: 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e  ot>0 ){.    id->
81d0: 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
81e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b   }.  return got;
81f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
8200: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
8210: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
8220: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8230: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
8240: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
8250: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
8260: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
8270: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
8280: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8290: 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c  t unixRead(OsFil
82a0: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
82b0: 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69  f, int amt){.  i
82c0: 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
82d0: 28 20 69 64 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ( id );.  TIMER_
82e0: 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20 73  START;.  got = s
82f0: 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
8300: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
8310: 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  amt);.  TIMER_EN
8320: 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52 45 41  D;.  TRACE5("REA
8330: 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
8340: 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46  d %d\n", ((unixF
8350: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67 6f 74  ile*)id)->h, got
8360: 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74  ,.          last
8370: 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41  _page, TIMER_ELA
8380: 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29  PSED);.  SEEK(0)
8390: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
83a0: 72 6f 72 28 20 67 6f 74 3d 30 20 29 3b 0a 20 20  ror( got=0 );.  
83b0: 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
83c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83d0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
83e0: 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72  ( got<0 ){.    r
83f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8400: 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
8410: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8420: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
8430: 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
8440: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
8450: 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
8460: 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
8470: 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
8480: 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
8490: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
84a0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
84b0: 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
84c0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
84d0: 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
84e0: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e  nixFile *id, con
84f0: 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
8500: 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
8510: 6f 74 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 50  ot;.#ifdef USE_P
8520: 52 45 41 44 0a 20 20 67 6f 74 20 3d 20 70 77 72  READ.  got = pwr
8530: 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
8540: 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74   cnt, id->offset
8550: 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73 65 65 6b  );.#else.  lseek
8560: 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73  (id->h, id->offs
8570: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
8580: 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d   got = write(id-
8590: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
85a0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67 6f 74  #endif.  if( got
85b0: 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66  >0 ){.    id->of
85c0: 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d  fset += got;.  }
85d0: 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
85e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
85f0: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
8600: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
8610: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8620: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
8630: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
8640: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
8650: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
8660: 74 20 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69  t unixWrite(OsFi
8670: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
8680: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
8690: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
86a0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
86b0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
86c0: 6d 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  mt>0 );.  TIMER_
86d0: 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65 28 20  START;.  while( 
86e0: 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
86f0: 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
8700: 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42  unixFile*)id, pB
8710: 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
8720: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
8730: 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
8740: 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
8750: 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45 52 5f 45  ];.  }.  TIMER_E
8760: 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 57 52  ND;.  TRACE5("WR
8770: 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
8780: 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78  7d %d\n", ((unix
8790: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 77 72  File*)id)->h, wr
87a0: 6f 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  ote,.          l
87b0: 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f  ast_page, TIMER_
87c0: 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b  ELAPSED);.  SEEK
87d0: 28 30 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  (0);.  SimulateI
87e0: 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
87f0: 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
8800: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
8810: 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
8820: 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
8830: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
8840: 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
8850: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8860: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
8870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
8890: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
88a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
88b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
88c0: 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70  the read/write p
88d0: 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65  ointer in a file
88e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
88f0: 75 6e 69 78 53 65 65 6b 28 4f 73 46 69 6c 65 20  unixSeek(OsFile 
8900: 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29  *id, i64 offset)
8910: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  {.  assert( id )
8920: 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f  ;.  SEEK(offset/
8930: 31 30 32 34 20 2b 20 31 29 3b 0a 23 69 66 64 65  1024 + 1);.#ifde
8940: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
8950: 69 66 28 20 6f 66 66 73 65 74 20 29 20 53 69 6d  if( offset ) Sim
8960: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
8970: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
8980: 5f 46 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20  _FULL);.#endif. 
8990: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
89a0: 2d 3e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  ->offset = offse
89b0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
89c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
89d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
89e0: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
89f0: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
8a00: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
8a10: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
8a20: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
8a30: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
8a40: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
8a50: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
8a60: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
8a70: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
8a80: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
8a90: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
8aa0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
8ab0: 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61  ** Use the fdata
8ac0: 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20  sync() API only 
8ad0: 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54  if the HAVE_FDAT
8ae0: 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  ASYNC macro is d
8af0: 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  efined..** Other
8b00: 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29  wise use fsync()
8b10: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a   in its place..*
8b20: 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46  /.#ifndef HAVE_F
8b30: 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
8b40: 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
8b50: 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
8b60: 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
8b70: 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
8b80: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
8b90: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
8ba0: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
8bb0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
8bc0: 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
8bd0: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
8be0: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
8bf0: 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
8c00: 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
8c10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
8c20: 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
8c30: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8c40: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
8c50: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8c60: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
8c70: 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
8c80: 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
8c90: 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
8ca0: 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
8cb0: 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
8cc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
8cd0: 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
8ce0: 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
8cf0: 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
8d00: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
8d10: 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
8d20: 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
8d30: 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
8d40: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
8d50: 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
8d60: 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
8d70: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
8d80: 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
8d90: 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
8da0: 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
8db0: 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
8dc0: 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
8dd0: 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
8de0: 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
8df0: 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
8e00: 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
8e10: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
8e20: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
8e30: 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
8e40: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
8e50: 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
8e60: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
8e70: 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
8e80: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
8e90: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
8ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
8eb0: 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
8ec0: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
8ed0: 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
8ee0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
8ef0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
8f00: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
8f10: 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
8f20: 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
8f30: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
8f40: 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
8f50: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8f60: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
8f70: 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
8f80: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
8f90: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
8fa0: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
8fb0: 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
8fc0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
8fd0: 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
8fe0: 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
8ff0: 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
9000: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
9010: 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
9020: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23  ITE_OK;.#else..#
9030: 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
9040: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
9050: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
9060: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
9070: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a  NC, 0);.  }else.
9080: 23 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 46  #endif /* HAVE_F
9090: 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 20 20 69 66  ULLFSYNC */.  if
90a0: 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20  ( dataOnly ){.  
90b0: 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
90c0: 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (fd);.  }else{. 
90d0: 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
90e0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
90f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9100: 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72  NO_SYNC) */..  r
9110: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9120: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
9130: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
9140: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
9150: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
9160: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
9170: 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
9180: 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
9190: 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
91a0: 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
91b0: 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
91c0: 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
91d0: 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
91e0: 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
91f0: 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
9200: 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
9210: 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
9220: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
9230: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
9240: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
9250: 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
9260: 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
9270: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
9280: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
9290: 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
92a0: 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
92b0: 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
92c0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
92d0: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
92e0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
92f0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
9300: 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
9310: 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
9320: 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
9330: 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
9340: 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
9350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
9360: 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
9370: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
9380: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
9390: 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
93a0: 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
93b0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
93c0: 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
93d0: 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
93e0: 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
93f0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
9400: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
9410: 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  nc(OsFile *id, i
9420: 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
9430: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
9440: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9450: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
9460: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
9470: 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
9480: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
9490: 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
94a0: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
94b0: 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c  pFile->fullSync,
94c0: 20 64 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69   dataOnly);.  Si
94d0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
94e0: 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
94f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9500: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
9510: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
9520: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
9530: 20 20 20 54 52 41 43 45 34 28 22 44 49 52 53 59     TRACE4("DIRSY
9540: 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
9550: 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
9560: 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
9570: 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
9580: 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
9590: 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 66 75 6c  SYNC, pFile->ful
95a0: 6c 53 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20  lSync);.#ifndef 
95b0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
95c0: 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68  IRSYNC.    /* Th
95d0: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
95e0: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
95f0: 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63  ed if full_fsync
9600: 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65   is.    ** turne
9610: 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c  d off or unavail
9620: 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c  able.  If a full
9630: 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20  _fsync occurred 
9640: 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68  above,.    ** th
9650: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
9660: 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c   sync is superfl
9670: 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uous..    */.   
9680: 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c   if( (!HAVE_FULL
9690: 46 53 59 4e 43 20 7c 7c 20 21 70 46 69 6c 65 2d  FSYNC || !pFile-
96a0: 3e 66 75 6c 6c 53 79 6e 63 29 20 26 26 20 66 75  >fullSync) && fu
96b0: 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
96c0: 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
96d0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
96e0: 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
96f0: 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
9700: 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
9710: 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
9720: 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
9730: 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
9740: 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
9750: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
9760: 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
9770: 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
9780: 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
9790: 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
97a0: 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
97b0: 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
97c0: 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
97d0: 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
97e0: 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
97f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f  SQLITE_IOERR; */
9800: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9810: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64    close(pFile->d
9820: 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20  irfd);  /* Only 
9830: 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
9840: 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
9850: 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
9860: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
9870: 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77  -1;    /* when w
9880: 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20  e are done. */. 
9890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
98a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
98b0: 53 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f  Sync the directo
98c0: 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69  ry zDirname. Thi
98d0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20  s is a no-op on 
98e0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
98f0: 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20  s other.** than 
9900: 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UNIX..**.** This
9910: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
9920: 20 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72   sure the master
9930: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9940: 73 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65  s truely been de
9950: 6c 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  leted.** before 
9960: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
9970: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  o individual jou
9980: 72 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69  rnals on a multi
9990: 2d 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74  -database commit
99a0: 2e 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46  ..** The F_FULLF
99b0: 53 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e  SYNC option is n
99c0: 6f 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a  ot needed here..
99d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
99e0: 69 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28  ixSyncDirectory(
99f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
9a00: 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  name){.#ifdef SQ
9a10: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
9a20: 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
9a30: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
9a40: 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72   int fd;.  int r
9a50: 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44  ;.  fd = open(zD
9a60: 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
9a70: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
9a80: 20 54 52 41 43 45 33 28 22 44 49 52 53 59 4e 43   TRACE3("DIRSYNC
9a90: 20 25 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66   %-3d (%s)\n", f
9aa0: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
9ab0: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
9ac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
9ad0: 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72  NTOPEN; .  }.  r
9ae0: 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
9af0: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 53 69 6d  close(fd);.  Sim
9b00: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 3d  ulateIOError( r=
9b10: 31 20 29 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a  1 );.  if( r ){.
9b20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9b30: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
9b40: 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  C;.  }else{.    
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9b60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
9b70: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
9b80: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
9b90: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
9ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9bb0: 69 78 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c  ixTruncate(OsFil
9bc0: 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
9bd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
9be0: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
9bf0: 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
9c00: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
9c10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d 75  , nByte);.  Simu
9c20: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
9c30: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
9c40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c50: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
9c60: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9c70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9c80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9c90: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
9ca0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
9cb0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
9cc0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
9cd0: 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a  ileSize(OsFile *
9ce0: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
9cf0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
9d00: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
9d10: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
9d20: 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69  rc = fstat(((uni
9d30: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
9d40: 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
9d50: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
9d60: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
9d70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d80: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
9d90: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
9da0: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
9db0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9dc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9dd0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
9de0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9df0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9e00: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9e10: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9e20: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9e30: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9e40: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
9e50: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
9e60: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
9e70: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
9e80: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
9e90: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
9ea0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
9eb0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
9ec0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
9ed0: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
9ee0: 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69   r = 0;.  unixFi
9ef0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9f00: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
9f10: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
9f20: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
9f30: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
9f40: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
9f50: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
9f60: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
9f70: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
9f80: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
9f90: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
9fa0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
9fb0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
9fc0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
9fd0: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
9fe0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
9ff0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
a000: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
a010: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
a020: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
a030: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
a040: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
a050: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
a060: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a070: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
a080: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a090: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
a0a0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
a0b0: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
a0c0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
a0d0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
a0e0: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
a0f0: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
a100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
a110: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
a120: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28  tex();.  TRACE3(
a130: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a140: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
a150: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
a160: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
a170: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
a180: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
a190: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
a1a0: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
a1b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a1c0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
a1d0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
a1e0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
a1f0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
a200: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
a210: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
a220: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
a230: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
a240: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
a250: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
a260: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
a270: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
a280: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
a290: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
a2a0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
a2b0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
a2c0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
a2d0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
a2e0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
a2f0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
a300: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
a310: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
a320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
a330: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
a340: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
a350: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
a360: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
a370: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
a380: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
a390: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
a3a0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
a3b0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
a3c0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a3d0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
a3e0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
a3f0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
a400: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
a410: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
a420: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a430: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
a440: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
a450: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
a460: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
a470: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
a480: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
a490: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
a4a0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a4b0: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
a4c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
a4d0: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
a4e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
a4f0: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
a500: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
a510: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
a520: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
a530: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
a540: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
a550: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
a560: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
a570: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
a580: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
a590: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
a5a0: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
a5b0: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
a5c0: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
a5d0: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
a5e0: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
a5f0: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
a600: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
a610: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
a620: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
a630: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
a640: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
a650: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
a660: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
a670: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
a680: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
a690: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
a6a0: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
a6b0: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
a6c0: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
a6d0: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
a6e0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
a6f0: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
a700: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a710: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
a720: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
a730: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
a740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
a750: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
a760: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
a770: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
a780: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
a790: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
a7a0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
a7b0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
a7c0: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
a7d0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
a7e0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
a7f0: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
a800: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a810: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
a820: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
a830: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
a840: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a850: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
a860: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
a870: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
a880: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
a890: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
a8a0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
a8b0: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
a8c0: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
a8d0: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
a8e0: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
a8f0: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
a900: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
a910: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
a920: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
a930: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
a940: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
a950: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
a960: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
a970: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
a980: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
a990: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
a9a0: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
a9b0: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
a9c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
a9d0: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
a9e0: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
a9f0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
aa00: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
aa10: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
aa20: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
aa30: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
aa40: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
aa50: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
aa60: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
aa70: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
aa80: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
aa90: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
aaa0: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
aab0: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
aac0: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
aad0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
aae0: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
aaf0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
ab00: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
ab10: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
ab20: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
ab30: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
ab40: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
ab50: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
ab60: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
ab70: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
ab80: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
ab90: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
aba0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
abb0: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
abc0: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
abd0: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
abe0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
abf0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
ac00: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
ac10: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
ac20: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
ac30: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
ac40: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
ac50: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
ac60: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
ac70: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
ac80: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
ac90: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
aca0: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
acb0: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
acc0: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
acd0: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
ace0: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
acf0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
ad00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
ad10: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ad20: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
ad30: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
ad40: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
ad50: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
ad60: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
ad70: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
ad80: 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45  pFile );.  TRACE
ad90: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
ada0: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
adb0: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
adc0: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
add0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
ade0: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
adf0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
ae00: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
ae10: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
ae20: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
ae30: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
ae40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ae50: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
ae60: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
ae70: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
ae80: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
ae90: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
aea0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
aeb0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
aec0: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
aed0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
aee0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
aef0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
af00: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
af10: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
af20: 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43  .    TRACE3("LOC
af30: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
af40: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
af50: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
af60: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
af70: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
af80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
af90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
afa0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
afb0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
afc0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
afd0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
afe0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
aff0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
b000: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
b010: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
b020: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
b030: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
b040: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
b050: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
b060: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b070: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
b080: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
b090: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
b0a0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
b0b0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
b0c0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
b0d0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
b0e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b0f0: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
b100: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
b110: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
b120: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
b130: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
b140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b150: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
b160: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
b170: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
b180: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
b190: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
b1a0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b1b0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
b1c0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
b1d0: 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20  nt OsFile*.  ** 
b1e0: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
b1f0: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
b200: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
b210: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
b220: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
b230: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
b240: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
b250: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
b260: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
b270: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
b280: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
b290: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b2a0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
b2b0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
b2c0: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
b2d0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
b2e0: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
b2f0: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
b300: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
b310: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
b320: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
b330: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
b340: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
b350: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
b360: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
b370: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b380: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
b390: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
b3a0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b3b0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
b3c0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
b3d0: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
b3e0: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
b3f0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
b400: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
b410: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
b420: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b430: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
b440: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
b450: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
b460: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
b470: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
b480: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
b490: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
b4a0: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
b4b0: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
b4c0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b4d0: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
b4e0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
b4f0: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
b500: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
b510: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
b520: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
b530: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
b540: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
b550: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
b560: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
b570: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
b580: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b590: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
b5a0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
b5b0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
b5c0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
b5d0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
b5e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
b5f0: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
b600: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
b610: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
b620: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b630: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b640: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
b650: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b660: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20  ock);.    if( s 
b670: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
b680: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
b690: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
b6a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b6b0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
b6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
b6d0: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
b6e0: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
b6f0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
b700: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
b710: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
b720: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
b730: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
b740: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
b750: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b760: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
b770: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
b780: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b790: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
b7a0: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
b7b0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
b7c0: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
b7d0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
b7e0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
b7f0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b800: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20  D_SIZE;.    s = 
b810: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
b820: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
b830: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
b840: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
b850: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
b860: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b870: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b880: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b890: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b8a0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b8b0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
b8c0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b8d0: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
b8e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
b8f0: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
b900: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
b910: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
b920: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b930: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 20      }.    if( s 
b940: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
b950: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
b960: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
b970: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
b990: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
b9a0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
b9b0: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
b9c0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
b9d0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20  Lock->cnt = 1;. 
b9e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
b9f0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
ba00: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  SIVE_LOCK && pLo
ba10: 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20  ck->cnt>1 ){.   
ba20: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
ba30: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
ba40: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
ba50: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
ba60: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
ba70: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
ba80: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
ba90: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
baa0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
bab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
bac0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
bad0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
bae0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
baf0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
bb00: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
bb10: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
bb20: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
bb30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
bb40: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
bb50: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
bb60: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
bb70: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
bb80: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
bb90: 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74     switch( lockt
bba0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
bbb0: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
bbc0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bbd0: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
bbe0: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62  _BYTE;.        b
bbf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc00: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
bc10: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bc20: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
bc30: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
bc40: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
bc50: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
bc60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
bc70: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
bc80: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
bc90: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
bca0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
bcb0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
bcc0: 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
bcd0: 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20  (errno==EINVAL) 
bce0: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
bcf0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
bd00: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
bd10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
bd20: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
bd30: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
bd40: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
bd50: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
bd60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
bd70: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
bd80: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
bd90: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
bda0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
bdb0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
bdc0: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
bdd0: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
bde0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
bdf0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41 43  eMutex();.  TRAC
be00: 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E4("LOCK    %d %
be10: 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %s\n", pFile->
be20: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
be30: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
be40: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
be50: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
be60: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ");.  return rc;
be70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
be80: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
be90: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
bea0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
beb0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
bec0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
bed0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
bee0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
bef0: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
bf00: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
bf10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
bf20: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
bf30: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
bf40: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
bf50: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
bf60: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
bf70: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bf80: 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
bf90: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
bfa0: 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  {.  struct lockI
bfb0: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
bfc0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
bfd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bfe0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
bff0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c000: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
c010: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c020: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
c030: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
c040: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
c050: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
c060: 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e,.      pFile->
c070: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
c080: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
c090: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
c0a0: 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  cnt, getpid());.
c0b0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
c0c0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
c0d0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
c0e0: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
c0f0: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
c100: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c110: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
c120: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
c130: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c140: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
c150: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
c160: 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d  tex();.  pLock =
c170: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
c180: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
c190: 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  cnt!=0 );.  if( 
c1a0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
c1b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
c1c0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
c1d0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c  ->locktype==pFil
c1e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
c1f0: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
c200: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
c210: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c220: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
c230: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c240: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c250: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c260: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c270: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c280: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c290: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
c2a0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c2b0: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a  K, &lock)!=0 ){.
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
c2d0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c2e0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  pen */.        r
c2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
c300: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  _RDLOCK;.      }
c310: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
c320: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c330: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
c340: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c350: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c360: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
c370: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
c380: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
c390: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
c3a0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
c3b0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
c3c0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c3d0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
c3e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
c3f0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
c400: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
c410: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c420: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
c430: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
c440: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
c450: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f    }.  }.  if( lo
c460: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
c470: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  ){.    struct op
c480: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
c490: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
c4a0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
c4b0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
c4c0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
c4d0: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
c4e0: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
c4f0: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
c500: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
c510: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
c520: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
c530: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
c540: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
c550: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
c560: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
c570: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c580: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c590: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c5a0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c5b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
c5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
c5d0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c5e0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  TLK, &lock)==0 )
c5f0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  {.        pLock-
c600: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
c610: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
c620: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
c630: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c640: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
c650: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c660: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
c670: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
c680: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
c690: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
c6a0: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
c6b0: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
c6c0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
c6d0: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
c6e0: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
c6f0: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
c700: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
c710: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
c720: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
c730: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f  s..    */.    pO
c740: 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  pen = pFile->pOp
c750: 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  en;.    pOpen->n
c760: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
c770: 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  rt( pOpen->nLock
c780: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
c790: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26  Open->nLock==0 &
c7a0: 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  & pOpen->nPendin
c7b0: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
c7c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
c7d0: 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
c7e0: 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
c7f0: 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d      close(pOpen-
c800: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20  >aPending[i]);. 
c810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
c820: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
c830: 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  g);.      pOpen-
c840: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
c850: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
c860: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ding = 0;.    }.
c870: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c    }.  sqlite3OsL
c880: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70  eaveMutex();.  p
c890: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
c8a0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
c8b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c8c0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
c8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c8e0: 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a  xClose(OsFile **
c8f0: 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pId){.  unixFile
c900: 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65   *id = (unixFile
c910: 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 21  *)*pId;..  if( !
c920: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
c930: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c  TE_OK;.  unixUnl
c940: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
c950: 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  K);.  if( id->di
c960: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
c970: 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
c980: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73  >dirfd = -1;.  s
c990: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
c9a0: 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 69 64 2d  ex();..  if( id-
c9b0: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
c9c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
c9d0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
c9e0: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
c9f0: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
ca00: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
ca10: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ca20: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ca30: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ca40: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ca50: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
ca60: 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e  iptor to pOpen->
ca70: 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
ca80: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
ca90: 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
caa0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
cab0: 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
cac0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
cad0: 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75 63  *aNew;.    struc
cae0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
caf0: 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20   = id->pOpen;.  
cb00: 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63    aNew = realloc
cb10: 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
cb20: 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  g, (pOpen->nPend
cb30: 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e  ing+1)*sizeof(in
cb40: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  t) );.    if( aN
cb50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ew==0 ){.      /
cb60: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
cb70: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
cb80: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
cb90: 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  or */.    }else{
cba0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
cbb0: 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20  ending = aNew;. 
cbc0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
cbd0: 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ding[pOpen->nPen
cbe0: 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20  ding] = id->h;. 
cbf0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
cc00: 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ding++;.    }.  
cc10: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
cc20: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
cc30: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20  anding locks so 
cc40: 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65  we can close the
cc50: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
cc60: 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 69  y */.    close(i
cc70: 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  d->h);.  }.  rel
cc80: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d  easeLockInfo(id-
cc90: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61  >pLock);.  relea
cca0: 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d 3e 70 4f  seOpenCnt(id->pO
ccb0: 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pen);..  sqlite3
ccc0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
ccd0: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
cce0: 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  ;.  TRACE2("CLOS
ccf0: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d  E   %-3d\n", id-
cd00: 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
cd10: 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
cd20: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
cd30: 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b  id);.  *pId = 0;
cd40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cd50: 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  _OK;.}...#ifdef 
cd60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
cd70: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61  CKING_STYLE.#pra
cd80: 67 6d 61 20 6d 61 72 6b 20 41 46 50 20 53 75 70  gma mark AFP Sup
cd90: 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  port../*. ** The
cda0: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
cdb0: 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
cdc0: 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
cdd0: 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
cde0: 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e. */.typedef st
cdf0: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
ce00: 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
ce10: 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
ce20: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
ce30: 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt {.  unsigned 
ce40: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
ce50: 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68 61 72  LockByte;.  char
ce60: 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a   *filePath;.};..
ce70: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
ce80: 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
ce90: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
cea0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
ceb0: 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
cec0: 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
ced0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
cee0: 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
cef0: 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
cf00: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
cf10: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
cf20: 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
cf30: 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
cf40: 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
cf50: 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
cf60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
cf70: 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
cf80: 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
cf90: 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
cfa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
cfb0: 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
cfc0: 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
cfd0: 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
cfe0: 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
cff0: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
d020: 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
d030: 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
d040: 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
d050: 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 09 5f 49  ngeLock2FSCTL._I
d060: 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
d070: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
d080: 6b 50 42 32 29 0a 0a 2f 2a 20 72 65 74 75 72 6e  kPB2)../* return
d090: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31   0 on success, 1
d0a0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 6f   on failure.  To
d0b0: 20 6d 61 74 63 68 20 74 68 65 20 62 65 68 61 76   match the behav
d0c0: 69 6f 72 20 6f 66 20 74 68 65 20 0a 20 20 6e 6f  ior of the .  no
d0d0: 72 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20  rmal posix file 
d0e0: 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e  locking (used in
d0f0: 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78   unixLock for ex
d100: 61 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c  ample), we shoul
d110: 64 20 0a 20 20 70 72 6f 76 69 64 65 20 27 72 69  d .  provide 'ri
d120: 63 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f 64  cher' return cod
d130: 65 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c 6c  es - specificall
d140: 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
d150: 74 65 20 62 65 74 77 65 65 6e 0a 20 20 27 66 69  te between.  'fi
d160: 6c 65 20 62 75 73 79 27 20 61 6e 64 20 27 66 69  le busy' and 'fi
d170: 6c 65 20 73 79 73 74 65 6d 20 65 72 72 6f 72 27  le system error'
d180: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 73 74 61 74   results */.stat
d190: 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74  ic int _AFPFSSet
d1a0: 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  Lock(const char 
d1b0: 2a 70 61 74 68 2c 20 69 6e 74 20 66 64 2c 20 75  *path, int fd, u
d1c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d1d0: 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 20 20 20  g offset, .     
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
d200: 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 69  g long length, i
d210: 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 29 0a  nt setLockFlag).
d220: 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
d230: 61 6e 67 65 4c 6f 63 6b 50 42 32 09 70 62 3b 0a  angeLockPB2.pb;.
d240: 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20    int           
d250: 20 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20            err;. 
d260: 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
d270: 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
d280: 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
d290: 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
d2a0: 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
d2b0: 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
d2c0: 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
d2d0: 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20 54 52 41  b.fd = fd;.  TRA
d2e0: 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74  CE5("AFPLOCK set
d2f0: 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72  ting lock %s for
d300: 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c   %d in range %ll
d310: 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
d320: 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
d330: 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66  ":"OFF"), fd, of
d340: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
d350: 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
d360: 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
d370: 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
d380: 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
d390: 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 54 52 41  ==-1 ) {.    TRA
d3a0: 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66 61 69  CE4("AFPLOCK fai
d3b0: 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
d3c0: 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20 70 61  %s' %d %s\n", pa
d3d0: 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20  th, errno, .    
d3e0: 20 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f    strerror(errno
d3f0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
d400: 3b 20 2f 2f 20 65 72 72 6f 72 0a 20 20 7d 20 65  ; // error.  } e
d410: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
d420: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a   0;.  }.}../*. *
d430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d440: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
d450: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
d460: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
d470: 65 63 69 66 69 65 64 0a 20 2a 2a 20 66 69 6c 65  ecified. ** file
d480: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
d490: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
d4a0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
d4b0: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 20 2a   held, return. *
d4c0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  * non-zero.  If 
d4d0: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
d4e0: 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e  cked or holds on
d4f0: 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c  ly SHARED locks,
d500: 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74 75 72 6e   then. ** return
d510: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69   zero.. */.stati
d520: 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 68 65  c int afpUnixChe
d530: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
d540: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
d550: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
d560: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d570: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
d580: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d590: 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ; .  afpLockingC
d5a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d5b0: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d5c0: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d5d0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d5e0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
d5f0: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d600: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d610: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d620: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d630: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d640: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
d650: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
d660: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
d670: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
d680: 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
d690: 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20 20 20  if ( !r ) {.    
d6a0: 2f 2f 20 6c 6f 63 6b 20 74 68 65 20 62 79 74 65  // lock the byte
d6b0: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
d6c0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
d6d0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d6e0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  h, pFile->h, RES
d6f0: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
d700: 3b 20 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c  ;  .    if (fail
d710: 65 64 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  ed) {.      /* i
d720: 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
d730: 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
d740: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
d750: 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
d760: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d      r = 1;.    }
d770: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
d780: 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
d790: 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
d7a0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
d7b0: 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
d7c0: 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
d7d0: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
d7e0: 2f 0a 20 20 20 20 20 20 5f 41 46 50 46 53 53 65  /.      _AFPFSSe
d7f0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d800: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d810: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
d820: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
d830: 20 7d 0a 20 20 54 52 41 43 45 33 28 22 54 45 53   }.  TRACE3("TES
d840: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c  T WR-LOCK %d %d\
d850: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29  n", pFile->h, r)
d860: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b  ;.  .  return r;
d870: 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65  .}../* AFP-style
d880: 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69   locking followi
d890: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
d8a0: 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65  of unixLock, see
d8b0: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a   the unixLock .*
d8c0: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65  * function comme
d8d0: 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20  nts for details 
d8e0: 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65  of lock manageme
d8f0: 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt. */.static in
d900: 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73  t afpUnixLock(Os
d910: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
d920: 63 6b 74 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20  cktype).{.  int 
d930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d940: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
d950: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
d960: 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
d970: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d980: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d990: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d9a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d9b0: 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
d9c0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  ock = 0;.  .  as
d9d0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
d9e0: 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20   TRACE5("LOCK   
d9f0: 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69   %d %s was %s pi
da00: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
da10: 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  h,.         lock
da20: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
da30: 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
da40: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
da50: 29 2c 20 67 65 74 70 69 64 28 29 29 3b 20 20 0a  ), getpid());  .
da60: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
da70: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
da80: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
da90: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
daa0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   on the.    ** O
dab0: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
dac0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
dad0: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
dae0: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 20  xit path, as.   
daf0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
db00: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
db10: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
db20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 70  ..    */.  if( p
db30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
db40: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
db50: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
db60: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
db70: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
db80: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
db90: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
dba0: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
dbb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dbc0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
dbd0: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
dbe0: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
dbf0: 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20 61 73 73  ect.    */.  ass
dc00: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
dc10: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
dc20: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
dc30: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
dc40: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
dc50: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
dc60: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
dc70: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
dc80: 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
dc90: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
dca0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
dcb0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
dcc0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
dcd0: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
dce0: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
dcf0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
dd00: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
dd10: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
dd20: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
dd30: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
dd40: 0a 20 20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  .    */.  rc = t
dd50: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
dd60: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
dd70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dd80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
dd90: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  veMutex();.    r
dda0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
ddb0: 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
ddc0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
ddd0: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
dde0: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
ddf0: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  and before.    *
de00: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
de10: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
de20: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
de30: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
de40: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
de50: 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f  released..    */
de60: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
de70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
de80: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
de90: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dea0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
deb0: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
dec0: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 69  ).      ){.    i
ded0: 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  nt failed = _AFP
dee0: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
def0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
df00: 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 50 45  le->h, .      PE
df10: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
df20: 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
df30: 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
df40: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
df50: 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
df60: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
df70: 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
df80: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
df90: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
dfa0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
dfb0: 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 6f 70  d make.    ** op
dfc0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
dfd0: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
dfe0: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 20  cified lock..   
dff0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
e000: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
e010: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66  ){.    int lk, f
e020: 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20 74  ailed;.    int t
e030: 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20  ries = 0;.    . 
e040: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
e050: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
e060: 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
e070: 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
e080: 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
e090: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
e0a0: 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
e0b0: 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
e0c0: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
e0d0: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20  dLockByte = (lk 
e0e0: 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
e0f0: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
e100: 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41  .    failed = _A
e110: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e120: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e130: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
e140: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e  SHARED_FIRST+con
e150: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e160: 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
e170: 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68   .    /* Drop th
e180: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
e190: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
e1a0: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
e1b0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
e1c0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
e1d0: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
e1e0: 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  0)) {.      rc =
e1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e200: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
e210: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
e220: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  en */.      goto
e230: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
e240: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66     }.    .    if
e250: 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
e260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
e270: 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
e280: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e290: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
e2a0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LOCK;.    }.  }e
e2b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
e2c0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
e2d0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
e2e0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
e2f0: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
e300: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
e310: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
e320: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
e330: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
e340: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
e350: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
e360: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
e370: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
e380: 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b   );.    if (lock
e390: 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44  type >= RESERVED
e3a0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
e3b0: 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52  locktype < RESER
e3c0: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
e3d0: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
e3e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
e3f0: 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
e400: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e410: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e420: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45  th, pFile->h, RE
e430: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
e440: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
e450: 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
e460: 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
e470: 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
e480: 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
e490: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
e4a0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
e4b0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
e4c0: 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
e4d0: 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
e4e0: 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
e4f0: 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
e500: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
e510: 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
e520: 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
e530: 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  nixUnlock.      
e540: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f 41  */.      if (!_A
e550: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e560: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e570: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
e580: 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
e5b0: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 29  LockByte, 1, 0))
e5c0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f   {.        /* no
e5d0: 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
e5e0: 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
e5f0: 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
e600: 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f        failed = _
e610: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
e620: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
e630: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
e640: 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
e670: 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
e680: 20 69 66 20 28 66 61 69 6c 65 64 20 26 26 20 5f   if (failed && _
e690: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
e6a0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
e6b0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
e6c0: 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
e6f0: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e700: 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20  Byte, 1, 1)) {. 
e710: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e720: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
e730: 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c  K; /* this shoul
e740: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
e750: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
e760: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e770: 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20     /* */.       
e780: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e790: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68  RR_UNLOCK; /* th
e7a0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
e7b0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
e7c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e7d0: 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d 20  failed && rc == 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
e7f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
e800: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
e810: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
e830: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
e840: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
e850: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
e860: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
e870: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e880: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
e890: 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
e8a0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 73 71 6c  nd_lock:.    sql
e8b0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
e8c0: 28 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f  ();.  TRACE4("LO
e8d0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
e8e0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
e8f0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
e900: 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  pe), .         r
e910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
e920: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
e930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e940: 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
e950: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e960: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
e970: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
e980: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
e990: 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
e9a0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e9b0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
e9c0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
e9d0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
e9e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e9f0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
ea00: 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
ea10: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
ea20: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
ea30: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
ea40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
ea50: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46  fpUnixUnlock(OsF
ea60: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
ea70: 6b 74 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63  ktype) {.  struc
ea80: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
ea90: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
eaa0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
eab0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
eac0: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
ead0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
eae0: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
eaf0: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
eb00: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
eb10: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
eb20: 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 35 28  ile );.  TRACE5(
eb30: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
eb40: 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  as %d pid=%d\n",
eb50: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
eb60: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46  ype,.         pF
eb70: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
eb80: 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20 20 61  etpid());.  .  a
eb90: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
eba0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
ebb0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ebc0: 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
ebd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ebe0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
ebf0: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
ec00: 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
ec10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ec20: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
ec30: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
ec40: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ec50: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
ec60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  LOCK ){.    if( 
ec70: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
ec80: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
ec90: 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a  nt failed = 0;..
eca0: 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
ecb0: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61  the exclusive ra
ecc0: 6e 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73  nge - then re-es
ecd0: 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
ece0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
ecf0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
ed00: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
ed10: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
ed20: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
ed30: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
ed40: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
ed50: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
ed60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
ed90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20   0);.        if 
eda0: 28 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20  (!failed) {.    
edb0: 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
edc0: 66 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68  fully removed th
edd0: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
ede0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
edf0: 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28   (_AFPFSSetLock(
ee00: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
ee10: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
ee20: 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20  RED_FIRST+.     
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
ee50: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
ee60: 31 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 1)) {.       
ee70: 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74       /* failed t
ee80: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 6f  o re-establish o
ee90: 75 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ur shared lock *
eea0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
eeb0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
eec0: 52 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  RDLOCK; /* This 
eed0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
eee0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pen */.         
eef0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   }.        } els
ef00: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e {.          /*
ef10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
ef20: 65 72 20 68 61 70 70 65 6e 20 2d 20 66 61 69 6c  er happen - fail
ef30: 65 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ed to unlock the
ef40: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
ef50: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
ef60: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
ef70: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
ef80: 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  } .      }.    }
ef90: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
efa0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
efb0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  e->locktype>=PEN
efc0: 44 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  DING_LOCK) {.   
efd0: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
efe0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
eff0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
f000: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
f010: 31 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 20 20  1, 0)){.        
f020: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c  /* failed to rel
f030: 65 61 73 65 20 74 68 65 20 70 65 6e 64 69 6e 67  ease the pending
f040: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
f050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f060: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68  RR_UNLOCK; /* Th
f070: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f080: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
f090: 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20  }.    } .    if 
f0a0: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
f0b0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
f0c0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
f0d0: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
f0e0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
f0f0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
f100: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
f110: 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 29  VED_BYTE, 1, 0))
f120: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61   {.        /* fa
f130: 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
f140: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
f150: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
f160: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f170: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
f180: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
f190: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
f1a0: 20 20 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20     } .  }.  if( 
f1b0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
f1c0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69  K ){.    int fai
f1d0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f1e0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f1f0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
f200: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
f230: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
f240: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
f250: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
f260: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f270: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f280: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
f290: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
f2a0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
f2b0: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
f2c0: 4b 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  K).    pFile->lo
f2d0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
f2e0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  e;.  sqlite3OsLe
f2f0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
f300: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
f310: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
f320: 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
f330: 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
f340: 6f 6e 74 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74  ontext . */.stat
f350: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c  ic int afpUnixCl
f360: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
f370: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f380: 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  id = (unixFile*)
f390: 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *pId;.  .  if( !
f3a0: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
f3b0: 54 45 5f 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78  TE_OK;.  afpUnix
f3c0: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
f3d0: 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65  LOCK);.  /* free
f3e0: 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67   the AFP locking
f3f0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
f400: 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  if (id->lockingC
f410: 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20  ontext != NULL) 
f420: 7b 0a 20 20 20 20 69 66 20 28 28 28 61 66 70 4c  {.    if (((afpL
f430: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
f440: 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id->lockingConte
f450: 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d  xt)->filePath !=
f460: 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c   NULL).      sql
f470: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
f480: 65 65 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  ee(((afpLockingC
f490: 6f 6e 74 65 78 74 2a 29 69 64 2d 3e 6c 6f 63 6b  ontext*)id->lock
f4a0: 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c  ingContext)->fil
f4b0: 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
f4c0: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
f4d0: 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  e(id->lockingCon
f4e0: 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  text);.  }.  .  
f4f0: 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
f500: 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72   ) close(id->dir
f510: 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  fd);.  id->dirfd
f520: 20 3d 20 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69   = -1;.  close(i
f530: 64 2d 3e 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f  d->h);.  id->isO
f540: 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  pen = 0;.  TRACE
f550: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
f560: 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
f570: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
f580: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
f590: 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  feFree(id);.  *p
f5a0: 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
f5b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
f5c0: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f  #pragma mark flo
f5d0: 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69  ck() style locki
f5e0: 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 66  ng../*. ** The f
f5f0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f600: 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  xt is not used. 
f610: 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20  */.typedef void 
f620: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  flockLockingCont
f630: 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ext;..static int
f640: 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52   flockUnixCheckR
f650: 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
f660: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78  le *id) {.  unix
f670: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f680: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
f690: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f6a0: 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45  ktype == RESERVE
f6b0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65  D_LOCK) {.    re
f6c0: 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65 61  turn 1; // alrea
f6d0: 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72 76  dy have a reserv
f6e0: 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73 65  ed lock.  } else
f6f0: 20 7b 0a 20 20 20 20 2f 2f 20 61 74 74 65 6d 70   {.    // attemp
f700: 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
f710: 6b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66  k.    int rc = f
f720: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
f730: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
f740: 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20  );.    if (!rc) 
f750: 7b 0a 20 20 20 20 20 20 2f 2f 20 67 6f 74 20 74  {.      // got t
f760: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
f770: 69 74 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70  it.      flock(p
f780: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
f790: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f7a0: 30 3b 20 20 2f 2f 20 6e 6f 20 6f 6e 65 20 68 61  0;  // no one ha
f7b0: 73 20 69 74 20 72 65 73 65 72 76 65 64 0a 20 20  s it reserved.  
f7c0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
f7d0: 3b 20 2f 2f 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ; // someone els
f7e0: 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
f7f0: 72 65 73 65 72 76 65 64 0a 20 20 7d 0a 7d 0a 0a  reserved.  }.}..
f800: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
f810: 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  UnixLock(OsFile 
f820: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f830: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
f840: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f850: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2f 20  le*)id;.  .  // 
f860: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
f870: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
f880: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
f890: 2f 2f 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  // Just adjust l
f8a0: 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
f8b0: 20 6f 75 74 74 61 20 68 65 72 65 2e 0a 20 20 69   outta here..  i
f8c0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
f8d0: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
f8e0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f8f0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f900: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f910: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
f920: 2f 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  / grab an exclus
f930: 69 76 65 20 6c 6f 63 6b 0a 20 20 69 6e 74 20 72  ive lock.  int r
f940: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f950: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
f960: 43 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28 72 63  CK_NB);.  if (rc
f970: 29 20 7b 0a 20 20 20 20 2f 2f 20 64 69 64 6e 27  ) {.    // didn'
f980: 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
f990: 75 73 79 0a 20 20 20 20 72 65 74 75 72 6e 20 53  usy.    return S
f9a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
f9b0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2f 20 67 6f  else {.    // go
f9c0: 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
f9d0: 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
f9e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
f9f0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
fa00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  TE_OK;.  }.}..st
fa20: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
fa30: 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20  ixUnlock(OsFile 
fa40: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
fa50: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
fa60: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
fa70: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
fa80: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
fa90: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
faa0: 0a 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69 66 20 70  .  // no-op if p
fab0: 6f 73 73 69 62 6c 65 0a 20 20 69 66 28 20 70 46  ossible.  if( pF
fac0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
fad0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
fae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
faf0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 73 68 61  .  }.  .  // sha
fb00: 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
fb10: 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
fb20: 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
fb30: 63 6c 75 73 69 76 65 0a 20 20 69 66 20 28 6c 6f  clusive.  if (lo
fb40: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
fb50: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
fb60: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
fb70: 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
fb80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fb90: 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20 72 65 61  .  .  // no, rea
fba0: 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a 20 20 69  lly, unlock..  i
fbb0: 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
fbc0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
fbd0: 3b 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20 20  ;.  if (rc).    
fbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fbf0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c  ERR_UNLOCK;.  el
fc00: 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
fc10: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
fc20: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
fc30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
fc40: 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
fc50: 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
fc60: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c   int flockUnixCl
fc70: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
fc80: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
fc90: 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  id = (unixFile*)
fca0: 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *pId;.  .  if( !
fcb0: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
fcc0: 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e  TE_OK;.  flockUn
fcd0: 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e  ixUnlock(*pId, N
fce0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66  O_LOCK);.  .  if
fcf0: 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
fd00: 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
fd10: 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
fd20: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
fd30: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
fd40: 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b  .  close(id->h);
fd50: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65    .  sqlite3OsLe
fd60: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64  aveMutex();.  id
fd70: 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  ->isOpen = 0;.  
fd80: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
fd90: 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b  %-3d\n", id->h);
fda0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
fdb0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  1);.  sqlite3Thr
fdc0: 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b  eadSafeFree(id);
fdd0: 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72  .  *pId = 0;.  r
fde0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fdf0: 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  .}..#pragma mark
fe00: 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63   Old-School .loc
fe10: 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f 63  k file based loc
fe20: 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  king../*. ** The
fe30: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
fe40: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
fe50: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f   contains all do
fe60: 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f  tlock (.lock) lo
fe70: 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63 20  ck. ** specific 
fe80: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
fe90: 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b  f struct dotlock
fea0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  LockingContext d
feb0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
fec0: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74  text;.struct dot
fed0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
fee0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63  xt {.  char *loc
fef0: 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74  kPath;.};...stat
ff00: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
ff10: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
ff20: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20  ock(OsFile *id) 
ff30: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
ff40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
ff50: 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
ff60: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
ff70: 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
ff80: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
ff90: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
ffa0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
ffb0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
ffc0: 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
ffd0: 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
ffe0: 65 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65  eturn 1; // alre
fff0: 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
10000 76 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73  ved lock.  } els
10010 65 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  e {.    struct s
10020 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20 20  tat statBuf;.   
10030 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74 65   if (lstat(conte
10040 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74  xt->lockPath,&st
10050 61 74 42 75 66 29 20 3d 3d 20 30 29 0a 20 20 20  atBuf) == 0).   
10060 20 20 20 2f 2f 20 66 69 6c 65 20 65 78 69 73 74     // file exist
10070 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  s, someone else 
10080 68 61 73 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20  has the lock.   
10090 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
100a0 20 65 6c 73 65 0a 20 20 20 20 20 20 2f 2f 20 66   else.      // f
100b0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
100c0 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61 76  st, we could hav
100d0 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
100e0 69 74 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  it.      return 
100f0 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
10100 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
10110 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Lock(OsFile *id,
10120 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
10130 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10140 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10150 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63  id;.  dotlockLoc
10160 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
10170 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74  text = .    (dot
10180 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10190 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
101a0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
101b0 20 20 2f 2f 20 69 66 20 77 65 20 61 6c 72 65 61    // if we alrea
101c0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
101d0 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
101e0 20 20 0a 20 20 2f 2f 20 4a 75 73 74 20 61 64 6a    .  // Just adj
101f0 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
10200 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
10210 2e 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  ..  if (pFile->l
10220 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
10230 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
10240 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
10250 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ype;.    .    /*
10260 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
10270 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
10280 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
10290 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e 74 65      utimes(conte
102a0 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c  xt->lockPath,NUL
102b0 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  L);.    return S
102c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
102d0 0a 20 20 2f 2f 20 63 68 65 63 6b 20 74 6f 20 73  .  // check to s
102e0 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20  ee if lock file 
102f0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 0a 20  already exists. 
10300 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
10310 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
10320 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  t(context->lockP
10330 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d  ath,&statBuf) ==
10340 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   0){.    return 
10350 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2f 20  SQLITE_BUSY; // 
10360 69 74 20 64 6f 65 73 2c 20 62 75 73 79 0a 20 20  it does, busy.  
10370 7d 0a 20 20 0a 20 20 2f 2f 20 67 72 61 62 20 61  }.  .  // grab a
10380 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10390 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e  .  int fd = open
103a0 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
103b0 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52  th,O_RDONLY|O_CR
103c0 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29  EAT|O_EXCL,0600)
103d0 3b 0a 20 20 69 66 20 28 66 64 20 3c 20 30 29 20  ;.  if (fd < 0) 
103e0 7b 0a 20 20 20 20 2f 2f 20 66 61 69 6c 65 64 20  {.    // failed 
103f0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
10400 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65  he file, someone
10410 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73   else may have s
10420 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 0a 20  tolen the lock. 
10430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10440 5f 42 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c  _BUSY; .  }.  cl
10450 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2f  ose(fd);.  .  //
10460 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
10470 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
10480 20 6f 6b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   ok.  pFile->loc
10490 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
104a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
104b0 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
104c0 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55  int dotlockUnixU
104d0 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
104e0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
104f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10500 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10510 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
10520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
10530 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
10540 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10550 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
10560 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
10570 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10580 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
10590 20 29 3b 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2d 6f   );.  .  // no-o
105a0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 0a 20 20  p if possible.  
105b0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
105c0 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
105d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
105e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
105f0 2f 2f 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  // shared can ju
10600 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
10610 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
10620 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20   an exclusive.  
10630 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if (locktype==SH
10640 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
10650 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10660 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
10670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10680 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 6e  K;.  }.  .  // n
10690 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
106a0 6b 2e 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74  k..  unlink(cont
106b0 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a  ext->lockPath);.
106c0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
106d0 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
106e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
106f0 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
10700 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
10710 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10720 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  nixClose(OsFile 
10730 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46  **pId) {.  unixF
10740 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
10750 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20  ile*)*pId;.  .  
10760 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e  if( !id ) return
10770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64 6f   SQLITE_OK;.  do
10780 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28  tlockUnixUnlock(
10790 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  *pId, NO_LOCK);.
107a0 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 64 6f    /* free the do
107b0 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 73 74  tlock locking st
107c0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
107d0 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
107e0 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
107f0 20 20 20 69 66 20 28 28 28 64 6f 74 6c 6f 63 6b     if (((dotlock
10800 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10810 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  )id->lockingCont
10820 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 21  ext)->lockPath !
10830 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71  = NULL).      sq
10840 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
10850 72 65 65 28 20 28 20 28 64 6f 74 6c 6f 63 6b 4c  ree( ( (dotlockL
10860 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
10870 0a 20 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63  .        id->loc
10880 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f  kingContext)->lo
10890 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  ckPath);.    sql
108a0 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
108b0 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  ee(id->lockingCo
108c0 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20  ntext);.  }.  . 
108d0 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
108e0 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
108f0 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
10900 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
10910 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
10920 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  .  .  close(id->
10930 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  h);.  .  sqlite3
10940 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
10950 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
10960 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  ;.  TRACE2("CLOS
10970 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d  E   %-3d\n", id-
10980 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
10990 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
109a0 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
109b0 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b  id);.  *pId = 0;
109c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109d0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61  _OK;.}...#pragma
109e0 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67   mark No locking
109f0 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 6e 6f 6c  ../*. ** The nol
10a00 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10a10 74 20 69 73 20 76 6f 69 64 0a 20 2a 2f 0a 74 79  t is void. */.ty
10a20 70 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63  pedef void noloc
10a30 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
10a40 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
10a50 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
10a60 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  rvedLock(OsFile 
10a70 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
10a80 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
10a90 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28   nolockUnixLock(
10aa0 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
10ab0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65  locktype) {.  re
10ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ad0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  }..static int no
10ae0 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f  lockUnixUnlock(O
10af0 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
10b00 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74  ocktype) {.  ret
10b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10b20 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
10b30 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
10b40 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78  c int nolockUnix
10b50 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70  Close(OsFile **p
10b60 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Id) {.  unixFile
10b70 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65   *id = (unixFile
10b80 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28  *)*pId;.  .  if(
10b90 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53 51   !id ) return SQ
10ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
10bb0 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
10bc0 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
10bd0 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
10be0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
10bf0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
10c00 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20  close(id->h);.  
10c10 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
10c20 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
10c30 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52  isOpen = 0;.  TR
10c40 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
10c50 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20  3d\n", id->h);. 
10c60 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
10c70 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65 61  ;.  sqlite3Threa
10c80 64 53 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20  dSafeFree(id);. 
10c90 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74   *pId = 0;.  ret
10ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10cb0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
10cc0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10cd0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
10ce0 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
10cf0 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
10d00 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
10d10 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
10d20 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c  er.** to the ful
10d30 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65  l pathname store
10d40 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
10d50 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
10d60 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20  alloc()..** The 
10d70 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
10d80 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
10d90 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73  for freeing this
10da0 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a   space once it.*
10db0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  * is no longer n
10dc0 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eeded..*/.char *
10dd0 73 71 6c 69 74 65 33 55 6e 69 78 46 75 6c 6c 50  sqlite3UnixFullP
10de0 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  athname(const ch
10df0 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a  ar *zRelative){.
10e00 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
10e10 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  0;.  if( zRelati
10e20 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ve[0]=='/' ){.  
10e30 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
10e40 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61  ng(&zFull, zRela
10e50 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  tive, (char*)0);
10e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
10e70 61 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74  ar *zBuf = sqlit
10e80 65 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20  eMalloc(5000);. 
10e90 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29     if( zBuf==0 )
10ea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
10eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
10ec0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [0] = 0;.    sql
10ed0 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
10ee0 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
10ef0 66 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a  f, 5000), "/", z
10f00 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20  Relative,.      
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10f20 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c  har*)0);.    sql
10f30 69 74 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20  iteFree(zBuf);. 
10f40 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20   }..#if 0.  /*. 
10f50 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22   ** Remove "/./"
10f60 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61   path elements a
10f70 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e  nd convert "/A/.
10f80 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
10f90 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f  .  ** to just "/
10fa0 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  "..  */.  if( zF
10fb0 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ull ){.    int i
10fc0 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a  , j;.    for(i=j
10fd0 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b  =0; zFull[i]; i+
10fe0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  +){.      if( zF
10ff0 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ull[i]=='/' ){. 
11000 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
11010 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
11020 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
11030 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
11040 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
11050 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
11060 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
11070 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
11080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11090 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
110a0 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
110b0 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  2]=='.' && zFull
110c0 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
110d0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
110e0 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d  >0 && zFull[j-1]
110f0 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
11100 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33            i += 3
11110 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
11120 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
11130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
11140 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c  ull[j++] = zFull
11150 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [i];.    }.    z
11160 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  Full[j] = 0;.  }
11170 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
11180 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zFull;.}../*.*
11190 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
111a0 75 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79  ue of the fullsy
111b0 6e 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67  nc flag in the g
111c0 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
111d0 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
111e0 76 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c  void unixSetFull
111f0 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
11200 20 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69   int v){.  ((uni
11210 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c  xFile*)id)->full
11220 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a  Sync = v;.}../*.
11230 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  ** Return the un
11240 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
11250 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69  ndle for an OsFi
11260 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
11270 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28   unixFileHandle(
11280 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
11290 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65  eturn ((unixFile
112a0 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a  *)id)->h;.}../*.
112b0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
112c0 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65  eger that indice
112d0 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  s the type of lo
112e0 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
112f0 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e  d.** by this han
11300 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20  dle.  (Used for 
11310 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
11320 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73  ysis only.).*/.s
11330 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
11340 63 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a  ckState(OsFile *
11350 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  id){.  return ((
11360 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
11370 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ocktype;.}../*.*
11380 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
11390 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
113a0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
113b0 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
113c0 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e  ile.** for unix.
113d0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
113e0 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
113f0 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  3UnixIoMethod = 
11400 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20  {.  unixClose,. 
11410 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
11420 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
11430 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
11440 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
11450 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
11460 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
11470 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
11480 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
11490 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78  FileSize,.  unix
114a0 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f  Lock,.  unixUnlo
114b0 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
114c0 61 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b  ate,.  unixCheck
114d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b  ReservedLock,.};
114e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
114f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
11500 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73  TYLE./*. ** This
11510 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
11520 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
11530 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
11540 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a   on an OsFile. *
11550 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20  * for unix with 
11560 41 46 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  AFP style file l
11570 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
11580 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
11590 64 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b  d sqlite3AFPLock
115a0 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
115b0 3d 20 7b 0a 20 20 20 20 61 66 70 55 6e 69 78 43  = {.    afpUnixC
115c0 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70  lose,.    unixOp
115d0 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20  enDirectory,.   
115e0 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75   unixRead,.    u
115f0 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e  nixWrite,.    un
11600 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78  ixSeek,.    unix
11610 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e  Truncate,.    un
11620 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  ixSync,.    unix
11630 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20  SetFullSync,.   
11640 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c   unixFileHandle,
11650 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  .    unixFileSiz
11660 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 4c 6f  e,.    afpUnixLo
11670 63 6b 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 55  ck,.    afpUnixU
11680 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
11690 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 61 66  ockState,.    af
116a0 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  pUnixCheckReserv
116b0 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 20  edLock,.};../*. 
116c0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
116d0 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
116e0 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
116f0 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73  operate on an Os
11700 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69  File. ** for uni
11710 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73  x with flock() s
11720 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
11730 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  g.. */.static co
11740 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
11750 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ite3FlockLocking
11760 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
11770 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c  .    flockUnixCl
11780 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65  ose,.    unixOpe
11790 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20  nDirectory,.    
117a0 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e  unixRead,.    un
117b0 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69  ixWrite,.    uni
117c0 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54  xSeek,.    unixT
117d0 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69  runcate,.    uni
117e0 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53  xSync,.    unixS
117f0 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20  etFullSync,.    
11800 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a  unixFileHandle,.
11810 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65      unixFileSize
11820 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c  ,.    flockUnixL
11830 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  ock,.    flockUn
11840 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e  ixUnlock,.    un
11850 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20  ixLockState,.   
11860 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52   flockUnixCheckR
11870 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
11880 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63  ./*. ** This vec
11890 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
118a0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
118b0 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
118c0 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f  an OsFile. ** fo
118d0 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c  r unix with dotl
118e0 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  ock style file l
118f0 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
11900 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
11910 64 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b  d sqlite3Dotlock
11920 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
11930 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64 6f 74 6c  hod = {.    dotl
11940 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  ockUnixClose,.  
11950 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74    unixOpenDirect
11960 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61  ory,.    unixRea
11970 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65  d,.    unixWrite
11980 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a  ,.    unixSeek,.
11990 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65      unixTruncate
119a0 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a  ,.    unixSync,.
119b0 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53      unixSetFullS
119c0 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c  ync,.    unixFil
119d0 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69  eHandle,.    uni
119e0 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 64  xFileSize,.    d
119f0 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a  otlockUnixLock,.
11a00 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55      dotlockUnixU
11a10 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
11a20 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 64 6f  ockState,.    do
11a30 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  tlockUnixCheckRe
11a40 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a  servedLock,.};..
11a50 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74  /*. ** This vect
11a60 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
11a70 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
11a80 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
11a90 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72  n OsFile. ** for
11aa0 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f   unix with dotlo
11ab0 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  ck style file lo
11ac0 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69  cking.. */.stati
11ad0 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
11ae0 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f   sqlite3NolockLo
11af0 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
11b00 64 20 3d 20 7b 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  d = {.  nolockUn
11b10 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 4f  ixClose,.  unixO
11b20 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20  penDirectory,.  
11b30 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78  unixRead,.  unix
11b40 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 53 65 65  Write,.  unixSee
11b50 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74  k,.  unixTruncat
11b60 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20  e,.  unixSync,. 
11b70 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63   unixSetFullSync
11b80 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64  ,.  unixFileHand
11b90 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  le,.  unixFileSi
11ba0 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78  ze,.  nolockUnix
11bb0 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  Lock,.  nolockUn
11bc0 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78  ixUnlock,.  unix
11bd0 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 6e 6f 6c  LockState,.  nol
11be0 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
11bf0 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 23 65  rvedLock,.};..#e
11c00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11c10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11c20 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  YLE */../*.** Al
11c30 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
11c40 72 20 61 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  r a new unixFile
11c50 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11c60 74 68 61 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  that unixFile..*
11c70 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
11c80 72 20 74 6f 20 74 68 65 20 6e 65 77 20 75 6e 69  r to the new uni
11c90 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e  xFile into *pId.
11ca0 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e 20 6f 75  .** If we run ou
11cb0 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f  t of memory, clo
11cc0 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
11cd0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
11ce0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
11cf0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
11d00 5f 53 54 59 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57  _STYLE./* . ** W
11d10 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65  hen locking exte
11d20 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c  nsions are enabl
11d30 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68  ed, the filepath
11d40 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79   and locking sty
11d50 6c 65 20 0a 20 2a 2a 20 61 72 65 20 6e 65 65 64  le . ** are need
11d60 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11d70 74 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65  the unixFile pMe
11d80 74 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20  thod to use for 
11d90 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
11da0 6e 73 2e 0a 20 2a 2a 20 54 68 65 20 6c 6f 63 6b  ns.. ** The lock
11db0 69 6e 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66  ing-style specif
11dc0 69 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ic lockingContex
11dd0 74 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  t data structure
11de0 20 69 73 20 63 72 65 61 74 65 64 20 0a 20 2a 2a   is created . **
11df0 20 61 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65   and assigned he
11e00 72 65 20 61 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61  re also.. */.sta
11e10 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
11e20 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20  UnixFile(.  int 
11e30 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
11e40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
11e50 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
11e60 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
11e70 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70   */.  OsFile **p
11e80 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Id,           /*
11e90 20 57 72 69 74 65 20 63 6f 6d 70 6c 65 74 65 64   Write completed
11ea0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
11eb0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
11ec0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
11ed0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11ee0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
11ef0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46  ed */.  int delF
11f00 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
11f10 2f 2a 20 44 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d  /* Delete-on-or-
11f20 62 65 66 6f 72 65 2d 63 6c 6f 73 65 20 66 6c 61  before-close fla
11f30 67 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  g */.){.  sqlite
11f40 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f  3LockingStyle lo
11f50 63 6b 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ckStyle;.  unixF
11f60 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69  ile *pNew;.  uni
11f70 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72  xFile f;.  int r
11f80 63 3b 0a 0a 20 20 6c 6f 63 6b 69 6e 67 53 74 79  c;..  lockingSty
11f90 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 65 74 65  le = sqlite3Dete
11fa0 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 7a  ctLockingStyle(z
11fb0 46 69 6c 65 6e 61 6d 65 2c 20 66 2e 68 29 3b 0a  Filename, f.h);.
11fc0 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53 74    if ( lockingSt
11fd0 79 6c 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63 6b  yle == posixLock
11fe0 69 6e 67 53 74 79 6c 65 20 29 20 7b 0a 20 20 20  ingStyle ) {.   
11ff0 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
12000 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
12010 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c   findLockInfo(h,
12020 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f   &f.pLock, &f.pO
12030 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pen);.    sqlite
12040 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
12050 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
12060 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20       close(h);. 
12070 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c       unlink(zFil
12080 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  ename);.      re
12090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
120a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  M;.    }.  } els
120b0 65 20 7b 0a 20 20 20 20 2f 2f 20 20 70 4c 6f 63  e {.    //  pLoc
120c0 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65 20  k and pOpen are 
120d0 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70 6f  only used for po
120e0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
120f0 6b 69 6e 67 20 0a 20 20 20 20 66 2e 70 4c 6f 63  king .    f.pLoc
12100 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 66 2e  k = NULL;.    f.
12110 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pOpen = NULL;.  
12120 7d 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20  }.  if( delFlag 
12130 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
12140 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
12150 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  f.dirfd = -1;.  
12160 66 2e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  f.fullSync = 0;.
12170 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30    f.locktype = 0
12180 3b 0a 20 20 66 2e 6f 66 66 73 65 74 20 3d 20 30  ;.  f.offset = 0
12190 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53  ;.  f.h = h;.  S
121a0 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b  ET_THREADID(&f);
121b0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
121c0 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f  3ThreadSafeMallo
121d0 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  c( sizeof(unixFi
121e0 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  le) );.  if( pNe
121f0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73  w==0 ){.    clos
12200 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(h);.    sqlite
12210 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
12220 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  .    releaseLock
12230 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20  Info(f.pLock);. 
12240 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
12250 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  t(f.pOpen);.    
12260 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
12270 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20  tex();.    *pId 
12280 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
12290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
122a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77  }else{.    *pNew
122b0 20 3d 20 66 3b 0a 20 20 20 20 73 77 69 74 63 68   = f;.    switch
122c0 28 6c 6f 63 6b 53 74 79 6c 65 29 20 7b 0a 20 20  (lockStyle) {.  
122d0 20 20 20 20 63 61 73 65 20 61 66 70 4c 6f 63 6b      case afpLock
122e0 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
122f0 20 20 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67    /* afp locking
12300 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
12310 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
12320 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
12330 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
12340 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
12350 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  xt */.        pN
12360 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12370 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
12380 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12390 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
123a0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20  ingContext = .  
123b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
123c0 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
123d0 73 69 7a 65 6f 66 28 61 66 70 4c 6f 63 6b 69 6e  sizeof(afpLockin
123e0 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20  gContext));.    
123f0 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67      ((afpLocking
12400 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e  Context *)pNew->
12410 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
12420 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20 20  >filePath = .   
12430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68         sqlite3Th
12440 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 73  readSafeMalloc(s
12450 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
12460 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73   + 1);.        s
12470 74 72 63 70 79 28 28 28 61 66 70 4c 6f 63 6b 69  trcpy(((afpLocki
12480 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77  ngContext *)pNew
12490 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
124a0 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20 20  )->filePath, .  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
124c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
124d0 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
124e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
124f0 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f      case flockLo
12500 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
12510 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63      /* flock loc
12520 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65  king doesn't nee
12530 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  d additional loc
12540 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f  kingContext info
12550 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
12560 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
12570 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b   = &sqlite3Flock
12580 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12590 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  hod;.        bre
125a0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64  ak;.      case d
125b0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
125c0 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 64  le:.        /* d
125d0 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
125e0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
125f0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
12600 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
12610 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
12620 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
12630 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20  ntext */.       
12640 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12650 20 26 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b   &sqlite3Dotlock
12660 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12670 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  hod;.        pNe
12680 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12690 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  t = sqlite3Threa
126a0 64 53 61 66 65 4d 61 6c 6c 6f 63 28 0a 20 20 20  dSafeMalloc(.   
126b0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f         sizeof(do
126c0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
126d0 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 28  ext));.        (
126e0 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
126f0 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c  ontext *)pNew->l
12700 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
12710 6c 6f 63 6b 50 61 74 68 20 3d 20 0a 20 20 20 20  lockPath = .    
12720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
12730 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12740 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
12750 29 20 2b 20 73 74 72 6c 65 6e 28 22 2e 6c 6f 63  ) + strlen(".loc
12760 6b 22 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  k") + 1);.      
12770 20 20 73 70 72 69 6e 74 66 28 28 28 64 6f 74 6c    sprintf(((dotl
12780 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
12790 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  t *)pNew->lockin
127a0 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
127b0 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ath, .          
127c0 20 20 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c        "%s.lock",
127d0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
127e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
127f0 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63 6b    case posixLock
12800 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
12810 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b 69    /* posix locki
12820 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  ng doesn't need 
12830 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  additional locki
12840 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  ngContext inform
12850 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
12860 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12870 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d   &sqlite3UnixIoM
12880 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62  ethod;.        b
12890 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
128a0 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a   noLockingStyle:
128b0 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e 73 75  .      case unsu
128c0 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74  pportedLockingSt
128d0 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61 75  yle:.      defau
128e0 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e 65  lt: .        pNe
128f0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
12900 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
12910 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  ngUnixIoMethod;.
12920 20 20 20 20 7d 0a 20 20 20 20 2a 70 49 64 20 3d      }.    *pId =
12930 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a   (OsFile*)pNew;.
12940 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
12950 2b 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  +1);.    return 
12960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
12970 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c 49 54 45  .#else /* SQLITE
12980 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12990 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74 69 63 20  STYLE */.static 
129a0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  int allocateUnix
129b0 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20  File(.  int h,  
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
129d0 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
129e0 72 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20 62  riptor on file b
129f0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
12a00 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 20   OsFile **pId,  
12a10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12a20 20 74 68 65 20 72 65 73 75 6c 20 75 6e 69 78 46   the resul unixF
12a30 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
12a40 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
12a50 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
12a60 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12a70 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
12a80 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67  */.  int delFlag
12a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12aa0 66 20 74 72 75 65 2c 20 64 65 6c 65 74 65 20 74  f true, delete t
12ab0 68 65 20 66 69 6c 65 20 6f 6e 20 6f 72 20 62 65  he file on or be
12ac0 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  fore closing */.
12ad0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
12ae0 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  New;.  unixFile 
12af0 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  f;.  int rc;..  
12b00 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
12b10 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
12b20 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66  ndLockInfo(h, &f
12b30 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e  .pLock, &f.pOpen
12b40 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  );.  sqlite3OsLe
12b50 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
12b60 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20  ( delFlag ){.   
12b70 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
12b80 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
12b90 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29   ){.    close(h)
12ba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12bb0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12bc0 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20 20   TRACE3("OPEN   
12bd0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
12be0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 2e  zFilename);.  f.
12bf0 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e  dirfd = -1;.  f.
12c00 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
12c10 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  f.locktype = 0;.
12c20 20 20 66 2e 6f 66 66 73 65 74 20 3d 20 30 3b 0a    f.offset = 0;.
12c30 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54    f.h = h;.  SET
12c40 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20  _THREADID(&f);. 
12c50 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 54   pNew = sqlite3T
12c60 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12c70 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
12c80 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
12c90 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  =0 ){.    close(
12ca0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  h);.    sqlite3O
12cb0 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
12cc0 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12cd0 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20  fo(f.pLock);.   
12ce0 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
12cf0 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  f.pOpen);.    sq
12d00 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
12d10 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  x();.    *pId = 
12d20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
12d30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
12d40 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d  lse{.    *pNew =
12d50 20 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d   f;.    pNew->pM
12d60 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12d70 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12d80 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65    *pId = (OsFile
12d90 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e  *)pNew;.    Open
12da0 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
12db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12dc0 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  K;.  }.}.#endif 
12dd0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12de0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
12df0 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
12e00 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
12e10 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
12e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12e60 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62  ** Everything ab
12e70 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66  ove deals with f
12e80 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74  ile I/O.  Everyt
12e90 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77  hing that follow
12ea0 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20  s deals.** with 
12eb0 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f  other miscellano
12ec0 75 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68  us aspects of th
12ed0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12ee0 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a  em interface.***
12ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a  *********/.../*.
12f40 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69  ** Get informati
12f50 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65 20 72  on to seed the r
12f60 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
12f70 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65  erator.  The see
12f80 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  d.** is written 
12f90 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
12fa0 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20  zBuf[256].  The 
12fb0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
12fc0 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20   must.** supply 
12fd0 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c  a sufficiently l
12fe0 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  arge buffer..*/.
12ff0 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 52  int sqlite3UnixR
13000 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a  andomSeed(char *
13010 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68  zBuf){.  /* We h
13020 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
13030 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
13040 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
13050 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
13060 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
13070 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
13080 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
13090 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
130a0 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
130b0 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
130c0 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
130d0 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
130e0 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
130f0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
13100 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
13110 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
13120 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
13130 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
13140 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
13150 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
13160 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
13170 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
13180 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
13190 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
131a0 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
131b0 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
131c0 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
131d0 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
131e0 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
131f0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
13200 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
13210 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
13220 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
13230 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
13240 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
13250 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
13260 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
13270 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
13280 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
13290 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36 29 3b  t(zBuf, 0, 256);
132a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
132b0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
132c0 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a     int pid, fd;.
132d0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f      fd = open("/
132e0 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
132f0 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  RDONLY);.    if(
13300 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
13310 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
13320 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
13330 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
13340 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
13350 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
13360 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
13370 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65  zBuf[sizeof(time
13380 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  _t)], &pid, size
13390 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 7d 65  of(pid));.    }e
133a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61 64 28  lse{.      read(
133b0 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a  fd, zBuf, 256);.
133c0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
133d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
133e0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
133f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13400 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
13410 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
13420 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13430 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
13440 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
13450 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
13460 69 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  iseconds we want
13470 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e   to sleep..*/.in
13480 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 6c 65  t sqlite3UnixSle
13490 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
134a0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
134b0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
134c0 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a  EEP.  usleep(ms*
134d0 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
134e0 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65  ms;.#else.  slee
134f0 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29  p((ms+999)/1000)
13500 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30 30 2a  ;.  return 1000*
13510 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b  ((ms+999)/1000);
13520 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13530 20 53 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   Static variable
13540 73 20 75 73 65 64 20 66 6f 72 20 74 68 72 65 61  s used for threa
13550 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f  d synchronizatio
13560 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74 65 78  n..**.** inMutex
13570 20 20 20 20 20 20 74 68 65 20 6e 65 73 74 69 6e        the nestin
13580 67 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 72  g depth of the r
13590 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 2e 20  ecursive mutex. 
135a0 20 54 68 65 20 74 68 72 65 61 64 0a 2a 2a 20 20   The thread.**  
135b0 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 6c 64              hold
135c0 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 63 61  ing mutexMain ca
135d0 6e 20 72 65 61 64 20 74 68 69 73 20 76 61 72 69  n read this vari
135e0 61 62 6c 65 20 61 74 20 61 6e 79 20 74 69 6d 65  able at any time
135f0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
13600 20 20 42 75 74 20 69 73 20 6d 75 73 74 20 68 6f    But is must ho
13610 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f 20 63  ld mutexAux to c
13620 68 61 6e 67 65 20 74 68 69 73 20 76 61 72 69 61  hange this varia
13630 62 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a 20 20  ble.  Other.**  
13640 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
13650 61 64 73 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75  ads must hold mu
13660 74 65 78 41 75 78 20 74 6f 20 72 65 61 64 20 74  texAux to read t
13670 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  he variable and 
13680 63 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  can.**          
13690 20 20 20 20 6e 65 76 65 72 20 77 72 69 74 65 2e      never write.
136a0 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65  .**.** mutexOwne
136b0 72 20 20 20 54 68 65 20 74 68 72 65 61 64 20 69  r   The thread i
136c0 64 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 20  d of the thread 
136d0 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69  holding mutexMai
136e0 6e 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20 20 20  n.  Same.**     
136f0 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20           access 
13700 72 75 6c 65 73 20 61 73 20 66 6f 72 20 69 6e 4d  rules as for inM
13710 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65  utex..**.** mute
13720 78 4f 77 6e 65 72 56 61 6c 69 64 20 20 20 54 72  xOwnerValid   Tr
13730 75 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  ue if the value 
13740 69 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73  in mutexOwner is
13750 20 76 61 6c 69 64 2e 20 20 54 68 65 20 73 61 6d   valid.  The sam
13760 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
13770 20 20 20 20 20 20 20 61 63 63 65 73 73 20 72 75         access ru
13780 6c 65 73 20 61 70 70 6c 79 20 61 73 20 66 6f 72  les apply as for
13790 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20   inMutex..**.** 
137a0 6d 75 74 65 78 4d 61 69 6e 20 20 20 20 54 68 65  mutexMain    The
137b0 20 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20 48 6f   main mutex.  Ho
137c0 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20 69 6e  ld this mutex in
137d0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 65 78   order to get ex
137e0 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 20  clusive.**      
137f0 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20 74          access t
13800 6f 20 53 51 4c 69 74 65 20 64 61 74 61 20 73 74  o SQLite data st
13810 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
13820 6d 75 74 65 78 41 75 78 20 20 20 20 20 41 6e 20  mutexAux     An 
13830 61 75 78 69 6c 69 61 72 79 20 6d 75 74 65 78 20  auxiliary mutex 
13840 6e 65 65 64 65 64 20 74 6f 20 61 63 63 65 73 73  needed to access
13850 20 76 61 72 69 61 62 6c 65 73 20 64 65 66 69 6e   variables defin
13860 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ed above..**.** 
13870 4d 75 74 65 78 65 73 20 61 72 65 20 61 6c 77 61  Mutexes are alwa
13880 79 73 20 61 63 71 75 69 72 65 64 20 69 6e 20 74  ys acquired in t
13890 68 69 73 20 6f 72 64 65 72 3a 20 6d 75 74 65 78  his order: mutex
138a0 4d 61 69 6e 20 6d 75 74 65 78 41 75 78 2e 20 20  Main mutexAux.  
138b0 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 6e 65   It.** is not ne
138c0 63 65 73 73 61 72 79 20 74 6f 20 61 63 71 75 69  cessary to acqui
138d0 72 65 20 6d 75 74 65 78 4d 61 69 6e 20 69 6e 20  re mutexMain in 
138e0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 6d 75 74  order to get mut
138f0 65 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a 2a 20  exAux - just.** 
13900 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
13910 6f 20 61 63 71 75 69 72 65 20 74 68 65 6d 20 69  o acquire them i
13920 6e 20 74 68 65 20 72 65 76 65 72 73 65 20 6f 72  n the reverse or
13930 64 65 72 3a 20 6d 75 74 65 78 41 75 78 20 6d 75  der: mutexAux mu
13940 74 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69 74 68  texMain..** Eith
13950 65 72 20 67 65 74 20 74 68 65 20 6d 75 74 65 78  er get the mutex
13960 65 73 20 77 69 74 68 20 6d 75 74 65 78 4d 61 69  es with mutexMai
13970 6e 20 66 69 72 73 74 20 6f 72 20 67 65 74 20 6d  n first or get m
13980 75 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a 2a 2a  utexAux only..**
13990 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  .** When running
139a0 20 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d 20 77   on a platform w
139b0 68 65 72 65 20 74 68 65 20 74 68 72 65 65 20 76  here the three v
139c0 61 72 69 61 62 6c 65 73 20 69 6e 4d 75 74 65 78  ariables inMutex
139d0 2c 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a 2a 2a  , mutexOwner,.**
139e0 20 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65 72 56   and mutexOwnerV
139f0 61 6c 69 64 20 63 61 6e 20 62 65 20 73 65 74 20  alid can be set 
13a00 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68 65 20  atomically, the 
13a10 6d 75 74 65 78 41 75 78 20 69 73 20 6e 6f 74 20  mutexAux is not 
13a20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f 6e 20  required..** On 
13a30 6d 61 6e 79 20 73 79 73 74 65 6d 73 2c 20 61 6c  many systems, al
13a40 6c 20 74 68 72 65 65 20 61 72 65 20 33 32 2d 62  l three are 32-b
13a50 69 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  it integers and 
13a60 77 72 69 74 69 6e 67 20 74 6f 20 61 20 33 32 2d  writing to a 32-
13a70 62 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  bit.** integer i
13a80 73 20 61 74 6f 6d 69 63 2e 20 20 49 20 74 68 69  s atomic.  I thi
13a90 6e 6b 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  nk.  But there a
13aa0 72 65 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 73  re no guarantees
13ab0 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 2a  .  So it seems.*
13ac0 2a 20 73 61 66 65 72 20 74 6f 20 70 72 6f 74 65  * safer to prote
13ad0 63 74 20 74 68 65 6d 20 75 73 69 6e 67 20 6d 75  ct them using mu
13ae0 74 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61 74 69  texAux..*/.stati
13af0 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
13b00 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
13b10 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74  _UNIX_THREADS.st
13b20 61 74 69 63 20 70 74 68 72 65 61 64 5f 74 20 6d  atic pthread_t m
13b30 75 74 65 78 4f 77 6e 65 72 3b 20 20 20 20 20 20  utexOwner;      
13b40 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20 68 6f      /* Thread ho
13b50 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20  lding mutexMain 
13b60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13b70 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20  texOwnerValid = 
13b80 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
13b90 20 69 66 20 6d 75 74 65 78 4f 77 6e 65 72 20 69   if mutexOwner i
13ba0 73 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61 74 69  s valid */.stati
13bb0 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
13bc0 74 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20 50 54  t mutexMain = PT
13bd0 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54  HREAD_MUTEX_INIT
13be0 49 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68 65 20  IALIZER; /* The 
13bf0 6d 75 74 65 78 20 2a 2f 0a 73 74 61 74 69 63 20  mutex */.static 
13c00 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
13c10 6d 75 74 65 78 41 75 78 20 3d 20 50 54 48 52 45  mutexAux = PTHRE
13c20 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
13c30 49 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20 6d 75  IZER;  /* Aux mu
13c40 74 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  tex */.#endif../
13c50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
13c60 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69  ng pair of routi
13c70 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  ne implement mut
13c80 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
13c90 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
13ca0 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
13cb0 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
13cc0 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
13cd0 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
13ce0 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
13cf0 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
13d00 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
13d10 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
13d20 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
13d30 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
13d40 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
13d50 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
13d60 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
13d70 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
13d80 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
13d90 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
13da0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20  ng..**.** As of 
13db0 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74  version 3.3.2, t
13dc0 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74 20 62  his mutex must b
13dd0 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a  e recursive..*/.
13de0 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78  void sqlite3Unix
13df0 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
13e00 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
13e10 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65  _THREADS.  pthre
13e20 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
13e30 75 74 65 78 41 75 78 29 3b 0a 20 20 69 66 28 20  utexAux);.  if( 
13e40 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64  !mutexOwnerValid
13e50 20 7c 7c 20 21 70 74 68 72 65 61 64 5f 65 71 75   || !pthread_equ
13e60 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70  al(mutexOwner, p
13e70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 20 29  thread_self()) )
13e80 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  {.    pthread_mu
13e90 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
13ea0 78 41 75 78 29 3b 0a 20 20 20 20 70 74 68 72 65  xAux);.    pthre
13eb0 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
13ec0 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20 20 61  utexMain);.    a
13ed0 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 3d 3d  ssert( inMutex==
13ee0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
13ef0 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69   !mutexOwnerVali
13f00 64 20 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64  d );.    pthread
13f10 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74  _mutex_lock(&mut
13f20 65 78 41 75 78 29 3b 0a 20 20 20 20 6d 75 74 65  exAux);.    mute
13f30 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64  xOwner = pthread
13f40 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d 75 74  _self();.    mut
13f50 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 31  exOwnerValid = 1
13f60 3b 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65 78 2b  ;.  }.  inMutex+
13f70 2b 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  +;.  pthread_mut
13f80 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
13f90 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Aux);.#else.  in
13fa0 4d 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69 66 0a  Mutex++;.#endif.
13fb0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  }.void sqlite3Un
13fc0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a  ixLeaveMutex(){.
13fd0 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65    assert( inMute
13fe0 78 3e 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  x>0 );.#ifdef SQ
13ff0 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
14000 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  S.  pthread_mute
14010 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  x_lock(&mutexAux
14020 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a  );.  inMutex--;.
14030 20 20 61 73 73 65 72 74 28 20 70 74 68 72 65 61    assert( pthrea
14040 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e  d_equal(mutexOwn
14050 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  er, pthread_self
14060 28 29 29 20 29 3b 0a 20 20 69 66 28 20 69 6e 4d  ()) );.  if( inM
14070 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61  utex==0 ){.    a
14080 73 73 65 72 74 28 20 6d 75 74 65 78 4f 77 6e 65  ssert( mutexOwne
14090 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 6d 75  rValid );.    mu
140a0 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20  texOwnerValid = 
140b0 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  0;.    pthread_m
140c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
140d0 65 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 70  exMain);.  }.  p
140e0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
140f0 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
14100 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d  #else.  inMutex-
14110 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  -;.#endif.}../*.
14120 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
14130 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63  f the mutex is c
14140 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a  urrently held..*
14150 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73  *.** If the this
14160 54 68 72 64 20 70 61 72 61 6d 65 74 65 72 20 69  Thrd parameter i
14170 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 74  s true, return t
14180 72 75 65 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a  rue only if the.
14190 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61  ** calling threa
141a0 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  d holds the mute
141b0 78 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  x.  If the param
141c0 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 72  eter is false, r
141d0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
141e0 20 61 6e 79 20 74 68 72 65 61 64 20 68 6f 6c 64   any thread hold
141f0 73 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a  s the mutex..*/.
14200 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49  int sqlite3UnixI
14210 6e 4d 75 74 65 78 28 69 6e 74 20 74 68 69 73 54  nMutex(int thisT
14220 68 72 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  hrd){.#ifdef SQL
14230 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
14240 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
14250 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
14260 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72 63  &mutexAux);.  rc
14270 20 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26 26 20   = inMutex>0 && 
14280 28 74 68 69 73 54 68 72 64 3d 3d 30 20 7c 7c 20  (thisThrd==0 || 
14290 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75  pthread_equal(mu
142a0 74 65 78 4f 77 6e 65 72 2c 70 74 68 72 65 61 64  texOwner,pthread
142b0 5f 73 65 6c 66 28 29 29 29 3b 0a 20 20 70 74 68  _self()));.  pth
142c0 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
142d0 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
142e0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65  return rc;.#else
142f0 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65  .  return inMute
14300 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  x>0;.#endif.}../
14310 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
14320 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65  e number of thre
14330 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61  ad-specific-data
14340 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65   blocks allocate
14350 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 74  d..** Use this t
14360 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 77 65  o verify that we
14370 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67   are not leaking
14380 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
14390 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74  -data..** Ticket
143a0 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66   #1601.*/.#ifdef
143b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
143c0 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75   sqlite3_tsd_cou
143d0 6e 74 20 3d 20 30 3b 0a 23 20 69 66 64 65 66 20  nt = 0;.# ifdef 
143e0 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
143f0 41 44 53 0a 20 20 20 20 73 74 61 74 69 63 20 70  ADS.    static p
14400 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 74  thread_mutex_t t
14410 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78  sd_counter_mutex
14420 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58   = PTHREAD_MUTEX
14430 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20  _INITIALIZER;.# 
14440 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55    define TSD_COU
14450 4e 54 45 52 28 4e 29 20 5c 0a 20 20 20 20 20 20  NTER(N) \.      
14460 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14470 75 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63  utex_lock(&tsd_c
14480 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c  ounter_mutex); \
14490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
144a0 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
144b0 2b 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20  += N; \.        
144c0 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
144d0 65 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63  ex_unlock(&tsd_c
144e0 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23  ounter_mutex);.#
144f0 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69 6e 65   else.#   define
14500 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
14510 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75   sqlite3_tsd_cou
14520 6e 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a  nt += N.# endif.
14530 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
14540 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f  SD_COUNTER(N)  /
14550 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
14560 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c  f../*.** If call
14570 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65  ed with allocate
14580 46 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72 65 74  Flag>0, then ret
14590 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
145a0 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
145b0 66 69 63 20 64 61 74 61 20 66 6f 72 20 74 68 65  fic data for the
145c0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
145d0 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a    Allocate and z
145e0 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65 61  ero the.** threa
145f0 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
14600 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
14610 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a  lready exist..**
14620 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69  .** If called wi
14630 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d  th allocateFlag=
14640 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74  =0, then check t
14650 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14660 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61  d.** specific da
14670 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74 20 69  ta.  Return it i
14680 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
14690 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
146a0 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
146b0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
146c0 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
146d0 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20 63 68  locateFlag<0, ch
146e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
146f0 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69  e thread specifi
14700 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61 6c 6c  c.** data is all
14710 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20 61 6c  ocated and is al
14720 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74 20 69  l zero.  If it i
14730 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s then deallocat
14740 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  e it..** Return 
14750 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14760 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63   thread specific
14770 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66   data or NULL if
14780 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f   it is.** unallo
14790 63 61 74 65 64 20 6f 72 20 67 65 74 73 20 64 65  cated or gets de
147a0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68  allocated..*/.Th
147b0 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69 74 65  readData *sqlite
147c0 33 55 6e 69 78 54 68 72 65 61 64 53 70 65 63 69  3UnixThreadSpeci
147d0 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f  ficData(int allo
147e0 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73 74 61  cateFlag){.  sta
147f0 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64  tic const Thread
14800 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20 3d 20  Data zeroData = 
14810 7b 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {0};  /* Initial
14820 69 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63 65 20  izer to silence 
14830 77 61 72 6e 69 6e 67 73 0a 20 20 20 20 20 20 20  warnings.       
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b      ** from brok
14870 65 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a  en compilers */.
14880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
14890 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61  IX_THREADS.  sta
148a0 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65 79 5f  tic pthread_key_
148b0 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20  t key;.  static 
148c0 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b  int keyInit = 0;
148d0 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
148e0 54 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79  Tsd;..  if( !key
148f0 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
14900 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
14910 29 3b 0a 20 20 20 20 69 66 28 20 21 6b 65 79 49  );.    if( !keyI
14920 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nit ){.      int
14930 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
14940 70 74 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61  pthread_key_crea
14950 74 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20  te(&key, 0);.   
14960 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14970 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65       sqlite3OsLe
14980 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
14990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
149a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65 79 49      }.      keyI
149b0 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nit = 1;.    }. 
149c0 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76     sqlite3OsLeav
149d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20  eMutex();.  }.. 
149e0 20 70 54 73 64 20 3d 20 70 74 68 72 65 61 64 5f   pTsd = pthread_
149f0 67 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 29  getspecific(key)
14a00 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
14a10 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
14a20 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20  ( pTsd==0 ){.   
14a30 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54     if( !sqlite3T
14a40 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20  estMallocFail() 
14a50 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64 20  ){.        pTsd 
14a60 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  = sqlite3OsMallo
14a70 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74  c(sizeof(zeroDat
14a80 61 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  a));.      }.#if
14a90 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
14aa0 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
14ab0 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65  3_isFail = 0;.#e
14ac0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
14ad0 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Tsd ){.        *
14ae0 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b  pTsd = zeroData;
14af0 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64  .        pthread
14b00 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b 65 79  _setspecific(key
14b10 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20  , pTsd);.       
14b20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29   TSD_COUNTER(+1)
14b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14b40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64    }else if( pTsd
14b50 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46  !=0 && allocateF
14b60 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20 20 20  lag<0 .         
14b70 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73     && memcmp(pTs
14b80 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69  d, &zeroData, si
14b90 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61 29  zeof(ThreadData)
14ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
14bb0 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b  te3OsFree(pTsd);
14bc0 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73 65 74  .    pthread_set
14bd0 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 30 29  specific(key, 0)
14be0 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
14bf0 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
14c00 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
14c10 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20  n pTsd;.#else.  
14c20 73 74 61 74 69 63 20 54 68 72 65 61 64 44 61 74  static ThreadDat
14c30 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20 20 69  a *pTsd = 0;.  i
14c40 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e  f( allocateFlag>
14c50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73  0 ){.    if( pTs
14c60 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  d==0 ){.      if
14c70 28 20 21 73 71 6c 69 74 65 33 54 65 73 74 4d 61  ( !sqlite3TestMa
14c80 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a 20 20  llocFail() ){.  
14c90 20 20 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c        pTsd = sql
14ca0 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69  ite3OsMalloc( si
14cb0 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 20 29  zeof(zeroData) )
14cc0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
14cd0 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
14ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
14cf0 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  sFail = 0;.#endi
14d00 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64  f.      if( pTsd
14d10 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73   ){.        *pTs
14d20 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20  d = zeroData;.  
14d30 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45        TSD_COUNTE
14d40 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  R(+1);.      }. 
14d50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14d60 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f   pTsd!=0 && allo
14d70 63 61 74 65 46 6c 61 67 3c 30 0a 20 20 20 20 20  cateFlag<0.     
14d80 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
14d90 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61  (pTsd, &zeroData
14da0 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44  , sizeof(ThreadD
14db0 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ata))==0 ){.    
14dc0 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54  sqlite3OsFree(pT
14dd0 73 64 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55  sd);.    TSD_COU
14de0 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54  NTER(-1);.    pT
14df0 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  sd = 0;.  }.  re
14e00 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69  turn pTsd;.#endi
14e10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
14e20 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
14e30 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
14e40 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62  on-zero value, b
14e50 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c  ecomes the resul
14e60 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72  t.** returned fr
14e70 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  om sqlite3OsCurr
14e80 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73  entTime().  This
14e90 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
14ea0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
14eb0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
14ec0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14ed0 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  time = 0;.#endif
14ee0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
14ef0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
14f00 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
14f10 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
14f20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
14f30 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
14f40 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
14f50 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
14f60 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
14f70 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
14f80 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
14f90 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
14fa0 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
14fb0 6c 69 74 65 33 55 6e 69 78 43 75 72 72 65 6e 74  lite3UnixCurrent
14fc0 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e  Time(double *prN
14fd0 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47  ow){.#ifdef NO_G
14fe0 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74  ETTOD.  time_t t
14ff0 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
15000 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30  *prNow = t/86400
15010 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
15020 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
15030 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73  imeval sNow;.  s
15040 74 72 75 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73  truct timezone s
15050 54 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64  Tz;  /* Not used
15060 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64   */.  gettimeofd
15070 61 79 28 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b  ay(&sNow, &sTz);
15080 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30  .  *prNow = 2440
15090 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f  587.5 + sNow.tv_
150a0 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e  sec/86400.0 + sN
150b0 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30  ow.tv_usec/86400
150c0 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66  000000.0;.#endif
150d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
150e0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
150f0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
15100 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73  {.    *prNow = s
15110 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
15120 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  ime/86400.0 + 24
15130 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e  40587.5;.  }.#en
15140 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  dif.  return 0;.
15150 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
15160 55 4e 49 58 20 2a 2f 0a                          UNIX */.