/ Hex Artifact Content
Login

Artifact 9fbbd8ab0a6b3992370ba0f3aae11feff2a78c96:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
0740: 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
0750: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0760: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0770: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0780: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0790: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
07a0: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
07b0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07c0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07e0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
0800: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0810: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0820: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if..../*.** The 
0830: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
0840: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
0850: 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69 66 69  f OsFile specifi
0860: 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a  c for the unix.*
0870: 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61  * protability la
0880: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0890: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
08a0: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
08b0: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 49 6f   unixFile {.  Io
08c0: 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d  Method const *pM
08d0: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
08e0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
08f0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70  y */.  struct op
0900: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0910: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0920: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0930: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0940: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
0950: 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66  *pLock;   /* Inf
0960: 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e  o about locks on
0970: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23   this inode */.#
0980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0990: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
09a0: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
09b0: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
09c0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
09d0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
09e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
09f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0a00: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 69 6e 74 20  _STYLE */.  int 
0a10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
0a30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
0a40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0a50: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54  locktype;   /* T
0a60: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
0a70: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
0a80: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0a90: 61 72 20 69 73 4f 70 65 6e 3b 20 20 20 20 20 2f  ar isOpen;     /
0aa0: 2a 20 54 72 75 65 20 69 66 20 6e 65 65 64 73 20  * True if needs 
0ab0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
0ac0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0ad0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 2f 2a 20 55  fullSync;   /* U
0ae0: 73 65 20 46 5f 46 55 4c 4c 53 59 4e 43 20 69 66  se F_FULLSYNC if
0af0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
0b00: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0b30: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0b40: 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 20  /.  i64 offset; 
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b60: 20 53 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   Seek offset */.
0b70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
0b80: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
0b90: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0bb0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0bc0: 20 74 68 69 73 20 4f 73 46 69 6c 65 20 2a 2f 0a   this OsFile */.
0bd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
0be0: 20 50 72 6f 76 69 64 65 20 74 68 65 20 61 62 69   Provide the abi
0bf0: 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
0c00: 20 73 6f 6d 65 20 4f 53 2d 6c 61 79 65 72 20 66   some OS-layer f
0c10: 75 6e 63 74 69 6f 6e 73 20 64 75 72 69 6e 67 0a  unctions during.
0c20: 2a 2a 20 74 65 73 74 69 6e 67 2e 20 20 54 68 69  ** testing.  Thi
0c30: 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 69 6d  s is used to sim
0c40: 75 6c 61 74 65 20 4f 53 20 63 72 61 73 68 65 73  ulate OS crashes
0c50: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
0c60: 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 61 72 65 20  .** commits are 
0c70: 61 74 6f 6d 69 63 20 65 76 65 6e 20 69 6e 20 74  atomic even in t
0c80: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 4f  he event of an O
0c90: 53 20 63 72 61 73 68 2e 0a 2a 2f 0a 23 69 66 64  S crash..*/.#ifd
0ca0: 65 66 20 53 51 4c 49 54 45 5f 43 52 41 53 48 5f  ef SQLITE_CRASH_
0cb0: 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
0cc0: 74 20 73 71 6c 69 74 65 33 43 72 61 73 68 54 65  t sqlite3CrashTe
0cd0: 73 74 45 6e 61 62 6c 65 3b 0a 20 20 65 78 74 65  stEnable;.  exte
0ce0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0cf0: 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65  ashOpenReadWrite
0d00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73  (const char*, Os
0d10: 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20  File**, int*);. 
0d20: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
0d30: 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c  te3CrashOpenExcl
0d40: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
0d50: 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74  *, OsFile**, int
0d60: 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
0d70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d80: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
0d90: 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20  har*, OsFile**, 
0da0: 69 6e 74 29 3b 0a 23 20 64 65 66 69 6e 65 20 43  int);.# define C
0db0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
0dc0: 44 45 28 58 2c 41 2c 42 2c 43 29 20 5c 0a 20 20  DE(X,A,B,C) \.  
0dd0: 20 20 69 66 28 73 71 6c 69 74 65 33 43 72 61 73    if(sqlite3Cras
0de0: 68 54 65 73 74 45 6e 61 62 6c 65 29 7b 20 72 65  hTestEnable){ re
0df0: 74 75 72 6e 20 58 28 41 2c 42 2c 43 29 3b 20 7d  turn X(A,B,C); }
0e00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0e10: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
0e20: 49 44 45 28 58 2c 41 2c 42 2c 43 29 20 20 2f 2a  IDE(X,A,B,C)  /*
0e30: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
0e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  .../*.** Include
0e50: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0e60: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0e70: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0e80: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0e90: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  h"../*.** Do not
0ea0: 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20   include any of 
0eb0: 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74  the File I/O int
0ec0: 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65  erface procedure
0ed0: 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49  s if the.** SQLI
0ee0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d  TE_OMIT_DISKIO m
0ef0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
0f00: 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
0f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0f20: 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f   will be in-memo
0f30: 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e  ry only).*/.#ifn
0f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0f50: 44 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  DISKIO.../*.** D
0f60: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
0f70: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
0f80: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
0f90: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
0fa0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
0fb0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
0fc0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
0fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
0fe0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
0ff0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
1000: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
1010: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1020: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
1030: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
1040: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1050: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
1060: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
1070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1080: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
1090: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
10a0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
10b0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
10c0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
10d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
10e0: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
10f0: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
1100: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
1110: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
1120: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
1130: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
1140: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
1150: 50 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53  P.  But it's DOS
1160: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1170: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1180: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1190: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
11a0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
11b0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
11c0: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
11d0: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
11e0: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
11f0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1200: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1220: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23  E_UNIX_THREADS.#
1230: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
1240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
1250: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
1260: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65  /*.** Set or che
1280: 63 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69  ck the OsFile.ti
1290: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
12a0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
12b0: 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73   an OsFile.** is
12c0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
12d0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
12e0: 73 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c  ses of the OsFil
12f0: 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1300: 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64  e.** same thread
1310: 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e   is operating on
1320: 20 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f   the OsFile.  So
1330: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
1340: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
1350: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
1360: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
1370: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
1380: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
1390: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
13a0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
13b0: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
13c0: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
13d0: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
13e0: 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c  another.  This l
13f0: 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20  ogic makes sure 
1400: 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  a user does not 
1410: 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a  try to do that.*
1420: 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a  * by mistake..**
1430: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
1440: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
1450: 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20   OsFiles can be 
1460: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
1470: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
1480: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
1490: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
14a0: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
14b0: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
14c0: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
14d0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
14e0: 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d  (which now the m
14f0: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
1500: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
1510: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
1520: 20 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65    But the OsFile
1530: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
1540: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
1550: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
1560: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
1570: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
1580: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
1590: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
15a0: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
15b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15c0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
15d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15e0: 55 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20  UNIX_THREADS).# 
15f0: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
1600: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
1610: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
1620: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
1630: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
1640: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1650: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
1660: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
1690: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
16a0: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
16b0: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
16c0: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
16d0: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
16e0: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
16f0: 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68  /*.** Here is th
1700: 65 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20  e dirt on POSIX 
1710: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20  advisory locks: 
1720: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
1730: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
1740: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
1750: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
1760: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
1770: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
1780: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
1790: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
17a0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
17b0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
17c0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
17d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
17e0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
17f0: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
1800: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
1810: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
1820: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
1830: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
1840: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
1850: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
1860: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
1870: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
1880: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
1890: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
18a0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
18b0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
18c0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
18d0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
18e0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
18f0: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
1900: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
1910: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
1920: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
1930: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
1940: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
1950: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
1960: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
1970: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
1980: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1990: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
19a0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
19b0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
19c0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
19d0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
19e0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
19f0: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
1a00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
1a10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
1a20: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
1a30: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
1a40: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
1a50: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
1a60: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
1a70: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
1a80: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
1a90: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
1aa0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
1ab0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1ac0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
1ad0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
1ae0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
1af0: 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66  *.** Bummer.  If
1b00: 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69   you ask me, thi
1b10: 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61  s is broken.  Ba
1b20: 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20  dly broken.  It 
1b30: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
1b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
1b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
1b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
1b70: 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70  ss among.** comp
1b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
1b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
1bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
1bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
1bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
1be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
1bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
1c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
1c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
1c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
1c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
1c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
1c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
1c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
1c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
1c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
1c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
1ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
1cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
1cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
1cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
1cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
1d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
1d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
1d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
1d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
1d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
1d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
1d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
1d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
1d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
1da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
1db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
1dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
1dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
1de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
1df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
1e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
1e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
1e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
1e30: 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73  .** The OsFile s
1e40: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1e50: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1e60: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1e70: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1e80: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1e90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ea0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1eb0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1ec0: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1ed0: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1ee0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1ef0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1f00: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1f10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1f20: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1f30: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1f40: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1f50: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1f60: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1f70: 74 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69  twice, both OsFi
1f80: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
1f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
1fa0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
1fb0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
1fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1fd0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
1fe0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
1ff0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
2000: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
2010: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
2020: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
2030: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
2040: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
2050: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
2060: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
2070: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
2080: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
2090: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
20a0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
20b0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
20c0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
20d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
20e0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
20f0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
2100: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
2110: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
2120: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
2130: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2140: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
2150: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
2160: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
2170: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
2180: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
2190: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
21a0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
21b0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
21c0: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
21d0: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
21e0: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
21f0: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
2200: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
2210: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
2220: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
2230: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
2240: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2250: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
2260: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
2270: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
2280: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2290: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
22a0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
22b0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
22c0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
22d0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
22e0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
22f0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2300: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2310: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2320: 6d 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73  m, each OsFile s
2330: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
2340: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
2350: 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72  o an openCnt str
2360: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
2370: 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74  s one openCnt st
2380: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f  ructure.** per o
2390: 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68  pen inode, which
23a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74   means that mult
23b0: 69 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e  iple OsFiles can
23c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
23d0: 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20  le.** openCnt.  
23e0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
23f0: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
2400: 20 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74   an OsFile, if t
2410: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
2420: 72 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f  r OsFiles open o
2430: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
2440: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
2450: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
2460: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
2470: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2480: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
2490: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
24a0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
24b0: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
24c0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
24d0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
24e0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
24f0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2500: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2510: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2520: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2530: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
2540: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
2550: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
2560: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
2570: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
2580: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
2590: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
25a0: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
25b0: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
25c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
25d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
25e0: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
25f0: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2600: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2610: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2620: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2630: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
2640: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
2650: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
2660: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
2670: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
2680: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
2690: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
26a0: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
26b0: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
26c0: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
26d0: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
26e0: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
26f0: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2700: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2710: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2720: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2730: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
2740: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
2750: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
2760: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
2770: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
2780: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
2790: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
27a0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
27b0: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
27c0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
27d0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
27e0: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
27f0: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2800: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2810: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2820: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2830: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2840: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
2850: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
2860: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
2870: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
2880: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
2890: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
28a0: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
28b0: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
28c0: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
28d0: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
28e0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
28f0: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2900: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2910: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2920: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2930: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
2940: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
2950: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
2960: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
2970: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2980: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2990: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
29a0: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
29b0: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
29c0: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
29d0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
29e0: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
29f0: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2a00: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2a10: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2a20: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2a30: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
2a40: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
2a50: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
2a60: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
2a70: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
2a80: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
2a90: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
2aa0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2ab0: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2ac0: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2ad0: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2ae0: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2af0: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2b00: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2b10: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2b20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2b30: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2b40: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
2b50: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
2b60: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
2b70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
2b80: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2b90: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2ba0: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2bb0: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2bc0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2bd0: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2be0: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2bf0: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2c00: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2c10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2c20: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2c30: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2c40: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c60: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2c70: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2c80: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2c90: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2ca0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2cb0: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2cc0: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2cd0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2ce0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2cf0: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2d00: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2d10: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2d20: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2d30: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2d40: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2d50: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2d60: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2d70: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2d80: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2d90: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2da0: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2db0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2dc0: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2dd0: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2de0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2df0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2e00: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2e10: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2e20: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
2e30: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
2e40: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
2e50: 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64  r zero if thread
2e60: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2e70: 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e  ach other */.#en
2e80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
2e90: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2ea0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2eb0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2ec0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
2ed0: 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68  ** inode on each
2ee0: 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64   thread with a d
2ef0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
2f00: 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68   ID.  (Threads h
2f10: 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ave.** different
2f20: 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20   process IDs on 
2f30: 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f  linux, but not o
2f40: 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69  n most other uni
2f50: 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69  xes.).**.** A si
2f60: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
2f70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
2f80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
2f90: 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a  o each OsFile.**
2fa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
2fb0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
2fc0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2fd0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
2fe0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
2ff0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
3000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73  the number of Os
3010: 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74  Files pointing t
3020: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
3030: 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72  lockInfo {.  str
3040: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b  uct lockKey key;
3050: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
3060: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
3070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3080: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
3090: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
30a0: 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20    int locktype; 
30b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
30d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
30e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3100: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3110: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
3120: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
3130: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3150: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
3160: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
3170: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
3180: 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20  ticular openCnt 
3190: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
31a0: 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  its inode.  This
31b0: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
31c0: 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65  as the lockKey e
31d0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
31e0: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
31f0: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ted..*/.struct o
3200: 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74  penKey {.  dev_t
3210: 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63   dev;   /* Devic
3220: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
3230: 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e  o_t ino;   /* In
3240: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b  ode number */.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3260: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3270: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
3280: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3290: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
32a0: 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  de.  This struct
32b0: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
32c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
32d0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a   locks on that.*
32e0: 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63  * inode.  If a c
32f0: 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65  lose is attempte
3300: 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f  d against an ino
3310: 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69  de that is holdi
3320: 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65  ng.** locks, the
3330: 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72   close is deferr
3340: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63  ed until all loc
3350: 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69  ks clear by addi
3360: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ng the.** file d
3370: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
3380: 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65  closed to the pe
3390: 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nding list..*/.s
33a0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a  truct openCnt {.
33b0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79    struct openKey
33c0: 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c   key;   /* The l
33d0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
33e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
33f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3400: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
3410: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3420: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
3430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3440: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
3450: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   locks */.  int 
3460: 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20  nPending;       
3470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3480: 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f  ending close() o
3490: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
34a0: 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20  nt *aPending;   
34b0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64       /* Malloced
34c0: 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66   space holding f
34d0: 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63  d's awaiting a c
34e0: 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lose() */.};../*
34f0: 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20   .** These hash 
3500: 74 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65  tables map inode
3510: 73 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72  s and file descr
3520: 69 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20  iptors (really, 
3530: 6c 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f  lockKey and.** o
3540: 70 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65  penKey structure
3550: 73 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  s) into lockInfo
3560: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72   and openCnt str
3570: 75 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73  uctures.  Access
3580: 20 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61   to .** these ha
3590: 73 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  sh tables must b
35a0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  e protected by a
35b0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
35c0: 63 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20  c Hash lockHash 
35d0: 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  = {SQLITE_HASH_B
35e0: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
3600: 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73 71  adSafeMalloc, sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
3620: 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 73 74 61 74  ree, 0, 0};.stat
3630: 69 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73 68  ic Hash openHash
3640: 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f   = {SQLITE_HASH_
3650: 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c  BINARY, 0, 0, 0,
3660: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72   .    sqlite3Thr
3670: 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73  eadSafeMalloc, s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 46 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  Free, 0, 0};..#i
36a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
36b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
36d0: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
36e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
36f0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
3700: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
3710: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
3720: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
3730: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
3740: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3750: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3760: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3770: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3780: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3790: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
37a0: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
37b0: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37c0: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
37d0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
37e0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
37f0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
3800: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
3810: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
3820: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
3830: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
3840: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3850: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3860: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3870: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3880: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3890: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
38a0: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
38b0: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
38c0: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
38d0: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
38e0: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
38f0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
3900: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3910: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3920: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3930: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
3940: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3950: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3960: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3970: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3980: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3990: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
39a0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
39b0: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
39c0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
39d0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
39e0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 70 6f 73  edef enum {..pos
39f0: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ixLockingStyle =
3a00: 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74 61   0,       /* sta
3a10: 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76 69  ndard posix-advi
3a20: 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 09 61  sory locks */..a
3a30: 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20  fpLockingStyle, 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75              /* u
3a50: 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a  se afp locks */.
3a60: 09 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  .flockLockingSty
3a70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le,           /*
3a80: 20 75 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a   use flock() */.
3a90: 09 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  .dotlockLockingS
3aa0: 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  tyle,         /*
3ab0: 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b   use <file>.lock
3ac0: 20 66 69 6c 65 73 20 2a 2f 0a 09 6e 6f 4c 6f 63   files */..noLoc
3ad0: 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20  kingStyle,      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75          /* usefu
3af0: 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  l for read-only 
3b00: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 09  file system */..
3b10: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
3b20: 6e 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20  ngStyle      /* 
3b30: 69 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70  indicates unsupp
3b40: 6f 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65  orted file syste
3b50: 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f  m */.} sqlite3Lo
3b60: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64  ckingStyle;.#end
3b70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
3b80: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3b90: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
3ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
3bb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
3bc0: 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65  able records whe
3bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
3be0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
3bf0: 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20   each others.** 
3c00: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  locks..**.**    
3c10: 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73  0:  No.  Threads
3c20: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
3c30: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
3c40: 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65  ks..**    1:  Ye
3c50: 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20  s.  Threads can 
3c60: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3c70: 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20  hers locks..**  
3c80: 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b   -1:  We don't k
3c90: 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f  now yet..**.** O
3ca0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
3cb0: 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  we know at compi
3cc0: 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61  le-time if threa
3cd0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3ce0: 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c  each.** others l
3cf0: 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20  ocks.  On those 
3d00: 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c  systems, the SQL
3d10: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3d20: 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a  IDE_LOCK macro.*
3d30: 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70  * will be set ap
3d40: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e  propriately.  On
3d50: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20   other systems, 
3d60: 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b  we have to check
3d70: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20   at.** runtime. 
3d80: 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72   On these latter
3d90: 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45   systems, SQLTIE
3da0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3db0: 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65  _LOCK is.** unde
3dc0: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  fined..**.** Thi
3dd0: 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61  s variable norma
3de0: 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f  lly has file sco
3df0: 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75  pe only.  But du
3e00: 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65  ring testing, we
3e10: 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c   make.** it a gl
3e20: 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  obal so that the
3e30: 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63   test code can c
3e40: 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20  hange its value 
3e50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
3e60: 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  fy.** that the r
3e70: 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65  ight stuff happe
3e80: 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  ns in either cas
3e90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
3ea0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3eb0: 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RIDE_LOCK.# defi
3ec0: 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ne SQLITE_THREAD
3ed0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d  _OVERRIDE_LOCK -
3ee0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  1.#endif.#ifdef 
3ef0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
3f00: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
3f10: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
3f20: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3f30: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65  VERRIDE_LOCK;.#e
3f40: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
3f50: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3f60: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3f70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3f80: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e  ERRIDE_LOCK;.#en
3f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3fa0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
3fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
3fc0: 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75  ed into individu
3fd0: 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61  al test.** threa
3fe0: 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68  ds by the testTh
3ff0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4000: 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ior() routine..*
4010: 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54  /.struct threadT
4020: 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  estData {.  int 
4030: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
4040: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65     /* File to be
4050: 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72   locked */.  str
4060: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20  uct flock lock; 
4070: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69      /* The locki
4080: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
4090: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20    int result;   
40a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
40b0: 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  lt of the lockin
40c0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d  g operation */.}
40d0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
40e0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
40f0: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
4100: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
4110: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
4120: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
4130: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4140: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
4150: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
4160: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
4170: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
4180: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
4190: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
41a0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
41b0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
41c0: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
41d0: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
41e0: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
41f0: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
4200: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
4210: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
4220: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
4230: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
4240: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
4250: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
4260: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
4270: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
4280: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
4290: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
42a0: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
42b0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
42c0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
42d0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c     s = fcntl(fd,
42e0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
42f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4300: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
4310: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
4320: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
4330: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
4340: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
4350: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
4360: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
4370: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
4380: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
4390: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
43a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
43b0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
43c0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
43d0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
43e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
43f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
4400: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
4410: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
4420: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4430: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
4440: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
4450: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4460: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
4470: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
4480: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
4490: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
44a0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
44b0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
44c0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
44d0: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
44e0: 20 73 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c   s && op==F_SETL
44f0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4500: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
4510: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
4520: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
4530: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
4540: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
4550: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4560: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4570: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4580: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4590: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
45a0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
45b0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
45c0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
45d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
45e0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
45f0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4600: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4620: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4630: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4640: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4650: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4660: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4670: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4680: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4690: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
46a0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
46b0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
46c0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
46d0: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
46e0: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
46f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4700: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
4710: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
4720: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4730: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
4740: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
4750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
4760: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4770: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4780: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4790: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
47a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
47b0: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
47c0: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
47d0: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
47e0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
47f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4800: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
4810: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
4820: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
4830: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
4840: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4870: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4880: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4890: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
48a0: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
48b0: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
48c0: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
48d0: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
48e0: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
48f0: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4900: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
4910: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4920: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
4930: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
4940: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
4950: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
4960: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4970: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4980: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4990: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49a0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
49b0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
49c0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
49d0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
49e0: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
49f0: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a00: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4a10: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4a20: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4a30: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4a40: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4a50: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4a60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4a70: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4a80: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4a90: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4aa0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4ab0: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4ac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4ad0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4ae0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4af0: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b00: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4b10: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4b20: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4b30: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4b40: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4b50: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4b60: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4b70: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4b80: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4b90: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4bb0: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4bc0: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4bd0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4be0: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4bf0: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c00: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4c10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4c20: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4c40: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4c50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4c60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4c70: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4c80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4c90: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4ca0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4cb0: 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ck){.  assert( s
4cc0: 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
4cd0: 31 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63  1) );.  if (pLoc
4ce0: 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72  k == NULL).    r
4cf0: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e  eturn;.  pLock->
4d00: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c  nRef--;.  if( pL
4d10: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
4d20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4d30: 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c  nsert(&lockHash,
4d40: 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69   &pLock->key, si
4d50: 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29  zeof(pLock->key)
4d60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4d70: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
4d80: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4d90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
4da0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4db0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4dc0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
4dd0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
4de0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
4df0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4e00: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4e10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4e20: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4e30: 20 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e    if (pOpen == N
4e40: 55 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b  ULL).    return;
4e50: 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d  .  pOpen->nRef--
4e60: 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e  ;.  if( pOpen->n
4e70: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Ref==0 ){.    sq
4e80: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4e90: 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65  &openHash, &pOpe
4ea0: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  n->key, sizeof(p
4eb0: 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Open->key), 0);.
4ec0: 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e      free(pOpen->
4ed0: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73  aPending);.    s
4ee0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
4ef0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d  Free(pOpen);.  }
4f00: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4f10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
4f20: 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73  _STYLE./*.** Tes
4f30: 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20  ts a byte-range 
4f40: 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f  locking query to
4f50: 20 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e   see if byte ran
4f60: 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a  ge locks are .**
4f70: 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e   supported, if n
4f80: 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  ot we fall back 
4f90: 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  to dotlockLockin
4fa0: 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  gStyle..*/.stati
4fb0: 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67  c sqlite3Locking
4fc0: 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73  Style sqlite3Tes
4fd0: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f  tLockingStyle(co
4fe0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
4ff0: 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b  th, .  int fd) {
5000: 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d  .  /* test byte-
5010: 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
5020: 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75   fcntl */.  stru
5030: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
5040: 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f  o;.  .  lockInfo
5050: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
5060: 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
5070: 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
5080: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
5090: 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
50a0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
50b0: 0a 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28  .  .  if (fcntl(
50c0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 28 69 6e  fd, F_GETLK, (in
50d0: 74 29 20 26 6c 6f 63 6b 49 6e 66 6f 29 20 21 3d  t) &lockInfo) !=
50e0: 20 2d 31 29 20 7b 0a 20 20 20 20 72 65 74 75 72   -1) {.    retur
50f0: 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74  n posixLockingSt
5100: 79 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f  yle;.  } .  .  /
5110: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c  * testing for fl
5120: 6f 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c  ock can give fal
5130: 73 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53  se positives.  S
5140: 6f 20 69 66 20 69 66 20 74 68 65 20 61 62 6f 76  o if if the abov
5150: 65 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c  e test.  ** fail
5160: 73 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20  s, then we fall 
5170: 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f  back to using do
5180: 74 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63  t-lock style loc
5190: 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72  king..  */  .  r
51a0: 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63  eturn dotlockLoc
51b0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a  kingStyle;.}../*
51c0: 20 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68   .** Examines th
51d0: 65 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65  e f_fstypename e
51e0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74  ntry in the stat
51f0: 66 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20  fs structure as 
5200: 72 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20  returned by .** 
5210: 73 74 61 74 28 29 20 66 6f 72 20 74 68 65 20 66  stat() for the f
5220: 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69  ile system hosti
5230: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
5240: 66 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68  file, assigns th
5250: 65 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  e .** appropriat
5260: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  e locking style 
5270: 62 61 73 65 64 20 6f 6e 20 69 74 27 73 20 76 61  based on it's va
5280: 6c 75 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75  lue.  These valu
5290: 65 73 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67  es and .** assig
52a0: 6e 6d 65 6e 74 73 20 61 72 65 20 62 61 73 65 64  nments are based
52b0: 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62   on Darwin/OSX b
52c0: 65 68 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65  ehavior and have
52d0: 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64   not been tested
52e0: 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79   on .** other sy
52f0: 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stems..*/.static
5300: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
5310: 74 79 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65  tyle sqlite3Dete
5320: 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63  ctLockingStyle(c
5330: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
5340: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20  ath, .  int fd) 
5350: 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  {..#ifdef SQLITE
5360: 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53  _FIXED_LOCKING_S
5370: 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28 73  TYLE.  return (s
5380: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
5390: 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  le)SQLITE_FIXED_
53a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23  LOCKING_STYLE;.#
53b0: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
53c0: 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20  atfs fsInfo;..  
53d0: 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65 50  if (statfs(fileP
53e0: 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
53f0: 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e 20   -1).    return 
5400: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5410: 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68  ngStyle(filePath
5420: 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20 28  , fd);.  .  if (
5430: 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
5440: 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20 20   MNT_RDONLY).   
5450: 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69 6e   return noLockin
5460: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
5470: 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f   (!strcmp(fsInfo
5480: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5490: 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28 21  hfs")) ||.    (!
54a0: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
54b0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66 73  fstypename, "ufs
54c0: 22 29 29 20 29 0a 09 09 72 65 74 75 72 6e 20 70  ")) )...return p
54d0: 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  osixLockingStyle
54e0: 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d  ;.  .  if(!strcm
54f0: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5500: 65 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29  ename, "afpfs"))
5510: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c  .    return afpL
5520: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5530: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
5540: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5550: 2c 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72  , "nfs")) .    r
5560: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73  eturn sqlite3Tes
5570: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69  tLockingStyle(fi
5580: 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a  lePath, fd);.  .
5590: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
55a0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
55b0: 2c 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20  , "smbfs")).    
55c0: 72 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b  return flockLock
55d0: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69  ingStyle;.  .  i
55e0: 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f(!strcmp(fsInfo
55f0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5600: 6d 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74  msdos")).    ret
5610: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
5620: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5630: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5640: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77  f_fstypename, "w
5650: 65 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74  ebdav")).    ret
5660: 75 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c  urn unsupportedL
5670: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5680: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5690: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
56a0: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20  (filePath, fd); 
56b0: 20 0a 23 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49   .#endif // SQLI
56c0: 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47  TE_FIXED_LOCKING
56d0: 5f 53 54 59 4c 45 0a 7d 0a 0a 23 65 6e 64 69 66  _STYLE.}..#endif
56e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
56f0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
5700: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
5710: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5720: 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e  r, locate lockIn
5730: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73  fo and openCnt s
5740: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a  tructures that.*
5750: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
5760: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5770: 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e  .  Create new on
5780: 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  es if necessary.
5790: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
57a0: 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20  values might be 
57b0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
57c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
57d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
57e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
57f0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ors..*/.static i
5800: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
5810: 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
5840: 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74  riptor used in t
5850: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
5860: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  ct lockInfo **pp
5870: 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75  Lock,    /* Retu
5880: 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20  rn the lockInfo 
5890: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
58a0: 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  /.  struct openC
58b0: 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20  nt **ppOpen     
58c0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f   /* Return the o
58d0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
58e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
58f0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 6c  t rc;.  struct l
5900: 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73  ockKey key1;.  s
5910: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
5920: 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  y2;.  struct sta
5930: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74 72  t statbuf;.  str
5940: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
5950: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f 70  ock;.  struct op
5960: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20  enCnt *pOpen;.  
5970: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
5980: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
5990: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc!=0 ) return 1
59a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
59b0: 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31 29  ite3OsInMutex(1)
59c0: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65   );.  memset(&ke
59d0: 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  y1, 0, sizeof(ke
59e0: 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76  y1));.  key1.dev
59f0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
5a00: 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  v;.  key1.ino = 
5a10: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
5a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
5a30: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 69 66 28  IX_THREADS.  if(
5a40: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
5a50: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c  EachOthersLocks<
5a60: 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72  0 ){.    testThr
5a70: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
5a80: 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65  or(fd);.  }.  ke
5a90: 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73  y1.tid = threads
5aa0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5ab0: 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74  rsLocks ? 0 : pt
5ac0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65  hread_self();.#e
5ad0: 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b  ndif.  memset(&k
5ae0: 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey2, 0, sizeof(k
5af0: 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65  ey2));.  key2.de
5b00: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5b10: 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d  ev;.  key2.ino =
5b20: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
5b30: 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75  .  pLock = (stru
5b40: 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c  ct lockInfo*)sql
5b50: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c 6f  ite3HashFind(&lo
5b60: 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20 73  ckHash, &key1, s
5b70: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
5b80: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5b90: 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49      struct lockI
5ba0: 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  nfo *pOld;.    p
5bb0: 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 54 68  Lock = sqlite3Th
5bc0: 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
5bd0: 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29  sizeof(*pLock) )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ;.    if( pLock=
5bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
5c00: 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
5c10: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
5c30: 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20  k->key = key1;. 
5c40: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
5c50: 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   1;.    pLock->c
5c60: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63  nt = 0;.    pLoc
5c70: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b  k->locktype = 0;
5c80: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
5c90: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
5ca0: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
5cb0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
5cc0: 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  1), pLock);.    
5cd0: 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20  if( pOld!=0 ){. 
5ce0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5cf0: 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  d==pLock );.    
5d00: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
5d10: 61 66 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  afeFree(pLock);.
5d20: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5d30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5d40: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5d50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
5d60: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
5d70: 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c  }.  *ppLock = pL
5d80: 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65  ock;.  if( ppOpe
5d90: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
5da0: 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e  n = (struct open
5db0: 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68  Cnt*)sqlite3Hash
5dc0: 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20  Find(&openHash, 
5dd0: 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65  &key2, sizeof(ke
5de0: 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  y2));.    if( pO
5df0: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
5e00: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5e10: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70 65  pOld;.      pOpe
5e20: 6e 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  n = sqlite3Threa
5e30: 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  dSafeMalloc( siz
5e40: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
5e50: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
5e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
5e70: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
5e80: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
5e90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
5ea0: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5eb0: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
5ec0: 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20     pOpen->key = 
5ed0: 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65  key2;.      pOpe
5ee0: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
5ef0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20     pOpen->nLock 
5f00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
5f10: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
5f20: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
5f30: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5f40: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5f50: 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48  ashInsert(&openH
5f60: 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79  ash, &pOpen->key
5f70: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20  , sizeof(key2), 
5f80: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  pOpen);.      if
5f90: 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20  ( pOld!=0 ){.   
5fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5fb0: 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  d==pOpen );.    
5fc0: 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
5fd0: 64 53 61 66 65 46 72 65 65 28 70 4f 70 65 6e 29  dSafeFree(pOpen)
5fe0: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
5ff0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
6000: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
6010: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
6020: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
6030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6040: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
6050: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
6060: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
6070: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
6080: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
6090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
60a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
60b0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
60c0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
60d0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
60e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
60f0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
6100: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
6110: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
6120: 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74  presetation of t
6130: 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69  he supplied.** i
6140: 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65  nteger lock-type
6150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
6160: 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65  t char *locktype
6170: 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70  Name(int locktyp
6180: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f  e){.  switch( lo
6190: 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65  cktype ){.  case
61a0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
61b0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20   "NONE";.  case 
61c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
61d0: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
61e0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
61f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
6200: 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45  RVED";.  case PE
6210: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
6220: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
6230: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6240: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6250: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
6260: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
6270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
6280: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
6290: 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ly in a differen
62a0: 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68  t thread than th
62b0: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68  e thread that th
62c0: 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72  e.** unixFile ar
62d0: 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74  gument belongs t
62e0: 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  o, then transfer
62f0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
6300: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76  e unixFile.** ov
6310: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
6320: 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  t thread..**.** 
6330: 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e  A unixFile is on
6340: 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68  ly owned by a th
6350: 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20  read on systems 
6360: 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64  where one thread
6370: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
6380: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
6390: 63 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66  created by a dif
63a0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  ferent thread.  
63b0: 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e  RedHat9 is.** an
63c0: 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68   example of such
63d0: 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a   a system..**.**
63e0: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
63f0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
6400: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
6410: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
6420: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
6430: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6440: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
6450: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
6460: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
6470: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
6480: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
6490: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
64a0: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
64b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
64c0: 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
64d0: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
64e0: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
64f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
6500: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
6510: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
6520: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
6530: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
6540: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
6550: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
6560: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
6570: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
6580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6590: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
65a0: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
65b0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
65c0: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
65d0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
65e0: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
65f0: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
6600: 20 20 20 54 52 41 43 45 31 28 22 4e 6f 2d 74 72     TRACE1("No-tr
6610: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
6620: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
6630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6640: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
6650: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
6660: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
6670: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
6680: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
6690: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
66a0: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
66b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
66c0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 34 28 22 54  .  }.  TRACE4("T
66d0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
66e0: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
66f0: 74 6f 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  to %d\n", pFile-
6700: 3e 68 2c 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53  >h,pFile->tid,hS
6710: 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74  elf);.  pFile->t
6720: 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66  id = hSelf;.  if
6730: 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21   (pFile->pLock !
6740: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65  = NULL) {.    re
6750: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
6760: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
6770: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
6780: 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46  fo(pFile->h, &pF
6790: 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a  ile->pLock, 0);.
67a0: 20 20 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b      TRACE5("LOCK
67b0: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
67c0: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
67d0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
67e0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
67f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
6800: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6810: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  ypeName(pFile->p
6820: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
6830: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
6840: 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nt);.    return 
6850: 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
6860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6870: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
6880: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
6890: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
68a0: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
68b0: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
68c0: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
68d0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
68e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
68f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
6900: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
6910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6920: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
6930: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6940: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
6950: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
6960: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6970: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
6980: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65  the named file e
6990: 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
69a0: 6c 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69  lite3UnixFileExi
69b0: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
69c0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
69d0: 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c  turn access(zFil
69e0: 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a  ename, 0)==0;.}.
69f0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
6a00: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
6a10: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
6a20: 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c  ixFile(.  int h,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
6a50: 72 69 70 74 6f 72 20 6f 66 20 74 68 65 20 6f 70  riptor of the op
6a60: 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  en file */.  OsF
6a70: 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20  ile **pId,      
6a80: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
6a90: 74 68 65 20 72 65 61 6c 20 66 69 6c 65 20 64 65  the real file de
6aa0: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
6ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ac0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
6ad0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
6ae0: 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
6af0: 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20  .  int delFlag  
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b10: 49 66 20 74 72 75 65 2c 20 6d 61 6b 65 20 73 75  If true, make su
6b20: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 6c 65  re the file dele
6b30: 74 65 73 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  tes on close */.
6b40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  );../*.** Attemp
6b50: 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65  t to open a file
6b60: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
6b70: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
6b80: 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73  If that.** fails
6b90: 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74  , try opening it
6ba0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20   read-only.  If 
6bb0: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
6bc0: 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20  t exist,.** try 
6bd0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a  to create it..**
6be0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
6bf0: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  a handle for the
6c00: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72   open file is wr
6c10: 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20  itten to *id.** 
6c20: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69  and *pReadonly i
6c30: 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68  s set to 0 if th
6c40: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
6c50: 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e  d for reading an
6c60: 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20  d.** writing or 
6c70: 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  1 if the file wa
6c80: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
6c90: 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  ly.  The functio
6ca0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  n returns.** SQL
6cb0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
6cc0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
6cd0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
6ce0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
6cf0: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
6d00: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
6d10: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
6d20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65  t sqlite3UnixOpe
6d30: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f  nReadWrite(.  co
6d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
6d50: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a  ame,.  OsFile **
6d60: 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61  pId,.  int *pRea
6d70: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68  donly.){.  int h
6d80: 3b 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53  ;.  .  CRASH_TES
6d90: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
6da0: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57  e3CrashOpenReadW
6db0: 72 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  rite, zFilename,
6dc0: 20 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29   pId, pReadonly)
6dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a  ;.  assert( 0==*
6de0: 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65  pId );.  h = ope
6df0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6e00: 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41  DWR|O_CREAT|O_LA
6e10: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6e20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6e30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6e40: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
6e50: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
6e60: 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20  ( h<0 ){.#ifdef 
6e70: 45 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65  EISDIR.    if( e
6e80: 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a  rrno==EISDIR ){.
6e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ea0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
6eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 68    }.#endif.    h
6ec0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
6ed0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
6ee0: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6ef0: 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20 29  );.    if( h<0 )
6f00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6f10: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
6f20: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61  .    }.    *pRea
6f30: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  donly = 1;.  }el
6f40: 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e  se{.    *pReadon
6f50: 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ly = 0;.  }.  re
6f60: 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69  turn allocateUni
6f70: 78 46 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46  xFile(h, pId, zF
6f80: 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  ilename, 0);.}..
6f90: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6fa0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
6fb0: 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  e for exclusive 
6fc0: 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70  access by this p
6fd0: 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66  rocess..** The f
6fe0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ile will be open
6ff0: 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
7000: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
7010: 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20    To avoid.** a 
7020: 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
7030: 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ty problem, we d
7040: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
7050: 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20  file to have.** 
7060: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
7070: 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61  ed.  Nor do we a
7080: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
7090: 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a   be a symbolic.*
70a0: 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * link..**.** If
70b0: 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65   delFlag is true
70c0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61  , then make arra
70d0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f  ngements to auto
70e0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
70f0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65  .** the file whe
7100: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
7110: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
7120: 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  , write the file
7130: 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64   handle into *id
7140: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
7150: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
7160: 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  failure, return 
7170: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
7180: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
7190: 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  nixOpenExclusive
71a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
71b0: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
71c0: 2a 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61  *pId, int delFla
71d0: 67 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  g){.  int h;..  
71e0: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
71f0: 49 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68  IDE(sqlite3Crash
7200: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a  OpenExclusive, z
7210: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64  Filename, pId, d
7220: 65 6c 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72  elFlag);.  asser
7230: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
7240: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
7250: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7260: 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45      O_RDWR|O_CRE
7270: 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  AT|O_EXCL|O_NOFO
7280: 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  LLOW|O_LARGEFILE
7290: 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20  |O_BINARY,.     
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
72c0: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
72d0: 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65  f( h<0 ){.    re
72e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
72f0: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OPEN;.  }.  retu
7300: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
7310: 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c  ile(h, pId, zFil
7320: 65 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b  ename, delFlag);
7330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
7340: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
7350: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e  file for read-on
7360: 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  ly access..**.**
7370: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
7380: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
7390: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
73a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
73b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
73c0: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
73d0: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
73e0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
73f0: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
7400: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7410: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
7420: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43  .  int h;.  .  C
7430: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
7440: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
7450: 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69  penReadOnly, zFi
7460: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b  lename, pId, 0);
7470: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
7480: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
7490: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
74a0: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
74b0: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
74c0: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( h<0 ){.    ret
74d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
74e0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PEN;.  }.  retur
74f0: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
7500: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7510: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  name, 0);.}../*.
7520: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
7530: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
7540: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
7550: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7560: 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20  ains a.** file. 
7570: 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   This file descr
7580: 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65  iptor can be use
7590: 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65  d to fsync() the
75a0: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e   directory.** in
75b0: 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
75c0: 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ure the creation
75d0: 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69   of a new file i
75e0: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
75f0: 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  en.** to disk..*
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e  e is only meanin
7620: 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20  gful for Unix.  
7630: 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
7640: 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73  der.** windows s
7650: 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65  ince windows doe
7660: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61  s not support ha
7670: 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20  rd links..**.** 
7680: 49 66 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73  If FULL_FSYNC is
7690: 20 65 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66   enabled, this f
76a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c  unction is not l
76b0: 6f 6e 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a  onger useful, .*
76c0: 2a 20 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73  * a FULL_FSYNC s
76d0: 79 6e 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ync applies to a
76e0: 6c 6c 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20  ll pending disk 
76f0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7700: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
7710: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
7720: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
7730: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
7740: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
7750: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
7760: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
7770: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
7780: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
7790: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
77a0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
77b0: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
77c0: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
77d0: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
77e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
77f0: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
7800: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
7810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
7820: 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46  rname.){.  unixF
7830: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
7840: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
7850: 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( pFile==0 ){.  
7860: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e    /* Do not open
7870: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
7880: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
7890: 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ing file is not 
78a0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f  already.    ** o
78b0: 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  pen. */.    retu
78c0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
78d0: 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48  EN;.  }.  SET_TH
78e0: 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20  READID(pFile);. 
78f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
7900: 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69  dirfd<0 );.  pFi
7910: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e  le->dirfd = open
7920: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
7930: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
7940: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
7950: 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  irfd<0 ){.    re
7960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
7970: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41  OPEN; .  }.  TRA
7980: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
7990: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
79a0: 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  dirfd, zDirname)
79b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
79c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
79d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
79e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
79f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
7a00: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
7a10: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
7a20: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
7a30: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
7a40: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
7a50: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
7a60: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
7a70: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
7a80: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
7a90: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
7aa0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
7ab0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
7ac0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
7ad0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
7ae0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
7af0: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
7b00: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
7b10: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
7b20: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
7b30: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
7b40: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
7b50: 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61  e3UnixTempFileNa
7b60: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
7b70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7b80: 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
7b90: 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
7ba0: 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
7bb0: 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
7bc0: 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
7bd0: 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
7be0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7bf0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
7c00: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
7c10: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
7c20: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
7c30: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
7c40: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
7c50: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
7c60: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
7c70: 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
7c80: 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
7c90: 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
7ca0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7cb0: 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
7cc0: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
7cd0: 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
7ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7cf0: 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
7d00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d10: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
7d20: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
7d30: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
7d40: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
7d50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d60: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
7d70: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
7d80: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
7d90: 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
7da0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
7db0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
7dc0: 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49  uf, "%s/"TEMP_FI
7dd0: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
7de0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
7df0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
7e00: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
7e10: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
7e20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
7e30: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
7e40: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
7e50: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
7e60: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
7e70: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
7e80: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
7e90: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
7ea0: 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
7eb0: 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
7ec0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7ed0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ; .}../*.** Chec
7ee0: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
7ef0: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
7f00: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
7f10: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
7f20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
7f30: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
7f40: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7f60: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
7f70: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
7f80: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
7f90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
7fa0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
7fb0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
7fc0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
7fd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
7fe0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
7ff0: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
8000: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
8010: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
8020: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
8030: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8040: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
8050: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 1;.}../*.** Se
8060: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
8070: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
8080: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
8090: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
80a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
80b0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
80c0: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
80d0: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
80e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
80f0: 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
8100: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
8110: 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
8120: 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20 55  nt got;.#ifdef U
8130: 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20 3d  SE_PREAD.  got =
8140: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
8150: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8160: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73  set);.#else.  ls
8170: 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f  eek(id->h, id->o
8180: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
8190: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
81a0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
81b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67  ;.#endif.  if( g
81c0: 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e  ot>0 ){.    id->
81d0: 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
81e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b   }.  return got;
81f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
8200: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
8210: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
8220: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8230: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
8240: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
8250: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
8260: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
8270: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
8280: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8290: 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c  t unixRead(OsFil
82a0: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
82b0: 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69  f, int amt){.  i
82c0: 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
82d0: 28 20 69 64 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ( id );.  TIMER_
82e0: 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20 73  START;.  got = s
82f0: 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
8300: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
8310: 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  amt);.  TIMER_EN
8320: 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52 45 41  D;.  TRACE5("REA
8330: 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
8340: 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46  d %d\n", ((unixF
8350: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67 6f 74  ile*)id)->h, got
8360: 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74  ,.          last
8370: 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41  _page, TIMER_ELA
8380: 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29  PSED);.  SEEK(0)
8390: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
83a0: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
83b0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
83c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
83d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
83e0: 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
83f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8400: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
8410: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
8420: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
8430: 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
8440: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8450: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
8460: 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
8470: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
8480: 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
8490: 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
84a0: 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
84b0: 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
84c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
84d0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
84e0: 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
84f0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
8500: 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
8510: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e  nixFile *id, con
8520: 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
8530: 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
8540: 6f 74 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 50  ot;.#ifdef USE_P
8550: 52 45 41 44 0a 20 20 67 6f 74 20 3d 20 70 77 72  READ.  got = pwr
8560: 69 74 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ite(id->h, pBuf,
8570: 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74   cnt, id->offset
8580: 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73 65 65 6b  );.#else.  lseek
8590: 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73  (id->h, id->offs
85a0: 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
85b0: 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d   got = write(id-
85c0: 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
85d0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67 6f 74  #endif.  if( got
85e0: 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66  >0 ){.    id->of
85f0: 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d  fset += got;.  }
8600: 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
8610: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
8620: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
8630: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
8640: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8650: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
8660: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
8670: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
8680: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
8690: 74 20 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69  t unixWrite(OsFi
86a0: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
86b0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
86c0: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
86d0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
86e0: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
86f0: 6d 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  mt>0 );.  TIMER_
8700: 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65 28 20  START;.  while( 
8710: 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20  amt>0 && (wrote 
8720: 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28  = seekAndWrite((
8730: 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42  unixFile*)id, pB
8740: 75 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20  uf, amt))>0 ){. 
8750: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
8760: 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
8770: 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
8780: 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45 52 5f 45  ];.  }.  TIMER_E
8790: 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 57 52  ND;.  TRACE5("WR
87a0: 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
87b0: 37 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78  7d %d\n", ((unix
87c0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 77 72  File*)id)->h, wr
87d0: 6f 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  ote,.          l
87e0: 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f  ast_page, TIMER_
87f0: 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45 45 4b  ELAPSED);.  SEEK
8800: 28 30 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  (0);.  SimulateI
8810: 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
8820: 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
8830: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
8840: 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
8850: 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
8860: 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
8870: 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
8880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8890: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
88a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
88b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
88c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
88d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
88e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
88f0: 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70  the read/write p
8900: 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65  ointer in a file
8910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8920: 75 6e 69 78 53 65 65 6b 28 4f 73 46 69 6c 65 20  unixSeek(OsFile 
8930: 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29  *id, i64 offset)
8940: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  {.  assert( id )
8950: 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f  ;.  SEEK(offset/
8960: 31 30 32 34 20 2b 20 31 29 3b 0a 23 69 66 64 65  1024 + 1);.#ifde
8970: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
8980: 69 66 28 20 6f 66 66 73 65 74 20 29 20 53 69 6d  if( offset ) Sim
8990: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
89a0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
89b0: 5f 46 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20  _FULL);.#endif. 
89c0: 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
89d0: 2d 3e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  ->offset = offse
89e0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  t;.  return SQLI
89f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
8a00: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
8a10: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
8a20: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
8a30: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
8a40: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
8a50: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
8a60: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
8a70: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
8a80: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
8a90: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
8aa0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
8ab0: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
8ac0: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
8ad0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
8ae0: 2a 2a 20 55 73 65 20 74 68 65 20 66 64 61 74 61  ** Use the fdata
8af0: 73 79 6e 63 28 29 20 41 50 49 20 6f 6e 6c 79 20  sync() API only 
8b00: 69 66 20 74 68 65 20 48 41 56 45 5f 46 44 41 54  if the HAVE_FDAT
8b10: 41 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  ASYNC macro is d
8b20: 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  efined..** Other
8b30: 77 69 73 65 20 75 73 65 20 66 73 79 6e 63 28 29  wise use fsync()
8b40: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a   in its place..*
8b50: 2f 0a 23 69 66 6e 64 65 66 20 48 41 56 45 5f 46  /.#ifndef HAVE_F
8b60: 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69 6e  DATASYNC.# defin
8b70: 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e  e fdatasync fsyn
8b80: 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  c.#endif../*.** 
8b90: 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  Define HAVE_FULL
8ba0: 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20  FSYNC to 0 or 1 
8bb0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
8bc0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
8bd0: 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d  he F_FULLFSYNC m
8be0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e  acro is defined.
8bf0: 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73    F_FULLFSYNC is
8c00: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e   currently.** on
8c10: 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
8c20: 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74  Mac OS X.  But t
8c30: 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65  hat could change
8c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55  ..*/.#ifdef F_FU
8c50: 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65  LLFSYNC.# define
8c60: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8c70: 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  1.#else.# define
8c80: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8c90: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
8ca0: 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
8cb0: 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
8cc0: 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
8cd0: 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
8ce0: 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
8cf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
8d00: 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
8d10: 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
8d20: 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
8d30: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
8d40: 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
8d50: 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
8d60: 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
8d70: 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
8d80: 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
8d90: 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
8da0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
8db0: 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
8dc0: 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
8dd0: 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
8de0: 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
8df0: 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
8e00: 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
8e10: 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
8e20: 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
8e30: 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
8e40: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
8e50: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
8e60: 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
8e70: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
8e80: 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
8e90: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
8ea0: 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
8eb0: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
8ec0: 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
8ed0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   number of times
8ee0: 20 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f   that we do a no
8ef0: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64  rmal fsync() and
8f00: 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e   .  ** FULLSYNC.
8f10: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64    This is used d
8f20: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f  uring testing to
8f30: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
8f40: 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  s procedure.  **
8f50: 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74   gets called wit
8f60: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72  h the correct ar
8f70: 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69  guments..  */.#i
8f80: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8f90: 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
8fa0: 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  ) sqlite3_fullsy
8fb0: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  nc_count++;.  sq
8fc0: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
8fd0: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
8fe0: 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
8ff0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
9000: 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
9010: 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
9020: 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
9030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
9040: 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c  _SYNC.  rc = SQL
9050: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23  ITE_OK;.#else..#
9060: 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
9070: 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63  C.  if( fullSync
9080: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e   ){.    rc = fcn
9090: 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59  tl(fd, F_FULLFSY
90a0: 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a  NC, 0);.  }else.
90b0: 23 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 46  #endif /* HAVE_F
90c0: 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 20 20 69 66  ULLFSYNC */.  if
90d0: 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20  ( dataOnly ){.  
90e0: 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
90f0: 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (fd);.  }else{. 
9100: 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
9110: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
9120: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9130: 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72  NO_SYNC) */..  r
9140: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9150: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
9160: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
9170: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
9180: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
9190: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
91a0: 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
91b0: 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
91c0: 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
91d0: 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
91e0: 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
91f0: 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
9200: 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
9210: 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
9220: 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
9230: 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
9240: 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
9250: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
9260: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
9270: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
9280: 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
9290: 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
92a0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
92b0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
92c0: 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
92d0: 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
92e0: 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
92f0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
9300: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
9310: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
9320: 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
9330: 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
9340: 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
9350: 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
9360: 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
9370: 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
9380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
9390: 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
93a0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
93b0: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
93c0: 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
93d0: 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
93e0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
93f0: 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
9400: 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
9410: 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
9420: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
9430: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
9440: 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  nc(OsFile *id, i
9450: 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
9460: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
9470: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9480: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
9490: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
94a0: 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
94b0: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
94c0: 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
94d0: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
94e0: 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c  pFile->fullSync,
94f0: 20 64 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69   dataOnly);.  Si
9500: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
9510: 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
9520: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9530: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
9540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
9550: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
9560: 20 20 20 54 52 41 43 45 34 28 22 44 49 52 53 59     TRACE4("DIRSY
9570: 4e 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75  NC %-3d (have_fu
9580: 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
9590: 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
95a0: 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20  e->dirfd,.      
95b0: 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
95c0: 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 66 75 6c  SYNC, pFile->ful
95d0: 6c 53 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20  lSync);.#ifndef 
95e0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
95f0: 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68  IRSYNC.    /* Th
9600: 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  e directory sync
9610: 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
9620: 65 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63  ed if full_fsync
9630: 20 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65   is.    ** turne
9640: 64 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c  d off or unavail
9650: 61 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c  able.  If a full
9660: 5f 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20  _fsync occurred 
9670: 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68  above,.    ** th
9680: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
9690: 20 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c   sync is superfl
96a0: 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uous..    */.   
96b0: 20 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c   if( (!HAVE_FULL
96c0: 46 53 59 4e 43 20 7c 7c 20 21 70 46 69 6c 65 2d  FSYNC || !pFile-
96d0: 3e 66 75 6c 6c 53 79 6e 63 29 20 26 26 20 66 75  >fullSync) && fu
96e0: 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
96f0: 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
9700: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
9710: 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
9720: 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
9730: 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
9740: 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
9750: 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
9760: 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
9770: 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
9780: 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
9790: 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
97a0: 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
97b0: 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
97c0: 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
97d0: 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
97e0: 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
97f0: 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
9800: 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
9810: 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
9820: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f  SQLITE_IOERR; */
9830: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9840: 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64    close(pFile->d
9850: 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20  irfd);  /* Only 
9860: 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63  need to sync onc
9870: 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20  e, so close the 
9880: 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
9890: 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20   pFile->dirfd = 
98a0: 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77  -1;    /* when w
98b0: 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20  e are done. */. 
98c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
98d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
98e0: 53 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f  Sync the directo
98f0: 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69  ry zDirname. Thi
9900: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20  s is a no-op on 
9910: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
9920: 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20  s other.** than 
9930: 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UNIX..**.** This
9940: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
9950: 20 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72   sure the master
9960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9970: 73 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65  s truely been de
9980: 6c 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  leted.** before 
9990: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
99a0: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  o individual jou
99b0: 72 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69  rnals on a multi
99c0: 2d 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74  -database commit
99d0: 2e 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46  ..** The F_FULLF
99e0: 53 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e  SYNC option is n
99f0: 6f 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a  ot needed here..
9a00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
9a10: 69 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28  ixSyncDirectory(
9a20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
9a30: 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  name){.#ifdef SQ
9a40: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52  LITE_DISABLE_DIR
9a50: 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
9a60: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
9a70: 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72   int fd;.  int r
9a80: 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44  ;.  fd = open(zD
9a90: 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
9aa0: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
9ab0: 20 54 52 41 43 45 33 28 22 44 49 52 53 59 4e 43   TRACE3("DIRSYNC
9ac0: 20 25 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66   %-3d (%s)\n", f
9ad0: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
9ae0: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
9af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
9b00: 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72  NTOPEN; .  }.  r
9b10: 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
9b20: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 53 69 6d  close(fd);.  Sim
9b30: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 3d  ulateIOError( r=
9b40: 31 20 29 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a  1 );.  if( r ){.
9b50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9b60: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
9b70: 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  C;.  }else{.    
9b80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9b90: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
9ba0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
9bb0: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
9bc0: 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
9bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9be0: 69 78 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c  ixTruncate(OsFil
9bf0: 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
9c00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
9c10: 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
9c20: 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28  c = ftruncate(((
9c30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
9c40: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d 75  , nByte);.  Simu
9c50: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
9c60: 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
9c70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c80: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
9c90: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
9ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9cb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9cc0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
9cd0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
9ce0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
9cf0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
9d00: 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a  ileSize(OsFile *
9d10: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
9d20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
9d30: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
9d40: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
9d50: 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69  rc = fstat(((uni
9d60: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
9d70: 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
9d80: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
9d90: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
9da0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9db0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
9dc0: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
9dd0: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
9de0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9df0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9e00: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
9e10: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9e20: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9e30: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9e40: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9e50: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9e60: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9e70: 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
9e80: 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rn.** non-zero. 
9e90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
9ea0: 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64  unlocked or hold
9eb0: 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f  s only SHARED lo
9ec0: 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74  cks, then.** ret
9ed0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
9ee0: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
9ef0: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
9f00: 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  File *id){.  int
9f10: 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69   r = 0;.  unixFi
9f20: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9f30: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
9f40: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
9f50: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
9f60: 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
9f70: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
9f80: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
9f90: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
9fa0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
9fb0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
9fc0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
9fd0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
9fe0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
9ff0: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
a000: 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a  K ){.    r = 1;.
a010: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
a020: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
a030: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
a040: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  lds it..  */.  i
a050: 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72  f( !r ){.    str
a060: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
a070: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
a080: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
a090: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
a0a0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
a0b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
a0c0: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
a0d0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
a0e0: 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e     fcntl(pFile->
a0f0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
a100: 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  k);.    if( lock
a110: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
a120: 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b   ){.      r = 1;
a130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
a140: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
a150: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 33 28  tex();.  TRACE3(
a160: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a170: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
a180: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
a190: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
a1a0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
a1b0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
a1c0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
a1d0: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
a1e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a1f0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
a200: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
a210: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
a220: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
a230: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
a240: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
a250: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
a260: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
a270: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
a280: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
a290: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
a2a0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
a2b0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
a2c0: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
a2d0: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
a2e0: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
a2f0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
a300: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
a310: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
a320: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
a330: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
a340: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
a350: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
a360: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
a370: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
a380: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
a390: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
a3a0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
a3b0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
a3c0: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
a3d0: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
a3e0: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
a3f0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a400: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
a410: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
a420: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
a430: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
a440: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
a450: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a460: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
a470: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
a480: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
a490: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
a4a0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
a4b0: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
a4c0: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
a4d0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a4e0: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
a4f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
a500: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
a510: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
a520: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
a530: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
a540: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
a550: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
a560: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
a570: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
a580: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
a590: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
a5a0: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
a5b0: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
a5c0: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
a5d0: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
a5e0: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
a5f0: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
a600: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
a610: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
a620: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
a630: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
a640: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
a650: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
a660: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
a670: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
a680: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
a690: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
a6a0: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
a6b0: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
a6c0: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
a6d0: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
a6e0: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
a6f0: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
a700: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
a710: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
a720: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
a730: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a740: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
a750: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
a760: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
a770: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
a780: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
a790: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
a7a0: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
a7b0: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
a7c0: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
a7d0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
a7e0: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
a7f0: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
a800: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
a810: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
a820: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
a830: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a840: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
a850: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
a860: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
a870: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
a880: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
a890: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
a8a0: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
a8b0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
a8c0: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
a8d0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
a8e0: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
a8f0: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
a900: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
a910: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
a920: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
a930: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
a940: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
a950: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
a960: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
a970: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
a980: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
a990: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
a9a0: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
a9b0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
a9c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
a9d0: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
a9e0: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
a9f0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
aa00: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
aa10: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
aa20: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
aa30: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
aa40: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
aa50: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
aa60: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
aa70: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
aa80: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
aa90: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
aaa0: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
aab0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
aac0: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
aad0: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
aae0: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
aaf0: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
ab00: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
ab10: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
ab20: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
ab30: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
ab40: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
ab50: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
ab60: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
ab70: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
ab80: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
ab90: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
aba0: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
abb0: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
abc0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
abd0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
abe0: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
abf0: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
ac00: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
ac10: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
ac20: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
ac30: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
ac40: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
ac50: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
ac60: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
ac70: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
ac80: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
ac90: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
aca0: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
acb0: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
acc0: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
acd0: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
ace0: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
acf0: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
ad00: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
ad10: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
ad20: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
ad30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
ad40: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ad50: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
ad60: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
ad70: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
ad80: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
ad90: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
ada0: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
adb0: 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45  pFile );.  TRACE
adc0: 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  7("LOCK    %d %s
add0: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
ade0: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
adf0: 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  >h,.      lockty
ae00: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
ae10: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70  , locktypeName(p
ae20: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  File->locktype),
ae30: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
ae40: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
ae50: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
ae60: 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20   , getpid());.. 
ae70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ae80: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
ae90: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
aea0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
aeb0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
aec0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
aed0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
aee0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
aef0: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
af00: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
af10: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
af20: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
af30: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
af40: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
af50: 0a 20 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43  .    TRACE3("LOC
af60: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
af70: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
af80: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
af90: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
afa0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
afb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
afc0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
afd0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
afe0: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
aff0: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
b000: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
b010: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
b020: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
b030: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
b040: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
b050: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
b060: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
b070: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
b080: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
b090: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b0a0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
b0b0: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
b0c0: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
b0d0: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
b0e0: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
b0f0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
b100: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
b110: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b120: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
b130: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
b140: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
b150: 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
b160: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
b170: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b180: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
b190: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74  Mutex();.    ret
b1a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c  urn rc;.  }.  pL
b1b0: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
b1c0: 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  ck;..  /* If som
b1d0: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b1e0: 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
b1f0: 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
b200: 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20  nt OsFile*.  ** 
b210: 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63  handle that prec
b220: 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73  ludes the reques
b230: 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  ted lock, return
b240: 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66   BUSY..  */.  if
b250: 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  ( (pFile->lockty
b260: 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  pe!=pLock->lockt
b270: 79 70 65 20 26 26 20 0a 20 20 20 20 20 20 20 20  ype && .        
b280: 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79    (pLock->lockty
b290: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
b2a0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41   || locktype>SHA
b2b0: 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
b2c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b2d0: 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
b2e0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
b2f0: 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
b300: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
b310: 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
b320: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
b330: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
b340: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
b350: 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
b360: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
b370: 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
b380: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
b390: 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
b3a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b3b0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
b3c0: 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74     (pLock->lockt
b3d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b3e0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74   || pLock->lockt
b3f0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
b400: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
b410: 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  t( locktype==SHA
b420: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
b430: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
b440: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
b450: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
b460: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 70 46  >cnt>0 );.    pF
b470: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
b480: 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
b490: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20   pLock->cnt++;. 
b4a0: 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d     pFile->pOpen-
b4b0: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f  >nLock++;.    go
b4c0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
b4d0: 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  ..  lock.l_len =
b4e0: 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77   1L;..  lock.l_w
b4f0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b500: 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e  ;..  /* A PENDIN
b510: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
b520: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
b530: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
b540: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
b550: 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
b560: 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
b570: 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
b580: 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
b590: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
b5a0: 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
b5b0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
b5c0: 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
b5d0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
b5e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46  USIVE_LOCK && pF
b5f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45  ile->locktype<PE
b600: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
b610: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
b620: 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   = (locktype==SH
b630: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
b640: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
b650: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b660: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b670: 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65   s = fcntl(pFile
b680: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b690: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20  ock);.    if( s 
b6a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
b6b0: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
b6c0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
b6d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b6e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
b6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
b700: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
b710: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
b720: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
b730: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
b740: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
b750: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
b760: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
b770: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
b780: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b790: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
b7a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  ert( pLock->cnt=
b7b0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
b7c0: 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ( pLock->locktyp
b7d0: 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  e==0 );..    /* 
b7e0: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
b7f0: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
b800: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
b810: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
b820: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
b830: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20  D_SIZE;.    s = 
b840: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
b850: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
b860: 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
b870: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
b880: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
b890: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
b8a0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
b8b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b8c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b8d0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
b8e0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
b8f0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
b900: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
b910: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
b920: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
b930: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
b940: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
b950: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 20      }.    if( s 
b970: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
b980: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
b990: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
b9a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
b9c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
b9d0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
b9e0: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
b9f0: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
ba00: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20  Lock->cnt = 1;. 
ba10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
ba20: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
ba30: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  SIVE_LOCK && pLo
ba40: 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20  ck->cnt>1 ){.   
ba50: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
ba60: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
ba70: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
ba80: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
ba90: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
baa0: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
bab0: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
bac0: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
bad0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
bae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
baf0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
bb00: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
bb10: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
bb20: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
bb30: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
bb40: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
bb50: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
bb60: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
bb70: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
bb80: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
bb90: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
bba0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
bbb0: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
bbc0: 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74     switch( lockt
bbd0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
bbe0: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
bbf0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bc00: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
bc10: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62  _BYTE;.        b
bc20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc30: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
bc40: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bc50: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
bc60: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
bc70: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
bc80: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
bc90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
bca0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
bcb0: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
bcc0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
bcd0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
bce0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
bcf0: 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
bd00: 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20  (errno==EINVAL) 
bd10: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
bd20: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
bd30: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
bd40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
bd50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
bd60: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
bd70: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
bd80: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
bd90: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
bda0: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
bdb0: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
bdc0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
bdd0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
bde0: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
bdf0: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
be00: 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a  ;.  }..end_lock:
be10: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
be20: 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41 43  eMutex();.  TRAC
be30: 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E4("LOCK    %d %
be40: 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %s\n", pFile->
be50: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
be60: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
be70: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
be80: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
be90: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ");.  return rc;
bea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
beb0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
bec0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
bed0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
bee0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
bef0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
bf00: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
bf10: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
bf20: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
bf30: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
bf40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
bf50: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
bf60: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
bf70: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
bf80: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
bf90: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
bfa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bfb0: 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  Unlock(OsFile *i
bfc0: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
bfd0: 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  {.  struct lockI
bfe0: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
bff0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
c000: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c010: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
c020: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
c030: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
c040: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c050: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
c060: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
c070: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
c080: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
c090: 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e,.      pFile->
c0a0: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
c0b0: 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  >pLock->locktype
c0c0: 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  , pFile->pLock->
c0d0: 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  cnt, getpid());.
c0e0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
c0f0: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
c100: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
c110: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
c120: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
c130: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
c140: 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52  .  if( CHECK_THR
c150: 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a  EADID(pFile) ){.
c160: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c170: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
c180: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
c190: 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d  tex();.  pLock =
c1a0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20   pFile->pLock;. 
c1b0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
c1c0: 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  cnt!=0 );.  if( 
c1d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
c1e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
c1f0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
c200: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c  ->locktype==pFil
c210: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  e->locktype );. 
c220: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
c230: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
c240: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
c250: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
c260: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c270: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c280: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
c290: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
c2a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
c2b0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
c2c0: 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28        if( fcntl(
c2d0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
c2e0: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a  K, &lock)!=0 ){.
c2f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
c300: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c310: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  pen */.        r
c320: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
c330: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  _RDLOCK;.      }
c340: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
c350: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c360: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
c370: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c380: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c390: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
c3a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
c3b0: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
c3c0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
c3d0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
c3e0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
c3f0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c400: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
c410: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
c420: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
c430: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
c440: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c450: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
c460: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
c470: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
c480: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f    }.  }.  if( lo
c490: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
c4a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  ){.    struct op
c4b0: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
c4c0: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
c4d0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
c4e0: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
c4f0: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
c500: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
c510: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
c520: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
c530: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
c540: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
c550: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
c560: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
c570: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
c580: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
c590: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
c5a0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c5b0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c5c0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c5d0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c5e0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
c5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
c600: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c610: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29  TLK, &lock)==0 )
c620: 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d  {.        pLock-
c630: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c  >locktype = NO_L
c640: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
c650: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
c660: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
c670: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
c680: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
c6a0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
c6b0: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
c6c0: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
c6d0: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
c6e0: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
c6f0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
c700: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
c710: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
c720: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
c730: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
c740: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
c750: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
c760: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f  s..    */.    pO
c770: 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70  pen = pFile->pOp
c780: 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  en;.    pOpen->n
c790: 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
c7a0: 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  rt( pOpen->nLock
c7b0: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
c7c0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26  Open->nLock==0 &
c7d0: 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  & pOpen->nPendin
c7e0: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
c7f0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
c800: 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0; i<pOpen->nPen
c810: 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ding; i++){.    
c820: 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d      close(pOpen-
c830: 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20  >aPending[i]);. 
c840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
c850: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
c860: 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  g);.      pOpen-
c870: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
c880: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
c890: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ding = 0;.    }.
c8a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c    }.  sqlite3OsL
c8b0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 70  eaveMutex();.  p
c8c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
c8d0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
c8e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c8f0: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
c900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c910: 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a  xClose(OsFile **
c920: 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pId){.  unixFile
c930: 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65   *id = (unixFile
c940: 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66 28 20 21  *)*pId;..  if( !
c950: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
c960: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c  TE_OK;.  unixUnl
c970: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
c980: 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  K);.  if( id->di
c990: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
c9a0: 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
c9b0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73  >dirfd = -1;.  s
c9c0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
c9d0: 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 69 64 2d  ex();..  if( id-
c9e0: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
c9f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
ca00: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
ca10: 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
ca20: 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
ca30: 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
ca40: 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
ca50: 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
ca60: 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
ca70: 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
ca80: 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
ca90: 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e  iptor to pOpen->
caa0: 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
cab0: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
cac0: 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
cad0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20      ** the last 
cae0: 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
caf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
cb00: 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75 63  *aNew;.    struc
cb10: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
cb20: 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20   = id->pOpen;.  
cb30: 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63    aNew = realloc
cb40: 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
cb50: 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  g, (pOpen->nPend
cb60: 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e  ing+1)*sizeof(in
cb70: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  t) );.    if( aN
cb80: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ew==0 ){.      /
cb90: 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  * If a malloc fa
cba0: 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74  ils, just leak t
cbb0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
cbc0: 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  or */.    }else{
cbd0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
cbe0: 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20  ending = aNew;. 
cbf0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
cc00: 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ding[pOpen->nPen
cc10: 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20  ding] = id->h;. 
cc20: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
cc30: 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ding++;.    }.  
cc40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
cc50: 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
cc60: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20  anding locks so 
cc70: 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65  we can close the
cc80: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
cc90: 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 69  y */.    close(i
cca0: 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  d->h);.  }.  rel
ccb0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d  easeLockInfo(id-
ccc0: 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61  >pLock);.  relea
ccd0: 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d 3e 70 4f  seOpenCnt(id->pO
cce0: 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pen);..  sqlite3
ccf0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
cd00: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
cd10: 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  ;.  TRACE2("CLOS
cd20: 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d  E   %-3d\n", id-
cd30: 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
cd40: 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
cd50: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
cd60: 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b  id);.  *pId = 0;
cd70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cd80: 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  _OK;.}...#ifdef 
cd90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
cda0: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61  CKING_STYLE.#pra
cdb0: 67 6d 61 20 6d 61 72 6b 20 41 46 50 20 53 75 70  gma mark AFP Sup
cdc0: 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  port../*. ** The
cdd0: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
cde0: 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
cdf0: 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
ce00: 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
ce10: 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e. */.typedef st
ce20: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
ce30: 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e  ontext afpLockin
ce40: 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  gContext;.struct
ce50: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
ce60: 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt {.  unsigned 
ce70: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
ce80: 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63 68 61 72  LockByte;.  char
ce90: 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a   *filePath;.};..
cea0: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
ceb0: 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
cec0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
ced0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
cee0: 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
cef0: 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
cf00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
cf10: 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
cf20: 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
cf30: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
cf40: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
cf50: 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
cf60: 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
cf70: 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
cf80: 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
cf90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
cfa0: 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
cfb0: 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
cfc0: 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
cfd0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
cfe0: 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
cff0: 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
d000: 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
d010: 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
d020: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
d050: 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
d060: 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
d070: 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
d080: 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 09 5f 49  ngeLock2FSCTL._I
d090: 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
d0a0: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
d0b0: 6b 50 42 32 29 0a 0a 2f 2a 20 72 65 74 75 72 6e  kPB2)../* return
d0c0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31   0 on success, 1
d0d0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 54 6f   on failure.  To
d0e0: 20 6d 61 74 63 68 20 74 68 65 20 62 65 68 61 76   match the behav
d0f0: 69 6f 72 20 6f 66 20 74 68 65 20 0a 20 20 6e 6f  ior of the .  no
d100: 72 6d 61 6c 20 70 6f 73 69 78 20 66 69 6c 65 20  rmal posix file 
d110: 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64 20 69 6e  locking (used in
d120: 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78   unixLock for ex
d130: 61 6d 70 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c  ample), we shoul
d140: 64 20 0a 20 20 70 72 6f 76 69 64 65 20 27 72 69  d .  provide 'ri
d150: 63 68 65 72 27 20 72 65 74 75 72 6e 20 63 6f 64  cher' return cod
d160: 65 73 20 2d 20 73 70 65 63 69 66 69 63 61 6c 6c  es - specificall
d170: 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
d180: 74 65 20 62 65 74 77 65 65 6e 0a 20 20 27 66 69  te between.  'fi
d190: 6c 65 20 62 75 73 79 27 20 61 6e 64 20 27 66 69  le busy' and 'fi
d1a0: 6c 65 20 73 79 73 74 65 6d 20 65 72 72 6f 72 27  le system error'
d1b0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 73 74 61 74   results */.stat
d1c0: 69 63 20 69 6e 74 20 5f 41 46 50 46 53 53 65 74  ic int _AFPFSSet
d1d0: 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  Lock(const char 
d1e0: 2a 70 61 74 68 2c 20 69 6e 74 20 66 64 2c 20 75  *path, int fd, u
d1f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d200: 67 20 6f 66 66 73 65 74 2c 20 0a 20 20 20 20 20  g offset, .     
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
d230: 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 69  g long length, i
d240: 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 29 0a  nt setLockFlag).
d250: 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
d260: 61 6e 67 65 4c 6f 63 6b 50 42 32 09 70 62 3b 0a  angeLockPB2.pb;.
d270: 20 20 69 6e 74 20 20 20 20 20 20 20 20 20 20 20    int           
d280: 20 20 20 20 20 20 20 20 20 20 65 72 72 3b 0a 20            err;. 
d290: 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
d2a0: 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
d2b0: 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
d2c0: 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
d2d0: 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
d2e0: 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
d2f0: 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
d300: 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20 54 52 41  b.fd = fd;.  TRA
d310: 43 45 35 28 22 41 46 50 4c 4f 43 4b 20 73 65 74  CE5("AFPLOCK set
d320: 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72  ting lock %s for
d330: 20 25 64 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c   %d in range %ll
d340: 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
d350: 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
d360: 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66  ":"OFF"), fd, of
d370: 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20  fset, length);. 
d380: 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
d390: 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
d3a0: 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
d3b0: 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
d3c0: 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 54 52 41  ==-1 ) {.    TRA
d3d0: 43 45 34 28 22 41 46 50 4c 4f 43 4b 20 66 61 69  CE4("AFPLOCK fai
d3e0: 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
d3f0: 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 20 70 61  %s' %d %s\n", pa
d400: 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20  th, errno, .    
d410: 20 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f    strerror(errno
d420: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
d430: 3b 20 2f 2f 20 65 72 72 6f 72 0a 20 20 7d 20 65  ; // error.  } e
d440: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
d450: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a   0;.  }.}../*. *
d460: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d470: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
d480: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
d490: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
d4a0: 65 63 69 66 69 65 64 0a 20 2a 2a 20 66 69 6c 65  ecified. ** file
d4b0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
d4c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
d4d0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
d4e0: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 20 2a   held, return. *
d4f0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  * non-zero.  If 
d500: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
d510: 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e  cked or holds on
d520: 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c  ly SHARED locks,
d530: 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74 75 72 6e   then. ** return
d540: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69   zero.. */.stati
d550: 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 68 65  c int afpUnixChe
d560: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
d570: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
d580: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
d590: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d5a0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
d5b0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d5c0: 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ; .  afpLockingC
d5d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d5e0: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d5f0: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d600: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d610: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
d620: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d630: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d640: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d650: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d660: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d670: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
d680: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
d690: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
d6a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
d6b0: 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
d6c0: 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20 20 20  if ( !r ) {.    
d6d0: 2f 2f 20 6c 6f 63 6b 20 74 68 65 20 62 79 74 65  // lock the byte
d6e0: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
d6f0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
d700: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
d710: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  h, pFile->h, RES
d720: 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
d730: 3b 20 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c  ;  .    if (fail
d740: 65 64 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  ed) {.      /* i
d750: 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
d760: 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
d770: 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
d780: 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
d790: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d      r = 1;.    }
d7a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a   else {.      /*
d7b0: 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
d7c0: 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
d7d0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
d7e0: 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
d7f0: 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
d800: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
d810: 2f 0a 20 20 20 20 20 20 5f 41 46 50 46 53 53 65  /.      _AFPFSSe
d820: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
d830: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
d840: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
d850: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
d860: 20 7d 0a 20 20 54 52 41 43 45 33 28 22 54 45 53   }.  TRACE3("TES
d870: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c  T WR-LOCK %d %d\
d880: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29  n", pFile->h, r)
d890: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b  ;.  .  return r;
d8a0: 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65  .}../* AFP-style
d8b0: 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69   locking followi
d8c0: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
d8d0: 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65  of unixLock, see
d8e0: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a   the unixLock .*
d8f0: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65  * function comme
d900: 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20  nts for details 
d910: 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65  of lock manageme
d920: 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt. */.static in
d930: 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73  t afpUnixLock(Os
d940: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
d950: 63 6b 74 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20  cktype).{.  int 
d960: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d970: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
d980: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
d990: 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
d9a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d9b0: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d9c0: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d9d0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d9e0: 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
d9f0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  ock = 0;.  .  as
da00: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
da10: 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20   TRACE5("LOCK   
da20: 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69   %d %s was %s pi
da30: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
da40: 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  h,.         lock
da50: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
da60: 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
da70: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
da80: 29 2c 20 67 65 74 70 69 64 28 29 29 3b 20 20 0a  ), getpid());  .
da90: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
daa0: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
dab0: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
dac0: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
dad0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   on the.    ** O
dae0: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
daf0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
db00: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
db10: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 20  xit path, as.   
db20: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
db30: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
db40: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
db50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 70  ..    */.  if( p
db60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
db70: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
db80: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
db90: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
dba0: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
dbb0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
dbc0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
dbd0: 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65  cktype));.    re
dbe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dbf0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
dc00: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
dc10: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
dc20: 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20 61 73 73  ect.    */.  ass
dc30: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
dc40: 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
dc50: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
dc60: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
dc70: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
dc80: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
dc90: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
dca0: 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
dcb0: 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
dcc0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
dcd0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
dce0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
dcf0: 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  because pFile->p
dd00: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
dd10: 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
dd20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73    */.  sqlite3Os
dd30: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
dd40: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
dd50: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
dd60: 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
dd70: 0a 20 20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74  .    */.  rc = t
dd80: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
dd90: 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  (pFile);.  if( r
dda0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ddb0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
ddc0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  veMutex();.    r
ddd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
dde0: 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
ddf0: 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
de00: 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
de10: 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
de20: 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  and before.    *
de30: 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45  * acquiring an E
de40: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
de50: 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c  For the SHARED l
de60: 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47  ock, the PENDING
de70: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
de80: 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f  released..    */
de90: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
dea0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
deb0: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
dec0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ded0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
dee0: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
def0: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 69  ).      ){.    i
df00: 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  nt failed = _AFP
df10: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
df20: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
df30: 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 50 45  le->h, .      PE
df40: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
df50: 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
df60: 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
df70: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
df80: 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
df90: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
dfa0: 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
dfb0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
dfc0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
dfd0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
dfe0: 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 6f 70  d make.    ** op
dff0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
e000: 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
e010: 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 20  cified lock..   
e020: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
e030: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
e040: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66  ){.    int lk, f
e050: 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74 20 74  ailed;.    int t
e060: 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20  ries = 0;.    . 
e070: 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
e080: 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20  e read-lock */. 
e090: 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
e0a0: 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
e0b0: 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
e0c0: 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
e0d0: 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
e0e0: 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
e0f0: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
e100: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20  dLockByte = (lk 
e110: 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
e120: 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b  HARED_SIZE - 1);
e130: 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41  .    failed = _A
e140: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e150: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e160: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
e170: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e  SHARED_FIRST+con
e180: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e190: 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
e1a0: 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68   .    /* Drop th
e1b0: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
e1c0: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
e1d0: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
e1e0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
e1f0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
e200: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
e210: 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  0)) {.      rc =
e220: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
e230: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
e240: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
e250: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f  en */.      goto
e260: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
e270: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 69 66     }.    .    if
e280: 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
e290: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
e2a0: 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SY;.    } else {
e2b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e2c0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
e2d0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LOCK;.    }.  }e
e2e0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
e2f0: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
e300: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
e310: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
e320: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
e330: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
e340: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
e350: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
e360: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
e370: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
e380: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
e390: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  ;.    assert( 0!
e3a0: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
e3b0: 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b   );.    if (lock
e3c0: 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56 45 44  type >= RESERVED
e3d0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
e3e0: 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53 45 52  locktype < RESER
e3f0: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
e400: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
e410: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
e420: 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
e430: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e440: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e450: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45  th, pFile->h, RE
e460: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31  SERVED_BYTE, 1,1
e470: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
e480: 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
e490: 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
e4a0: 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
e4b0: 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
e4c0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
e4d0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
e4e0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
e4f0: 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
e500: 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
e510: 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
e520: 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
e530: 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
e540: 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
e550: 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
e560: 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  nixUnlock.      
e570: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21 5f 41  */.      if (!_A
e580: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e590: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e5a0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
e5b0: 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20  FIRST +.        
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
e5e0: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 29  LockByte, 1, 0))
e5f0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f   {.        /* no
e600: 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
e610: 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
e620: 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
e630: 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f        failed = _
e640: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
e650: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
e660: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
e670: 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
e6a0: 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  IZE, 1);.       
e6b0: 20 69 66 20 28 66 61 69 6c 65 64 20 26 26 20 5f   if (failed && _
e6c0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
e6d0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
e6e0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
e6f0: 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
e720: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
e730: 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20  Byte, 1, 1)) {. 
e740: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e750: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
e760: 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c  K; /* this shoul
e770: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
e780: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
e790: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
e7a0: 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20     /* */.       
e7b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e7c0: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68  RR_UNLOCK; /* th
e7d0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
e7e0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
e7f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e800: 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d 3d 20  failed && rc == 
e810: 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
e820: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
e830: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
e840: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
e860: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
e870: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
e880: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
e890: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
e8a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e8b0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
e8c0: 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
e8d0: 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 73 71 6c  nd_lock:.    sql
e8e0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
e8f0: 28 29 3b 0a 20 20 54 52 41 43 45 34 28 22 4c 4f  ();.  TRACE4("LO
e900: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e  CK    %d %s %s\n
e910: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
e920: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
e930: 70 65 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  pe), .         r
e940: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
e950: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
e960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e970: 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68  ./*. ** Lower th
e980: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
e990: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
e9a0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
e9b0: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
e9c0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
e9d0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
e9e0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
e9f0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
ea00: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
ea10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
ea20: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
ea30: 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
ea40: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
ea50: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
ea60: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
ea70: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
ea80: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46  fpUnixUnlock(OsF
ea90: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
eaa0: 6b 74 79 70 65 29 20 7b 0a 20 20 73 74 72 75 63  ktype) {.  struc
eab0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
eac0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ead0: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
eae0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
eaf0: 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
eb00: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
eb10: 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
eb20: 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
eb30: 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
eb40: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  t;..  assert( pF
eb50: 69 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 35 28  ile );.  TRACE5(
eb60: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
eb70: 61 73 20 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  as %d pid=%d\n",
eb80: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
eb90: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 70 46  ype,.         pF
eba0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67  ile->locktype, g
ebb0: 65 74 70 69 64 28 29 29 3b 0a 20 20 0a 20 20 61  etpid());.  .  a
ebc0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
ebd0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
ebe0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ebf0: 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20  ktype<=locktype 
ec00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ec10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
ec20: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
ec30: 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  D(pFile) ){.    
ec40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ec50: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
ec60: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
ec70: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ec80: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
ec90: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  LOCK ){.    if( 
eca0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
ecb0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 69  _LOCK ){.      i
ecc0: 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a  nt failed = 0;..
ecd0: 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
ece0: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61  the exclusive ra
ecf0: 6e 67 65 20 2d 20 74 68 65 6e 20 72 65 2d 65 73  nge - then re-es
ed00: 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
ed10: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
ed20: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
ed30: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
ed40: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
ed50: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
ed60: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
ed70: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
ed80: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
ed90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
edc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20   0);.        if 
edd0: 28 21 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20  (!failed) {.    
ede0: 20 20 20 20 20 20 2f 2a 20 73 75 63 63 65 73 73        /* success
edf0: 66 75 6c 6c 79 20 72 65 6d 6f 76 65 64 20 74 68  fully removed th
ee00: 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
ee10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
ee20: 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28   (_AFPFSSetLock(
ee30: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
ee40: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
ee50: 52 45 44 5f 46 49 52 53 54 2b 0a 20 20 20 20 20  RED_FIRST+.     
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
ee80: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
ee90: 31 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 1)) {.       
eea0: 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74       /* failed t
eeb0: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 6f  o re-establish o
eec0: 75 72 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ur shared lock *
eed0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
eee0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
eef0: 52 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  RDLOCK; /* This 
ef00: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
ef10: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  pen */.         
ef20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73   }.        } els
ef30: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e {.          /*
ef40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
ef50: 65 72 20 68 61 70 70 65 6e 20 2d 20 66 61 69 6c  er happen - fail
ef60: 65 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ed to unlock the
ef70: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
ef80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
ef90: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
efa0: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
efb0: 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  } .      }.    }
efc0: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
efd0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
efe0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e  e->locktype>=PEN
eff0: 44 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  DING_LOCK) {.   
f000: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
f010: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
f020: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
f030: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
f040: 31 2c 20 30 29 29 7b 0a 20 20 20 20 20 20 20 20  1, 0)){.        
f050: 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c  /* failed to rel
f060: 65 61 73 65 20 74 68 65 20 70 65 6e 64 69 6e 67  ease the pending
f070: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
f080: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f090: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68  RR_UNLOCK; /* Th
f0a0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f0b0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
f0c0: 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 20  }.    } .    if 
f0d0: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
f0e0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
f0f0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
f100: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
f110: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
f120: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
f130: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
f140: 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 29  VED_BYTE, 1, 0))
f150: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61   {.        /* fa
f160: 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  iled to release 
f170: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
f180: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
f190: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f1a0: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
f1b0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
f1c0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
f1d0: 20 20 20 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20     } .  }.  if( 
f1e0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
f1f0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69  K ){.    int fai
f200: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f210: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f220: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
f230: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
f260: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
f270: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
f280: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
f290: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f2a0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f2b0: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
f2c0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
f2d0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
f2e0: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
f2f0: 4b 29 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  K).    pFile->lo
f300: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
f310: 65 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  e;.  sqlite3OsLe
f320: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
f330: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
f340: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
f350: 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
f360: 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
f370: 6f 6e 74 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74  ontext . */.stat
f380: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 6c  ic int afpUnixCl
f390: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
f3a0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f3b0: 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  id = (unixFile*)
f3c0: 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *pId;.  .  if( !
f3d0: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
f3e0: 54 45 5f 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78  TE_OK;.  afpUnix
f3f0: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
f400: 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65  LOCK);.  /* free
f410: 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67   the AFP locking
f420: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
f430: 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  if (id->lockingC
f440: 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20  ontext != NULL) 
f450: 7b 0a 20 20 20 20 69 66 20 28 28 28 61 66 70 4c  {.    if (((afpL
f460: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
f470: 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id->lockingConte
f480: 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d  xt)->filePath !=
f490: 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c   NULL).      sql
f4a0: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
f4b0: 65 65 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  ee(((afpLockingC
f4c0: 6f 6e 74 65 78 74 2a 29 69 64 2d 3e 6c 6f 63 6b  ontext*)id->lock
f4d0: 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c  ingContext)->fil
f4e0: 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
f4f0: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
f500: 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  e(id->lockingCon
f510: 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  text);.  }.  .  
f520: 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
f530: 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72   ) close(id->dir
f540: 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  fd);.  id->dirfd
f550: 20 3d 20 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69   = -1;.  close(i
f560: 64 2d 3e 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f  d->h);.  id->isO
f570: 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  pen = 0;.  TRACE
f580: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
f590: 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
f5a0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
f5b0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
f5c0: 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  feFree(id);.  *p
f5d0: 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
f5e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
f5f0: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f  #pragma mark flo
f600: 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69  ck() style locki
f610: 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 66  ng../*. ** The f
f620: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f630: 78 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  xt is not used. 
f640: 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20  */.typedef void 
f650: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  flockLockingCont
f660: 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ext;..static int
f670: 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52   flockUnixCheckR
f680: 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
f690: 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78  le *id) {.  unix
f6a0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
f6b0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
f6c0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f6d0: 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45  ktype == RESERVE
f6e0: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65  D_LOCK) {.    re
f6f0: 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65 61  turn 1; // alrea
f700: 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72 76  dy have a reserv
f710: 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73 65  ed lock.  } else
f720: 20 7b 0a 20 20 20 20 2f 2f 20 61 74 74 65 6d 70   {.    // attemp
f730: 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
f740: 6b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66  k.    int rc = f
f750: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
f760: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
f770: 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20  );.    if (!rc) 
f780: 7b 0a 20 20 20 20 20 20 2f 2f 20 67 6f 74 20 74  {.      // got t
f790: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
f7a0: 69 74 0a 20 20 20 20 20 20 66 6c 6f 63 6b 28 70  it.      flock(p
f7b0: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
f7c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
f7d0: 30 3b 20 20 2f 2f 20 6e 6f 20 6f 6e 65 20 68 61  0;  // no one ha
f7e0: 73 20 69 74 20 72 65 73 65 72 76 65 64 0a 20 20  s it reserved.  
f7f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31    }.    return 1
f800: 3b 20 2f 2f 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  ; // someone els
f810: 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74 20  e might have it 
f820: 72 65 73 65 72 76 65 64 0a 20 20 7d 0a 7d 0a 0a  reserved.  }.}..
f830: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
f840: 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  UnixLock(OsFile 
f850: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
f860: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
f870: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f880: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2f 20  le*)id;.  .  // 
f890: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
f8a0: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
f8b0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
f8c0: 2f 2f 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  // Just adjust l
f8d0: 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
f8e0: 20 6f 75 74 74 61 20 68 65 72 65 2e 0a 20 20 69   outta here..  i
f8f0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
f900: 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
f910: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f920: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f930: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f940: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
f950: 2f 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  / grab an exclus
f960: 69 76 65 20 6c 6f 63 6b 0a 20 20 69 6e 74 20 72  ive lock.  int r
f970: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f980: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
f990: 43 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28 72 63  CK_NB);.  if (rc
f9a0: 29 20 7b 0a 20 20 20 20 2f 2f 20 64 69 64 6e 27  ) {.    // didn'
f9b0: 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
f9c0: 75 73 79 0a 20 20 20 20 72 65 74 75 72 6e 20 53  usy.    return S
f9d0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20  QLITE_BUSY;.  } 
f9e0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2f 20 67 6f  else {.    // go
f9f0: 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
fa00: 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
fa10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
fa20: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
fa30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  TE_OK;.  }.}..st
fa50: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
fa60: 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20  ixUnlock(OsFile 
fa70: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
fa80: 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
fa90: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
faa0: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
fab0: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
fac0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fad0: 0a 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69 66 20 70  .  // no-op if p
fae0: 6f 73 73 69 62 6c 65 0a 20 20 69 66 28 20 70 46  ossible.  if( pF
faf0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
fb00: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
fb10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fb20: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 73 68 61  .  }.  .  // sha
fb30: 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
fb40: 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
fb50: 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
fb60: 63 6c 75 73 69 76 65 0a 20 20 69 66 20 28 6c 6f  clusive.  if (lo
fb70: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
fb80: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
fb90: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
fba0: 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
fbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fbc0: 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20 72 65 61  .  .  // no, rea
fbd0: 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a 20 20 69  lly, unlock..  i
fbe0: 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
fbf0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
fc00: 3b 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20 20  ;.  if (rc).    
fc10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
fc20: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c  ERR_UNLOCK;.  el
fc30: 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
fc40: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
fc50: 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  CK;.    return S
fc60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
fc70: 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
fc80: 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
fc90: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c   int flockUnixCl
fca0: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
fcb0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
fcc0: 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  id = (unixFile*)
fcd0: 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21  *pId;.  .  if( !
fce0: 69 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  id ) return SQLI
fcf0: 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e  TE_OK;.  flockUn
fd00: 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e  ixUnlock(*pId, N
fd10: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66  O_LOCK);.  .  if
fd20: 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
fd30: 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
fd40: 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
fd50: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
fd60: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
fd70: 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b  .  close(id->h);
fd80: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65    .  sqlite3OsLe
fd90: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64  aveMutex();.  id
fda0: 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  ->isOpen = 0;.  
fdb0: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
fdc0: 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b  %-3d\n", id->h);
fdd0: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
fde0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  1);.  sqlite3Thr
fdf0: 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b  eadSafeFree(id);
fe00: 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72  .  *pId = 0;.  r
fe10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fe20: 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  .}..#pragma mark
fe30: 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63   Old-School .loc
fe40: 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f 63  k file based loc
fe50: 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  king../*. ** The
fe60: 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
fe70: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
fe80: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f   contains all do
fe90: 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f  tlock (.lock) lo
fea0: 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63 20  ck. ** specific 
feb0: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
fec0: 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b  f struct dotlock
fed0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  LockingContext d
fee0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
fef0: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74  text;.struct dot
ff00: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
ff10: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63  xt {.  char *loc
ff20: 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74  kPath;.};...stat
ff30: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
ff40: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
ff50: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20  ock(OsFile *id) 
ff60: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
ff70: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
ff80: 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
ff90: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
ffa0: 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
ffb0: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
ffc0: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
ffd0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
ffe0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
fff0: 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
10000 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
10010 65 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65  eturn 1; // alre
10020 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
10030 76 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73  ved lock.  } els
10040 65 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  e {.    struct s
10050 74 61 74 20 73 74 61 74 42 75 66 3b 0a 20 20 20  tat statBuf;.   
10060 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74 65   if (lstat(conte
10070 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74  xt->lockPath,&st
10080 61 74 42 75 66 29 20 3d 3d 20 30 29 0a 20 20 20  atBuf) == 0).   
10090 20 20 20 2f 2f 20 66 69 6c 65 20 65 78 69 73 74     // file exist
100a0 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  s, someone else 
100b0 68 61 73 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20  has the lock.   
100c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
100d0 20 65 6c 73 65 0a 20 20 20 20 20 20 2f 2f 20 66   else.      // f
100e0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
100f0 73 74 2c 20 77 65 20 63 6f 75 6c 64 20 68 61 76  st, we could hav
10100 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20  e it if we want 
10110 69 74 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  it.      return 
10120 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
10130 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
10140 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Lock(OsFile *id,
10150 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
10160 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
10170 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
10180 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63  id;.  dotlockLoc
10190 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
101a0 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74  text = .    (dot
101b0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
101c0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
101d0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a  kingContext;.  .
101e0 20 20 2f 2f 20 69 66 20 77 65 20 61 6c 72 65 61    // if we alrea
101f0 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
10200 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
10210 20 20 0a 20 20 2f 2f 20 4a 75 73 74 20 61 64 6a    .  // Just adj
10220 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
10230 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
10240 2e 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  ..  if (pFile->l
10250 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
10260 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
10270 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
10280 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ype;.    .    /*
10290 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
102a0 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
102b0 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
102c0 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e 74 65      utimes(conte
102d0 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c  xt->lockPath,NUL
102e0 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  L);.    return S
102f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10300 0a 20 20 2f 2f 20 63 68 65 63 6b 20 74 6f 20 73  .  // check to s
10310 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20  ee if lock file 
10320 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 0a 20  already exists. 
10330 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
10340 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
10350 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  t(context->lockP
10360 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d  ath,&statBuf) ==
10370 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   0){.    return 
10380 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2f 20  SQLITE_BUSY; // 
10390 69 74 20 64 6f 65 73 2c 20 62 75 73 79 0a 20 20  it does, busy.  
103a0 7d 0a 20 20 0a 20 20 2f 2f 20 67 72 61 62 20 61  }.  .  // grab a
103b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
103c0 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e  .  int fd = open
103d0 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
103e0 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52  th,O_RDONLY|O_CR
103f0 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29  EAT|O_EXCL,0600)
10400 3b 0a 20 20 69 66 20 28 66 64 20 3c 20 30 29 20  ;.  if (fd < 0) 
10410 7b 0a 20 20 20 20 2f 2f 20 66 61 69 6c 65 64 20  {.    // failed 
10420 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
10430 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65  he file, someone
10440 20 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73   else may have s
10450 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 0a 20  tolen the lock. 
10460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10470 5f 42 55 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c  _BUSY; .  }.  cl
10480 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2f  ose(fd);.  .  //
10490 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
104a0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
104b0 20 6f 6b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   ok.  pFile->loc
104c0 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
104d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
104e0 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
104f0 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55  int dotlockUnixU
10500 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
10510 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10520 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10530 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10540 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
10550 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
10560 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
10570 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10580 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
10590 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
105a0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
105b0 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
105c0 20 29 3b 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2d 6f   );.  .  // no-o
105d0 70 20 69 66 20 70 6f 73 73 69 62 6c 65 0a 20 20  p if possible.  
105e0 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
105f0 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype==locktype ){
10600 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10610 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
10620 2f 2f 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  // shared can ju
10630 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
10640 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
10650 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20   an exclusive.  
10660 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if (locktype==SH
10670 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
10680 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
10690 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
106a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
106b0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 6e  K;.  }.  .  // n
106c0 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
106d0 6b 2e 0a 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74  k..  unlink(cont
106e0 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a  ext->lockPath);.
106f0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10700 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  e = NO_LOCK;.  r
10710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10720 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
10730 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
10740 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10750 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  nixClose(OsFile 
10760 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46  **pId) {.  unixF
10770 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
10780 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20  ile*)*pId;.  .  
10790 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e  if( !id ) return
107a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64 6f   SQLITE_OK;.  do
107b0 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28  tlockUnixUnlock(
107c0 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  *pId, NO_LOCK);.
107d0 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 64 6f    /* free the do
107e0 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 73 74  tlock locking st
107f0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
10800 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
10810 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
10820 20 20 20 69 66 20 28 28 28 64 6f 74 6c 6f 63 6b     if (((dotlock
10830 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10840 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  )id->lockingCont
10850 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 21  ext)->lockPath !
10860 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 73 71  = NULL).      sq
10870 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
10880 72 65 65 28 20 28 20 28 64 6f 74 6c 6f 63 6b 4c  ree( ( (dotlockL
10890 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
108a0 0a 20 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63  .        id->loc
108b0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f  kingContext)->lo
108c0 63 6b 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  ckPath);.    sql
108d0 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
108e0 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  ee(id->lockingCo
108f0 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20  ntext);.  }.  . 
10900 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
10910 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
10920 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
10930 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
10940 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
10950 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  .  .  close(id->
10960 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  h);.  .  sqlite3
10970 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
10980 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
10990 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  ;.  TRACE2("CLOS
109a0 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d  E   %-3d\n", id-
109b0 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  >h);.  OpenCount
109c0 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
109d0 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
109e0 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b  id);.  *pId = 0;
109f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10a00 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61  _OK;.}...#pragma
10a10 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67   mark No locking
10a20 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 6e 6f 6c  ../*. ** The nol
10a30 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10a40 74 20 69 73 20 76 6f 69 64 0a 20 2a 2f 0a 74 79  t is void. */.ty
10a50 70 65 64 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63  pedef void noloc
10a60 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  kLockingContext;
10a70 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
10a80 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
10a90 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  rvedLock(OsFile 
10aa0 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  *id) {.  return 
10ab0 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
10ac0 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28   nolockUnixLock(
10ad0 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
10ae0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65  locktype) {.  re
10af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b00 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  }..static int no
10b10 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f  lockUnixUnlock(O
10b20 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
10b30 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74  ocktype) {.  ret
10b40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10b50 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
10b60 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69   file.. */.stati
10b70 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78  c int nolockUnix
10b80 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70  Close(OsFile **p
10b90 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Id) {.  unixFile
10ba0 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65   *id = (unixFile
10bb0 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28  *)*pId;.  .  if(
10bc0 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53 51   !id ) return SQ
10bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
10be0 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
10bf0 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
10c00 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
10c10 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
10c20 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
10c30 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20  close(id->h);.  
10c40 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
10c50 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
10c60 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52  isOpen = 0;.  TR
10c70 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
10c80 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20  3d\n", id->h);. 
10c90 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
10ca0 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65 61  ;.  sqlite3Threa
10cb0 64 53 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20  dSafeFree(id);. 
10cc0 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74   *pId = 0;.  ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10ce0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
10cf0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
10d00 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  G_STYLE */../*.*
10d10 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
10d20 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
10d30 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
10d40 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
10d50 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c  er.** to the ful
10d60 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65  l pathname store
10d70 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
10d80 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
10d90 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20  alloc()..** The 
10da0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
10db0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
10dc0 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73  for freeing this
10dd0 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a   space once it.*
10de0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  * is no longer n
10df0 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eeded..*/.char *
10e00 73 71 6c 69 74 65 33 55 6e 69 78 46 75 6c 6c 50  sqlite3UnixFullP
10e10 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  athname(const ch
10e20 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a  ar *zRelative){.
10e30 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
10e40 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  0;.  if( zRelati
10e50 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ve[0]=='/' ){.  
10e60 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
10e70 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61  ng(&zFull, zRela
10e80 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  tive, (char*)0);
10e90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
10ea0 61 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74  ar *zBuf = sqlit
10eb0 65 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20  eMalloc(5000);. 
10ec0 20 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29     if( zBuf==0 )
10ed0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
10ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
10ef0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [0] = 0;.    sql
10f00 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
10f10 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
10f20 66 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a  f, 5000), "/", z
10f30 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20  Relative,.      
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
10f50 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c  har*)0);.    sql
10f60 69 74 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20  iteFree(zBuf);. 
10f70 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20   }..#if 0.  /*. 
10f80 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22   ** Remove "/./"
10f90 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61   path elements a
10fa0 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e  nd convert "/A/.
10fb0 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73  /" path elements
10fc0 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f  .  ** to just "/
10fd0 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  "..  */.  if( zF
10fe0 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ull ){.    int i
10ff0 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a  , j;.    for(i=j
11000 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b  =0; zFull[i]; i+
11010 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46  +){.      if( zF
11020 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ull[i]=='/' ){. 
11030 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
11040 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
11050 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
11060 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
11070 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
11080 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
11090 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
110a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
110b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
110c0 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d   if( zFull[i+1]=
110d0 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
110e0 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  2]=='.' && zFull
110f0 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
11100 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
11110 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d  >0 && zFull[j-1]
11120 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
11130 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33            i += 3
11140 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
11150 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
11160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
11170 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c  ull[j++] = zFull
11180 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [i];.    }.    z
11190 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  Full[j] = 0;.  }
111a0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
111b0 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zFull;.}../*.*
111c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
111d0 75 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79  ue of the fullsy
111e0 6e 63 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67  nc flag in the g
111f0 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
11200 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ptor..*/.static 
11210 76 6f 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c  void unixSetFull
11220 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
11230 20 69 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69   int v){.  ((uni
11240 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c  xFile*)id)->full
11250 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a  Sync = v;.}../*.
11260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  ** Return the un
11270 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61  derlying file ha
11280 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69  ndle for an OsFi
11290 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
112a0 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28   unixFileHandle(
112b0 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
112c0 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65  eturn ((unixFile
112d0 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a  *)id)->h;.}../*.
112e0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
112f0 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65  eger that indice
11300 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  s the type of lo
11310 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
11320 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e  d.** by this han
11330 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20  dle.  (Used for 
11340 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
11350 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73  ysis only.).*/.s
11360 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
11370 63 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a  ckState(OsFile *
11380 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  id){.  return ((
11390 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  unixFile*)id)->l
113a0 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ocktype;.}../*.*
113b0 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
113c0 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
113d0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
113e0 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
113f0 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e  ile.** for unix.
11400 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
11410 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
11420 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  3UnixIoMethod = 
11430 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20  {.  unixClose,. 
11440 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
11450 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
11460 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
11470 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
11480 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
11490 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
114a0 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
114b0 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
114c0 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78  FileSize,.  unix
114d0 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f  Lock,.  unixUnlo
114e0 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ck,.  unixLockSt
114f0 61 74 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b  ate,.  unixCheck
11500 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b  ReservedLock,.};
11510 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11520 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
11530 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73  TYLE./*. ** This
11540 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
11550 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
11560 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
11570 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a   on an OsFile. *
11580 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20  * for unix with 
11590 41 46 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  AFP style file l
115a0 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
115b0 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
115c0 64 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b  d sqlite3AFPLock
115d0 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
115e0 3d 20 7b 0a 20 20 20 20 61 66 70 55 6e 69 78 43  = {.    afpUnixC
115f0 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70  lose,.    unixOp
11600 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20  enDirectory,.   
11610 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75   unixRead,.    u
11620 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e  nixWrite,.    un
11630 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78  ixSeek,.    unix
11640 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e  Truncate,.    un
11650 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  ixSync,.    unix
11660 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20  SetFullSync,.   
11670 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c   unixFileHandle,
11680 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  .    unixFileSiz
11690 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 4c 6f  e,.    afpUnixLo
116a0 63 6b 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 55  ck,.    afpUnixU
116b0 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
116c0 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 61 66  ockState,.    af
116d0 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  pUnixCheckReserv
116e0 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 20  edLock,.};../*. 
116f0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
11700 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
11710 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
11720 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73  operate on an Os
11730 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69  File. ** for uni
11740 78 20 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73  x with flock() s
11750 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
11760 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  g.. */.static co
11770 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
11780 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ite3FlockLocking
11790 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
117a0 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c  .    flockUnixCl
117b0 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65  ose,.    unixOpe
117c0 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20  nDirectory,.    
117d0 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e  unixRead,.    un
117e0 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69  ixWrite,.    uni
117f0 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54  xSeek,.    unixT
11800 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69  runcate,.    uni
11810 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53  xSync,.    unixS
11820 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20  etFullSync,.    
11830 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a  unixFileHandle,.
11840 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65      unixFileSize
11850 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c  ,.    flockUnixL
11860 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  ock,.    flockUn
11870 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e  ixUnlock,.    un
11880 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20  ixLockState,.   
11890 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52   flockUnixCheckR
118a0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
118b0 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63  ./*. ** This vec
118c0 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
118d0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
118e0 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
118f0 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f  an OsFile. ** fo
11900 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c  r unix with dotl
11910 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  ock style file l
11920 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
11930 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
11940 64 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b  d sqlite3Dotlock
11950 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
11960 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64 6f 74 6c  hod = {.    dotl
11970 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20  ockUnixClose,.  
11980 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74    unixOpenDirect
11990 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52 65 61  ory,.    unixRea
119a0 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69 74 65  d,.    unixWrite
119b0 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a  ,.    unixSeek,.
119c0 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65      unixTruncate
119d0 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a  ,.    unixSync,.
119e0 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53      unixSetFullS
119f0 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c  ync,.    unixFil
11a00 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69  eHandle,.    uni
11a10 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20 20 64  xFileSize,.    d
11a20 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a  otlockUnixLock,.
11a30 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55      dotlockUnixU
11a40 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
11a50 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 64 6f  ockState,.    do
11a60 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  tlockUnixCheckRe
11a70 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a  servedLock,.};..
11a80 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74  /*. ** This vect
11a90 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
11aa0 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
11ab0 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
11ac0 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72  n OsFile. ** for
11ad0 20 75 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f   unix with dotlo
11ae0 63 6b 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  ck style file lo
11af0 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69  cking.. */.stati
11b00 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
11b10 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f   sqlite3NolockLo
11b20 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f  ckingUnixIoMetho
11b30 64 20 3d 20 7b 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  d = {.  nolockUn
11b40 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 4f  ixClose,.  unixO
11b50 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20  penDirectory,.  
11b60 75 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78  unixRead,.  unix
11b70 57 72 69 74 65 2c 0a 20 20 75 6e 69 78 53 65 65  Write,.  unixSee
11b80 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74  k,.  unixTruncat
11b90 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20  e,.  unixSync,. 
11ba0 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63   unixSetFullSync
11bb0 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64  ,.  unixFileHand
11bc0 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69  le,.  unixFileSi
11bd0 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78  ze,.  nolockUnix
11be0 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  Lock,.  nolockUn
11bf0 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78  ixUnlock,.  unix
11c00 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 6e 6f 6c  LockState,.  nol
11c10 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
11c20 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 23 65  rvedLock,.};..#e
11c30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11c40 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11c50 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  YLE */../*.** Al
11c60 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
11c70 72 20 61 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  r a new unixFile
11c80 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11c90 74 68 61 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a  that unixFile..*
11ca0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
11cb0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 75 6e 69  r to the new uni
11cc0 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e  xFile into *pId.
11cd0 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e 20 6f 75  .** If we run ou
11ce0 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f  t of memory, clo
11cf0 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  se the file and 
11d00 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
11d10 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
11d20 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
11d30 5f 53 54 59 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57  _STYLE./* . ** W
11d40 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65  hen locking exte
11d50 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c  nsions are enabl
11d60 65 64 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68  ed, the filepath
11d70 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79   and locking sty
11d80 6c 65 20 0a 20 2a 2a 20 61 72 65 20 6e 65 65 64  le . ** are need
11d90 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11da0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65  the unixFile pMe
11db0 74 68 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20  thod to use for 
11dc0 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
11dd0 6e 73 2e 0a 20 2a 2a 20 54 68 65 20 6c 6f 63 6b  ns.. ** The lock
11de0 69 6e 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66  ing-style specif
11df0 69 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ic lockingContex
11e00 74 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  t data structure
11e10 20 69 73 20 63 72 65 61 74 65 64 20 0a 20 2a 2a   is created . **
11e20 20 61 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65   and assigned he
11e30 72 65 20 61 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61  re also.. */.sta
11e40 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
11e50 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20  UnixFile(.  int 
11e60 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
11e70 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
11e80 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
11e90 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
11ea0 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70   */.  OsFile **p
11eb0 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Id,           /*
11ec0 20 57 72 69 74 65 20 63 6f 6d 70 6c 65 74 65 64   Write completed
11ed0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
11ee0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
11ef0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
11f00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11f10 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
11f20 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46  ed */.  int delF
11f30 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
11f40 2f 2a 20 44 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d  /* Delete-on-or-
11f50 62 65 66 6f 72 65 2d 63 6c 6f 73 65 20 66 6c 61  before-close fla
11f60 67 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  g */.){.  sqlite
11f70 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f  3LockingStyle lo
11f80 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
11f90 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
11fa0 75 6e 69 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e  unixFile f;.  in
11fb0 74 20 72 63 3b 0a 0a 20 20 6c 6f 63 6b 69 6e 67  t rc;..  locking
11fc0 53 74 79 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Style = sqlite3D
11fd0 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  etectLockingStyl
11fe0 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b  e(zFilename, h);
11ff0 0a 20 20 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53  .  if ( lockingS
12000 74 79 6c 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63  tyle == posixLoc
12010 6b 69 6e 67 53 74 79 6c 65 20 29 20 7b 0a 20 20  kingStyle ) {.  
12020 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
12030 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
12040 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
12050 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70  , &f.pLock, &f.p
12060 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  Open);.    sqlit
12070 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
12080 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
12090 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
120a0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69        unlink(zFi
120b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  lename);.      r
120c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
120d0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  EM;.    }.  } el
120e0 73 65 20 7b 0a 20 20 20 20 2f 2f 20 20 70 4c 6f  se {.    //  pLo
120f0 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20 61 72 65  ck and pOpen are
12100 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 70   only used for p
12110 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
12120 63 6b 69 6e 67 20 0a 20 20 20 20 66 2e 70 4c 6f  cking .    f.pLo
12130 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 66  ck = NULL;.    f
12140 2e 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20  .pOpen = NULL;. 
12150 20 7d 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67   }.  if( delFlag
12160 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
12170 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
12180 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20   f.dirfd = -1;. 
12190 20 66 2e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b   f.fullSync = 0;
121a0 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20  .  f.locktype = 
121b0 30 3b 0a 20 20 66 2e 6f 66 66 73 65 74 20 3d 20  0;.  f.offset = 
121c0 30 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20  0;.  f.h = h;.  
121d0 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29  SET_THREADID(&f)
121e0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
121f0 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c  e3ThreadSafeMall
12200 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46  oc( sizeof(unixF
12210 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  ile) );.  if( pN
12220 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f  ew==0 ){.    clo
12230 73 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  se(h);.    sqlit
12240 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
12250 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  ;.    releaseLoc
12260 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a  kInfo(f.pLock);.
12270 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43      releaseOpenC
12280 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20  nt(f.pOpen);.   
12290 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
122a0 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49 64  utex();.    *pId
122b0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
122c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
122d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65   }else{.    *pNe
122e0 77 20 3d 20 66 3b 0a 20 20 20 20 73 77 69 74 63  w = f;.    switc
122f0 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 29 20  h(lockingStyle) 
12300 7b 0a 20 20 20 20 20 20 63 61 73 65 20 61 66 70  {.      case afp
12310 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
12320 20 20 20 20 20 20 2f 2a 20 61 66 70 20 6c 6f 63        /* afp loc
12330 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
12340 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
12350 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
12360 65 64 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ed in.        **
12370 20 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   the afpLockingC
12380 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  ontext */.      
12390 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
123a0 3d 20 26 73 71 6c 69 74 65 33 41 46 50 4c 6f 63  = &sqlite3AFPLoc
123b0 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
123c0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
123d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
123e0 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
123f0 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
12400 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66 70 4c 6f  loc(sizeof(afpLo
12410 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a  ckingContext));.
12420 20 20 20 20 20 20 20 20 28 28 61 66 70 4c 6f 63          ((afpLoc
12430 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e  kingContext *)pN
12440 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
12450 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20  xt)->filePath = 
12460 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12470 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c  e3ThreadSafeMall
12480 6f 63 28 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  oc(strlen(zFilen
12490 61 6d 65 29 20 2b 20 31 29 3b 0a 20 20 20 20 20  ame) + 1);.     
124a0 20 20 20 73 74 72 63 70 79 28 28 28 61 66 70 4c     strcpy(((afpL
124b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
124c0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
124d0 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 2c  text)->filePath,
124e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
124f0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
12500 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
12510 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
12520 3b 0a 20 20 20 20 20 20 63 61 73 65 20 66 6c 6f  ;.      case flo
12530 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  ckLockingStyle:.
12540 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b          /* flock
12550 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74   locking doesn't
12560 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c   need additional
12570 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
12580 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
12590 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65         pNew->pMe
125a0 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46  thod = &sqlite3F
125b0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
125c0 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20  oMethod;.       
125d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
125e0 73 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  se dotlockLockin
125f0 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 20 20  gStyle:.        
12600 2f 2a 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69  /* dotlock locki
12610 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
12620 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
12630 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
12640 20 69 6e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20   in.         ** 
12650 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
12660 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  ngContext */.   
12670 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
12680 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 44 6f 74  od = &sqlite3Dot
12690 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
126a0 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20  oMethod;.       
126b0 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
126c0 6e 74 65 78 74 20 3d 20 73 71 6c 69 74 65 33 54  ntext = sqlite3T
126d0 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
126e0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
126f0 66 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  f(dotlockLocking
12700 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
12710 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b     ((dotlockLock
12720 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
12730 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12740 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 3d 20 0a  t)->lockPath = .
12750 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12760 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
12770 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 46 69 6c 65  loc(strlen(zFile
12780 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28 22  name) + strlen("
12790 2e 6c 6f 63 6b 22 29 20 2b 20 31 29 3b 0a 20 20  .lock") + 1);.  
127a0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 28 28        sprintf(((
127b0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
127c0 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f  ntext *)pNew->lo
127d0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c  ckingContext)->l
127e0 6f 63 6b 50 61 74 68 2c 20 0a 20 20 20 20 20 20  ockPath, .      
127f0 20 20 20 20 20 20 20 20 20 20 22 25 73 2e 6c 6f            "%s.lo
12800 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ck", zFilename);
12810 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12820 20 20 20 20 20 20 63 61 73 65 20 70 6f 73 69 78        case posix
12830 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
12840 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c        /* posix l
12850 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e  ocking doesn't n
12860 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  eed additional l
12870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e  ockingContext in
12880 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
12890 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
128a0 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69  od = &sqlite3Uni
128b0 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20  xIoMethod;.     
128c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
128d0 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74  case noLockingSt
128e0 79 6c 65 3a 0a 20 20 20 20 20 20 63 61 73 65 20  yle:.      case 
128f0 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
12900 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 64  ngStyle:.      d
12910 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 20  efault: .       
12920 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12930 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c   &sqlite3NolockL
12940 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
12950 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  od;.    }.    *p
12960 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e  Id = (OsFile*)pN
12970 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ew;.    OpenCoun
12980 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74  ter(+1);.    ret
12990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
129a0 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51   }.}.#else /* SQ
129b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
129c0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61  ING_STYLE */.sta
129d0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
129e0 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20  UnixFile(.  int 
129f0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
12a00 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
12a10 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 66 69  descriptor on fi
12a20 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
12a30 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49  */.  OsFile **pI
12a40 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  d,          /* W
12a50 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 20 75  rite the resul u
12a60 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
12a70 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
12a80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12a90 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e, /* Name of th
12aa0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
12ab0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ned */.  int del
12ac0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
12ad0 2f 2a 20 49 66 20 74 72 75 65 2c 20 64 65 6c 65  /* If true, dele
12ae0 74 65 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 6f  te the file on o
12af0 72 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  r before closing
12b00 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
12b10 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46  e *pNew;.  unixF
12b20 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b  ile f;.  int rc;
12b30 0a 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ..  sqlite3OsEnt
12b40 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
12b50 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68  = findLockInfo(h
12b60 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70  , &f.pLock, &f.p
12b70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  Open);.  sqlite3
12b80 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
12b90 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b    if( delFlag ){
12ba0 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
12bb0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ename);.  }.  if
12bc0 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73  ( rc ){.    clos
12bd0 65 28 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(h);.    return
12be0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12bf0 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45   }.  TRACE3("OPE
12c00 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
12c10 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a   h, zFilename);.
12c20 20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a    f.dirfd = -1;.
12c30 20 20 66 2e 66 75 6c 6c 53 79 6e 63 20 3d 20 30    f.fullSync = 0
12c40 3b 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d  ;.  f.locktype =
12c50 20 30 3b 0a 20 20 66 2e 6f 66 66 73 65 74 20 3d   0;.  f.offset =
12c60 20 30 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20   0;.  f.h = h;. 
12c70 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66   SET_THREADID(&f
12c80 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
12c90 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
12ca0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78  loc( sizeof(unix
12cb0 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  File) );.  if( p
12cc0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c  New==0 ){.    cl
12cd0 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  ose(h);.    sqli
12ce0 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
12cf0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
12d00 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b  ckInfo(f.pLock);
12d10 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
12d20 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20  Cnt(f.pOpen);.  
12d30 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
12d40 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49  Mutex();.    *pI
12d50 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  d = 0;.    retur
12d60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e    }else{.    *pN
12d80 65 77 20 3d 20 66 3b 0a 20 20 20 20 70 4e 65 77  ew = f;.    pNew
12d90 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
12da0 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
12db0 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73  ;.    *pId = (Os
12dc0 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20  File*)pNew;.    
12dd0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
12de0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12df0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TE_OK;.  }.}.#en
12e00 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
12e10 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
12e20 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
12e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
12e40 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
12e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e90 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
12ea0 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
12eb0 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
12ec0 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
12ed0 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
12ee0 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
12ef0 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
12f00 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
12f10 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
12f20 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
12f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12f80 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
12f90 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
12fa0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
12fb0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
12fc0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
12fd0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
12fe0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
12ff0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
13000 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
13010 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
13020 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 76 6f 69 64  e <dlfcn.h>.void
13030 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 6f   *sqlite3UnixDlo
13040 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
13050 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
13060 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
13070 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
13080 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
13090 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 55  }.void *sqlite3U
130a0 6e 69 78 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70  nixDlsym(void *p
130b0 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
130c0 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20  ar *zSymbol){.  
130d0 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61  return dlsym(pHa
130e0 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
130f0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  }.int sqlite3Uni
13100 78 44 6c 63 6c 6f 73 65 28 76 6f 69 64 20 2a 70  xDlclose(void *p
13110 48 61 6e 64 6c 65 29 7b 0a 20 20 72 65 74 75 72  Handle){.  retur
13120 6e 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c  n dlclose(pHandl
13130 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
13140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
13150 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f  _EXTENSION */../
13160 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61  *.** Get informa
13170 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65  tion to seed the
13180 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
13190 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73  enerator.  The s
131a0 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  eed.** is writte
131b0 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  n into the buffe
131c0 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68  r zBuf[256].  Th
131d0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
131e0 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c  on must.** suppl
131f0 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79  y a sufficiently
13200 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a   large buffer..*
13210 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
13220 78 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  xRandomSeed(char
13230 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
13240 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
13250 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
13260 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
13270 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
13280 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
13290 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
132a0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
132b0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
132c0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
132d0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
132e0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
132f0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
13300 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
13310 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
13320 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
13330 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
13340 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
13350 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
13360 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
13370 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
13380 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
13390 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
133a0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
133b0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
133c0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
133d0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
133e0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
133f0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
13400 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
13410 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
13420 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
13430 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
13440 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
13450 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
13460 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
13470 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
13480 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
13490 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
134a0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
134b0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
134c0 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
134d0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
134e0 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
134f0 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
13500 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
13510 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
13520 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
13530 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
13540 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
13550 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
13560 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
13570 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
13580 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
13590 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69  (&zBuf[sizeof(ti
135a0 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  me_t)], &pid, si
135b0 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
135c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61  }else{.      rea
135d0 64 28 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29  d(fd, zBuf, 256)
135e0 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
135f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13600 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
13610 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13620 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
13630 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
13640 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
13650 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
13660 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
13670 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
13680 6c 6c 69 73 65 63 6f 6e 64 73 20 77 65 20 77 61  lliseconds we wa
13690 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a  nt to sleep..*/.
136a0 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53  int sqlite3UnixS
136b0 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69  leep(int ms){.#i
136c0 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
136d0 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
136e0 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
136f0 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  s*1000);.  retur
13700 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c  n ms;.#else.  sl
13710 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30  eep((ms+999)/100
13720 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30  0);.  return 100
13730 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30  0*((ms+999)/1000
13740 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
13750 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61 62  ** Static variab
13760 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68 72  les used for thr
13770 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74  ead synchronizat
13780 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74  ion..**.** inMut
13790 65 78 20 20 20 20 20 20 74 68 65 20 6e 65 73 74  ex      the nest
137a0 69 6e 67 20 64 65 70 74 68 20 6f 66 20 74 68 65  ing depth of the
137b0 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
137c0 2e 20 20 54 68 65 20 74 68 72 65 61 64 0a 2a 2a  .  The thread.**
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f                ho
137e0 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20  lding mutexMain 
137f0 63 61 6e 20 72 65 61 64 20 74 68 69 73 20 76 61  can read this va
13800 72 69 61 62 6c 65 20 61 74 20 61 6e 79 20 74 69  riable at any ti
13810 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  me..**          
13820 20 20 20 20 42 75 74 20 69 73 20 6d 75 73 74 20      But is must 
13830 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f  hold mutexAux to
13840 20 63 68 61 6e 67 65 20 74 68 69 73 20 76 61 72   change this var
13850 69 61 62 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a  iable.  Other.**
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
13870 72 65 61 64 73 20 6d 75 73 74 20 68 6f 6c 64 20  reads must hold 
13880 6d 75 74 65 78 41 75 78 20 74 6f 20 72 65 61 64  mutexAux to read
13890 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e   the variable an
138a0 64 20 63 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  d can.**        
138b0 20 20 20 20 20 20 6e 65 76 65 72 20 77 72 69 74        never writ
138c0 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77  e..**.** mutexOw
138d0 6e 65 72 20 20 20 54 68 65 20 74 68 72 65 61 64  ner   The thread
138e0 20 69 64 20 6f 66 20 74 68 65 20 74 68 72 65 61   id of the threa
138f0 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d  d holding mutexM
13900 61 69 6e 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20  ain.  Same.**   
13910 20 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73             acces
13920 73 20 72 75 6c 65 73 20 61 73 20 66 6f 72 20 69  s rules as for i
13930 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75  nMutex..**.** mu
13940 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 20 20  texOwnerValid   
13950 54 72 75 65 20 69 66 20 74 68 65 20 76 61 6c 75  True if the valu
13960 65 20 69 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20  e in mutexOwner 
13970 69 73 20 76 61 6c 69 64 2e 20 20 54 68 65 20 73  is valid.  The s
13980 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ame.**          
13990 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20           access 
139a0 72 75 6c 65 73 20 61 70 70 6c 79 20 61 73 20 66  rules apply as f
139b0 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a  or inMutex..**.*
139c0 2a 20 6d 75 74 65 78 4d 61 69 6e 20 20 20 20 54  * mutexMain    T
139d0 68 65 20 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20  he main mutex.  
139e0 48 6f 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20  Hold this mutex 
139f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
13a00 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20  exclusive.**    
13a10 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73            access
13a20 20 74 6f 20 53 51 4c 69 74 65 20 64 61 74 61 20   to SQLite data 
13a30 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
13a40 2a 20 6d 75 74 65 78 41 75 78 20 20 20 20 20 41  * mutexAux     A
13a50 6e 20 61 75 78 69 6c 69 61 72 79 20 6d 75 74 65  n auxiliary mute
13a60 78 20 6e 65 65 64 65 64 20 74 6f 20 61 63 63 65  x needed to acce
13a70 73 73 20 76 61 72 69 61 62 6c 65 73 20 64 65 66  ss variables def
13a80 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
13a90 2a 20 4d 75 74 65 78 65 73 20 61 72 65 20 61 6c  * Mutexes are al
13aa0 77 61 79 73 20 61 63 71 75 69 72 65 64 20 69 6e  ways acquired in
13ab0 20 74 68 69 73 20 6f 72 64 65 72 3a 20 6d 75 74   this order: mut
13ac0 65 78 4d 61 69 6e 20 6d 75 74 65 78 41 75 78 2e  exMain mutexAux.
13ad0 20 20 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20     It.** is not 
13ae0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 63 71  necessary to acq
13af0 75 69 72 65 20 6d 75 74 65 78 4d 61 69 6e 20 69  uire mutexMain i
13b00 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 6d  n order to get m
13b10 75 74 65 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a  utexAux - just.*
13b20 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
13b30 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 6d   to acquire them
13b40 20 69 6e 20 74 68 65 20 72 65 76 65 72 73 65 20   in the reverse 
13b50 6f 72 64 65 72 3a 20 6d 75 74 65 78 41 75 78 20  order: mutexAux 
13b60 6d 75 74 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69  mutexMain..** Ei
13b70 74 68 65 72 20 67 65 74 20 74 68 65 20 6d 75 74  ther get the mut
13b80 65 78 65 73 20 77 69 74 68 20 6d 75 74 65 78 4d  exes with mutexM
13b90 61 69 6e 20 66 69 72 73 74 20 6f 72 20 67 65 74  ain first or get
13ba0 20 6d 75 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a   mutexAux only..
13bb0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69  **.** When runni
13bc0 6e 67 20 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d  ng on a platform
13bd0 20 77 68 65 72 65 20 74 68 65 20 74 68 72 65 65   where the three
13be0 20 76 61 72 69 61 62 6c 65 73 20 69 6e 4d 75 74   variables inMut
13bf0 65 78 2c 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a  ex, mutexOwner,.
13c00 2a 2a 20 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65  ** and mutexOwne
13c10 72 56 61 6c 69 64 20 63 61 6e 20 62 65 20 73 65  rValid can be se
13c20 74 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68  t atomically, th
13c30 65 20 6d 75 74 65 78 41 75 78 20 69 73 20 6e 6f  e mutexAux is no
13c40 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f  t required..** O
13c50 6e 20 6d 61 6e 79 20 73 79 73 74 65 6d 73 2c 20  n many systems, 
13c60 61 6c 6c 20 74 68 72 65 65 20 61 72 65 20 33 32  all three are 32
13c70 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 61 6e  -bit integers an
13c80 64 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 33  d writing to a 3
13c90 32 2d 62 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72  2-bit.** integer
13ca0 20 69 73 20 61 74 6f 6d 69 63 2e 20 20 49 20 74   is atomic.  I t
13cb0 68 69 6e 6b 2e 20 20 42 75 74 20 74 68 65 72 65  hink.  But there
13cc0 20 61 72 65 20 6e 6f 20 67 75 61 72 61 6e 74 65   are no guarante
13cd0 65 73 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  es.  So it seems
13ce0 0a 2a 2a 20 73 61 66 65 72 20 74 6f 20 70 72 6f  .** safer to pro
13cf0 74 65 63 74 20 74 68 65 6d 20 75 73 69 6e 67 20  tect them using 
13d00 6d 75 74 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61  mutexAux..*/.sta
13d10 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20  tic int inMutex 
13d20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13d30 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
13d40 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 74  static pthread_t
13d50 20 6d 75 74 65 78 4f 77 6e 65 72 3b 20 20 20 20   mutexOwner;    
13d60 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20        /* Thread 
13d70 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69  holding mutexMai
13d80 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
13d90 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
13da0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
13db0 75 65 20 69 66 20 6d 75 74 65 78 4f 77 6e 65 72  ue if mutexOwner
13dc0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61   is valid */.sta
13dd0 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
13de0 78 5f 74 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20  x_t mutexMain = 
13df0 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
13e00 49 54 49 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68  ITIALIZER; /* Th
13e10 65 20 6d 75 74 65 78 20 2a 2f 0a 73 74 61 74 69  e mutex */.stati
13e20 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
13e30 74 20 6d 75 74 65 78 41 75 78 20 3d 20 50 54 48  t mutexAux = PTH
13e40 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
13e50 41 4c 49 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20  ALIZER;  /* Aux 
13e60 6d 75 74 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a  mutex */.#endif.
13e70 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
13e80 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75  wing pair of rou
13e90 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  tine implement m
13ea0 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20  utual exclusion 
13eb0 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72  for.** multi-thr
13ec0 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e  eaded processes.
13ed0 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
13ee0 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65  thread is allowe
13ef0 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64  d to.** executed
13f00 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75   code that is su
13f10 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65  rrounded by Ente
13f20 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61  rMutex() and Lea
13f30 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a  veMutex()..**.**
13f40 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c   SQLite uses onl
13f50 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78  y a single Mutex
13f60 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20  .  There is not 
13f70 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a  much critical.**
13f80 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c   code and what l
13f90 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65  ittle there is e
13fa0 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20  xecutes quickly 
13fb0 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63  and without bloc
13fc0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f  king..**.** As o
13fd0 66 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c  f version 3.3.2,
13fe0 20 74 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74   this mutex must
13ff0 20 62 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a   be recursive..*
14000 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
14010 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a  ixEnterMutex(){.
14020 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
14030 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
14040 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
14050 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 69 66  &mutexAux);.  if
14060 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  ( !mutexOwnerVal
14070 69 64 20 7c 7c 20 21 70 74 68 72 65 61 64 5f 65  id || !pthread_e
14080 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
14090 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
140a0 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
140b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
140c0 74 65 78 41 75 78 29 3b 0a 20 20 20 20 70 74 68  texAux);.    pth
140d0 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
140e0 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20  &mutexMain);.   
140f0 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
14100 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
14110 74 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61  t( !mutexOwnerVa
14120 6c 69 64 20 29 3b 0a 20 20 20 20 70 74 68 72 65  lid );.    pthre
14130 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
14140 75 74 65 78 41 75 78 29 3b 0a 20 20 20 20 6d 75  utexAux);.    mu
14150 74 65 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65  texOwner = pthre
14160 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d  ad_self();.    m
14170 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d  utexOwnerValid =
14180 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65   1;.  }.  inMute
14190 78 2b 2b 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d  x++;.  pthread_m
141a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
141b0 65 78 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20  exAux);.#else.  
141c0 69 6e 4d 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69  inMutex++;.#endi
141d0 66 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  f.}.void sqlite3
141e0 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  UnixLeaveMutex()
141f0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
14200 74 65 78 3e 30 20 29 3b 0a 23 69 66 64 65 66 20  tex>0 );.#ifdef 
14210 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
14220 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  ADS.  pthread_mu
14230 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41  tex_lock(&mutexA
14240 75 78 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d  ux);.  inMutex--
14250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 74 68 72  ;.  assert( pthr
14260 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
14270 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
14280 6c 66 28 29 29 20 29 3b 0a 20 20 69 66 28 20 69  lf()) );.  if( i
14290 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  nMutex==0 ){.   
142a0 20 61 73 73 65 72 74 28 20 6d 75 74 65 78 4f 77   assert( mutexOw
142b0 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  nerValid );.    
142c0 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
142d0 3d 20 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64  = 0;.    pthread
142e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d  _mutex_unlock(&m
142f0 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  utexMain);.  }. 
14300 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
14310 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  nlock(&mutexAux)
14320 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65  ;.#else.  inMute
14330 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  x--;.#endif.}../
14340 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
14350 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73   if the mutex is
14360 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e   currently held.
14370 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  .**.** If the th
14380 69 73 54 68 72 64 20 70 61 72 61 6d 65 74 65 72  isThrd parameter
14390 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e   is true, return
143a0 20 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 74 68   true only if th
143b0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72  e.** calling thr
143c0 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  ead holds the mu
143d0 74 65 78 2e 20 20 49 66 20 74 68 65 20 70 61 72  tex.  If the par
143e0 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c  ameter is false,
143f0 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   return.** true 
14400 69 66 20 61 6e 79 20 74 68 72 65 61 64 20 68 6f  if any thread ho
14410 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a  lds the mutex..*
14420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
14430 78 49 6e 4d 75 74 65 78 28 69 6e 74 20 74 68 69  xInMutex(int thi
14440 73 54 68 72 64 29 7b 0a 23 69 66 64 65 66 20 53  sThrd){.#ifdef S
14450 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
14460 44 53 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  DS.  int rc;.  p
14470 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
14480 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
14490 72 63 20 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26  rc = inMutex>0 &
144a0 26 20 28 74 68 69 73 54 68 72 64 3d 3d 30 20 7c  & (thisThrd==0 |
144b0 7c 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  | pthread_equal(
144c0 6d 75 74 65 78 4f 77 6e 65 72 2c 70 74 68 72 65  mutexOwner,pthre
144d0 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a 20 20 70  ad_self()));.  p
144e0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
144f0 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
14500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c    return rc;.#el
14510 73 65 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75  se.  return inMu
14520 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  tex>0;.#endif.}.
14530 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
14540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
14550 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
14560 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61  ta blocks alloca
14570 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73  ted..** Use this
14580 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
14590 77 65 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69  we are not leaki
145a0 6e 67 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ng thread-specif
145b0 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b  ic-data..** Tick
145c0 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64  et #1601.*/.#ifd
145d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
145e0 6e 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  nt sqlite3_tsd_c
145f0 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 69 66 64 65  ount = 0;.# ifde
14600 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
14610 52 45 41 44 53 0a 20 20 20 20 73 74 61 74 69 63  READS.    static
14620 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
14630 20 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74   tsd_counter_mut
14640 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54  ex = PTHREAD_MUT
14650 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a  EX_INITIALIZER;.
14660 23 20 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43  #   define TSD_C
14670 4f 55 4e 54 45 52 28 4e 29 20 5c 0a 20 20 20 20  OUNTER(N) \.    
14680 20 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64           pthread
14690 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64  _mutex_lock(&tsd
146a0 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
146b0 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
146c0 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
146d0 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20  t += N; \.      
146e0 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
146f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64  utex_unlock(&tsd
14700 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
14710 0a 23 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69  .# else.#   defi
14720 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e  ne TSD_COUNTER(N
14730 29 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  )  sqlite3_tsd_c
14740 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69  ount += N.# endi
14750 66 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  f.#else.# define
14760 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
14770 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e   /* no-op */.#en
14780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61  dif../*.** If ca
14790 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61  lled with alloca
147a0 74 65 46 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72  teFlag>0, then r
147b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
147c0 74 6f 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65  to thread.** spe
147d0 63 69 66 69 63 20 64 61 74 61 20 66 6f 72 20 74  cific data for t
147e0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
147f0 64 2e 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  d.  Allocate and
14800 20 7a 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72   zero the.** thr
14810 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
14820 61 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  a if it does not
14830 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
14840 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  **.** If called 
14850 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
14860 67 3d 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b  g==0, then check
14870 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14880 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  ead.** specific 
14890 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74  data.  Return it
148a0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
148b0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
148c0 78 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  xist,.** then re
148d0 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
148e0 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
148f0 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20  allocateFlag<0, 
14900 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14910 74 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69  the thread speci
14920 66 69 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61  fic.** data is a
14930 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20  llocated and is 
14940 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74  all zero.  If it
14950 20 69 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63   is then dealloc
14960 61 74 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72  ate it..** Retur
14970 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14980 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66  he thread specif
14990 69 63 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20  ic data or NULL 
149a0 69 66 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c  if it is.** unal
149b0 6c 6f 63 61 74 65 64 20 6f 72 20 67 65 74 73 20  located or gets 
149c0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  deallocated..*/.
149d0 54 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69  ThreadData *sqli
149e0 74 65 33 55 6e 69 78 54 68 72 65 61 64 53 70 65  te3UnixThreadSpe
149f0 63 69 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c  cificData(int al
14a00 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73  locateFlag){.  s
14a10 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65  tatic const Thre
14a20 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20  adData zeroData 
14a30 3d 20 7b 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69  = {0};  /* Initi
14a40 61 6c 69 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63  alizer to silenc
14a50 65 20 77 61 72 6e 69 6e 67 73 0a 20 20 20 20 20  e warnings.     
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72        ** from br
14a90 6f 6b 65 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a  oken compilers *
14aa0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14ab0 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73  UNIX_THREADS.  s
14ac0 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65  tatic pthread_ke
14ad0 79 5f 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69  y_t key;.  stati
14ae0 63 20 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20  c int keyInit = 
14af0 30 3b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  0;.  ThreadData 
14b00 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b  *pTsd;..  if( !k
14b10 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  eyInit ){.    sq
14b20 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
14b30 78 28 29 3b 0a 20 20 20 20 69 66 28 20 21 6b 65  x();.    if( !ke
14b40 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69  yInit ){.      i
14b50 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  nt rc;.      rc 
14b60 3d 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 63 72  = pthread_key_cr
14b70 65 61 74 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20  eate(&key, 0);. 
14b80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
14b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
14ba0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
14bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
14bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65        }.      ke
14bd0 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  yInit = 1;.    }
14be0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
14bf0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
14c00 0a 20 20 70 54 73 64 20 3d 20 70 74 68 72 65 61  .  pTsd = pthrea
14c10 64 5f 67 65 74 73 70 65 63 69 66 69 63 28 6b 65  d_getspecific(ke
14c20 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61  y);.  if( alloca
14c30 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20  teFlag>0 ){.    
14c40 69 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20  if( pTsd==0 ){. 
14c50 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
14c60 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28  3TestMallocFail(
14c70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73  ) ){.        pTs
14c80 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  d = sqlite3OsMal
14c90 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44  loc(sizeof(zeroD
14ca0 61 74 61 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ata));.      }.#
14cb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
14cc0 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
14cd0 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a  te3_isFail = 0;.
14ce0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
14cf0 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
14d00 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
14d10 61 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  a;.        pthre
14d20 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b  ad_setspecific(k
14d30 65 79 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20  ey, pTsd);.     
14d40 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
14d50 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
14d60 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
14d70 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
14d80 65 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20  eFlag<0 .       
14d90 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
14da0 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20  Tsd, &zeroData, 
14db0 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74  sizeof(ThreadDat
14dc0 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  a))==0 ){.    sq
14dd0 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64  lite3OsFree(pTsd
14de0 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73  );.    pthread_s
14df0 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20  etspecific(key, 
14e00 30 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e  0);.    TSD_COUN
14e10 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73  TER(-1);.    pTs
14e20 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
14e30 75 72 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a  urn pTsd;.#else.
14e40 20 20 73 74 61 74 69 63 20 54 68 72 65 61 64 44    static ThreadD
14e50 61 74 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20  ata *pTsd = 0;. 
14e60 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
14e70 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
14e80 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
14e90 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
14ea0 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
14eb0 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
14ec0 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20  qlite3OsMalloc( 
14ed0 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29  sizeof(zeroData)
14ee0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
14ef0 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
14f00 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
14f10 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  _isFail = 0;.#en
14f20 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 54  dif.      if( pT
14f30 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sd ){.        *p
14f40 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a  Tsd = zeroData;.
14f50 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e          TSD_COUN
14f60 54 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d  TER(+1);.      }
14f70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
14f80 66 28 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c  f( pTsd!=0 && al
14f90 6c 6f 63 61 74 65 46 6c 61 67 3c 30 0a 20 20 20  locateFlag<0.   
14fa0 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
14fb0 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61  mp(pTsd, &zeroDa
14fc0 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61  ta, sizeof(Threa
14fd0 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20  dData))==0 ){.  
14fe0 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28    sqlite3OsFree(
14ff0 70 54 73 64 29 3b 0a 20 20 20 20 54 53 44 5f 43  pTsd);.    TSD_C
15000 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20  OUNTER(-1);.    
15010 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
15020 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e  return pTsd;.#en
15030 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
15040 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
15050 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
15060 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
15070 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
15080 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
15090 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
150a0 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
150b0 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
150c0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
150d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
150e0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
150f0 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
15100 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
15110 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
15120 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
15130 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
15140 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
15150 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
15160 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
15170 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
15180 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
15190 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
151a0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
151b0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
151c0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
151d0 73 71 6c 69 74 65 33 55 6e 69 78 43 75 72 72 65  sqlite3UnixCurre
151e0 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70  ntTime(double *p
151f0 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f  rNow){.#ifdef NO
15200 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74  _GETTOD.  time_t
15210 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
15220 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34    *prNow = t/864
15230 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
15240 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
15250 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
15260 20 73 74 72 75 63 74 20 74 69 6d 65 7a 6f 6e 65   struct timezone
15270 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75 73   sTz;  /* Not us
15280 65 64 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f  ed */.  gettimeo
15290 66 64 61 79 28 26 73 4e 6f 77 2c 20 26 73 54 7a  fday(&sNow, &sTz
152a0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
152b0 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
152c0 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
152d0 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
152e0 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
152f0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
15300 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
15310 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
15320 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
15330 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
15340 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
15350 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
15360 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
15370 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
15380 53 5f 55 4e 49 58 20 2a 2f 0a                    S_UNIX */.