/ Hex Artifact Content
Login

Artifact 0d91b28d57c0885fe97fb9020fd1091578066b5b:


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 26 6c 6f  fd, F_GETLK, &lo
50d0: 63 6b 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 7b  ckInfo) != -1) {
50e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69  .    return posi
50f0: 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  xLockingStyle;. 
5100: 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73 74   } .  .  /* test
5110: 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63 61  ing for flock ca
5120: 6e 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73  n give false pos
5130: 69 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69  itives.  So if i
5140: 66 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74  f the above test
5150: 0a 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68 65  .  ** fails, the
5160: 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  n we fall back t
5170: 6f 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b  o using dot-lock
5180: 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a   style locking..
5190: 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20    */  .  return 
51a0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
51b0: 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45  yle;.}../* .** E
51c0: 78 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66 73  xamines the f_fs
51d0: 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69  typename entry i
51e0: 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72  n the statfs str
51f0: 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e  ucture as return
5200: 65 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28 29  ed by .** stat()
5210: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73 79   for the file sy
5220: 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65  stem hosting the
5230: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
5240: 61 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a 20  assigns the .** 
5250: 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
5260: 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20  ing style based 
5270: 6f 6e 20 69 74 27 73 20 76 61 6c 75 65 2e 20 20  on it's value.  
5280: 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64  These values and
5290: 20 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73   .** assignments
52a0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61   are based on Da
52b0: 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f  rwin/OSX behavio
52c0: 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62  r and have not b
52d0: 65 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a  een tested on .*
52e0: 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
5300: 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73  e3LockingStyle s
5310: 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b  qlite3DetectLock
5320: 69 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63  ingStyle(const c
5330: 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a  har *filePath, .
5340: 20 20 69 6e 74 20 66 64 29 20 7b 0a 0a 23 69 66    int fd) {..#if
5350: 64 65 66 20 53 51 4c 49 54 45 5f 46 49 58 45 44  def SQLITE_FIXED
5360: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
5370: 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
5380: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 29 53 51 4c  LockingStyle)SQL
5390: 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e  ITE_FIXED_LOCKIN
53a0: 47 5f 53 54 59 4c 45 3b 0a 23 65 6c 73 65 0a 20  G_STYLE;.#else. 
53b0: 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
53c0: 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 20 28 73 74  sInfo;..  if (st
53d0: 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
53e0: 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 29 0a 20  fsInfo) == -1). 
53f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
5400: 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  3TestLockingStyl
5410: 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b  e(filePath, fd);
5420: 0a 20 20 0a 20 20 69 66 20 28 66 73 49 6e 66 6f  .  .  if (fsInfo
5430: 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
5440: 44 4f 4e 4c 59 29 0a 20 20 20 20 72 65 74 75 72  DONLY).    retur
5450: 6e 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  n noLockingStyle
5460: 3b 0a 20 20 0a 20 20 69 66 28 20 28 21 73 74 72  ;.  .  if( (!str
5470: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
5480: 79 70 65 6e 61 6d 65 2c 20 22 68 66 73 22 29 29  ypename, "hfs"))
5490: 20 7c 7c 0a 20 20 20 20 28 21 73 74 72 63 6d 70   ||.    (!strcmp
54a0: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
54b0: 6e 61 6d 65 2c 20 22 75 66 73 22 29 29 20 29 0a  name, "ufs")) ).
54c0: 09 09 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f  ..return posixLo
54d0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
54e0: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
54f0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5500: 20 22 61 66 70 66 73 22 29 29 0a 20 20 20 20 72   "afpfs")).    r
5510: 65 74 75 72 6e 20 61 66 70 4c 6f 63 6b 69 6e 67  eturn afpLocking
5520: 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21  Style;.  .  if(!
5530: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
5540: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
5550: 22 29 29 20 0a 20 20 20 20 72 65 74 75 72 6e 20  ")) .    return 
5560: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5570: 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68  ngStyle(filePath
5580: 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 28 21  , fd);.  .  if(!
5590: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
55a0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62  fstypename, "smb
55b0: 66 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e  fs")).    return
55c0: 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79   flockLockingSty
55d0: 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72  le;.  .  if(!str
55e0: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
55f0: 79 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22  ypename, "msdos"
5600: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 64 6f  )).    return do
5610: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  tlockLockingStyl
5620: 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63  e;.  .  if(!strc
5630: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
5640: 70 65 6e 61 6d 65 2c 20 22 77 65 62 64 61 76 22  pename, "webdav"
5650: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  )).    return un
5660: 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67  supportedLocking
5670: 53 74 79 6c 65 3b 0a 20 20 0a 20 20 72 65 74 75  Style;.  .  retu
5680: 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f  rn sqlite3TestLo
5690: 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50  ckingStyle(fileP
56a0: 61 74 68 2c 20 66 64 29 3b 20 20 0a 23 65 6e 64  ath, fd);  .#end
56b0: 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 46 49 58  if // SQLITE_FIX
56c0: 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ED_LOCKING_STYLE
56d0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
56e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
56f0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
5700: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
5710: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
5720: 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64  ate lockInfo and
5730: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
5740: 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  res that.** desc
5750: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
5760: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
5770: 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20  ate new ones if 
5780: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
5790: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ** return values
57a0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
57b0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
57c0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
57d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
57e0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
57f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
5800: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74  dLockInfo(.  int
5810: 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20   fd,            
5820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5840: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
5850: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
5860: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
5870: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
5880: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
5890: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
58a0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
58b0: 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65  pOpen      /* Re
58c0: 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74  turn the openCnt
58d0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
58e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
58f0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79    struct lockKey
5900: 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20   key1;.  struct 
5910: 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20  openKey key2;.  
5920: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
5930: 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  buf;.  struct lo
5940: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
5950: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
5960: 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66  *pOpen;.  rc = f
5970: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
5980: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
5990: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 61  ) return 1;..  a
59a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73  ssert( sqlite3Os
59b0: 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20 20  InMutex(1) );.  
59c0: 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c  memset(&key1, 0,
59d0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a   sizeof(key1));.
59e0: 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61    key1.dev = sta
59f0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
5a00: 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey1.ino = statbu
5a10: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65 66  f.st_ino;.#ifdef
5a20: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
5a30: 45 41 44 53 0a 20 20 69 66 28 20 74 68 72 65 61  EADS.  if( threa
5a40: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
5a50: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
5a60: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
5a70: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
5a80: 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64  ;.  }.  key1.tid
5a90: 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69   = threadsOverri
5aa0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
5ab0: 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f  s ? 0 : pthread_
5ac0: 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20  self();.#endif. 
5ad0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30   memset(&key2, 0
5ae0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
5af0: 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74  .  key2.dev = st
5b00: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20  atbuf.st_dev;.  
5b10: 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62  key2.ino = statb
5b20: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f  uf.st_ino;.  pLo
5b30: 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63  ck = (struct loc
5b40: 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61  kInfo*)sqlite3Ha
5b50: 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68  shFind(&lockHash
5b60: 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28  , &key1, sizeof(
5b70: 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c  key1));.  if( pL
5b80: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ock==0 ){.    st
5b90: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
5ba0: 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  Old;.    pLock =
5bb0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
5bc0: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
5bd0: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
5be0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5bf0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5c00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5c10: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5c20: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79  }.    pLock->key
5c30: 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f   = key1;.    pLo
5c40: 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ck->nRef = 1;.  
5c50: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
5c60: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
5c70: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ktype = 0;.    p
5c80: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
5c90: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
5ca0: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
5cb0: 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c  sizeof(key1), pL
5cc0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ock);.    if( pO
5cd0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ld!=0 ){.      a
5ce0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f  ssert( pOld==pLo
5cf0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ck );.      sqli
5d00: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
5d10: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
5d20: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5d30: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5d40: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
5d50: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
5d60: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
5d70: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
5d80: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
5d90: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
5da0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
5db0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5dc0: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
5dd0: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5de0: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
5df0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5e00: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
5e10: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
5e20: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
5e30: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
5e40: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69  Open) );.      i
5e50: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
5e60: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f         releaseLo
5e70: 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20  ckInfo(pLock);. 
5e80: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
5e90: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
5ea0: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
5eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
5ec0: 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a  en->key = key2;.
5ed0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
5ee0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  f = 1;.      pOp
5ef0: 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20  en->nLock = 0;. 
5f00: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
5f10: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
5f20: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
5f30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20  = 0;.      pOld 
5f40: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5f50: 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26  ert(&openHash, &
5f60: 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65  pOpen->key, size
5f70: 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29  of(key2), pOpen)
5f80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64  ;.      if( pOld
5f90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5fa0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70  ssert( pOld==pOp
5fb0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  en );.        sq
5fc0: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
5fd0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
5fe0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
5ff0: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
6000: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
6010: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
6020: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
6030: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6040: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
6050: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ++;.    }.    *p
6060: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20  pOpen = pOpen;. 
6070: 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63   }..exit_findloc
6080: 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20  kinfo:.  return 
6090: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
60a0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
60b0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
60c0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
60d0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
60e0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
60f0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
6100: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
6110: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
6120: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
6130: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
6140: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
6150: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6160: 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69   *locktypeName(i
6170: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
6180: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
6190: 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f   ){.  case NO_LO
61a0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
61b0: 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45 44  ";.  case SHARED
61c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
61d0: 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52  HARED";.  case R
61e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
61f0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
6200: 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f  .  case PENDING_
6210: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
6220: 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45  NDING";.  case E
6230: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72  XCLUSIVE_LOCK: r
6240: 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45  eturn "EXCLUSIVE
6250: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
6260: 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69  "ERROR";.}.#endi
6270: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  f../*.** If we a
6280: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
6290: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
62a0: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
62b0: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
62c0: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
62d0: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
62e0: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
62f0: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
6300: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
6310: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
6320: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
6330: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
6340: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
6350: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
6360: 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a  one thread is.**
6370: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72   unable to overr
6380: 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65  ide locks create
6390: 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  d by a different
63a0: 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61 74   thread.  RedHat
63b0: 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70  9 is.** an examp
63c0: 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79 73  le of such a sys
63d0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72  tem..**.** Owner
63e0: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
63f0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66   only allowed if
6400: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6410: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
6420: 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75  ked..** If the u
6430: 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65  nixFile is locke
6440: 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68  d and an ownersh
6450: 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65  ip is wrong, the
6460: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  n return.** SQLI
6470: 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49  TE_MISUSE.  SQLI
6480: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6490: 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
64a0: 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  works..*/.#ifdef
64b0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
64c0: 45 41 44 53 0a 73 74 61 74 69 63 20 69 6e 74 20  EADS.static int 
64d0: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
64e0: 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  p(unixFile *pFil
64f0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
6500: 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b  pthread_t hSelf;
6510: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
6520: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
6530: 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Locks ){.    /* 
6540: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
6550: 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  ers not needed o
6560: 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f  n this system */
6570: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6580: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65  TE_OK;.  }.  hSe
6590: 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  lf = pthread_sel
65a0: 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65  f();.  if( pthre
65b0: 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e  ad_equal(pFile->
65c0: 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20  tid, hSelf) ){. 
65d0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69     /* We are sti
65e0: 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  ll in the same t
65f0: 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54  hread */.    OST
6600: 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66  RACE1("No-transf
6610: 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c  er, same thread\
6620: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
6630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6640: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
6650: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  type!=NO_LOCK ){
6660: 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f  .    /* We canno
6670: 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68  t change ownersh
6680: 69 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20  ip while we are 
6690: 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20  holding a lock! 
66a0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
66b0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
66c0: 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61  .  OSTRACE4("Tra
66d0: 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20  nsfer ownership 
66e0: 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f  of %d from %d to
66f0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
6700: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
6710: 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29  ile->tid, hSelf)
6720: 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d  ;.  pFile->tid =
6730: 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46   hSelf;.  if (pF
6740: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55  ile->pLock != NU
6750: 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73  LL) {.    releas
6760: 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d  eLockInfo(pFile-
6770: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  >pLock);.    rc 
6780: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70  = findLockInfo(p
6790: 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d  File->h, &pFile-
67a0: 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20  >pLock, 0);.    
67b0: 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20  OSTRACE5("LOCK  
67c0: 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25    %d is now %s(%
67d0: 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  s,%d)\n", pFile-
67e0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  >h,.           l
67f0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
6800: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
6810: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
6820: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f  eName(pFile->pLo
6830: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
6840: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
6850: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
6860: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
6870: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6880: 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20  K;.  }.}.#else. 
6890: 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68   /* On single-th
68a0: 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f  readed builds, o
68b0: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
68c0: 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a  r is a no-op */.
68d0: 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65  # define transfe
68e0: 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51  rOwnership(X) SQ
68f0: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
6900: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
6910: 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f 0a 69   named file.*/.i
6920: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 44 65  nt sqlite3UnixDe
6930: 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  lete(const char 
6940: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 53  *zFilename){.  S
6950: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
6960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6970: 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e  RR_DELETE);.  un
6980: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
6990: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
69a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
69b0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
69c0: 20 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73   named file exis
69d0: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
69e0: 65 33 55 6e 69 78 46 69 6c 65 45 78 69 73 74 73  e3UnixFileExists
69f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
6a00: 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
6a10: 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61  n access(zFilena
6a20: 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  me, 0)==0;.}../*
6a30: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
6a40: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
6a50: 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  nt allocateUnixF
6a60: 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20  ile(.  int h,   
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
6a90: 74 6f 72 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  tor of the open 
6aa0: 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  file */.  OsFile
6ab0: 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20   **pId,         
6ac0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
6ad0: 20 72 65 61 6c 20 66 69 6c 65 20 64 65 73 63 72   real file descr
6ae0: 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
6af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
6b00: 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d  ename,    /* Nam
6b10: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
6b20: 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
6b30: 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20  int delFlag     
6b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
6b50: 74 72 75 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  true, make sure 
6b60: 74 68 65 20 66 69 6c 65 20 64 65 6c 65 74 65 73  the file deletes
6b70: 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 29 3b 0a   on close */.);.
6b80: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6b90: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f  o open a file fo
6ba0: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
6bb0: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20  nd writing.  If 
6bc0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74  that.** fails, t
6bd0: 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65  ry opening it re
6be0: 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65  ad-only.  If the
6bf0: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
6c00: 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20  xist,.** try to 
6c10: 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  create it..**.**
6c20: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
6c30: 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70  andle for the op
6c40: 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74  en file is writt
6c50: 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64  en to *id.** and
6c60: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73   *pReadonly is s
6c70: 65 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66  et to 0 if the f
6c80: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66  ile was opened f
6c90: 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a  or reading and.*
6ca0: 2a 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69  * writing or 1 i
6cb0: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
6cc0: 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
6cd0: 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72    The function r
6ce0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
6cf0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
6d00: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
6d10: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
6d20: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
6d30: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e  leaves.** *id an
6d40: 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63  d *pReadonly unc
6d50: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
6d60: 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65  qlite3UnixOpenRe
6d70: 61 64 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74  adWrite(.  const
6d80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
6d90: 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ,.  OsFile **pId
6da0: 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e  ,.  int *pReadon
6db0: 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ly.){.  int h;. 
6dc0: 20 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f 4f   .  CRASH_TEST_O
6dd0: 56 45 52 52 49 44 45 28 73 71 6c 69 74 65 33 43  VERRIDE(sqlite3C
6de0: 72 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74  rashOpenReadWrit
6df0: 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49  e, zFilename, pI
6e00: 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29 3b 0a 20  d, pReadonly);. 
6e10: 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64   assert( 0==*pId
6e20: 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a   );.  h = open(z
6e30: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
6e40: 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45  |O_CREAT|O_LARGE
6e50: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20  FILE|O_BINARY,. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
6e80: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
6e90: 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 68  SSIONS);.  if( h
6ea0: 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53  <0 ){.#ifdef EIS
6eb0: 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e  DIR.    if( errn
6ec0: 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20  o==EISDIR ){.   
6ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6ee0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
6ef0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 68 20 3d 20  .#endif.    h = 
6f00: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
6f10: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
6f20: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
6f30: 20 20 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20      if( h<0 ){. 
6f40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6f50: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20  TE_CANTOPEN; .  
6f60: 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e    }.    *pReadon
6f70: 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 1;.  }else{
6f80: 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20  .    *pReadonly 
6f90: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
6fa0: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
6fb0: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
6fc0: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  name, 0);.}.../*
6fd0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
6fe0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
6ff0: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
7000: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
7010: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
7020: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
7030: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
7040: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
7050: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
7060: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
7070: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
7080: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
7090: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
70a0: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
70b0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
70c0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
70d0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
70e0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
70f0: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
7100: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
7110: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
7120: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
7130: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
7140: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
7150: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
7160: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
7170: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
7180: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
7190: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
71a0: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
71b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
71c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
71d0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f  OpenExclusive(co
71e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
71f0: 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49  ame, OsFile **pI
7200: 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b  d, int delFlag){
7210: 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 43 52 41  .  int h;..  CRA
7220: 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45  SH_TEST_OVERRIDE
7230: 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65  (sqlite3CrashOpe
7240: 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c  nExclusive, zFil
7250: 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46  ename, pId, delF
7260: 6c 61 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  lag);.  assert( 
7270: 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d  0==*pId );.  h =
7280: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
7290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
72a0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c   O_RDWR|O_CREAT|
72b0: 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
72c0: 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f  W|O_LARGEFILE|O_
72d0: 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20  BINARY,.        
72e0: 20 20 20 20 20 20 20 20 64 65 6c 46 6c 61 67 20          delFlag 
72f0: 3f 20 30 36 30 30 20 3a 20 53 51 4c 49 54 45 5f  ? 0600 : SQLITE_
7300: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
7310: 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
7320: 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75   h<0 ){.    retu
7330: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
7340: 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EN;.  }.  return
7350: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
7360: 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e  e(h, pId, zFilen
7370: 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 7d  ame, delFlag);.}
7380: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
7390: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
73a0: 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79  le for read-only
73b0: 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f   access..**.** O
73c0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
73d0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
73e0: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
73f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
7400: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
7410: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
7420: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
7430: 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e   sqlite3UnixOpen
7440: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
7450: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
7460: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20  OsFile **pId){. 
7470: 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43 52 41   int h;.  .  CRA
7480: 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45  SH_TEST_OVERRIDE
7490: 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65  (sqlite3CrashOpe
74a0: 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69 6c 65  nReadOnly, zFile
74b0: 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b 0a 20  name, pId, 0);. 
74c0: 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64   assert( 0==*pId
74d0: 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a   );.  h = open(z
74e0: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  Filename, O_RDON
74f0: 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  LY|O_LARGEFILE|O
7500: 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66 28 20  _BINARY);.  if( 
7510: 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  h<0 ){.    retur
7520: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
7530: 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  N;.  }.  return 
7540: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
7550: 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61  (h, pId, zFilena
7560: 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me, 0);.}../*.**
7570: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
7580: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
7590: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
75a0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
75b0: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
75c0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
75d0: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
75e0: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
75f0: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
7600: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
7610: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
7620: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
7630: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
7640: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
7650: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7660: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
7670: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
7680: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
7690: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e  r.** windows sin
76a0: 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  ce windows does 
76b0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64  not support hard
76c0: 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   links..**.** If
76d0: 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73 20 65   FULL_FSYNC is e
76e0: 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66 75 6e  nabled, this fun
76f0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c 6f 6e  ction is not lon
7700: 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a 2a 20  ger useful, .** 
7710: 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73 79 6e  a FULL_FSYNC syn
7720: 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c  c applies to all
7730: 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20 6f 70   pending disk op
7740: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
7750: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61  On success, a ha
7760: 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69  ndle for a previ
7770: 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20  ously open file 
7780: 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70 64  at *id is.** upd
7790: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 65  ated with the ne
77a0: 77 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  w directory file
77b0: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
77c0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
77d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
77e0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  On failure, the 
77f0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
7800: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7810: 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   and leaves.** *
7820: 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  id unchanged..*/
7830: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
7840: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20  OpenDirectory(. 
7850: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63   OsFile *id,.  c
7860: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
7870: 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  ame.){.  unixFil
7880: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
7890: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20  File*)id;.  if( 
78a0: 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
78b0: 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74  /* Do not open t
78c0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 66 20  he directory if 
78d0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
78e0: 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c  g file is not al
78f0: 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ready.    ** ope
7900: 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  n. */.    return
7910: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7920: 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48 52 45  ;.  }.  SET_THRE
7930: 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20 20 61  ADID(pFile);.  a
7940: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 64 69  ssert( pFile->di
7950: 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65  rfd<0 );.  pFile
7960: 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a  ->dirfd = open(z
7970: 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
7980: 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
7990: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
79a0: 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
79b0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
79c0: 45 4e 3b 20 0a 20 20 7d 0a 20 20 4f 53 54 52 41  EN; .  }.  OSTRA
79d0: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
79e0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
79f0: 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  dirfd, zDirname)
7a00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7a10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
7a20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
7a30: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
7a40: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
7a50: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
7a60: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
7a70: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
7a80: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
7a90: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
7aa0: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
7ab0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
7ac0: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
7ad0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
7ae0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
7af0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
7b00: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
7b10: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
7b20: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
7b30: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
7b40: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
7b50: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
7b60: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
7b70: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
7b80: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
7b90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
7ba0: 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61  e3UnixTempFileNa
7bb0: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
7bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7bd0: 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
7be0: 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
7bf0: 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
7c00: 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
7c10: 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
7c20: 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
7c30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7c40: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
7c50: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
7c60: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
7c70: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
7c80: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
7c90: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
7ca0: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
7cb0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
7cc0: 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
7cd0: 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
7ce0: 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
7cf0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7d00: 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
7d10: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
7d20: 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
7d30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7d40: 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
7d50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d60: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
7d70: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
7d80: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
7d90: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
7da0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7db0: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
7dc0: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
7dd0: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
7de0: 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
7df0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
7e00: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
7e10: 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49  uf, "%s/"TEMP_FI
7e20: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
7e30: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
7e40: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
7e50: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
7e60: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
7e70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
7e80: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
7e90: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
7ea0: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
7eb0: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
7ec0: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
7ed0: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
7ee0: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
7ef0: 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
7f00: 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
7f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7f20: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ; .}../*.** Chec
7f30: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
7f40: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
7f50: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
7f60: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
7f70: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
7f80: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
7f90: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
7fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7fb0: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
7fc0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
7fd0: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
7fe0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
7ff0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
8000: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
8010: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
8020: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
8030: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
8040: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
8050: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
8060: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
8070: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
8080: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8090: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
80a0: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 1;.}../*.** Se
80b0: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
80c0: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
80d0: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
80e0: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
80f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8100: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
8110: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
8120: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
8130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
8140: 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
8150: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
8160: 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
8170: 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65  nt got;.  i64 ne
8180: 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52  wOffset;.  TIMER
8190: 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69  _START;.#if defi
81a0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
81b0: 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d   got = pread(id-
81c0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 69  >h, pBuf, cnt, i
81d0: 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69  d->offset);.#eli
81e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
81f0: 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70  EAD64).  got = p
8200: 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42  read64(id->h, pB
8210: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8220: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  set);.#else.  ne
8230: 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
8240: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65  id->h, id->offse
8250: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
8260: 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 69  if( newOffset!=i
8270: 64 2d 3e 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  d->offset ){.   
8280: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
8290: 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d    got = read(id-
82a0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
82b0: 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45  #endif.  TIMER_E
82c0: 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22  ND;.  OSTRACE5("
82d0: 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
82e0: 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20 69 64   %7lld %d\n", id
82f0: 2d 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e 6f 66  ->h, got, id->of
8300: 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50  fset, TIMER_ELAP
8310: 53 45 44 29 3b 0a 20 20 69 66 28 20 67 6f 74 3e  SED);.  if( got>
8320: 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66 66  0 ){.    id->off
8330: 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a  set += got;.  }.
8340: 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
8350: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
8360: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
8370: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
8380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
8390: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
83a0: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
83b0: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
83c0: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
83d0: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
83e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
83f0: 6e 69 78 52 65 61 64 28 4f 73 46 69 6c 65 20 2a  nixRead(OsFile *
8400: 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  id, void *pBuf, 
8410: 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20  int amt){.  int 
8420: 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
8430: 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65  d );.  got = see
8440: 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
8450: 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20 61 6d  le*)id, pBuf, am
8460: 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  t);.  SimulateIO
8470: 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
8480: 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
8490: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
84a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
84b0: 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
84c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
84d0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
84e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
84f0: 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
8500: 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f  [got], 0, amt-go
8510: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
8520: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
8530: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  T_READ;.  }.}../
8540: 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
8550: 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
8560: 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
8570: 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
8580: 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
8590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
85a0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
85b0: 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
85c0: 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fset..*/.static 
85d0: 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
85e0: 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 63  (unixFile *id, c
85f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
8600: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
8610: 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f   got;.  i64 newO
8620: 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53  ffset;.  TIMER_S
8630: 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
8640: 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
8650: 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e  ot = pwrite(id->
8660: 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 69 64  h, pBuf, cnt, id
8670: 2d 3e 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66  ->offset);.#elif
8680: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
8690: 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77  AD64).  got = pw
86a0: 72 69 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42  rite64(id->h, pB
86b0: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
86c0: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  set);.#else.  ne
86d0: 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
86e0: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65  id->h, id->offse
86f0: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
8700: 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 69  if( newOffset!=i
8710: 64 2d 3e 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  d->offset ){.   
8720: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
8730: 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64    got = write(id
8740: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
8750: 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
8760: 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28  END;.  OSTRACE5(
8770: 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
8780: 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20 69  d %7lld %d\n", i
8790: 64 2d 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e 6f  d->h, got, id->o
87a0: 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41  ffset, TIMER_ELA
87b0: 50 53 45 44 29 3b 0a 20 20 69 66 28 20 67 6f 74  PSED);.  if( got
87c0: 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66  >0 ){.    id->of
87d0: 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d  fset += got;.  }
87e0: 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
87f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
8800: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
8810: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
8820: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8830: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
8840: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
8850: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
8860: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
8870: 74 20 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69  t unixWrite(OsFi
8880: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
8890: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
88a0: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
88b0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
88c0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
88d0: 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  mt>0 );.  while(
88e0: 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
88f0: 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
8900: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70  (unixFile*)id, p
8910: 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a  Buf, amt))>0 ){.
8920: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
8930: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
8940: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
8950: 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  e];.  }.  Simula
8960: 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
8970: 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
8980: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
8990: 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
89a0: 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  e=0, amt=1 ));. 
89b0: 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
89c0: 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b    if( wrote<0 ){
89d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
89e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
89f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8a00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8a10: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
8a20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8a30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
8a40: 76 65 20 74 68 65 20 72 65 61 64 2f 77 72 69 74  ve the read/writ
8a50: 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66  e pointer in a f
8a60: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
8a70: 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f 73 46 69  nt unixSeek(OsFi
8a80: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
8a90: 65 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  et){.  assert( i
8aa0: 64 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  d );.#ifdef SQLI
8ab0: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66  TE_TEST.  if( of
8ac0: 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44  fset ) SimulateD
8ad0: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
8ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
8af0: 3b 0a 23 65 6e 64 69 66 0a 20 20 28 28 75 6e 69  ;.#endif.  ((uni
8b00: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f 66 66 73  xFile*)id)->offs
8b10: 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  et = offset;.  r
8b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8b30: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8b40: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
8b50: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
8b60: 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
8b70: 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
8b80: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
8b90: 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
8ba0: 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
8bb0: 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
8bc0: 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
8bd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
8be0: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
8bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
8c00: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
8c10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
8c20: 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28 29   the fdatasync()
8c30: 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65   API only if the
8c40: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20   HAVE_FDATASYNC 
8c50: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
8c60: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ..** Otherwise u
8c70: 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74  se fsync() in it
8c80: 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  s place..*/.#ifn
8c90: 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53 59  def HAVE_FDATASY
8ca0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  NC.# define fdat
8cb0: 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
8cc0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
8cd0: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8ce0: 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
8cf0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
8d00: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
8d10: 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
8d20: 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
8d30: 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
8d40: 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
8d50: 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
8d60: 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
8d70: 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
8d80: 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
8d90: 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
8da0: 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
8db0: 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
8dc0: 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
8dd0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
8de0: 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
8df0: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
8e00: 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
8e10: 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
8e20: 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
8e30: 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
8e40: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8e50: 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
8e60: 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
8e70: 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
8e80: 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
8e90: 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
8ea0: 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
8eb0: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
8ec0: 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
8ed0: 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
8ee0: 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
8ef0: 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
8f00: 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
8f10: 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
8f20: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
8f30: 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
8f40: 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
8f50: 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
8f60: 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
8f70: 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
8f80: 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
8f90: 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8fc0: 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
8fd0: 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
8fe0: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
8ff0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
9000: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
9010: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
9020: 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
9030: 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
9040: 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
9050: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
9060: 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
9070: 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
9080: 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
9090: 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
90a0: 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
90b0: 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
90c0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
90d0: 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
90e0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
90f0: 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
9100: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
9110: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
9120: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
9130: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
9140: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
9150: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
9160: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
9170: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
9180: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9190: 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41 56  ;.#else..#if HAV
91a0: 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
91b0: 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
91c0: 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
91d0: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
91e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
91f0: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
9200: 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
9210: 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
9220: 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
9230: 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 20   an fsync()..   
9240: 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
9250: 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
9260: 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
9270: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
9280: 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20    * file system 
9290: 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
92a0: 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
92b0: 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
92c0: 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74   * isn't support
92d0: 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
92e0: 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
92f0: 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
9300: 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77    * and (for now
9310: 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
9320: 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
9330: 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
9340: 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20 62  l.  .   * It'd b
9350: 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
9360: 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
9370: 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
9380: 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66 63  oid .   * the fc
9390: 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
93a0: 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
93b0: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  ed..   */.  if( 
93c0: 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
93d0: 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69  fd);..#else .  i
93e0: 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20  f( dataOnly ){. 
93f0: 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e     rc = fdatasyn
9400: 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c(fd);.  }else{.
9410: 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
9420: 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
9430: 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  * HAVE_FULLFSYNC
9440: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65   */.#endif /* de
9450: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f  fined(SQLITE_NO_
9460: 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75  SYNC) */..  retu
9470: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9480: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
9490: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
94a0: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
94b0: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
94c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
94d0: 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
94e0: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
94f0: 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
9500: 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
9510: 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
9520: 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
9530: 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
9540: 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
9550: 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
9560: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
9570: 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
9580: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
9590: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
95a0: 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
95b0: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
95c0: 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
95d0: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
95e0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
95f0: 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
9600: 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
9610: 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
9620: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
9630: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
9640: 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
9650: 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
9660: 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
9670: 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
9680: 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
9690: 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
96a0: 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
96b0: 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
96c0: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
96d0: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
96e0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
96f0: 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
9700: 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
9710: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
9720: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
9730: 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
9740: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
9750: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
9760: 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
9770: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
9780: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
9790: 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
97a0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
97b0: 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
97c0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
97d0: 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20 25  RACE2("SYNC    %
97e0: 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
97f0: 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
9800: 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 70  sync(pFile->h, p
9810: 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20  File->fullSync, 
9820: 64 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d  dataOnly);.  Sim
9830: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
9840: 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
9850: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9860: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b  ITE_IOERR_FSYNC;
9870: 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
9880: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  ->dirfd>=0 ){.  
9890: 20 20 4f 53 54 52 41 43 45 34 28 22 44 49 52 53    OSTRACE4("DIRS
98a0: 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66  YNC %-3d (have_f
98b0: 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
98c0: 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
98d0: 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20  le->dirfd,.     
98e0: 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
98f0: 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 66 75  FSYNC, pFile->fu
9900: 6c 6c 53 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66  llSync);.#ifndef
9910: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
9920: 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54  DIRSYNC.    /* T
9930: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
9940: 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  c is only attemp
9950: 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e  ted if full_fsyn
9960: 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e  c is.    ** turn
9970: 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69  ed off or unavai
9980: 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c  lable.  If a ful
9990: 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64  l_fsync occurred
99a0: 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74   above,.    ** t
99b0: 68 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  hen the director
99c0: 79 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66  y sync is superf
99d0: 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  luous..    */.  
99e0: 20 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c    if( (!HAVE_FUL
99f0: 4c 46 53 59 4e 43 20 7c 7c 20 21 70 46 69 6c 65  LFSYNC || !pFile
9a00: 2d 3e 66 75 6c 6c 53 79 6e 63 29 20 26 26 20 66  ->fullSync) && f
9a10: 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
9a20: 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20  >dirfd,0,0) ){. 
9a30: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
9a40: 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69  ** We have recei
9a50: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70  ved multiple rep
9a60: 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20  orts of fsync() 
9a70: 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  returning.      
9a80: 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20   ** errors when 
9a90: 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63  applied to direc
9aa0: 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69  tories on certai
9ab0: 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a  n file systems..
9ac0: 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c         ** A fail
9ad0: 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  ed directory syn
9ae0: 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64  c is not a big d
9af0: 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d  eal.  So it seem
9b00: 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74  s.       ** bett
9b10: 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
9b20: 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20   error.  Ticket 
9b30: 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a  #1657.       */.
9b40: 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e         /* return
9b50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a   SQLITE_IOERR; *
9b60: 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  /.    }.#endif. 
9b70: 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e     close(pFile->
9b80: 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79  dirfd);  /* Only
9b90: 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e   need to sync on
9ba0: 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65  ce, so close the
9bb0: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
9bc0: 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d    pFile->dirfd =
9bd0: 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20   -1;    /* when 
9be0: 77 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a  we are done. */.
9bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9c10: 20 53 79 6e 63 20 74 68 65 20 64 69 72 65 63 74   Sync the direct
9c20: 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68  ory zDirname. Th
9c30: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e  is is a no-op on
9c40: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
9c50: 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e  ms other.** than
9c60: 20 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   UNIX..**.** Thi
9c70: 73 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  s is used to mak
9c80: 65 20 73 75 72 65 20 74 68 65 20 6d 61 73 74 65  e sure the maste
9c90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
9ca0: 61 73 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64  as truely been d
9cb0: 65 6c 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65  eleted.** before
9cc0: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
9cd0: 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  to individual jo
9ce0: 75 72 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74  urnals on a mult
9cf0: 69 2d 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69  i-database commi
9d00: 74 2e 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c  t..** The F_FULL
9d10: 46 53 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20  FSYNC option is 
9d20: 6e 6f 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e  not needed here.
9d30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
9d40: 6e 69 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79  nixSyncDirectory
9d50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69  (const char *zDi
9d60: 72 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  rname){.#ifdef S
9d70: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
9d80: 52 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53  RSYNC.  return S
9d90: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
9da0: 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20    int fd;.  int 
9db0: 72 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  r;.  fd = open(z
9dc0: 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
9dd0: 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
9de0: 20 20 4f 53 54 52 41 43 45 33 28 22 44 49 52 53    OSTRACE3("DIRS
9df0: 59 4e 43 20 25 2d 33 64 20 28 25 73 29 5c 6e 22  YNC %-3d (%s)\n"
9e00: 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  , fd, zDirname);
9e10: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
9e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e30: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a  _CANTOPEN; .  }.
9e40: 20 20 72 20 3d 20 66 73 79 6e 63 28 66 64 29 3b    r = fsync(fd);
9e50: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
9e60: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9e70: 20 72 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 20   r=1 );.  if( r 
9e80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9e90: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
9ea0: 53 59 4e 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SYNC;.  }else{. 
9eb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ec0: 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  _OK;.  }.#endif.
9ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
9ee0: 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
9ef0: 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
9f00: 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
9f10: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 4f 73   unixTruncate(Os
9f20: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  File *id, i64 nB
9f30: 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  yte){.  int rc;.
9f40: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
9f50: 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
9f60: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
9f70: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
9f80: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
9f90: 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
9fa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9fb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
9fc0: 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  CATE;.  }else{. 
9fd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9fe0: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
9ff0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
a000: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
a010: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
a020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
a030: 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c  ixFileSize(OsFil
a040: 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
a050: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
a060: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
a070: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
a080: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
a090: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
a0a0: 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
a0b0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
a0c0: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
a0d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a0e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
a0f0: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
a100: 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20   buf.st_size;.  
a110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a130: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
a140: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
a150: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
a160: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
a170: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
a180: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
a190: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
a1a0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
a1b0: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
a1c0: 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  o.  If the file 
a1d0: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68  is unlocked or h
a1e0: 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44  olds only SHARED
a1f0: 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20   locks, then.** 
a200: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a  return zero..*/.
a210: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
a220: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
a230: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
a240: 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69  int r = 0;.  uni
a250: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
a260: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
a270: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
a280: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
a290: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
a2a0: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
a2b0: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
a2c0: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
a2d0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
a2e0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
a2f0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
a300: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
a310: 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  ( pFile->pLock->
a320: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
a330: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOCK ){.    r = 
a340: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
a350: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
a360: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a370: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
a380: 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20 20 20    if( !r ){.    
a390: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
a3a0: 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  k;.    lock.l_wh
a3b0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a3c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a3d0: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
a3e0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
a3f0: 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e  n = 1;.    lock.
a400: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
a410: 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46 69 6c  ;.    fcntl(pFil
a420: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
a430: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c  lock);.    if( l
a440: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
a450: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  LCK ){.      r =
a460: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
a470: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
a480: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
a490: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
a4a0: 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69  CK %d %d\n", pFi
a4b0: 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65  le->h, r);..  re
a4c0: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
a4d0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
a4e0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
a4f0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
a500: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
a510: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
a520: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
a530: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
a540: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
a550: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
a560: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
a570: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
a580: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
a590: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
a5a0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
a5b0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
a5c0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
a5d0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
a5e0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
a5f0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
a600: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
a610: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
a620: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
a630: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
a640: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
a650: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
a660: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
a670: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
a680: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
a690: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
a6a0: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
a6b0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
a6c0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
a6d0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
a6e0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
a6f0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
a700: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
a710: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
a720: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a730: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
a740: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
a750: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
a760: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
a770: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
a780: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a790: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
a7a0: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
a7b0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
a7c0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
a7d0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
a7e0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
a7f0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
a800: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
a810: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f  t locktype){.  /
a820: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a830: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
a840: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
a850: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
a860: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
a870: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
a880: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
a890: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
a8a0: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
a8b0: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
a8c0: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
a8d0: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
a8e0: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
a8f0: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
a900: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
a910: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
a920: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
a930: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
a940: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
a950: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
a960: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
a970: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
a980: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
a990: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
a9a0: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
a9b0: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
a9c0: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
a9d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
a9e0: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
a9f0: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
aa00: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
aa10: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
aa20: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
aa30: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
aa40: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
aa50: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
aa60: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
aa70: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
aa80: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
aa90: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
aaa0: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
aab0: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
aac0: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
aad0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
aae0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
aaf0: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
ab00: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
ab10: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
ab20: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
ab30: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
ab40: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
ab50: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
ab60: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
ab70: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
ab80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
ab90: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
aba0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
abb0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
abc0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
abd0: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
abe0: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
abf0: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
ac00: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
ac10: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
ac20: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
ac30: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
ac40: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
ac50: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
ac60: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
ac70: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
ac80: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
ac90: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
aca0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
acb0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
acc0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
acd0: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
ace0: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
acf0: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
ad00: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
ad10: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
ad20: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
ad30: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
ad40: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
ad50: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
ad60: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
ad70: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
ad80: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
ad90: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
ada0: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
adb0: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
adc0: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
add0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
ade0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
adf0: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
ae00: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
ae10: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
ae20: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
ae30: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
ae40: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
ae50: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
ae60: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
ae70: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
ae80: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
ae90: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
aea0: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
aeb0: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
aec0: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
aed0: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
aee0: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
aef0: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
af00: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
af10: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
af20: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
af30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
af40: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
af50: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
af60: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
af70: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
af80: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
af90: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
afa0: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
afb0: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
afc0: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
afd0: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
afe0: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
aff0: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
b000: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
b010: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
b020: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
b030: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
b040: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
b050: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
b060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b070: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b080: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b090: 64 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  d;.  struct lock
b0a0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46  Info *pLock = pF
b0b0: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74  ile->pLock;.  st
b0c0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
b0d0: 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73  .  int s;..  ass
b0e0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
b0f0: 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20  OSTRACE7("LOCK  
b100: 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
b110: 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c  s,%d) pid=%d\n",
b120: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
b130: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
b140: 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70  cktype), locktyp
b150: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
b160: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f  ktype),.      lo
b170: 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b  cktypeName(pLock
b180: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f  ->locktype), pLo
b190: 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64  ck->cnt , getpid
b1a0: 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ());..  /* If th
b1b0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
b1c0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
b1d0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
b1e0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
b1f0: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
b200: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
b210: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
b220: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
b230: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
b240: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
b250: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
b260: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
b270: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
b280: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
b290: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
b2a0: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
b2b0: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
b2c0: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
b2d0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
b2e0: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74  ktype));.    ret
b2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
b300: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
b310: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
b320: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
b330: 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
b340: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b350: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
b360: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b370: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
b380: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
b390: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
b3a0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
b3b0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
b3c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
b3d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b3e0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
b3f0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
b400: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
b410: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
b420: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
b430: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
b440: 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  tex();..  /* Mak
b450: 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65  e sure the curre
b460: 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74  nt thread owns t
b470: 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  he pFile..  */. 
b480: 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77   rc = transferOw
b490: 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a  nership(pFile);.
b4a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b4b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
b4c0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
b4d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
b4e0: 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70  .  }.  pLock = p
b4f0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  File->pLock;..  
b500: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
b510: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
b520: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
b530: 61 20 64 69 66 66 65 72 65 6e 74 20 4f 73 46 69  a different OsFi
b540: 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
b550: 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
b560: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
b570: 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
b580: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
b590: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f  e->locktype!=pLo
b5a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20  ck->locktype && 
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63  .          (pLoc
b5c0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  k->locktype>=PEN
b5d0: 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  DING_LOCK || loc
b5e0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
b5f0: 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
b600: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
b610: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b620: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
b630: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
b640: 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
b650: 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
b660: 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
b670: 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
b680: 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
b690: 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
b6a0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
b6b0: 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
b6c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
b6d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
b6e0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b6f0: 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f  K && .      (pLo
b700: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  ck->locktype==SH
b710: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  ARED_LOCK || pLo
b720: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  ck->locktype==RE
b730: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a  SERVED_LOCK) ){.
b740: 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
b750: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b760: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
b770: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b780: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
b790: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  t( pLock->cnt>0 
b7a0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
b7b0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
b7c0: 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  LOCK;.    pLock-
b7d0: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c  >cnt++;.    pFil
b7e0: 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  e->pOpen->nLock+
b7f0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
b800: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63  lock;.  }..  loc
b810: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20  k.l_len = 1L;.. 
b820: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
b830: 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a   SEEK_SET;..  /*
b840: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
b850: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
b860: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
b870: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
b880: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
b890: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
b8a0: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
b8b0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
b8c0: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
b8d0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
b8e0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b8f0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b900: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
b910: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
b920: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
b930: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
b940: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
b950: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63  ck.l_type = (loc
b960: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b970: 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c  CK?F_RDLCK:F_WRL
b980: 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  CK);.    lock.l_
b990: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
b9a0: 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63  BYTE;.    s = fc
b9b0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
b9c0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
b9d0: 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20     if( s ){.    
b9e0: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
b9f0: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
ba00: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
ba10: 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
ba20: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
ba30: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
ba40: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
ba50: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
ba60: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
ba70: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
ba80: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
ba90: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
baa0: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
bab0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
bac0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
bad0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
bae0: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20  ock->cnt==0 );. 
baf0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
bb00: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
bb10: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
bb20: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
bb30: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
bb40: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
bb50: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
bb60: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
bb70: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
bb80: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
bb90: 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f  , &lock);..    /
bba0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
bbb0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
bbc0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
bbd0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
bbe0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
bbf0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
bc00: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
bc10: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63  NLCK;.    if( fc
bc20: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bc30: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30  SETLK, &lock)!=0
bc40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
bc50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
bc60: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
bc70: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
bc80: 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
bc90: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
bca0: 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20     if( s ){.    
bcb0: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
bcc0: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
bcd0: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
bce0: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
bcf0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
bd00: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
bd10: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  OCK;.      pFile
bd20: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b  ->pOpen->nLock++
bd30: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  ;.      pLock->c
bd40: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  nt = 1;.    }.  
bd50: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
bd60: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
bd70: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74  CK && pLock->cnt
bd80: 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
bd90: 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
bda0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
bdb0: 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
bdc0: 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
bdd0: 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
bde0: 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
bdf0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
be00: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
be10: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
be20: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
be30: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
be40: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
be50: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
be60: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
be70: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
be80: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
be90: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
bea0: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
beb0: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
bec0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
bed0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
bee0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
bef0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74  _WRLCK;.    swit
bf00: 63 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  ch( locktype ){.
bf10: 20 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52        case RESER
bf20: 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  VED_LOCK:.      
bf30: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
bf40: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
bf50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bf60: 20 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53       case EXCLUS
bf70: 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  IVE_LOCK:.      
bf80: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
bf90: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
bfa0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
bfb0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
bfc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bfd0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
bfe0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29         assert(0)
bff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
c000: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
c010: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
c020: 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20  .    if( s ){.  
c030: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
c040: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
c050: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
c060: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
c070: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
c080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
c090: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
c0a0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
c0b0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c0c0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
c0d0: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
c0e0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c0f0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
c100: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c110: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
c120: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
c130: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
c140: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
c150: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
c160: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
c170: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
c180: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
c190: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
c1a0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
c1b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
c1c0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
c1d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c1e0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
c1f0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
c200: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
c210: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
c220: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
c230: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c240: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
c250: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
c260: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
c270: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
c280: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
c290: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
c2a0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
c2b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
c2c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c2d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
c2e0: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
c2f0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
c300: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73  t locktype){.  s
c310: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
c320: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
c330: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
c340: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c350: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
c360: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
c370: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
c380: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c390: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c3a0: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c3b0: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
c3c0: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
c3d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
c3e0: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
c3f0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ock->locktype, p
c400: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
c410: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
c420: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
c430: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
c440: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
c450: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
c460: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c470: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
c480: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
c490: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
c4a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c4b0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
c4c0: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
c4d0: 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46  ();.  pLock = pF
c4e0: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73  ile->pLock;.  as
c4f0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
c500: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
c510: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
c520: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c530: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
c540: 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e  ocktype==pFile->
c550: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
c560: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
c570: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c580: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c590: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
c5a0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
c5b0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
c5c0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c5d0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c5e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c5f0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c600: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
c610: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c620: 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20  &lock)!=0 ){.   
c630: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
c640: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
c660: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
c670: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
c680: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
c690: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c6a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c6b0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c6c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c6d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
c6e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
c6f0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
c700: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
c710: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
c720: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
c730: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
c740: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
c750: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
c760: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c780: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
c790: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
c7a0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
c7b0: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d   happen */.    }
c7c0: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
c7d0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
c7e0: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
c7f0: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
c800: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
c810: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
c820: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
c830: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
c840: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
c850: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
c860: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
c870: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
c880: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
c890: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
c8a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
c8b0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
c8c0: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
c8d0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c8e0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
c8f0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c900: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c910: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
c920: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
c930: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70       if( fcntl(p
c940: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c950: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
c960: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f         pLock->lo
c970: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
c980: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c990: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c9a0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
c9b0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
c9c0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
c9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c9e0: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
c9f0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
ca00: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
ca10: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
ca20: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
ca30: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
ca40: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
ca50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ca60: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
ca70: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
ca80: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
ca90: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
caa0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e      */.    pOpen
cab0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
cac0: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  .    pOpen->nLoc
cad0: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
cae0: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
caf0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65   );.    if( pOpe
cb00: 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  n->nLock==0 && p
cb10: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30  Open->nPending>0
cb20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
cb30: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cb40: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  i<pOpen->nPendin
cb50: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
cb60: 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50   close(pOpen->aP
cb70: 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  ending[i]);.    
cb80: 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70    }.      free(p
cb90: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
cba0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
cbb0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
cbc0: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
cbd0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
cbe0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
cbf0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 70 46 69 6c  eMutex();.  pFil
cc00: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
cc10: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
cc20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
cc30: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
cc40: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
cc50: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
cc60: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69  ){.  unixFile *i
cc70: 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
cc80: 70 49 64 3b 0a 0a 20 20 69 66 28 20 21 69 64 20  pId;..  if( !id 
cc90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
cca0: 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  OK;.  unixUnlock
ccb0: 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
ccc0: 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
ccd0: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e  >=0 ) close(id->
cce0: 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69  dirfd);.  id->di
ccf0: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69  rfd = -1;.  sqli
cd00: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
cd10: 29 3b 0a 0a 20 20 69 66 28 20 69 64 2d 3e 70 4f  );..  if( id->pO
cd20: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  pen->nLock ){.  
cd30: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
cd40: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
cd50: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
cd60: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
cd70: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
cd80: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
cd90: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
cda0: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
cdb0: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
cdc0: 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
cdd0: 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
cde0: 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
cdf0: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
ce00: 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
ce10: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
ce20: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
ce30: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e    */.    int *aN
ce40: 65 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f  ew;.    struct o
ce50: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
ce60: 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61  id->pOpen;.    a
ce70: 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70  New = realloc( p
ce80: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20  Open->aPending, 
ce90: 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  (pOpen->nPending
cea0: 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  +1)*sizeof(int) 
ceb0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
cec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
ced0: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
cee0: 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20  , just leak the 
cef0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cf00: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
cf10: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
cf20: 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ing = aNew;.    
cf30: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
cf40: 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  g[pOpen->nPendin
cf50: 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20  g] = id->h;.    
cf60: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
cf70: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
cf80: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
cf90: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
cfa0: 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20  ing locks so we 
cfb0: 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69  can close the fi
cfc0: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  le immediately *
cfd0: 2f 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e  /.    close(id->
cfe0: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  h);.  }.  releas
cff0: 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c  eLockInfo(id->pL
d000: 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f  ock);.  releaseO
d010: 70 65 6e 43 6e 74 28 69 64 2d 3e 70 4f 70 65 6e  penCnt(id->pOpen
d020: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  );..  sqlite3OsL
d030: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
d040: 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
d050: 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
d060: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e     %-3d\n", id->
d070: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
d080: 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
d090: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
d0a0: 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a  d);.  *pId = 0;.
d0b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d0c0: 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  OK;.}...#ifdef S
d0d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
d0e0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61 67  KING_STYLE.#prag
d0f0: 6d 61 20 6d 61 72 6b 20 41 46 50 20 53 75 70 70  ma mark AFP Supp
d100: 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20  ort../*. ** The 
d110: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d120: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  t structure cont
d130: 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63  ains all afp loc
d140: 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65  k specific state
d150: 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  . */.typedef str
d160: 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
d170: 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
d180: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
d190: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d1a0: 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  t {.  unsigned l
d1b0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
d1c0: 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68 61 72 20  ockByte;.  char 
d1d0: 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73  *filePath;.};..s
d1e0: 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
d1f0: 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
d200: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
d210: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
d220: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
d230: 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
d240: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
d250: 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
d260: 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
d270: 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
d280: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
d290: 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
d2a0: 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
d2b0: 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
d2c0: 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
d2d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
d2e0: 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
d2f0: 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
d300: 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
d310: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
d320: 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
d330: 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
d340: 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
d350: 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
d360: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
d390: 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
d3a0: 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
d3b0: 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
d3c0: 67 65 4c 6f 63 6b 32 46 53 43 54 4c 09 5f 49 4f  geLock2FSCTL._IO
d3d0: 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
d3e0: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
d3f0: 50 42 32 29 0a 0a 2f 2a 20 72 65 74 75 72 6e 20  PB2)../* return 
d400: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20  0 on success, 1 
d410: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 6f 20  on failure.  To 
d420: 6d 61 74 63 68 20 74 68 65 20 62 65 68 61 76 69  match the behavi
d430: 6f 72 20 6f 66 20 74 68 65 20 0a 20 20 6e 6f 72  or of the .  nor
d440: 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20 6c  mal posix file l
d450: 6f 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e 20  ocking (used in 
d460: 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78 61  unixLock for exa
d470: 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c 64  mple), we should
d480: 20 0a 20 20 70 72 6f 76 69 64 65 20 27 72 69 63   .  provide 'ric
d490: 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f 64 65  her' return code
d4a0: 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c 6c 79  s - specifically
d4b0: 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
d4c0: 65 20 62 65 74 77 65 65 6e 0a 20 20 27 66 69 6c  e between.  'fil
d4d0: 65 20 62 75 73 79 27 20 61 6e 64 20 27 66 69 6c  e busy' and 'fil
d4e0: 65 20 73 79 73 74 65 6d 20 65 72 72 6f 72 27 20  e system error' 
d4f0: 72 65 73 75 6c 74 73 20 2a 2f 0a 73 74 61 74 69  results */.stati
d500: 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74 4c  c int _AFPFSSetL
d510: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
d520: 70 61 74 68 2c 20 69 6e 74 20 66 64 2c 20 75 6e  path, int fd, un
d530: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
d540: 20 6f 66 66 73 65 74 2c 20 0a 20 20 20 20 20 20   offset, .      
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
d570: 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 69 6e   long length, in
d580: 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 29 0a 7b  t setLockFlag).{
d590: 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
d5a0: 6e 67 65 4c 6f 63 6b 50 42 32 09 70 62 3b 0a 20  ngeLockPB2.pb;. 
d5b0: 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20 20   int            
d5c0: 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20           err;.  
d5d0: 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
d5e0: 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
d5f0: 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
d600: 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
d610: 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
d620: 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
d630: 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
d640: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 4f 53 54 52  .fd = fd;.  OSTR
d650: 41 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65  ACE5("AFPLOCK se
d660: 74 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f  tting lock %s fo
d670: 72 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c  r %d in range %l
d680: 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
d690: 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
d6a0: 4e 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f  N":"OFF"), fd, o
d6b0: 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a  ffset, length);.
d6c0: 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61    err = fsctl(pa
d6d0: 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e  th, afpfsByteRan
d6e0: 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70  geLock2FSCTL, &p
d6f0: 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72  b, 0);.  if ( er
d700: 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 4f 53  r==-1 ) {.    OS
d710: 54 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20  TRACE4("AFPLOCK 
d720: 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
d730: 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
d740: 20 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20   path, errno, . 
d750: 20 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72       strerror(er
d760: 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rno));.    retur
d770: 6e 20 31 3b 20 2f 2f 20 65 72 72 6f 72 0a 20 20  n 1; // error.  
d780: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
d790: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
d7a0: 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  . ** This routin
d7b0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
d7c0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
d7d0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
d7e0: 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a 20 66   specified. ** f
d7f0: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
d800: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
d810: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
d820: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
d830: 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  . ** non-zero.  
d840: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
d850: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
d860: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
d870: 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74  ks, then. ** ret
d880: 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74  urn zero.. */.st
d890: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
d8a0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
d8b0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  k(OsFile *id){. 
d8c0: 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e   int r = 0;.  un
d8d0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
d8e0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
d8f0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
d900: 65 20 29 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69  e ); .  afpLocki
d910: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
d920: 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
d930: 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
d940: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d950: 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
d960: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
d970: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
d980: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
d990: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
d9a0: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
d9b0: 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b  CK ){.    r = 1;
d9c0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
d9d0: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
d9e0: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
d9f0: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
da00: 0a 20 20 69 66 20 28 20 21 72 20 29 20 7b 0a 20  .  if ( !r ) {. 
da10: 20 20 20 2f 2f 20 6c 6f 63 6b 20 74 68 65 20 62     // lock the b
da20: 79 74 65 0a 20 20 20 20 69 6e 74 20 66 61 69 6c  yte.    int fail
da30: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
da40: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
da50: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
da60: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
da70: 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20 28 66  ,1);  .    if (f
da80: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 2f  ailed) {.      /
da90: 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
daa0: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
dab0: 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
dac0: 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
dad0: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
dae0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
daf0: 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
db00: 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
db10: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
db20: 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
db30: 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
db40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
db50: 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46 50 46  e */.      _AFPF
db60: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
db70: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
db80: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
db90: 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
dba0: 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33  }.  }.  OSTRACE3
dbb0: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
dbc0: 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
dbd0: 68 2c 20 72 29 3b 0a 20 20 0a 20 20 72 65 74 75  h, r);.  .  retu
dbe0: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d  rn r;.}../* AFP-
dbf0: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f  style locking fo
dc00: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61  llowing the beha
dc10: 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b  vior of unixLock
dc20: 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f  , see the unixLo
dc30: 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ck .** function 
dc40: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74  comments for det
dc50: 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e  ails of lock man
dc60: 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74  agement. */.stat
dc70: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f  ic int afpUnixLo
dc80: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
dc90: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 0a 7b 0a 20  nt locktype).{. 
dca0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dcb0: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
dcc0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
dcd0: 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
dce0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
dcf0: 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
dd00: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
dd10: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
dd20: 78 74 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e  xt;.  int gotPen
dd30: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
dd40: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
dd50: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
dd60: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
dd70: 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %s pid=%d\n", 
dd80: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
dd90: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
dda0: 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
ddb0: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
ddc0: 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64  ocktype), getpid
ddd0: 28 29 29 3b 20 20 0a 20 20 2f 2a 20 49 66 20 74  ());  .  /* If t
dde0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
ddf0: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
de00: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
de10: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
de20: 20 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f     ** OsFile, do
de30: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
de40: 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
de50: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
de60: 20 61 73 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   as.    ** sqlit
de70: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
de80: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
de90: 6c 65 64 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a  led yet..    */.
dea0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
deb0: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
dec0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
ded0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
dee0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
def0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
df00: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
df10: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
df20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
df30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
df40: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
df50: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
df60: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 20  e is correct.   
df70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
df80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
df90: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
dfa0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
dfb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
dfc0: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
dfd0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
dfe0: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
dff0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
e000: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
e010: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
e020: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
e030: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
e040: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
e050: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
e060: 68 72 65 61 64 73 0a 20 20 20 20 2a 2f 0a 20 20  hreads.    */.  
e070: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
e080: 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  tex();..  /* Mak
e090: 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65  e sure the curre
e0a0: 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74  nt thread owns t
e0b0: 68 65 20 70 46 69 6c 65 2e 0a 20 20 20 20 2a 2f  he pFile..    */
e0c0: 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
e0d0: 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
e0e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e0f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
e100: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
e110: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
e120: 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  c;.  }.    .  /*
e130: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
e140: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
e150: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
e160: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
e170: 6f 72 65 0a 20 20 20 20 2a 2a 20 61 63 71 75 69  ore.    ** acqui
e180: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
e190: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
e1a0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
e1b0: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
e1c0: 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65     ** be release
e1d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20  d..    */.  if( 
e1e0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
e1f0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
e200: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
e210: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
e220: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
e230: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  DING_LOCK).     
e240: 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
e250: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
e260: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e270: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e280: 0a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  .      PENDING_B
e290: 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
e2a0: 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
e2b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e2c0: 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
e2d0: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
e2e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
e2f0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
e300: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
e310: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
e320: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
e330: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
e340: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
e350: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
e360: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 69  lock..    */.  i
e370: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
e380: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e390: 69 6e 74 20 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a  int lk, failed;.
e3a0: 20 20 20 20 69 6e 74 20 74 72 69 65 73 20 3d 20      int tries = 
e3b0: 30 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e  0;.    .    /* N
e3c0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
e3d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  lock */.    /* n
e3e0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
e3f0: 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
e400: 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
e410: 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
e420: 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
e430: 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65  om(); .    conte
e440: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
e450: 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66  te = (lk & 0x7ff
e460: 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
e470: 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 66 61  IZE - 1);.    fa
e480: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
e490: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e4a0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e4b0: 2c 20 0a 20 20 20 20 20 20 53 48 41 52 45 44 5f  , .      SHARED_
e4c0: 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
e4d0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
e4e0: 2c 20 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f  , 1);.    .    /
e4f0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
e500: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
e510: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 5f 41 46  k */.    if (_AF
e520: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
e530: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
e540: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
e550: 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20  BYTE, 1, 0)) {. 
e560: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e570: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
e580: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
e590: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
e5a0: 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
e5b0: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
e5c0: 20 20 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65    .    if( faile
e5d0: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
e5e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
e5f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e600: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e610: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e620: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e630: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
e640: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
e650: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
e660: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
e670: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
e680: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
e690: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
e6a0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
e6b0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
e6c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
e6d0: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
e6e0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
e6f0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
e700: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
e710: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
e720: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
e730: 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
e740: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
e750: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
e760: 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
e770: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
e780: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
e790: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
e7a0: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
e7b0: 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
e7c0: 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
e7d0: 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d  d && locktype ==
e7e0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
e7f0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
e800: 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
e810: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
e820: 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
e830: 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
e840: 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
e850: 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
e860: 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
e870: 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
e880: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e890: 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
e8a0: 74 68 65 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  the  afpUnixUnlo
e8b0: 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
e8c0: 20 20 69 66 20 28 21 5f 41 46 50 46 53 53 65 74    if (!_AFPFSSet
e8d0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e8e0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e8f0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
e920: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
e930: 65 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  e, 1, 0)) {.    
e940: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
e950: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
e960: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
e970: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
e980: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e990: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e9a0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
e9b0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
e9c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
e9f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 61  ;.        if (fa
ea00: 69 6c 65 64 20 26 26 20 5f 41 46 50 46 53 53 65  iled && _AFPFSSe
ea10: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
ea20: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
ea30: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
ea40: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
ea70: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
ea80: 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 1)) {.        
ea90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
eaa0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74  ERR_RDLOCK; /* t
eab0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
eac0: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
ead0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
eae0: 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 2a  e {.        /* *
eaf0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
eb00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
eb10: 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75  CK; /* this shou
eb20: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
eb30: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
eb40: 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
eb50: 26 26 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  && rc == SQLITE_
eb60: 4f 4b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  OK){.      rc = 
eb70: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
eb80: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
eb90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eba0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
ebb0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
ebc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
ebd0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
ebe0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
ebf0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
ec00: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
ec10: 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
ec20: 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  :.    sqlite3OsL
ec30: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
ec40: 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
ec50: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
ec60: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
ec70: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
ec80: 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
ec90: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
eca0: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
ecb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
ecc0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
ecd0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
ece0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
ecf0: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
ed00: 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d    locktype. ** m
ed10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ed20: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ed30: 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
ed40: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ed50: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
ed60: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
ed70: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
ed80: 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
ed90: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
eda0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
edb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
edc0: 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69  tatic int afpUni
edd0: 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  xUnlock(OsFile *
ede0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
edf0: 29 20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ) {.  struct flo
ee00: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
ee10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ee20: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
ee30: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ee40: 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
ee50: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
ee60: 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
ee70: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
ee80: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20  ckingContext;.. 
ee90: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
eea0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
eeb0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
eec0: 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
eed0: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
eee0: 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  ,.         pFile
eef0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
ef00: 69 64 28 29 29 3b 0a 20 20 0a 20 20 61 73 73 65  id());.  .  asse
ef10: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
ef20: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
ef30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
ef40: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
ef50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ef60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ef70: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
ef80: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ef90: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
efa0: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
efb0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
efc0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
efd0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
efe0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
eff0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
f000: 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
f010: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20 20 20  failed = 0;..   
f020: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65     /* unlock the
f030: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
f040: 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62   - then re-estab
f050: 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
f060: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66  lock */.      if
f070: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
f080: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
f090: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69  K) {.        fai
f0a0: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f0b0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f0c0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
f0d0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
f110: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66  ;.        if (!f
f120: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ailed) {.       
f130: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c     /* successful
f140: 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65  ly removed the e
f150: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
f160: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f  .          if (_
f170: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
f180: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f190: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f1a0: 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20 20 20  _FIRST+.        
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1c0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
f1d0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
f1e0: 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1)) {.          
f1f0: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
f200: 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75 72 20  e-establish our 
f210: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
f220: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
f230: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f240: 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f  OCK; /* This sho
f250: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
f270: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f280: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
f290: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f2a0: 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65 64 20  happen - failed 
f2b0: 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78  to unlock the ex
f2c0: 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2a 2f  clusive range */
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f2e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f2f0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  OCK;.        } .
f300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f310: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49    if (rc == SQLI
f320: 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
f330: 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
f340: 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  G_LOCK) {.      
f350: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
f360: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
f370: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
f380: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
f390: 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0)){.        /* 
f3a0: 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73  failed to releas
f3b0: 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  e the pending lo
f3c0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ck */.        rc
f3d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f3e0: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  UNLOCK; /* This 
f3f0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
f400: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
f410: 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63     } .    if (rc
f420: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26   == SQLITE_OK &&
f430: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f440: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  >=RESERVED_LOCK)
f450: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
f460: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
f470: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
f480: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f490: 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a  _BYTE, 1, 0)) {.
f4a0: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
f4b0: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
f4c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
f4d0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
f4e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f4f0: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
f500: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f510: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
f520: 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  } .  }.  if( loc
f530: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
f540: 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
f550: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
f560: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
f570: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, pFile->h, . 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
f5a0: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
f5b0: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
f5c0: 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
f5d0: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
f5e0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f5f0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
f600: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
f610: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
f620: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72     }.  }.  if (r
f630: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  c == SQLITE_OK).
f640: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f650: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f660: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
f670: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
f680: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
f690: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
f6a0: 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
f6b0: 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
f6c0: 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ext . */.static 
f6d0: 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73 65  int afpUnixClose
f6e0: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
f6f0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
f700: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
f710: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
f720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f730: 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c  OK;.  afpUnixUnl
f740: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
f750: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
f760: 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74  e AFP locking st
f770: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
f780: 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
f790: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
f7a0: 20 20 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b     if (((afpLock
f7b0: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d  ingContext *)id-
f7c0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f7d0: 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55  ->filePath != NU
f7e0: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
f7f0: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
f800: 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
f810: 65 78 74 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67  ext*)id->locking
f820: 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
f830: 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
f840: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
f850: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f860: 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  t);.  }.  .  if(
f870: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
f880: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
f890: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
f8a0: 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  -1;.  close(id->
f8b0: 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  h);.  id->isOpen
f8c0: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
f8d0: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
f8e0: 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
f8f0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
f900: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
f910: 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  eFree(id);.  *pI
f920: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
f930: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
f940: 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63  pragma mark floc
f950: 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e  k() style lockin
f960: 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 66 6c  g../*. ** The fl
f970: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
f980: 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 2a  t is not used. *
f990: 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 66  /.typedef void f
f9a0: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f9b0: 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  xt;..static int 
f9c0: 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  flockUnixCheckRe
f9d0: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
f9e0: 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
f9f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fa00: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
fa10: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
fa20: 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44  type == RESERVED
fa30: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74  _LOCK) {.    ret
fa40: 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65 61 64  urn 1; // alread
fa50: 79 20 68 61 76 65 20 61 20 72 65 73 65 72 76 65  y have a reserve
fa60: 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73 65 20  d lock.  } else 
fa70: 7b 0a 20 20 20 20 2f 2f 20 61 74 74 65 6d 70 74  {.    // attempt
fa80: 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b   to get the lock
fa90: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  .    int rc = fl
faa0: 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
fab0: 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
fac0: 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20 7b  ;.    if (!rc) {
fad0: 0a 20 20 20 20 20 20 2f 2f 20 67 6f 74 20 74 68  .      // got th
fae0: 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
faf0: 74 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70 46  t.      flock(pF
fb00: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
fb10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
fb20: 3b 20 20 2f 2f 20 6e 6f 20 6f 6e 65 20 68 61 73  ;  // no one has
fb30: 20 69 74 20 72 65 73 65 72 76 65 64 0a 20 20 20   it reserved.   
fb40: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b   }.    return 1;
fb50: 20 2f 2f 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   // someone else
fb60: 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72   might have it r
fb70: 65 73 65 72 76 65 64 0a 20 20 7d 0a 7d 0a 0a 73  eserved.  }.}..s
fb80: 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55  tatic int flockU
fb90: 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  nixLock(OsFile *
fba0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
fbb0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
fbc0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fbd0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2f 20 69  e*)id;.  .  // i
fbe0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
fbf0: 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
fc00: 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2f  exclusive.  .  /
fc10: 2f 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  / Just adjust le
fc20: 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
fc30: 6f 75 74 74 61 20 68 65 72 65 2e 0a 20 20 69 66  outta here..  if
fc40: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
fc50: 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  e > NO_LOCK) {. 
fc60: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
fc70: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
fc80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc90: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f  _OK;.  }.  .  //
fca0: 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
fcb0: 76 65 20 6c 6f 63 6b 0a 20 20 69 6e 74 20 72 63  ve lock.  int rc
fcc0: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
fcd0: 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
fce0: 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28 72 63 29  K_NB);.  if (rc)
fcf0: 20 7b 0a 20 20 20 20 2f 2f 20 64 69 64 6e 27 74   {.    // didn't
fd00: 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
fd10: 73 79 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  sy.    return SQ
fd20: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65  LITE_BUSY;.  } e
fd30: 6c 73 65 20 7b 0a 20 20 20 20 2f 2f 20 67 6f 74  lse {.    // got
fd40: 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
fd50: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 0a  e and return ok.
fd60: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
fd70: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
fd80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fd90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  E_OK;.  }.}..sta
fda0: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
fdb0: 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  xUnlock(OsFile *
fdc0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
fdd0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
fde0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
fdf0: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
fe00: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
fe10: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
fe20: 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    // no-op if po
fe30: 73 73 69 62 6c 65 0a 20 20 69 66 28 20 70 46 69  ssible.  if( pFi
fe40: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f  le->locktype==lo
fe50: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe70: 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 73 68 61 72    }.  .  // shar
fe80: 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
fe90: 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
fea0: 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
feb0: 6c 75 73 69 76 65 0a 20 20 69 66 20 28 6c 6f 63  lusive.  if (loc
fec0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
fed0: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
fee0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fef0: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
ff00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ff10: 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20 72 65 61 6c    .  // no, real
ff20: 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a 20 20 69 6e  ly, unlock..  in
ff30: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
ff40: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
ff50: 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20 20 72  .  if (rc).    r
ff60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
ff70: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73  RR_UNLOCK;.  els
ff80: 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  e {.    pFile->l
ff90: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
ffa0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
ffb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
ffc0: 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
ffd0: 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
ffe0: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f  int flockUnixClo
fff0: 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
10000 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69   {.  unixFile *i
10010 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
10020 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69  pId;.  .  if( !i
10030 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
10040 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69  E_OK;.  flockUni
10050 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
10060 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28  _LOCK);.  .  if(
10070 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
10080 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
10090 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
100a0 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45  -1;.  sqlite3OsE
100b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a  nterMutex();.  .
100c0 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20    close(id->h); 
100d0 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61   .  sqlite3OsLea
100e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d  veMutex();.  id-
100f0 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  >isOpen = 0;.  O
10100 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20  STRACE2("CLOSE  
10110 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29   %-3d\n", id->h)
10120 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
10130 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68  -1);.  sqlite3Th
10140 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29  readSafeFree(id)
10150 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
10160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10170 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  ;.}..#pragma mar
10180 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f  k Old-School .lo
10190 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f  ck file based lo
101a0 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  cking../*. ** Th
101b0 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
101c0 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
101d0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64  e contains all d
101e0 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c  otlock (.lock) l
101f0 6f 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63  ock. ** specific
10200 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64   state. */.typed
10210 65 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63  ef struct dotloc
10220 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10230 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10240 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f  ntext;.struct do
10250 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10260 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f  ext {.  char *lo
10270 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61  ckPath;.};...sta
10280 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10290 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
102a0 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
102b0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
102c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
102d0 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c  *)id;.  dotlockL
102e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
102f0 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64  ontext = .    (d
10300 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
10310 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
10320 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10330 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c   .  if (pFile->l
10340 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52  ocktype == RESER
10350 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
10360 72 65 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72  return 1; // alr
10370 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65  eady have a rese
10380 72 76 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c  rved lock.  } el
10390 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  se {.    struct 
103a0 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20  stat statBuf;.  
103b0 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74    if (lstat(cont
103c0 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73  ext->lockPath,&s
103d0 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a 20 20  tatBuf) == 0).  
103e0 20 20 20 20 2f 2f 20 66 69 6c 65 20 65 78 69 73      // file exis
103f0 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  ts, someone else
10400 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 0a 20 20   has the lock.  
10410 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10420 20 20 65 6c 73 65 0a 20 20 20 20 20 20 2f 2f 20    else.      // 
10430 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
10440 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61  ist, we could ha
10450 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
10460 20 69 74 0a 20 20 20 20 20 20 72 65 74 75 72 6e   it.      return
10470 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
10480 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69  c int dotlockUni
10490 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xLock(OsFile *id
104a0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
104b0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
104c0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
104d0 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
104e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
104f0 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
10500 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10510 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
10520 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
10530 0a 20 20 2f 2f 20 69 66 20 77 65 20 61 6c 72 65  .  // if we alre
10540 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
10550 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
10560 2e 20 20 0a 20 20 2f 2f 20 4a 75 73 74 20 61 64  .  .  // Just ad
10570 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
10580 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
10590 65 2e 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  e..  if (pFile->
105a0 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
105b0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
105c0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
105d0 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f  type;.    .    /
105e0 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
105f0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
10600 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
10610 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e 74  .    utimes(cont
10620 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55  ext->lockPath,NU
10630 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LL);.    return 
10640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10650 20 0a 20 20 2f 2f 20 63 68 65 63 6b 20 74 6f 20   .  // check to 
10660 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65  see if lock file
10670 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 0a   already exists.
10680 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
10690 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74  atBuf;.  if (lst
106a0 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  at(context->lock
106b0 50 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d  Path,&statBuf) =
106c0 3d 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  = 0){.    return
106d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2f   SQLITE_BUSY; //
106e0 20 69 74 20 64 6f 65 73 2c 20 62 75 73 79 0a 20   it does, busy. 
106f0 20 7d 0a 20 20 0a 20 20 2f 2f 20 67 72 61 62 20   }.  .  // grab 
10700 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10710 6b 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65  k.  int fd = ope
10720 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  n(context->lockP
10730 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43  ath,O_RDONLY|O_C
10740 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30  REAT|O_EXCL,0600
10750 29 3b 0a 20 20 69 66 20 28 66 64 20 3c 20 30 29  );.  if (fd < 0)
10760 20 7b 0a 20 20 20 20 2f 2f 20 66 61 69 6c 65 64   {.    // failed
10770 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
10780 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e  the file, someon
10790 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20  e else may have 
107a0 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 0a  stolen the lock.
107b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
107c0 45 5f 42 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63  E_BUSY; .  }.  c
107d0 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f  lose(fd);.  .  /
107e0 2f 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68  / got it, set th
107f0 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72  e type and retur
10800 6e 20 6f 6b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  n ok.  pFile->lo
10810 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
10820 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
10830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
10840 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
10850 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
10860 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
10870 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10880 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10890 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c  *)id;.  dotlockL
108a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
108b0 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64  ontext = .    (d
108c0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
108d0 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
108e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
108f0 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b   .  assert( lock
10900 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
10910 4b 20 29 3b 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2d  K );.  .  // no-
10920 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 0a 20  op if possible. 
10930 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
10940 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29  type==locktype )
10950 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10960 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
10970 20 2f 2f 20 73 68 61 72 65 64 20 63 61 6e 20 6a   // shared can j
10980 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
10990 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
109a0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  e an exclusive. 
109b0 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
109c0 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
109d0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
109e0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
109f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a00 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20  OK;.  }.  .  // 
10a10 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
10a20 63 6b 2e 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e  ck..  unlink(con
10a30 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b  text->lockPath);
10a40 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
10a50 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
10a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10a70 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
10a80 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
10a90 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
10aa0 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  UnixClose(OsFile
10ab0 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78   **pId) {.  unix
10ac0 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
10ad0 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20  File*)*pId;.  . 
10ae0 20 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72   if( !id ) retur
10af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64  n SQLITE_OK;.  d
10b00 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  otlockUnixUnlock
10b10 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
10b20 0a 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 64  .  /* free the d
10b30 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 73  otlock locking s
10b40 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66  tructure */.  if
10b50 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e   (id->lockingCon
10b60 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  text != NULL) {.
10b70 20 20 20 20 69 66 20 28 28 28 64 6f 74 6c 6f 63      if (((dotloc
10b80 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10b90 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  *)id->lockingCon
10ba0 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20  text)->lockPath 
10bb0 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73  != NULL).      s
10bc0 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
10bd0 46 72 65 65 28 20 28 20 28 64 6f 74 6c 6f 63 6b  Free( ( (dotlock
10be0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10bf0 29 0a 20 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f  ).        id->lo
10c00 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c  ckingContext)->l
10c10 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ockPath);.    sq
10c20 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
10c30 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  ree(id->lockingC
10c40 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a  ontext);.  }.  .
10c50 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e    if( id->dirfd>
10c60 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64  =0 ) close(id->d
10c70 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72  irfd);.  id->dir
10c80 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  fd = -1;.  sqlit
10c90 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
10ca0 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d  ;.  .  close(id-
10cb0 3e 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  >h);.  .  sqlite
10cc0 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
10cd0 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
10ce0 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  0;.  OSTRACE2("C
10cf0 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
10d00 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
10d10 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
10d20 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
10d30 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d  ee(id);.  *pId =
10d40 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
10d50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61  ITE_OK;.}...#pra
10d60 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b  gma mark No lock
10d70 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20  ing../*. ** The 
10d80 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  nolockLockingCon
10d90 74 65 78 74 20 69 73 20 76 6f 69 64 0a 20 2a 2f  text is void. */
10da0 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 6e 6f  .typedef void no
10db0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10dc0 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  xt;..static int 
10dd0 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52  nolockUnixCheckR
10de0 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
10df0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75  le *id) {.  retu
10e00 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
10e10 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f  int nolockUnixLo
10e20 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
10e30 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
10e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10e50 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
10e60 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63   nolockUnixUnloc
10e70 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
10e80 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
10e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10ea0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
10eb0 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
10ec0 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10ed0 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  nixClose(OsFile 
10ee0 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46  **pId) {.  unixF
10ef0 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
10f00 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20  ile*)*pId;.  .  
10f10 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e  if( !id ) return
10f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
10f30 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
10f40 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
10f50 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
10f60 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
10f70 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
10f80 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b  .  close(id->h);
10f90 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  .  .  sqlite3OsL
10fa0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
10fb0 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
10fc0 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
10fd0 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e     %-3d\n", id->
10fe0 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
10ff0 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
11000 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
11010 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a  d);.  *pId = 0;.
11020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11030 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
11040 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11050 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
11060 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
11070 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
11080 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
11090 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
110a0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
110b0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
110c0 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
110d0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
110e0 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
110f0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
11100 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
11110 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
11120 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
11130 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
11140 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
11150 68 61 72 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  har *sqlite3Unix
11160 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
11170 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
11180 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ve){.  char *zFu
11190 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52  ll = 0;.  if( zR
111a0 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
111b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
111c0 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
111d0 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72  zRelative, (char
111e0 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
111f0 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20     char *zBuf = 
11200 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30  sqliteMalloc(500
11210 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
11220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
11230 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
11240 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20   zBuf[0] = 0;.  
11250 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
11260 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77  ng(&zFull, getcw
11270 64 28 7a 42 75 66 2c 20 35 30 30 30 29 2c 20 22  d(zBuf, 5000), "
11280 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20  /", zRelative,. 
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
112b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 75    sqliteFree(zBu
112c0 66 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20  f);.  }..#if 0. 
112d0 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20   /*.  ** Remove 
112e0 22 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65  "/./" path eleme
112f0 6e 74 73 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  nts and convert 
11300 22 2f 41 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65  "/A/./" path ele
11310 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75  ments.  ** to ju
11320 73 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69  st "/"..  */.  i
11330 66 28 20 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20  f( zFull ){.    
11340 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
11350 72 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69  r(i=j=0; zFull[i
11360 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
11370 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27  f( zFull[i]=='/'
11380 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11390 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20  zFull[i+1]=='/' 
113a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
113b0 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
113c0 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  1]=='.' && zFull
113d0 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
113e0 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a          i += 1;.
113f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
11400 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
11410 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b        if( zFull[
11420 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75  i+1]=='.' && zFu
11430 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20  ll[i+2]=='.' && 
11440 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20  zFull[i+3]=='/' 
11450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
11460 6c 65 28 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c  le( j>0 && zFull
11470 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
11480 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69  -; }.          i
11490 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
114a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
114b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
114c0 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20     zFull[j++] = 
114d0 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a  zFull[i];.    }.
114e0 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30      zFull[j] = 0
114f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
11500 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a  return zFull;.}.
11510 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11520 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
11530 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20  ullsync flag in 
11540 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
11550 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
11560 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 65  atic void unixSe
11570 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65  tFullSync(OsFile
11580 20 2a 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20   *id, int v){.  
11590 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
115a0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 7d  >fullSync = v;.}
115b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
115c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
115d0 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  le handle for an
115e0 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69   OsFile.*/.stati
115f0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 48 61  c int unixFileHa
11600 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  ndle(OsFile *id)
11610 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
11620 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d  xFile*)id)->h;.}
11630 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
11640 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  n integer that i
11650 6e 64 69 63 65 73 20 74 68 65 20 74 79 70 65 20  ndices the type 
11660 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
11670 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69  y held.** by thi
11680 73 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64  s handle.  (Used
11690 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
116a0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29   analysis only.)
116b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
116c0 6e 69 78 4c 6f 63 6b 53 74 61 74 65 28 4f 73 46  nixLockState(OsF
116d0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
116e0 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rn ((unixFile*)i
116f0 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a  d)->locktype;.}.
11700 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11710 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
11720 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
11730 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
11740 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
11750 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
11760 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
11770 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
11780 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
11790 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
117a0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
117b0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
117c0 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
117d0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
117e0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
117f0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
11800 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
11810 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
11820 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
11830 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
11840 62 61 73 65 20 61 6e 64 20 69 74 27 73 20 6a 6f  base and it's jo
11850 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
11860 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
11870 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
11880 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
11890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
118a0 78 53 65 63 74 6f 72 53 69 7a 65 28 4f 73 46 69  xSectorSize(OsFi
118b0 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
118c0 6e 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  n PAGER_SECTOR_S
118d0 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  IZE;.}../*.** Th
118e0 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
118f0 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
11900 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
11910 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
11920 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a  ** for unix..*/.
11930 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d  static const IoM
11940 65 74 68 6f 64 20 73 71 6c 69 74 65 33 55 6e 69  ethod sqlite3Uni
11950 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
11960 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69  unixClose,.  uni
11970 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  xOpenDirectory,.
11980 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e    unixRead,.  un
11990 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 53  ixWrite,.  unixS
119a0 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63  eek,.  unixTrunc
119b0 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c  ate,.  unixSync,
119c0 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79  .  unixSetFullSy
119d0 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48 61  nc,.  unixFileHa
119e0 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65  ndle,.  unixFile
119f0 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b  Size,.  unixLock
11a00 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  ,.  unixUnlock,.
11a10 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
11a20 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
11a30 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78  rvedLock,.  unix
11a40 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a  SectorSize,.};..
11a50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11a60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
11a70 4c 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76  LE./*. ** This v
11a80 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
11a90 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
11aa0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
11ab0 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20  n an OsFile. ** 
11ac0 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 41 46  for unix with AF
11ad0 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  P style file loc
11ae0 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  king.. */.static
11af0 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20   const IoMethod 
11b00 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e  sqlite3AFPLockin
11b10 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  gUnixIoMethod = 
11b20 7b 0a 20 20 20 20 61 66 70 55 6e 69 78 43 6c 6f  {.    afpUnixClo
11b30 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e  se,.    unixOpen
11b40 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75  Directory,.    u
11b50 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69  nixRead,.    uni
11b60 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78  xWrite,.    unix
11b70 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72  Seek,.    unixTr
11b80 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78  uncate,.    unix
11b90 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65  Sync,.    unixSe
11ba0 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75  tFullSync,.    u
11bb0 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  nixFileHandle,. 
11bc0 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
11bd0 0a 20 20 20 20 61 66 70 55 6e 69 78 4c 6f 63 6b  .    afpUnixLock
11be0 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 55 6e 6c  ,.    afpUnixUnl
11bf0 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63  ock,.    unixLoc
11c00 6b 53 74 61 74 65 2c 0a 20 20 20 20 61 66 70 55  kState,.    afpU
11c10 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
11c20 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 53 65  Lock,.    unixSe
11c30 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a  ctorSize,.};../*
11c40 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  . ** This vector
11c50 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
11c60 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
11c70 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
11c80 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75  OsFile. ** for u
11c90 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29  nix with flock()
11ca0 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
11cb0 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ing.. */.static 
11cc0 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73  const IoMethod s
11cd0 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69  qlite3FlockLocki
11ce0 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
11cf0 20 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78   {.    flockUnix
11d00 43 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f  Close,.    unixO
11d10 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20  penDirectory,.  
11d20 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20    unixRead,.    
11d30 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75  unixWrite,.    u
11d40 6e 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69  nixSeek,.    uni
11d50 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75  xTruncate,.    u
11d60 6e 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69  nixSync,.    uni
11d70 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20  xSetFullSync,.  
11d80 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65    unixFileHandle
11d90 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69  ,.    unixFileSi
11da0 7a 65 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69  ze,.    flockUni
11db0 78 4c 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b  xLock,.    flock
11dc0 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20  UnixUnlock,.    
11dd0 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20  unixLockState,. 
11de0 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63     flockUnixChec
11df0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
11e00 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
11e10 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  e,.};../*. ** Th
11e20 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
11e30 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
11e40 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
11e50 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
11e60 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74   ** for unix wit
11e70 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20  h dotlock style 
11e80 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a  file locking.. *
11e90 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49  /.static const I
11ea0 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 44  oMethod sqlite3D
11eb0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69  otlockLockingUni
11ec0 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
11ed0 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f    dotlockUnixClo
11ee0 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e  se,.    unixOpen
11ef0 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75  Directory,.    u
11f00 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69  nixRead,.    uni
11f10 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78  xWrite,.    unix
11f20 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72  Seek,.    unixTr
11f30 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78  uncate,.    unix
11f40 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65  Sync,.    unixSe
11f50 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75  tFullSync,.    u
11f60 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  nixFileHandle,. 
11f70 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
11f80 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  .    dotlockUnix
11f90 4c 6f 63 6b 2c 0a 20 20 20 20 64 6f 74 6c 6f 63  Lock,.    dotloc
11fa0 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20  kUnixUnlock,.   
11fb0 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a   unixLockState,.
11fc0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43      dotlockUnixC
11fd0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11fe0 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72  ,.    unixSector
11ff0 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a  Size,.};../*. **
12000 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
12010 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
12020 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
12030 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
12040 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20  le. ** for unix 
12050 77 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79  with dotlock sty
12060 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  le file locking.
12070 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
12080 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74  t IoMethod sqlit
12090 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  e3NolockLockingU
120a0 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
120b0 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73    nolockUnixClos
120c0 65 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44 69 72  e,.  unixOpenDir
120d0 65 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78 52 65  ectory,.  unixRe
120e0 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c  ad,.  unixWrite,
120f0 0a 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 75  .  unixSeek,.  u
12100 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75  nixTruncate,.  u
12110 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 53  nixSync,.  unixS
12120 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e  etFullSync,.  un
12130 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20  ixFileHandle,.  
12140 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
12150 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a  nolockUnixLock,.
12160 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f    nolockUnixUnlo
12170 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
12180 61 74 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69  ate,.  nolockUni
12190 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
121a0 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f 72  ck,.  unixSector
121b0 53 69 7a 65 2c 0a 7d 3b 0a 0a 23 65 6e 64 69 66  Size,.};..#endif
121c0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
121d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
121e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
121f0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
12200 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61 6e 64  new unixFile and
12210 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 61 74   initialize that
12220 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 57 72   unixFile..** Wr
12230 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
12240 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
12250 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20  e into *pId..** 
12260 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  If we run out of
12270 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74   memory, close t
12280 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74 75  he file and retu
12290 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  rn an error..*/.
122a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
122b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
122c0 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57 68 65 6e 20  LE./* . ** When 
122d0 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69 6f  locking extensio
122e0 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c 20  ns are enabled, 
122f0 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e 64  the filepath and
12300 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 0a   locking style .
12310 20 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20 74   ** are needed t
12320 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
12330 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f 64  unixFile pMethod
12340 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b   to use for lock
12350 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
12360 20 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d   ** The locking-
12370 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 6c  style specific l
12380 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 61  ockingContext da
12390 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ta structure is 
123a0 63 72 65 61 74 65 64 20 0a 20 2a 2a 20 61 6e 64  created . ** and
123b0 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20 61   assigned here a
123c0 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  lso.. */.static 
123d0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  int allocateUnix
123e0 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20  File(.  int h,  
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
12410 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
12420 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
12430 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20    OsFile **pId, 
12440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12450 74 65 20 63 6f 6d 70 6c 65 74 65 64 20 69 6e 69  te completed ini
12460 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 65 72 65  tialization here
12470 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12480 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
12490 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
124a0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
124b0 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20  /.  int delFlag 
124c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
124d0 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d 62 65 66 6f  elete-on-or-befo
124e0 72 65 2d 63 6c 6f 73 65 20 66 6c 61 67 20 2a 2f  re-close flag */
124f0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c 6f 63  .){.  sqlite3Loc
12500 6b 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b 69 6e  kingStyle lockin
12510 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
12520 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69 78  le *pNew;.  unix
12530 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72 63  File f;.  int rc
12540 3b 0a 0a 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c  ;..  lockingStyl
12550 65 20 3d 20 73 71 6c 69 74 65 33 44 65 74 65 63  e = sqlite3Detec
12560 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46  tLockingStyle(zF
12570 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69  ilename, h);.  i
12580 66 20 28 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65  f ( lockingStyle
12590 20 3d 3d 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67   == posixLocking
125a0 53 74 79 6c 65 20 29 20 7b 0a 20 20 20 20 73 71  Style ) {.    sq
125b0 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
125c0 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
125d0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66  ndLockInfo(h, &f
125e0 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e  .pLock, &f.pOpen
125f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
12600 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
12610 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12620 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20    close(h);.    
12630 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
12640 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
12650 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12660 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b      }.  } else {
12670 0a 20 20 20 20 2f 2f 20 20 70 4c 6f 63 6b 20 61  .    //  pLock a
12680 6e 64 20 70 4f 70 65 6e 20 61 72 65 20 6f 6e 6c  nd pOpen are onl
12690 79 20 75 73 65 64 20 66 6f 72 20 70 6f 73 69 78  y used for posix
126a0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
126b0 67 20 0a 20 20 20 20 66 2e 70 4c 6f 63 6b 20 3d  g .    f.pLock =
126c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 66 2e 70 4f 70   NULL;.    f.pOp
126d0 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  en = NULL;.  }. 
126e0 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a   if( delFlag ){.
126f0 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
12700 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 2e 64  name);.  }.  f.d
12710 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e 66  irfd = -1;.  f.f
12720 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 66  ullSync = 0;.  f
12730 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20  .locktype = 0;. 
12740 20 66 2e 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20   f.offset = 0;. 
12750 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54 5f   f.h = h;.  SET_
12760 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20  THREADID(&f);.  
12770 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 54 68  pNew = sqlite3Th
12780 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
12790 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
127a0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
127b0 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  0 ){.    close(h
127c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
127d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
127e0 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
127f0 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  o(f.pLock);.    
12800 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 66  releaseOpenCnt(f
12810 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c  .pOpen);.    sql
12820 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
12830 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30  ();.    *pId = 0
12840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12850 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
12860 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20  se{.    *pNew = 
12870 66 3b 0a 20 20 20 20 73 77 69 74 63 68 28 6c 6f  f;.    switch(lo
12880 63 6b 69 6e 67 53 74 79 6c 65 29 20 7b 0a 20 20  ckingStyle) {.  
12890 20 20 20 20 63 61 73 65 20 61 66 70 4c 6f 63 6b      case afpLock
128a0 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
128b0 20 20 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67    /* afp locking
128c0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
128d0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
128e0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
128f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
12900 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
12910 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  xt */.        pN
12920 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12930 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
12940 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12950 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
12960 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20  ingContext = .  
12970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
12980 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12990 73 69 7a 65 6f 66 28 61 66 70 4c 6f 63 6b 69 6e  sizeof(afpLockin
129a0 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20  gContext));.    
129b0 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67      ((afpLocking
129c0 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e  Context *)pNew->
129d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
129e0 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20 20  >filePath = .   
129f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68         sqlite3Th
12a00 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 73  readSafeMalloc(s
12a10 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
12a20 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73   + 1);.        s
12a30 74 72 63 70 79 28 28 28 61 66 70 4c 6f 63 6b 69  trcpy(((afpLocki
12a40 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77  ngContext *)pNew
12a50 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12a60 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20 20  )->filePath, .  
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69               zFi
12a80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
12a90 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
12aa0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12ab0 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f      case flockLo
12ac0 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
12ad0 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63      /* flock loc
12ae0 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65  king doesn't nee
12af0 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  d additional loc
12b00 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f  kingContext info
12b10 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
12b20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
12b30 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b   = &sqlite3Flock
12b40 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12b50 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  hod;.        bre
12b60 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64  ak;.      case d
12b70 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
12b80 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 64  le:.        /* d
12b90 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 75  otlock locking u
12ba0 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
12bb0 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
12bc0 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
12bd0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
12be0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
12bf0 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20  ntext */.       
12c00 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12c10 20 26 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b   &sqlite3Dotlock
12c20 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12c30 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  hod;.        pNe
12c40 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12c50 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  t = sqlite3Threa
12c60 64 53 61 66 65 4d 61 6c 6c 6f 63 28 0a 20 20 20  dSafeMalloc(.   
12c70 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64 6f         sizeof(do
12c80 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
12c90 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 28  ext));.        (
12ca0 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
12cb0 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c  ontext *)pNew->l
12cc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
12cd0 6c 6f 63 6b 50 61 74 68 20 3d 20 0a 20 20 20 20  lockPath = .    
12ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
12cf0 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12d00 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
12d10 29 20 2b 20 73 74 72 6c 65 6e 28 22 2e 6c 6f 63  ) + strlen(".loc
12d20 6b 22 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  k") + 1);.      
12d30 20 20 73 70 72 69 6e 74 66 28 28 28 64 6f 74 6c    sprintf(((dotl
12d40 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
12d50 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  t *)pNew->lockin
12d60 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
12d70 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ath, .          
12d80 20 20 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c        "%s.lock",
12d90 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
12da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12db0 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63 6b    case posixLock
12dc0 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
12dd0 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b 69    /* posix locki
12de0 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  ng doesn't need 
12df0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  additional locki
12e00 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d  ngContext inform
12e10 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
12e20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12e30 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d   &sqlite3UnixIoM
12e40 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62  ethod;.        b
12e50 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
12e60 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a   noLockingStyle:
12e70 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e 73 75  .      case unsu
12e80 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74  pportedLockingSt
12e90 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61 75  yle:.      defau
12ea0 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e 65  lt: .        pNe
12eb0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
12ec0 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
12ed0 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  ngUnixIoMethod;.
12ee0 20 20 20 20 7d 0a 20 20 20 20 2a 70 49 64 20 3d      }.    *pId =
12ef0 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a   (OsFile*)pNew;.
12f00 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
12f10 2b 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  +1);.    return 
12f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
12f30 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c 49 54 45  .#else /* SQLITE
12f40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12f50 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74 69 63 20  STYLE */.static 
12f60 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  int allocateUnix
12f70 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20  File(.  int h,  
12f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12f90 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
12fa0 72 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20 62  riptor on file b
12fb0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
12fc0 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 20   OsFile **pId,  
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
12fe0 20 74 68 65 20 72 65 73 75 6c 20 75 6e 69 78 46   the resul unixF
12ff0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
13000 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
13010 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
13020 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13030 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
13040 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67  */.  int delFlag
13050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13060 66 20 74 72 75 65 2c 20 64 65 6c 65 74 65 20 74  f true, delete t
13070 68 65 20 66 69 6c 65 20 6f 6e 20 6f 72 20 62 65  he file on or be
13080 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  fore closing */.
13090 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
130a0 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  New;.  unixFile 
130b0 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  f;.  int rc;..  
130c0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
130d0 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
130e0 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66  ndLockInfo(h, &f
130f0 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e  .pLock, &f.pOpen
13100 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  );.  sqlite3OsLe
13110 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
13120 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20  ( delFlag ){.   
13130 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
13140 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
13150 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68 29   ){.    close(h)
13160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13170 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
13180 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e 20   OSTRACE3("OPEN 
13190 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
131a0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
131b0 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  f.dirfd = -1;.  
131c0 66 2e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  f.fullSync = 0;.
131d0 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30    f.locktype = 0
131e0 3b 0a 20 20 66 2e 6f 66 66 73 65 74 20 3d 20 30  ;.  f.offset = 0
131f0 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53  ;.  f.h = h;.  S
13200 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b  ET_THREADID(&f);
13210 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
13220 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f  3ThreadSafeMallo
13230 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  c( sizeof(unixFi
13240 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  le) );.  if( pNe
13250 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73  w==0 ){.    clos
13260 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(h);.    sqlite
13270 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
13280 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  .    releaseLock
13290 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20  Info(f.pLock);. 
132a0 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e     releaseOpenCn
132b0 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20  t(f.pOpen);.    
132c0 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
132d0 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20  tex();.    *pId 
132e0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
132f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13300 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77  }else{.    *pNew
13310 20 3d 20 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = f;.    pNew->
13320 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
13330 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
13340 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69      *pId = (OsFi
13350 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70  le*)pNew;.    Op
13360 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
13370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13380 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  _OK;.  }.}.#endi
13390 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
133a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
133b0 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53   */..#endif /* S
133c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
133d0 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  O */./**********
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13420 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20  *.** Everything 
13430 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68  above deals with
13440 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72   file I/O.  Ever
13450 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c  ything that foll
13460 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74  ows deals.** wit
13470 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61  h other miscella
13480 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66 20  nous aspects of 
13490 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
134a0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a  stem interface.*
134b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 23  ***********/...#
13500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13510 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
13520 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
13530 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
13540 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
13550 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
13560 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
13570 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
13580 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
13590 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
135a0 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
135b0 3c 64 6c 66 63 6e 2e 68 3e 0a 76 6f 69 64 20 2a  <dlfcn.h>.void *
135c0 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 6f 70 65  sqlite3UnixDlope
135d0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
135e0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75  ilename){.  retu
135f0 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e  rn dlopen(zFilen
13600 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20  ame, RTLD_NOW | 
13610 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a  RTLD_GLOBAL);.}.
13620 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 55 6e 69  void *sqlite3Uni
13630 78 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70 48 61  xDlsym(void *pHa
13640 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
13650 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65   *zSymbol){.  re
13660 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64  turn dlsym(pHand
13670 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a  le, zSymbol);.}.
13680 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 44  int sqlite3UnixD
13690 6c 63 6c 6f 73 65 28 76 6f 69 64 20 2a 70 48 61  lclose(void *pHa
136a0 6e 64 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  ndle){.  return 
136b0 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29  dlclose(pHandle)
136c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
136d0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
136e0 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a  XTENSION */../*.
136f0 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69  ** Get informati
13700 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65 20 72  on to seed the r
13710 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
13720 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65  erator.  The see
13730 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  d.** is written 
13740 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
13750 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20  zBuf[256].  The 
13760 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
13770 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20   must.** supply 
13780 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c  a sufficiently l
13790 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  arge buffer..*/.
137a0 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 52  int sqlite3UnixR
137b0 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a  andomSeed(char *
137c0 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68  zBuf){.  /* We h
137d0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
137e0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
137f0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
13800 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
13810 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
13820 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
13830 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
13840 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
13850 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
13860 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
13870 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
13880 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
13890 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
138a0 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
138b0 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
138c0 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
138d0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
138e0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
138f0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
13900 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
13910 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
13920 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
13930 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
13940 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
13950 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
13960 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
13970 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
13980 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
13990 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
139a0 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
139b0 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
139c0 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
139d0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
139e0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
139f0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
13a00 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
13a10 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
13a20 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
13a30 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
13a40 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36 29 3b  t(zBuf, 0, 256);
13a50 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13a60 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
13a70 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a     int pid, fd;.
13a80 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f      fd = open("/
13a90 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
13aa0 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  RDONLY);.    if(
13ab0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
13ac0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
13ad0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
13ae0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
13af0 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
13b00 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29    pid = getpid()
13b10 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
13b20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65  zBuf[sizeof(time
13b30 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  _t)], &pid, size
13b40 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 7d 65  of(pid));.    }e
13b50 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61 64 28  lse{.      read(
13b60 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a  fd, zBuf, 256);.
13b70 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
13b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13b90 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
13ba0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13bb0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
13bc0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
13bd0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13be0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
13bf0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
13c00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
13c10 69 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  iseconds we want
13c20 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e   to sleep..*/.in
13c30 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 6c 65  t sqlite3UnixSle
13c40 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
13c50 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
13c60 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
13c70 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a  EEP.  usleep(ms*
13c80 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
13c90 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65  ms;.#else.  slee
13ca0 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29  p((ms+999)/1000)
13cb0 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30 30 2a  ;.  return 1000*
13cc0 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b  ((ms+999)/1000);
13cd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13ce0 20 53 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   Static variable
13cf0 73 20 75 73 65 64 20 66 6f 72 20 74 68 72 65 61  s used for threa
13d00 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f  d synchronizatio
13d10 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74 65 78  n..**.** inMutex
13d20 20 20 20 20 20 20 74 68 65 20 6e 65 73 74 69 6e        the nestin
13d30 67 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 72  g depth of the r
13d40 65 63 75 72 73 69 76 65 20 6d 75 74 65 78 2e 20  ecursive mutex. 
13d50 20 54 68 65 20 74 68 72 65 61 64 0a 2a 2a 20 20   The thread.**  
13d60 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 6c 64              hold
13d70 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 63 61  ing mutexMain ca
13d80 6e 20 72 65 61 64 20 74 68 69 73 20 76 61 72 69  n read this vari
13d90 61 62 6c 65 20 61 74 20 61 6e 79 20 74 69 6d 65  able at any time
13da0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
13db0 20 20 42 75 74 20 69 73 20 6d 75 73 74 20 68 6f    But is must ho
13dc0 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f 20 63  ld mutexAux to c
13dd0 68 61 6e 67 65 20 74 68 69 73 20 76 61 72 69 61  hange this varia
13de0 62 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a 20 20  ble.  Other.**  
13df0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
13e00 61 64 73 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75  ads must hold mu
13e10 74 65 78 41 75 78 20 74 6f 20 72 65 61 64 20 74  texAux to read t
13e20 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  he variable and 
13e30 63 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  can.**          
13e40 20 20 20 20 6e 65 76 65 72 20 77 72 69 74 65 2e      never write.
13e50 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65  .**.** mutexOwne
13e60 72 20 20 20 54 68 65 20 74 68 72 65 61 64 20 69  r   The thread i
13e70 64 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 20  d of the thread 
13e80 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69  holding mutexMai
13e90 6e 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20 20 20  n.  Same.**     
13ea0 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20           access 
13eb0 72 75 6c 65 73 20 61 73 20 66 6f 72 20 69 6e 4d  rules as for inM
13ec0 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65  utex..**.** mute
13ed0 78 4f 77 6e 65 72 56 61 6c 69 64 20 20 20 54 72  xOwnerValid   Tr
13ee0 75 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  ue if the value 
13ef0 69 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73  in mutexOwner is
13f00 20 76 61 6c 69 64 2e 20 20 54 68 65 20 73 61 6d   valid.  The sam
13f10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
13f20 20 20 20 20 20 20 20 61 63 63 65 73 73 20 72 75         access ru
13f30 6c 65 73 20 61 70 70 6c 79 20 61 73 20 66 6f 72  les apply as for
13f40 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20   inMutex..**.** 
13f50 6d 75 74 65 78 4d 61 69 6e 20 20 20 20 54 68 65  mutexMain    The
13f60 20 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20 48 6f   main mutex.  Ho
13f70 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20 69 6e  ld this mutex in
13f80 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 65 78   order to get ex
13f90 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 20  clusive.**      
13fa0 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20 74          access t
13fb0 6f 20 53 51 4c 69 74 65 20 64 61 74 61 20 73 74  o SQLite data st
13fc0 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
13fd0 6d 75 74 65 78 41 75 78 20 20 20 20 20 41 6e 20  mutexAux     An 
13fe0 61 75 78 69 6c 69 61 72 79 20 6d 75 74 65 78 20  auxiliary mutex 
13ff0 6e 65 65 64 65 64 20 74 6f 20 61 63 63 65 73 73  needed to access
14000 20 76 61 72 69 61 62 6c 65 73 20 64 65 66 69 6e   variables defin
14010 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ed above..**.** 
14020 4d 75 74 65 78 65 73 20 61 72 65 20 61 6c 77 61  Mutexes are alwa
14030 79 73 20 61 63 71 75 69 72 65 64 20 69 6e 20 74  ys acquired in t
14040 68 69 73 20 6f 72 64 65 72 3a 20 6d 75 74 65 78  his order: mutex
14050 4d 61 69 6e 20 6d 75 74 65 78 41 75 78 2e 20 20  Main mutexAux.  
14060 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 6e 65   It.** is not ne
14070 63 65 73 73 61 72 79 20 74 6f 20 61 63 71 75 69  cessary to acqui
14080 72 65 20 6d 75 74 65 78 4d 61 69 6e 20 69 6e 20  re mutexMain in 
14090 6f 72 64 65 72 20 74 6f 20 67 65 74 20 6d 75 74  order to get mut
140a0 65 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a 2a 20  exAux - just.** 
140b0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
140c0 6f 20 61 63 71 75 69 72 65 20 74 68 65 6d 20 69  o acquire them i
140d0 6e 20 74 68 65 20 72 65 76 65 72 73 65 20 6f 72  n the reverse or
140e0 64 65 72 3a 20 6d 75 74 65 78 41 75 78 20 6d 75  der: mutexAux mu
140f0 74 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69 74 68  texMain..** Eith
14100 65 72 20 67 65 74 20 74 68 65 20 6d 75 74 65 78  er get the mutex
14110 65 73 20 77 69 74 68 20 6d 75 74 65 78 4d 61 69  es with mutexMai
14120 6e 20 66 69 72 73 74 20 6f 72 20 67 65 74 20 6d  n first or get m
14130 75 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a 2a 2a  utexAux only..**
14140 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  .** When running
14150 20 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d 20 77   on a platform w
14160 68 65 72 65 20 74 68 65 20 74 68 72 65 65 20 76  here the three v
14170 61 72 69 61 62 6c 65 73 20 69 6e 4d 75 74 65 78  ariables inMutex
14180 2c 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a 2a 2a  , mutexOwner,.**
14190 20 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65 72 56   and mutexOwnerV
141a0 61 6c 69 64 20 63 61 6e 20 62 65 20 73 65 74 20  alid can be set 
141b0 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68 65 20  atomically, the 
141c0 6d 75 74 65 78 41 75 78 20 69 73 20 6e 6f 74 20  mutexAux is not 
141d0 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f 6e 20  required..** On 
141e0 6d 61 6e 79 20 73 79 73 74 65 6d 73 2c 20 61 6c  many systems, al
141f0 6c 20 74 68 72 65 65 20 61 72 65 20 33 32 2d 62  l three are 32-b
14200 69 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  it integers and 
14210 77 72 69 74 69 6e 67 20 74 6f 20 61 20 33 32 2d  writing to a 32-
14220 62 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  bit.** integer i
14230 73 20 61 74 6f 6d 69 63 2e 20 20 49 20 74 68 69  s atomic.  I thi
14240 6e 6b 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  nk.  But there a
14250 72 65 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 73  re no guarantees
14260 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 2a  .  So it seems.*
14270 2a 20 73 61 66 65 72 20 74 6f 20 70 72 6f 74 65  * safer to prote
14280 63 74 20 74 68 65 6d 20 75 73 69 6e 67 20 6d 75  ct them using mu
14290 74 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61 74 69  texAux..*/.stati
142a0 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
142b0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
142c0 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74  _UNIX_THREADS.st
142d0 61 74 69 63 20 70 74 68 72 65 61 64 5f 74 20 6d  atic pthread_t m
142e0 75 74 65 78 4f 77 6e 65 72 3b 20 20 20 20 20 20  utexOwner;      
142f0 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20 68 6f      /* Thread ho
14300 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20  lding mutexMain 
14310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
14320 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20  texOwnerValid = 
14330 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
14340 20 69 66 20 6d 75 74 65 78 4f 77 6e 65 72 20 69   if mutexOwner i
14350 73 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61 74 69  s valid */.stati
14360 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
14370 74 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20 50 54  t mutexMain = PT
14380 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54  HREAD_MUTEX_INIT
14390 49 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68 65 20  IALIZER; /* The 
143a0 6d 75 74 65 78 20 2a 2f 0a 73 74 61 74 69 63 20  mutex */.static 
143b0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
143c0 6d 75 74 65 78 41 75 78 20 3d 20 50 54 48 52 45  mutexAux = PTHRE
143d0 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
143e0 49 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20 6d 75  IZER;  /* Aux mu
143f0 74 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  tex */.#endif../
14400 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
14410 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69  ng pair of routi
14420 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  ne implement mut
14430 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
14440 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
14450 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
14460 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
14470 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
14480 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
14490 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
144a0 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
144b0 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
144c0 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
144d0 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
144e0 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
144f0 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
14500 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
14510 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
14520 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
14530 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
14540 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
14550 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20  ng..**.** As of 
14560 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74  version 3.3.2, t
14570 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74 20 62  his mutex must b
14580 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a  e recursive..*/.
14590 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78  void sqlite3Unix
145a0 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
145b0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
145c0 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65  _THREADS.  pthre
145d0 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
145e0 75 74 65 78 41 75 78 29 3b 0a 20 20 69 66 28 20  utexAux);.  if( 
145f0 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64  !mutexOwnerValid
14600 20 7c 7c 20 21 70 74 68 72 65 61 64 5f 65 71 75   || !pthread_equ
14610 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70  al(mutexOwner, p
14620 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 20 29  thread_self()) )
14630 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  {.    pthread_mu
14640 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
14650 78 41 75 78 29 3b 0a 20 20 20 20 70 74 68 72 65  xAux);.    pthre
14660 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
14670 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20 20 61  utexMain);.    a
14680 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 3d 3d  ssert( inMutex==
14690 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
146a0 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69   !mutexOwnerVali
146b0 64 20 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64  d );.    pthread
146c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74  _mutex_lock(&mut
146d0 65 78 41 75 78 29 3b 0a 20 20 20 20 6d 75 74 65  exAux);.    mute
146e0 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64  xOwner = pthread
146f0 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d 75 74  _self();.    mut
14700 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 31  exOwnerValid = 1
14710 3b 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65 78 2b  ;.  }.  inMutex+
14720 2b 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  +;.  pthread_mut
14730 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
14740 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  Aux);.#else.  in
14750 4d 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69 66 0a  Mutex++;.#endif.
14760 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  }.void sqlite3Un
14770 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a  ixLeaveMutex(){.
14780 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65    assert( inMute
14790 78 3e 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  x>0 );.#ifdef SQ
147a0 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
147b0 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  S.  pthread_mute
147c0 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  x_lock(&mutexAux
147d0 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a  );.  inMutex--;.
147e0 20 20 61 73 73 65 72 74 28 20 70 74 68 72 65 61    assert( pthrea
147f0 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e  d_equal(mutexOwn
14800 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  er, pthread_self
14810 28 29 29 20 29 3b 0a 20 20 69 66 28 20 69 6e 4d  ()) );.  if( inM
14820 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61  utex==0 ){.    a
14830 73 73 65 72 74 28 20 6d 75 74 65 78 4f 77 6e 65  ssert( mutexOwne
14840 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 6d 75  rValid );.    mu
14850 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20  texOwnerValid = 
14860 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d  0;.    pthread_m
14870 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
14880 65 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 70  exMain);.  }.  p
14890 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
148a0 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
148b0 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d  #else.  inMutex-
148c0 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  -;.#endif.}../*.
148d0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
148e0 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63  f the mutex is c
148f0 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a  urrently held..*
14900 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73  *.** If the this
14910 54 68 72 64 20 70 61 72 61 6d 65 74 65 72 20 69  Thrd parameter i
14920 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 74  s true, return t
14930 72 75 65 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a  rue only if the.
14940 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61  ** calling threa
14950 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  d holds the mute
14960 78 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  x.  If the param
14970 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 72  eter is false, r
14980 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
14990 20 61 6e 79 20 74 68 72 65 61 64 20 68 6f 6c 64   any thread hold
149a0 73 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a  s the mutex..*/.
149b0 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49  int sqlite3UnixI
149c0 6e 4d 75 74 65 78 28 69 6e 74 20 74 68 69 73 54  nMutex(int thisT
149d0 68 72 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  hrd){.#ifdef SQL
149e0 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
149f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68  .  int rc;.  pth
14a00 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
14a10 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72 63  &mutexAux);.  rc
14a20 20 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26 26 20   = inMutex>0 && 
14a30 28 74 68 69 73 54 68 72 64 3d 3d 30 20 7c 7c 20  (thisThrd==0 || 
14a40 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75  pthread_equal(mu
14a50 74 65 78 4f 77 6e 65 72 2c 70 74 68 72 65 61 64  texOwner,pthread
14a60 5f 73 65 6c 66 28 29 29 29 3b 0a 20 20 70 74 68  _self()));.  pth
14a70 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
14a80 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
14a90 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65  return rc;.#else
14aa0 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65  .  return inMute
14ab0 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  x>0;.#endif.}../
14ac0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
14ad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65  e number of thre
14ae0 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61  ad-specific-data
14af0 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65   blocks allocate
14b00 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 74  d..** Use this t
14b10 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 77 65  o verify that we
14b20 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67   are not leaking
14b30 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
14b40 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74  -data..** Ticket
14b50 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66   #1601.*/.#ifdef
14b60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
14b70 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75   sqlite3_tsd_cou
14b80 6e 74 20 3d 20 30 3b 0a 23 20 69 66 64 65 66 20  nt = 0;.# ifdef 
14b90 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
14ba0 41 44 53 0a 20 20 20 20 73 74 61 74 69 63 20 70  ADS.    static p
14bb0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 74  thread_mutex_t t
14bc0 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78  sd_counter_mutex
14bd0 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58   = PTHREAD_MUTEX
14be0 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20  _INITIALIZER;.# 
14bf0 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55    define TSD_COU
14c00 4e 54 45 52 28 4e 29 20 5c 0a 20 20 20 20 20 20  NTER(N) \.      
14c10 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14c20 75 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63  utex_lock(&tsd_c
14c30 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c  ounter_mutex); \
14c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
14c50 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
14c60 2b 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20  += N; \.        
14c70 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74       pthread_mut
14c80 65 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63  ex_unlock(&tsd_c
14c90 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23  ounter_mutex);.#
14ca0 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69 6e 65   else.#   define
14cb0 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
14cc0 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75   sqlite3_tsd_cou
14cd0 6e 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a  nt += N.# endif.
14ce0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
14cf0 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f  SD_COUNTER(N)  /
14d00 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
14d10 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c  f../*.** If call
14d20 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65  ed with allocate
14d30 46 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72 65 74  Flag>0, then ret
14d40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
14d50 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
14d60 66 69 63 20 64 61 74 61 20 66 6f 72 20 74 68 65  fic data for the
14d70 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
14d80 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a    Allocate and z
14d90 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65 61  ero the.** threa
14da0 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
14db0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
14dc0 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a  lready exist..**
14dd0 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69  .** If called wi
14de0 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d  th allocateFlag=
14df0 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74  =0, then check t
14e00 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14e10 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61  d.** specific da
14e20 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74 20 69  ta.  Return it i
14e30 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
14e40 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
14e50 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  st,.** then retu
14e60 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
14e70 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
14e80 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20 63 68  locateFlag<0, ch
14e90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
14ea0 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69  e thread specifi
14eb0 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61 6c 6c  c.** data is all
14ec0 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20 61 6c  ocated and is al
14ed0 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74 20 69  l zero.  If it i
14ee0 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s then deallocat
14ef0 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  e it..** Return 
14f00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14f10 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63   thread specific
14f20 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66   data or NULL if
14f30 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f   it is.** unallo
14f40 63 61 74 65 64 20 6f 72 20 67 65 74 73 20 64 65  cated or gets de
14f50 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68  allocated..*/.Th
14f60 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69 74 65  readData *sqlite
14f70 33 55 6e 69 78 54 68 72 65 61 64 53 70 65 63 69  3UnixThreadSpeci
14f80 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f  ficData(int allo
14f90 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73 74 61  cateFlag){.  sta
14fa0 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64  tic const Thread
14fb0 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20 3d 20  Data zeroData = 
14fc0 7b 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {0};  /* Initial
14fd0 69 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63 65 20  izer to silence 
14fe0 77 61 72 6e 69 6e 67 73 0a 20 20 20 20 20 20 20  warnings.       
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b      ** from brok
15020 65 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a  en compilers */.
15030 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
15040 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61  IX_THREADS.  sta
15050 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65 79 5f  tic pthread_key_
15060 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20  t key;.  static 
15070 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b  int keyInit = 0;
15080 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
15090 54 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79  Tsd;..  if( !key
150a0 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
150b0 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
150c0 29 3b 0a 20 20 20 20 69 66 28 20 21 6b 65 79 49  );.    if( !keyI
150d0 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nit ){.      int
150e0 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
150f0 70 74 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61  pthread_key_crea
15100 74 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20  te(&key, 0);.   
15110 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15120 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65       sqlite3OsLe
15130 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
15140 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15150 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65 79 49      }.      keyI
15160 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nit = 1;.    }. 
15170 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76     sqlite3OsLeav
15180 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20  eMutex();.  }.. 
15190 20 70 54 73 64 20 3d 20 70 74 68 72 65 61 64 5f   pTsd = pthread_
151a0 67 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 29  getspecific(key)
151b0 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
151c0 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
151d0 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20  ( pTsd==0 ){.   
151e0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54     if( !sqlite3T
151f0 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20  estMallocFail() 
15200 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64 20  ){.        pTsd 
15210 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  = sqlite3OsMallo
15220 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74  c(sizeof(zeroDat
15230 61 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  a));.      }.#if
15240 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45  def SQLITE_MEMDE
15250 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65  BUG.      sqlite
15260 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65  3_isFail = 0;.#e
15270 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
15280 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Tsd ){.        *
15290 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b  pTsd = zeroData;
152a0 0a 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64  .        pthread
152b0 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b 65 79  _setspecific(key
152c0 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20  , pTsd);.       
152d0 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29   TSD_COUNTER(+1)
152e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
152f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64    }else if( pTsd
15300 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46  !=0 && allocateF
15310 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20 20 20  lag<0 .         
15320 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73     && memcmp(pTs
15330 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69  d, &zeroData, si
15340 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61 29  zeof(ThreadData)
15350 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
15360 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b  te3OsFree(pTsd);
15370 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73 65 74  .    pthread_set
15380 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 30 29  specific(key, 0)
15390 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
153a0 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
153b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
153c0 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20  n pTsd;.#else.  
153d0 73 74 61 74 69 63 20 54 68 72 65 61 64 44 61 74  static ThreadDat
153e0 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20 20 69  a *pTsd = 0;.  i
153f0 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e  f( allocateFlag>
15400 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73  0 ){.    if( pTs
15410 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  d==0 ){.      if
15420 28 20 21 73 71 6c 69 74 65 33 54 65 73 74 4d 61  ( !sqlite3TestMa
15430 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a 20 20  llocFail() ){.  
15440 20 20 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c        pTsd = sql
15450 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69  ite3OsMalloc( si
15460 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 20 29  zeof(zeroData) )
15470 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
15480 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
15490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
154a0 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  sFail = 0;.#endi
154b0 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64  f.      if( pTsd
154c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73   ){.        *pTs
154d0 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20  d = zeroData;.  
154e0 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45        TSD_COUNTE
154f0 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  R(+1);.      }. 
15500 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
15510 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f   pTsd!=0 && allo
15520 63 61 74 65 46 6c 61 67 3c 30 0a 20 20 20 20 20  cateFlag<0.     
15530 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
15540 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61  (pTsd, &zeroData
15550 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44  , sizeof(ThreadD
15560 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ata))==0 ){.    
15570 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54  sqlite3OsFree(pT
15580 73 64 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55  sd);.    TSD_COU
15590 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54  NTER(-1);.    pT
155a0 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  sd = 0;.  }.  re
155b0 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69  turn pTsd;.#endi
155c0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
155d0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
155e0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
155f0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62  on-zero value, b
15600 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c  ecomes the resul
15610 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72  t.** returned fr
15620 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  om sqlite3OsCurr
15630 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73  entTime().  This
15640 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
15650 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
15660 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
15670 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
15680 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  time = 0;.#endif
15690 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
156a0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
156b0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
156c0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
156d0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
156e0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
156f0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
15700 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
15710 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
15720 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
15730 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
15740 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
15750 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
15760 6c 69 74 65 33 55 6e 69 78 43 75 72 72 65 6e 74  lite3UnixCurrent
15770 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e  Time(double *prN
15780 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47  ow){.#ifdef NO_G
15790 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74  ETTOD.  time_t t
157a0 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
157b0 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30  *prNow = t/86400
157c0 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
157d0 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
157e0 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73  imeval sNow;.  s
157f0 74 72 75 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73  truct timezone s
15800 54 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64  Tz;  /* Not used
15810 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64   */.  gettimeofd
15820 61 79 28 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b  ay(&sNow, &sTz);
15830 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30  .  *prNow = 2440
15840 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f  587.5 + sNow.tv_
15850 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e  sec/86400.0 + sN
15860 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30  ow.tv_usec/86400
15870 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66  000000.0;.#endif
15880 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15890 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
158a0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
158b0 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73  {.    *prNow = s
158c0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
158d0 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  ime/86400.0 + 24
158e0 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e  40587.5;.  }.#en
158f0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  dif.  return 0;.
15900 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
15910 55 4e 49 58 20 2a 2f 0a                          UNIX */.