/ Hex Artifact Content
Login

Artifact 09d422370948fb5087a2873ac81470ef2f943559:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
0740: 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
0750: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0760: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0770: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0780: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0790: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
07a0: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
07b0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07c0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07e0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
0800: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0810: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0820: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if..../*.** The 
0830: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
0840: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
0850: 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69 66 69  f OsFile specifi
0860: 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a  c for the unix.*
0870: 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61  * protability la
0880: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0890: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
08a0: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
08b0: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 49 6f   unixFile {.  Io
08c0: 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d  Method const *pM
08d0: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
08e0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
08f0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70  y */.  struct op
0900: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0910: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0920: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0930: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0940: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
0950: 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66  *pLock;   /* Inf
0960: 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e  o about locks on
0970: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23   this inode */.#
0980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0990: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
09a0: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
09b0: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
09c0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
09d0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
09e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
09f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0a00: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 69 6e 74 20  _STYLE */.  int 
0a10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
0a30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
0a40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0a50: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54  locktype;   /* T
0a60: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
0a70: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
0a80: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0a90: 61 72 20 69 73 4f 70 65 6e 3b 20 20 20 20 20 2f  ar isOpen;     /
0aa0: 2a 20 54 72 75 65 20 69 66 20 6e 65 65 64 73 20  * True if needs 
0ab0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
0ac0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0ad0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 2f 2a 20 55  fullSync;   /* U
0ae0: 73 65 20 46 5f 46 55 4c 4c 53 59 4e 43 20 69 66  se F_FULLSYNC if
0af0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
0b00: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0b30: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0b40: 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 20  /.  i64 offset; 
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b60: 20 53 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   Seek offset */.
0b70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
0b80: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
0b90: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0bb0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0bc0: 20 74 68 69 73 20 4f 73 46 69 6c 65 20 2a 2f 0a   this OsFile */.
0bd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
0be0: 20 50 72 6f 76 69 64 65 20 74 68 65 20 61 62 69   Provide the abi
0bf0: 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
0c00: 20 73 6f 6d 65 20 4f 53 2d 6c 61 79 65 72 20 66   some OS-layer f
0c10: 75 6e 63 74 69 6f 6e 73 20 64 75 72 69 6e 67 0a  unctions during.
0c20: 2a 2a 20 74 65 73 74 69 6e 67 2e 20 20 54 68 69  ** testing.  Thi
0c30: 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 69 6d  s is used to sim
0c40: 75 6c 61 74 65 20 4f 53 20 63 72 61 73 68 65 73  ulate OS crashes
0c50: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
0c60: 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 61 72 65 20  .** commits are 
0c70: 61 74 6f 6d 69 63 20 65 76 65 6e 20 69 6e 20 74  atomic even in t
0c80: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 4f  he event of an O
0c90: 53 20 63 72 61 73 68 2e 0a 2a 2f 0a 23 69 66 64  S crash..*/.#ifd
0ca0: 65 66 20 53 51 4c 49 54 45 5f 43 52 41 53 48 5f  ef SQLITE_CRASH_
0cb0: 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
0cc0: 74 20 73 71 6c 69 74 65 33 43 72 61 73 68 54 65  t sqlite3CrashTe
0cd0: 73 74 45 6e 61 62 6c 65 3b 0a 20 20 65 78 74 65  stEnable;.  exte
0ce0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0cf0: 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65  ashOpenReadWrite
0d00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73  (const char*, Os
0d10: 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20  File**, int*);. 
0d20: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
0d30: 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c  te3CrashOpenExcl
0d40: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
0d50: 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74  *, OsFile**, int
0d60: 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
0d70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d80: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
0d90: 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20  har*, OsFile**, 
0da0: 69 6e 74 29 3b 0a 23 20 64 65 66 69 6e 65 20 43  int);.# define C
0db0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
0dc0: 44 45 28 58 2c 41 2c 42 2c 43 29 20 5c 0a 20 20  DE(X,A,B,C) \.  
0dd0: 20 20 69 66 28 73 71 6c 69 74 65 33 43 72 61 73    if(sqlite3Cras
0de0: 68 54 65 73 74 45 6e 61 62 6c 65 29 7b 20 72 65  hTestEnable){ re
0df0: 74 75 72 6e 20 58 28 41 2c 42 2c 43 29 3b 20 7d  turn X(A,B,C); }
0e00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0e10: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
0e20: 49 44 45 28 58 2c 41 2c 42 2c 43 29 20 20 2f 2a  IDE(X,A,B,C)  /*
0e30: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
0e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  .../*.** Include
0e50: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0e60: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0e70: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0e80: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0e90: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  h"../*.** Do not
0ea0: 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20   include any of 
0eb0: 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74  the File I/O int
0ec0: 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65  erface procedure
0ed0: 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49  s if the.** SQLI
0ee0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d  TE_OMIT_DISKIO m
0ef0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
0f00: 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
0f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0f20: 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f   will be in-memo
0f30: 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e  ry only).*/.#ifn
0f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0f50: 44 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  DISKIO.../*.** D
0f60: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
0f70: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
0f80: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
0f90: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
0fa0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
0fb0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
0fc0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
0fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
0fe0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
0ff0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
1000: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
1010: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1020: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
1030: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
1040: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1050: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
1060: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
1070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1080: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
1090: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
10a0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
10b0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
10c0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
10d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
10e0: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
10f0: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
1100: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
1110: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
1120: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
1130: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
1140: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
1150: 50 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53  P.  But it's DOS
1160: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1170: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1180: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1190: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
11a0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
11b0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
11c0: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
11d0: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
11e0: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
11f0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1200: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1220: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23  E_UNIX_THREADS.#
1230: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
1240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
1250: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
1260: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65  /*.** Set or che
1280: 63 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69  ck the OsFile.ti
1290: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
12a0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
12b0: 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73   an OsFile.** is
12c0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
12d0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
12e0: 73 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c  ses of the OsFil
12f0: 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1300: 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64  e.** same thread
1310: 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e   is operating on
1320: 20 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f   the OsFile.  So
1330: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
1340: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
1350: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
1360: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
1370: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
1380: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
1390: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
13a0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
13b0: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
13c0: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
13d0: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
13e0: 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c  another.  This l
13f0: 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20  ogic makes sure 
1400: 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  a user does not 
1410: 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a  try to do that.*
1420: 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a  * by mistake..**
1430: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
1440: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
1450: 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20   OsFiles can be 
1460: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
1470: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
1480: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
1490: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
14a0: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
14b0: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
14c0: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
14d0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
14e0: 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d  (which now the m
14f0: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
1500: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
1510: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
1520: 20 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65    But the OsFile
1530: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
1540: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
1550: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
1560: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
1570: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
1580: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
1590: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
15a0: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
15b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15c0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
15d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15e0: 55 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20  UNIX_THREADS).# 
15f0: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
1600: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
1610: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
1620: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
1630: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
1640: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1650: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
1660: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
1690: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
16a0: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
16b0: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
16c0: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
16d0: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
16e0: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
16f0: 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68  /*.** Here is th
1700: 65 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20  e dirt on POSIX 
1710: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20  advisory locks: 
1720: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
1730: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
1740: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
1750: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
1760: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
1770: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
1780: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
1790: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
17a0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
17b0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
17c0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
17d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
17e0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
17f0: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
1800: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
1810: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
1820: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
1830: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
1840: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
1850: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
1860: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
1870: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
1880: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
1890: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
18a0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
18b0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
18c0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
18d0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
18e0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
18f0: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
1900: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
1910: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
1920: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
1930: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
1940: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
1950: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
1960: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
1970: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
1980: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1990: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
19a0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
19b0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
19c0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
19d0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
19e0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
19f0: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
1a00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
1a10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
1a20: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
1a30: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
1a40: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
1a50: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
1a60: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
1a70: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
1a80: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
1a90: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
1aa0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
1ab0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1ac0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
1ad0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
1ae0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
1af0: 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66  *.** Bummer.  If
1b00: 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69   you ask me, thi
1b10: 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61  s is broken.  Ba
1b20: 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20  dly broken.  It 
1b30: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
1b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
1b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
1b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
1b70: 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70  ss among.** comp
1b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
1b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
1bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
1bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
1bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
1be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
1bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
1c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
1c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
1c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
1c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
1c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
1c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
1c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
1c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
1c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
1c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
1ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
1cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
1cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
1cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
1cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
1d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
1d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
1d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
1d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
1d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
1d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
1d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
1d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
1d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
1da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
1db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
1dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
1dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
1de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
1df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
1e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
1e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
1e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
1e30: 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73  .** The OsFile s
1e40: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1e50: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1e60: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1e70: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1e80: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1e90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ea0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1eb0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1ec0: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1ed0: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1ee0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1ef0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1f00: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1f10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1f20: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1f30: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1f40: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1f50: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1f60: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1f70: 74 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69  twice, both OsFi
1f80: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
1f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
1fa0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
1fb0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
1fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1fd0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
1fe0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
1ff0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
2000: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
2010: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
2020: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
2030: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
2040: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
2050: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
2060: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
2070: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
2080: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
2090: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
20a0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
20b0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
20c0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
20d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
20e0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
20f0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
2100: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
2110: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
2120: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
2130: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2140: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
2150: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
2160: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
2170: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
2180: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
2190: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
21a0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
21b0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
21c0: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
21d0: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
21e0: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
21f0: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
2200: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
2210: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
2220: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
2230: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
2240: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2250: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
2260: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
2270: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
2280: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2290: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
22a0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
22b0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
22c0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
22d0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
22e0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
22f0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2300: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2310: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2320: 6d 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73  m, each OsFile s
2330: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
2340: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
2350: 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72  o an openCnt str
2360: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
2370: 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74  s one openCnt st
2380: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f  ructure.** per o
2390: 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68  pen inode, which
23a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74   means that mult
23b0: 69 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e  iple OsFiles can
23c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
23d0: 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20  le.** openCnt.  
23e0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
23f0: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
2400: 20 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74   an OsFile, if t
2410: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
2420: 72 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f  r OsFiles open o
2430: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
2440: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
2450: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
2460: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
2470: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2480: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
2490: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
24a0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
24b0: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
24c0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
24d0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
24e0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
24f0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2500: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2510: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2520: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2530: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
2540: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
2550: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
2560: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
2570: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
2580: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
2590: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
25a0: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
25b0: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
25c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
25d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
25e0: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
25f0: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2600: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2610: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2620: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2630: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
2640: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
2650: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
2660: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
2670: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
2680: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
2690: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
26a0: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
26b0: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
26c0: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
26d0: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
26e0: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
26f0: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2700: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2710: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2720: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2730: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
2740: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
2750: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
2760: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
2770: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
2780: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
2790: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
27a0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
27b0: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
27c0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
27d0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
27e0: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
27f0: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2800: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2810: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2820: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2830: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2840: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
2850: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
2860: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
2870: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
2880: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
2890: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
28a0: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
28b0: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
28c0: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
28d0: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
28e0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
28f0: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2900: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2910: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2920: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2930: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
2940: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
2950: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
2960: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
2970: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2980: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2990: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
29a0: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
29b0: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
29c0: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
29d0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
29e0: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
29f0: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2a00: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2a10: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2a20: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2a30: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
2a40: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
2a50: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
2a60: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
2a70: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
2a80: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
2a90: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
2aa0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2ab0: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2ac0: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2ad0: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2ae0: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2af0: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2b00: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2b10: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2b20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2b30: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2b40: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
2b50: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
2b60: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
2b70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
2b80: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2b90: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2ba0: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2bb0: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2bc0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2bd0: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2be0: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2bf0: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2c00: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2c10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2c20: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2c30: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2c40: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c60: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2c70: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2c80: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2c90: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2ca0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2cb0: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2cc0: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2cd0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2ce0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2cf0: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2d00: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2d10: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2d20: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2d30: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2d40: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2d50: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2d60: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2d70: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2d80: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2d90: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2da0: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2db0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2dc0: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2dd0: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2de0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2df0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2e00: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2e10: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2e20: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
2e30: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
2e40: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
2e50: 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64  r zero if thread
2e60: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2e70: 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e  ach other */.#en
2e80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
2e90: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2ea0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2eb0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2ec0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
2ed0: 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68  ** inode on each
2ee0: 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64   thread with a d
2ef0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
2f00: 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68   ID.  (Threads h
2f10: 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ave.** different
2f20: 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20   process IDs on 
2f30: 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f  linux, but not o
2f40: 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69  n most other uni
2f50: 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69  xes.).**.** A si
2f60: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
2f70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
2f80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
2f90: 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a  o each OsFile.**
2fa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
2fb0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
2fc0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2fd0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
2fe0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
2ff0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
3000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73  the number of Os
3010: 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74  Files pointing t
3020: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
3030: 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72  lockInfo {.  str
3040: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b  uct lockKey key;
3050: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
3060: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
3070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3080: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
3090: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
30a0: 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20    int locktype; 
30b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
30d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
30e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3100: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3110: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
3120: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
3130: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3150: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
3160: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
3170: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
3180: 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20  ticular openCnt 
3190: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
31a0: 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  its inode.  This
31b0: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
31c0: 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65  as the lockKey e
31d0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
31e0: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
31f0: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ted..*/.struct o
3200: 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74  penKey {.  dev_t
3210: 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63   dev;   /* Devic
3220: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
3230: 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e  o_t ino;   /* In
3240: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b  ode number */.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3260: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3270: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
3280: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3290: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
32a0: 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  de.  This struct
32b0: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
32c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
32d0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a   locks on that.*
32e0: 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63  * inode.  If a c
32f0: 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65  lose is attempte
3300: 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f  d against an ino
3310: 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69  de that is holdi
3320: 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65  ng.** locks, the
3330: 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72   close is deferr
3340: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63  ed until all loc
3350: 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69  ks clear by addi
3360: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ng the.** file d
3370: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
3380: 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65  closed to the pe
3390: 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nding list..*/.s
33a0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a  truct openCnt {.
33b0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79    struct openKey
33c0: 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c   key;   /* The l
33d0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
33e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
33f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3400: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
3410: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3420: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
3430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3440: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
3450: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   locks */.  int 
3460: 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20  nPending;       
3470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3480: 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f  ending close() o
3490: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
34a0: 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20  nt *aPending;   
34b0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64       /* Malloced
34c0: 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66   space holding f
34d0: 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63  d's awaiting a c
34e0: 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lose() */.};../*
34f0: 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20   .** These hash 
3500: 74 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65  tables map inode
3510: 73 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72  s and file descr
3520: 69 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20  iptors (really, 
3530: 6c 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f  lockKey and.** o
3540: 70 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65  penKey structure
3550: 73 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  s) into lockInfo
3560: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72   and openCnt str
3570: 75 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73  uctures.  Access
3580: 20 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61   to .** these ha
3590: 73 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  sh tables must b
35a0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  e protected by a
35b0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
35c0: 63 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20  c Hash lockHash 
35d0: 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  = {SQLITE_HASH_B
35e0: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
3600: 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73 71  adSafeMalloc, sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
3620: 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 73 74 61 74  ree, 0, 0};.stat
3630: 69 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73 68  ic Hash openHash
3640: 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f   = {SQLITE_HASH_
3650: 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c  BINARY, 0, 0, 0,
3660: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72   .    sqlite3Thr
3670: 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73  eadSafeMalloc, s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 46 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  Free, 0, 0};..#i
36a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
36b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
36d0: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
36e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
36f0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
3700: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
3710: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
3720: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
3730: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
3740: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3750: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3760: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3770: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3780: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3790: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
37a0: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
37b0: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37c0: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
37d0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
37e0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
37f0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
3800: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
3810: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
3820: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
3830: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
3840: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3850: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3860: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3870: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3880: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3890: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
38a0: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
38b0: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
38c0: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
38d0: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
38e0: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
38f0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
3900: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3910: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3920: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3930: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
3940: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3950: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3960: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3970: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3980: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3990: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
39a0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
39b0: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
39c0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
39d0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
39e0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 70 6f 73  edef enum {..pos
39f0: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ixLockingStyle =
3a00: 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74 61   0,       /* sta
3a10: 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76 69  ndard posix-advi
3a20: 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 09 61  sory locks */..a
3a30: 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20  fpLockingStyle, 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75              /* u
3a50: 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a  se afp locks */.
3a60: 09 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  .flockLockingSty
3a70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le,           /*
3a80: 20 75 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a   use flock() */.
3a90: 09 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  .dotlockLockingS
3aa0: 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  tyle,         /*
3ab0: 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b   use <file>.lock
3ac0: 20 66 69 6c 65 73 20 2a 2f 0a 09 6e 6f 4c 6f 63   files */..noLoc
3ad0: 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20  kingStyle,      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75          /* usefu
3af0: 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  l for read-only 
3b00: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 09  file system */..
3b10: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
3b20: 6e 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20  ngStyle      /* 
3b30: 69 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70  indicates unsupp
3b40: 6f 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65  orted file syste
3b50: 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f  m */.} sqlite3Lo
3b60: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64  ckingStyle;.#end
3b70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
3b80: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3b90: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
3ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
3bb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
3bc0: 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65  able records whe
3bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
3be0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
3bf0: 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20   each others.** 
3c00: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  locks..**.**    
3c10: 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73  0:  No.  Threads
3c20: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
3c30: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
3c40: 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65  ks..**    1:  Ye
3c50: 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20  s.  Threads can 
3c60: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3c70: 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20  hers locks..**  
3c80: 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b   -1:  We don't k
3c90: 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f  now yet..**.** O
3ca0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
3cb0: 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  we know at compi
3cc0: 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61  le-time if threa
3cd0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3ce0: 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c  each.** others l
3cf0: 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20  ocks.  On those 
3d00: 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c  systems, the SQL
3d10: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3d20: 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a  IDE_LOCK macro.*
3d30: 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70  * will be set ap
3d40: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e  propriately.  On
3d50: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20   other systems, 
3d60: 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b  we have to check
3d70: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20   at.** runtime. 
3d80: 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72   On these latter
3d90: 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45   systems, SQLTIE
3da0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3db0: 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65  _LOCK is.** unde
3dc0: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  fined..**.** Thi
3dd0: 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61  s variable norma
3de0: 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f  lly has file sco
3df0: 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75  pe only.  But du
3e00: 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65  ring testing, we
3e10: 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c   make.** it a gl
3e20: 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  obal so that the
3e30: 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63   test code can c
3e40: 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20  hange its value 
3e50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
3e60: 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  fy.** that the r
3e70: 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65  ight stuff happe
3e80: 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  ns in either cas
3e90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
3ea0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3eb0: 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RIDE_LOCK.# defi
3ec0: 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ne SQLITE_THREAD
3ed0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d  _OVERRIDE_LOCK -
3ee0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  1.#endif.#ifdef 
3ef0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
3f00: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
3f10: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
3f20: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3f30: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65  VERRIDE_LOCK;.#e
3f40: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
3f50: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3f60: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3f70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3f80: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e  ERRIDE_LOCK;.#en
3f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3fa0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
3fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
3fc0: 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75  ed into individu
3fd0: 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61  al test.** threa
3fe0: 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68  ds by the testTh
3ff0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4000: 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ior() routine..*
4010: 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54  /.struct threadT
4020: 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  estData {.  int 
4030: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
4040: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65     /* File to be
4050: 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72   locked */.  str
4060: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20  uct flock lock; 
4070: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69      /* The locki
4080: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
4090: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20    int result;   
40a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
40b0: 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  lt of the lockin
40c0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d  g operation */.}
40d0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
40e0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
40f0: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
4100: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
4110: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
4120: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
4130: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4140: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
4150: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
4160: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
4170: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
4180: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
4190: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
41a0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
41b0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
41c0: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
41d0: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
41e0: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
41f0: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
4200: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
4210: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
4220: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
4230: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
4240: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
4250: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
4260: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
4270: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
4280: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
4290: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
42a0: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
42b0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
42c0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
42d0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c     s = fcntl(fd,
42e0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
42f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4300: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
4310: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
4320: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
4330: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
4340: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
4350: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
4360: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
4370: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
4380: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
4390: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
43a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
43b0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
43c0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
43d0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
43e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
43f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
4400: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
4410: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
4420: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4430: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
4440: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
4450: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4460: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
4470: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
4480: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
4490: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
44a0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
44b0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
44c0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
44d0: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
44e0: 20 73 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c   s && op==F_SETL
44f0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4500: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
4510: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
4520: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
4530: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
4540: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
4550: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4560: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4570: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4580: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4590: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
45a0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
45b0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
45c0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
45d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
45e0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
45f0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4600: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4620: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4630: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4640: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4650: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4660: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4670: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4680: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4690: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
46a0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
46b0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
46c0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
46d0: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
46e0: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
46f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4700: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
4710: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
4720: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4730: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
4740: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
4750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
4760: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4770: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4780: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4790: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
47a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
47b0: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
47c0: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
47d0: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
47e0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
47f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4800: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
4810: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
4820: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
4830: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
4840: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4870: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4880: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4890: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
48a0: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
48b0: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
48c0: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
48d0: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
48e0: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
48f0: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4900: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
4910: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4920: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
4930: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
4940: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
4950: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
4960: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4970: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4980: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4990: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49a0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
49b0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
49c0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
49d0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
49e0: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
49f0: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a00: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4a10: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4a20: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4a30: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4a40: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4a50: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4a60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4a70: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4a80: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4a90: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4aa0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4ab0: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4ac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4ad0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4ae0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4af0: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b00: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4b10: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4b20: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4b30: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4b40: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4b50: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4b60: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4b70: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4b80: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4b90: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4bb0: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4bc0: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4bd0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4be0: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4bf0: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c00: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4c10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4c20: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4c40: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4c50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4c60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4c70: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4c80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4c90: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4ca0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4cb0: 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ck){.  assert( s
4cc0: 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
4cd0: 31 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63  1) );.  if (pLoc
4ce0: 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72  k == NULL).    r
4cf0: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e  eturn;.  pLock->
4d00: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c  nRef--;.  if( pL
4d10: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
4d20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4d30: 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c  nsert(&lockHash,
4d40: 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69   &pLock->key, si
4d50: 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29  zeof(pLock->key)
4d60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4d70: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
4d80: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4d90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
4da0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4db0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4dc0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
4dd0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
4de0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
4df0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4e00: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4e10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4e20: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4e30: 20 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e    if (pOpen == N
4e40: 55 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b  ULL).    return;
4e50: 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d  .  pOpen->nRef--
4e60: 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e  ;.  if( pOpen->n
4e70: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Ref==0 ){.    sq
4e80: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4e90: 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65  &openHash, &pOpe
4ea0: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  n->key, sizeof(p
4eb0: 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Open->key), 0);.
4ec0: 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e      free(pOpen->
4ed0: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73  aPending);.    s
4ee0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
4ef0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d  Free(pOpen);.  }
4f00: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4f10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
4f20: 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73  _STYLE./*.** Tes
4f30: 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20  ts a byte-range 
4f40: 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f  locking query to
4f50: 20 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e   see if byte ran
4f60: 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a  ge locks are .**
4f70: 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e   supported, if n
4f80: 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  ot we fall back 
4f90: 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  to dotlockLockin
4fa0: 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  gStyle..*/.stati
4fb0: 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67  c sqlite3Locking
4fc0: 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73  Style sqlite3Tes
4fd0: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f  tLockingStyle(co
4fe0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
4ff0: 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b  th, .  int fd) {
5000: 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d  .  /* test byte-
5010: 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
5020: 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75   fcntl */.  stru
5030: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
5040: 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f  o;.  .  lockInfo
5050: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
5060: 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
5070: 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
5080: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
5090: 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
50a0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
50b0: 0a 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28  .  .  if (fcntl(
50c0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  fd, F_GETLK, &lo
50d0: 63 6b 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 7b  ckInfo) != -1) {
50e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69  .    return posi
50f0: 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  xLockingStyle;. 
5100: 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73 74   } .  .  /* test
5110: 69 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63 61  ing for flock ca
5120: 6e 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73  n give false pos
5130: 69 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69  itives.  So if i
5140: 66 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74  f the above test
5150: 0a 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68 65  .  ** fails, the
5160: 6e 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  n we fall back t
5170: 6f 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b  o using dot-lock
5180: 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a   style locking..
5190: 20 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20    */  .  return 
51a0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
51b0: 79 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45  yle;.}../* .** E
51c0: 78 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66 73  xamines the f_fs
51d0: 74 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69  typename entry i
51e0: 6e 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72  n the statfs str
51f0: 75 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e  ucture as return
5200: 65 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28 29  ed by .** stat()
5210: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73 79   for the file sy
5220: 73 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65  stem hosting the
5230: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
5240: 61 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a 20  assigns the .** 
5250: 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
5260: 69 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20  ing style based 
5270: 6f 6e 20 69 74 27 73 20 76 61 6c 75 65 2e 20 20  on it's value.  
5280: 54 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64  These values and
5290: 20 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73   .** assignments
52a0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61   are based on Da
52b0: 72 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f  rwin/OSX behavio
52c0: 72 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62  r and have not b
52d0: 65 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a  een tested on .*
52e0: 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e  * other systems.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
5300: 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73  e3LockingStyle s
5310: 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b  qlite3DetectLock
5320: 69 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63  ingStyle(const c
5330: 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a  har *filePath, .
5340: 20 20 69 6e 74 20 66 64 29 20 7b 0a 0a 23 69 66    int fd) {..#if
5350: 64 65 66 20 53 51 4c 49 54 45 5f 46 49 58 45 44  def SQLITE_FIXED
5360: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
5370: 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
5380: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 29 53 51 4c  LockingStyle)SQL
5390: 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e  ITE_FIXED_LOCKIN
53a0: 47 5f 53 54 59 4c 45 3b 0a 23 65 6c 73 65 0a 20  G_STYLE;.#else. 
53b0: 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
53c0: 73 49 6e 66 6f 3b 0a 0a 20 20 69 66 20 28 73 74  sInfo;..  if (st
53d0: 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
53e0: 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 29 0a 20  fsInfo) == -1). 
53f0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
5400: 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  3TestLockingStyl
5410: 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b  e(filePath, fd);
5420: 0a 20 20 0a 20 20 69 66 20 28 66 73 49 6e 66 6f  .  .  if (fsInfo
5430: 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52  .f_flags & MNT_R
5440: 44 4f 4e 4c 59 29 0a 20 20 20 20 72 65 74 75 72  DONLY).    retur
5450: 6e 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  n noLockingStyle
5460: 3b 0a 20 20 0a 20 20 69 66 28 20 28 21 73 74 72  ;.  .  if( (!str
5470: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
5480: 79 70 65 6e 61 6d 65 2c 20 22 68 66 73 22 29 29  ypename, "hfs"))
5490: 20 7c 7c 0a 20 20 20 20 28 21 73 74 72 63 6d 70   ||.    (!strcmp
54a0: 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
54b0: 6e 61 6d 65 2c 20 22 75 66 73 22 29 29 20 29 0a  name, "ufs")) ).
54c0: 09 09 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f  ..return posixLo
54d0: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20  ckingStyle;.  . 
54e0: 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e   if(!strcmp(fsIn
54f0: 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
5500: 20 22 61 66 70 66 73 22 29 29 0a 20 20 20 20 72   "afpfs")).    r
5510: 65 74 75 72 6e 20 61 66 70 4c 6f 63 6b 69 6e 67  eturn afpLocking
5520: 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21  Style;.  .  if(!
5530: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
5540: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
5550: 22 29 29 20 0a 20 20 20 20 72 65 74 75 72 6e 20  ")) .    return 
5560: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5570: 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68  ngStyle(filePath
5580: 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 28 21  , fd);.  .  if(!
5590: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
55a0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62  fstypename, "smb
55b0: 66 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e  fs")).    return
55c0: 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79   flockLockingSty
55d0: 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72  le;.  .  if(!str
55e0: 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
55f0: 79 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22  ypename, "msdos"
5600: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 64 6f  )).    return do
5610: 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  tlockLockingStyl
5620: 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63  e;.  .  if(!strc
5630: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
5640: 70 65 6e 61 6d 65 2c 20 22 77 65 62 64 61 76 22  pename, "webdav"
5650: 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  )).    return un
5660: 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67  supportedLocking
5670: 53 74 79 6c 65 3b 0a 20 20 0a 20 20 72 65 74 75  Style;.  .  retu
5680: 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f  rn sqlite3TestLo
5690: 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50  ckingStyle(fileP
56a0: 61 74 68 2c 20 66 64 29 3b 20 20 0a 23 65 6e 64  ath, fd);  .#end
56b0: 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 46 49 58  if // SQLITE_FIX
56c0: 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ED_LOCKING_STYLE
56d0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
56e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
56f0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
5700: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
5710: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
5720: 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64  ate lockInfo and
5730: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
5740: 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  res that.** desc
5750: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
5760: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
5770: 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20  ate new ones if 
5780: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
5790: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ** return values
57a0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
57b0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
57c0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
57d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
57e0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
57f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
5800: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74  dLockInfo(.  int
5810: 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20   fd,            
5820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5840: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
5850: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
5860: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
5870: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
5880: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
5890: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
58a0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
58b0: 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65  pOpen      /* Re
58c0: 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74  turn the openCnt
58d0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
58e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
58f0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79    struct lockKey
5900: 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20   key1;.  struct 
5910: 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20  openKey key2;.  
5920: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
5930: 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  buf;.  struct lo
5940: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
5950: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
5960: 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66  *pOpen;.  rc = f
5970: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
5980: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
5990: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 61  ) return 1;..  a
59a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73  ssert( sqlite3Os
59b0: 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20 20  InMutex(1) );.  
59c0: 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c  memset(&key1, 0,
59d0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a   sizeof(key1));.
59e0: 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61    key1.dev = sta
59f0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
5a00: 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey1.ino = statbu
5a10: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65 66  f.st_ino;.#ifdef
5a20: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
5a30: 45 41 44 53 0a 20 20 69 66 28 20 74 68 72 65 61  EADS.  if( threa
5a40: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
5a50: 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20  hersLocks<0 ){. 
5a60: 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63     testThreadLoc
5a70: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29  kingBehavior(fd)
5a80: 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64  ;.  }.  key1.tid
5a90: 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69   = threadsOverri
5aa0: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
5ab0: 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f  s ? 0 : pthread_
5ac0: 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20  self();.#endif. 
5ad0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30   memset(&key2, 0
5ae0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b  , sizeof(key2));
5af0: 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74  .  key2.dev = st
5b00: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20  atbuf.st_dev;.  
5b10: 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62  key2.ino = statb
5b20: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f  uf.st_ino;.  pLo
5b30: 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63  ck = (struct loc
5b40: 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61  kInfo*)sqlite3Ha
5b50: 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68  shFind(&lockHash
5b60: 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28  , &key1, sizeof(
5b70: 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c  key1));.  if( pL
5b80: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ock==0 ){.    st
5b90: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70  ruct lockInfo *p
5ba0: 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  Old;.    pLock =
5bb0: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
5bc0: 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
5bd0: 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20  (*pLock) );.    
5be0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5bf0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5c00: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5c10: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5c20: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79  }.    pLock->key
5c30: 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f   = key1;.    pLo
5c40: 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ck->nRef = 1;.  
5c50: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
5c60: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
5c70: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ktype = 0;.    p
5c80: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
5c90: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
5ca0: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
5cb0: 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c  sizeof(key1), pL
5cc0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ock);.    if( pO
5cd0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ld!=0 ){.      a
5ce0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f  ssert( pOld==pLo
5cf0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ck );.      sqli
5d00: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
5d10: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
5d20: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5d30: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5d40: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  info;.    }.  }e
5d50: 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  lse{.    pLock->
5d60: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
5d70: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
5d80: 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29   if( ppOpen!=0 )
5d90: 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73  {.    pOpen = (s
5da0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73  truct openCnt*)s
5db0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
5dc0: 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c  openHash, &key2,
5dd0: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5de0: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
5df0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
5e00: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
5e10: 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71        pOpen = sq
5e20: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
5e30: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
5e40: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69  Open) );.      i
5e50: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
5e60: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f         releaseLo
5e70: 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20  ckInfo(pLock);. 
5e80: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
5e90: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
5ea0: 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20  _findlockinfo;. 
5eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
5ec0: 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a  en->key = key2;.
5ed0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65        pOpen->nRe
5ee0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  f = 1;.      pOp
5ef0: 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20  en->nLock = 0;. 
5f00: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e       pOpen->nPen
5f10: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  ding = 0;.      
5f20: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
5f30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20  = 0;.      pOld 
5f40: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5f50: 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26  ert(&openHash, &
5f60: 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65  pOpen->key, size
5f70: 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29  of(key2), pOpen)
5f80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64  ;.      if( pOld
5f90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5fa0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70  ssert( pOld==pOp
5fb0: 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  en );.        sq
5fc0: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
5fd0: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20  ree(pOpen);.    
5fe0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
5ff0: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
6000: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
6010: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
6020: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
6030: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6040: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
6050: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ++;.    }.    *p
6060: 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20  pOpen = pOpen;. 
6070: 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63   }..exit_findloc
6080: 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20  kinfo:.  return 
6090: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
60a0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
60b0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
60c0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
60d0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
60e0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
60f0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
6100: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
6110: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
6120: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
6130: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
6140: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
6150: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6160: 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69   *locktypeName(i
6170: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
6180: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
6190: 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f   ){.  case NO_LO
61a0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45  CK: return "NONE
61b0: 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45 44  ";.  case SHARED
61c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
61d0: 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52  HARED";.  case R
61e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
61f0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
6200: 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f  .  case PENDING_
6210: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45  LOCK: return "PE
6220: 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45  NDING";.  case E
6230: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72  XCLUSIVE_LOCK: r
6240: 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45  eturn "EXCLUSIVE
6250: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
6260: 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69  "ERROR";.}.#endi
6270: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  f../*.** If we a
6280: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
6290: 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65  a different thre
62a0: 61 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65  ad than the thre
62b0: 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75  ad that the.** u
62c0: 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74  nixFile argument
62d0: 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65   belongs to, the
62e0: 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72  n transfer owner
62f0: 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78  ship of the unix
6300: 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  File.** over to 
6310: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
6320: 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78  ad..**.** A unix
6330: 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e  File is only own
6340: 65 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f  ed by a thread o
6350: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
6360: 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a  one thread is.**
6370: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72   unable to overr
6380: 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65  ide locks create
6390: 64 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  d by a different
63a0: 20 74 68 72 65 61 64 2e 20 20 52 65 64 48 61 74   thread.  RedHat
63b0: 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70  9 is.** an examp
63c0: 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73 79 73  le of such a sys
63d0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72  tem..**.** Owner
63e0: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
63f0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66   only allowed if
6400: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6410: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
6420: 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75  ked..** If the u
6430: 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65  nixFile is locke
6440: 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68  d and an ownersh
6450: 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65  ip is wrong, the
6460: 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  n return.** SQLI
6470: 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49  TE_MISUSE.  SQLI
6480: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
6490: 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
64a0: 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  works..*/.#ifdef
64b0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
64c0: 45 41 44 53 0a 73 74 61 74 69 63 20 69 6e 74 20  EADS.static int 
64d0: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
64e0: 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  p(unixFile *pFil
64f0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
6500: 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b  pthread_t hSelf;
6510: 0a 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76  .  if( threadsOv
6520: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
6530: 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20  Locks ){.    /* 
6540: 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66  Ownership transf
6550: 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  ers not needed o
6560: 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f  n this system */
6570: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6580: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65  TE_OK;.  }.  hSe
6590: 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c  lf = pthread_sel
65a0: 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65  f();.  if( pthre
65b0: 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e  ad_equal(pFile->
65c0: 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20  tid, hSelf) ){. 
65d0: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69     /* We are sti
65e0: 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  ll in the same t
65f0: 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 54 52 41  hread */.    TRA
6600: 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65 72  CE1("No-transfer
6610: 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e 22  , same thread\n"
6620: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6630: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
6640: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
6650: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe!=NO_LOCK ){. 
6660: 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20     /* We cannot 
6670: 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69 70  change ownership
6680: 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68 6f   while we are ho
6690: 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a 2f  lding a lock! */
66a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66b0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
66c0: 20 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65   TRACE4("Transfe
66d0: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
66e0: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
66f0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 70 46 69  n", pFile->h,pFi
6700: 6c 65 2d 3e 74 69 64 2c 68 53 65 6c 66 29 3b 0a  le->tid,hSelf);.
6710: 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68    pFile->tid = h
6720: 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c  Self;.  if (pFil
6730: 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c  e->pLock != NULL
6740: 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ) {.    releaseL
6750: 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70  ockInfo(pFile->p
6760: 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  Lock);.    rc = 
6770: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69  findLockInfo(pFi
6780: 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e 70  le->h, &pFile->p
6790: 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 54 52  Lock, 0);.    TR
67a0: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
67b0: 20 69 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64   is now %s(%s,%d
67c0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
67d0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
67e0: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
67f0: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
6800: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
6810: 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  e(pFile->pLock->
6820: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65  locktype), pFile
6830: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20  ->pLock->cnt);. 
6840: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6850: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
6860: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6870: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20   }.}.#else.  /* 
6880: 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64  On single-thread
6890: 65 64 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72  ed builds, owner
68a0: 73 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73  ship transfer is
68b0: 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65   a no-op */.# de
68c0: 66 69 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e  fine transferOwn
68d0: 65 72 73 68 69 70 28 58 29 20 53 51 4c 49 54 45  ership(X) SQLITE
68e0: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
68f0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
6900: 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73  ed file.*/.int s
6910: 71 6c 69 74 65 33 55 6e 69 78 44 65 6c 65 74 65  qlite3UnixDelete
6920: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
6930: 6c 65 6e 61 6d 65 29 7b 0a 20 20 75 6e 6c 69 6e  lename){.  unlin
6940: 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
6950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6970: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
6980: 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73 2e  med file exists.
6990: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
69a0: 6e 69 78 46 69 6c 65 45 78 69 73 74 73 28 63 6f  nixFileExists(co
69b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
69c0: 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 61  ame){.  return a
69d0: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
69e0: 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f   0)==0;.}../* Fo
69f0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
6a00: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
6a10: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
6a20: 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  (.  int h,      
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a40: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
6a50: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
6a60: 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a  e */.  OsFile **
6a70: 70 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  pId,            
6a80: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
6a90: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
6aa0: 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  or here */.  con
6ab0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6ac0: 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  me,    /* Name o
6ad0: 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
6ae0: 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
6af0: 20 64 65 6c 46 6c 61 67 20 20 20 20 20 20 20 20   delFlag        
6b00: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
6b10: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
6b20: 20 66 69 6c 65 20 64 65 6c 65 74 65 73 20 6f 6e   file deletes on
6b30: 20 63 6c 6f 73 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a   close */.);../*
6b40: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
6b50: 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72 20 62  pen a file for b
6b60: 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20  oth reading and 
6b70: 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74 68 61  writing.  If tha
6b80: 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72 79 20  t.** fails, try 
6b90: 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61 64 2d  opening it read-
6ba0: 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20 66 69  only.  If the fi
6bb0: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
6bc0: 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63 72 65  t,.** try to cre
6bd0: 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ate it..**.** On
6be0: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
6bf0: 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  le for the open 
6c00: 66 69 6c 65 20 69 73 20 77 72 69 74 74 65 6e 20  file is written 
6c10: 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70  to *id.** and *p
6c20: 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65 74 20  Readonly is set 
6c30: 74 6f 20 30 20 69 66 20 74 68 65 20 66 69 6c 65  to 0 if the file
6c40: 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f 72 20   was opened for 
6c50: 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77  reading and.** w
6c60: 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66 20 74  riting or 1 if t
6c70: 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
6c80: 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54  ed read-only.  T
6c90: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
6ca0: 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  rns.** SQLITE_OK
6cb0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
6cc0: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  re, the function
6cd0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
6ce0: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61  CANTOPEN and lea
6cf0: 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a  ves.** *id and *
6d00: 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e  pReadonly unchan
6d10: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
6d20: 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 57  te3UnixOpenReadW
6d30: 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  rite(.  const ch
6d40: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  ar *zFilename,. 
6d50: 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20   OsFile **pId,. 
6d60: 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a   int *pReadonly.
6d70: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20  ){.  int h;.  . 
6d80: 20 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52   CRASH_TEST_OVER
6d90: 52 49 44 45 28 73 71 6c 69 74 65 33 43 72 61 73  RIDE(sqlite3Cras
6da0: 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65 2c 20  hOpenReadWrite, 
6db0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20  zFilename, pId, 
6dc0: 70 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 61 73  pReadonly);.  as
6dd0: 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b  sert( 0==*pId );
6de0: 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c  .  h = open(zFil
6df0: 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ename, O_RDWR|O_
6e00: 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c  CREAT|O_LARGEFIL
6e10: 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20  E|O_BINARY,.    
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
6e40: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
6e50: 4f 4e 53 29 3b 0a 20 20 69 66 28 20 68 3c 30 20  ONS);.  if( h<0 
6e60: 29 7b 0a 23 69 66 64 65 66 20 45 49 53 44 49 52  ){.#ifdef EISDIR
6e70: 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d  .    if( errno==
6e80: 45 49 53 44 49 52 20 29 7b 0a 20 20 20 20 20 20  EISDIR ){.      
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
6ea0: 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 23 65  NTOPEN;.    }.#e
6eb0: 6e 64 69 66 0a 20 20 20 20 68 20 3d 20 6f 70 65  ndif.    h = ope
6ec0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6ed0: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c  DONLY|O_LARGEFIL
6ee0: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 20  E|O_BINARY);.   
6ef0: 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20   if( h<0 ){.    
6f00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6f10: 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d  CANTOPEN; .    }
6f20: 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20  .    *pReadonly 
6f30: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
6f40: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30    *pReadonly = 0
6f50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
6f60: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
6f70: 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d  h, pId, zFilenam
6f80: 65 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  e, 0);.}.../*.**
6f90: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
6fa0: 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20   a new file for 
6fb0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
6fc0: 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73   by this process
6fd0: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77 69  ..** The file wi
6fe0: 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72  ll be opened for
6ff0: 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
7000: 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20 61  d writing.  To a
7010: 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74  void.** a potent
7020: 69 61 6c 20 73 65 63 75 72 69 74 79 20 70 72 6f  ial security pro
7030: 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20  blem, we do not 
7040: 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74  allow the file t
7050: 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  o have.** previo
7060: 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 4e  usly existed.  N
7070: 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74  or do we allow t
7080: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61 20  he file to be a 
7090: 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b  symbolic.** link
70a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c  ..**.** If delFl
70b0: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
70c0: 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e   make arrangemen
70d0: 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ts to automatica
70e0: 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  lly delete.** th
70f0: 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  e file when it i
7100: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
7110: 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74  On success, writ
7120: 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  e the file handl
7130: 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72  e into *id and r
7140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
7150: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72  .**.** On failur
7160: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
7170: 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e  _CANTOPEN..*/.in
7180: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65  t sqlite3UnixOpe
7190: 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74  nExclusive(const
71a0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
71b0: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20  , OsFile **pId, 
71c0: 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20  int delFlag){.  
71d0: 69 6e 74 20 68 3b 0a 0a 20 20 43 52 41 53 48 5f  int h;..  CRASH_
71e0: 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71  TEST_OVERRIDE(sq
71f0: 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78  lite3CrashOpenEx
7200: 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65 6e 61  clusive, zFilena
7210: 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c 61 67  me, pId, delFlag
7220: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
7230: 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70  *pId );.  h = op
7240: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  en(zFilename,.  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 5f                O_
7260: 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45  RDWR|O_CREAT|O_E
7270: 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 7c 4f  XCL|O_NOFOLLOW|O
7280: 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
7290: 41 52 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ARY,.           
72a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
72b0: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
72c0: 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 68 3c 30  IONS);.  if( h<0
72d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
72e0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
72f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c    }.  return all
7300: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 68 2c  ocateUnixFile(h,
7310: 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c   pId, zFilename,
7320: 20 64 65 6c 46 6c 61 67 29 3b 0a 7d 0a 0a 2f 2a   delFlag);.}../*
7330: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
7340: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
7350: 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63  or read-only acc
7360: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ess..**.** On su
7370: 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65  ccess, write the
7380: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74   file handle int
7390: 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e  o *id and return
73a0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
73b0: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65  * On failure, re
73c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
73d0: 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OPEN..*/.int sql
73e0: 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64  ite3UnixOpenRead
73f0: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
7400: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
7410: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74  le **pId){.  int
7420: 20 68 3b 0a 20 20 0a 20 20 43 52 41 53 48 5f 54   h;.  .  CRASH_T
7430: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c  EST_OVERRIDE(sql
7440: 69 74 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61  ite3CrashOpenRea
7450: 64 4f 6e 6c 79 2c 20 7a 46 69 6c 65 6e 61 6d 65  dOnly, zFilename
7460: 2c 20 70 49 64 2c 20 30 29 3b 0a 20 20 61 73 73  , pId, 0);.  ass
7470: 65 72 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a  ert( 0==*pId );.
7480: 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65    h = open(zFile
7490: 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
74a0: 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
74b0: 41 52 59 29 3b 0a 20 20 69 66 28 20 68 3c 30 20  ARY);.  if( h<0 
74c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
74d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
74e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f   }.  return allo
74f0: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 68 2c 20  cateUnixFile(h, 
7500: 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  pId, zFilename, 
7510: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
7520: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
7530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7540: 6f 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  or the directory
7550: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
7560: 0a 2a 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20  .** file.  This 
7570: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
7580: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66  can be used to f
7590: 73 79 6e 63 28 29 20 74 68 65 20 64 69 72 65 63  sync() the direc
75a0: 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tory.** in order
75b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
75c0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20  e creation of a 
75d0: 6e 65 77 20 66 69 6c 65 20 69 73 20 61 63 74 75  new file is actu
75e0: 61 6c 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ally written.** 
75f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
7600: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
7610: 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66  nly meaningful f
7620: 6f 72 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20  or Unix.  It is 
7630: 61 20 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a  a no-op under.**
7640: 20 77 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77   windows since w
7650: 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
7660: 73 75 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e  support hard lin
7670: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 46 55 4c  ks..**.** If FUL
7680: 4c 5f 46 53 59 4e 43 20 69 73 20 65 6e 61 62 6c  L_FSYNC is enabl
7690: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
76a0: 6e 20 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20  n is not longer 
76b0: 75 73 65 66 75 6c 2c 20 0a 2a 2a 20 61 20 46 55  useful, .** a FU
76c0: 4c 4c 5f 46 53 59 4e 43 20 73 79 6e 63 20 61 70  LL_FSYNC sync ap
76d0: 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 70 65 6e  plies to all pen
76e0: 64 69 6e 67 20 64 69 73 6b 20 6f 70 65 72 61 74  ding disk operat
76f0: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ions..**.** On s
7700: 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65  uccess, a handle
7710: 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c   for a previousl
7720: 79 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 2a  y open file at *
7730: 69 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64  id is.** updated
7740: 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69   with the new di
7750: 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
7760: 63 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49  criptor and SQLI
7770: 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75  TE_OK is.** retu
7780: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  rned..**.** On f
7790: 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63  ailure, the func
77a0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
77b0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64  ITE_CANTOPEN and
77c0: 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75   leaves.** *id u
77d0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
77e0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e  tic int unixOpen
77f0: 44 69 72 65 63 74 6f 72 79 28 0a 20 20 4f 73 46  Directory(.  OsF
7800: 69 6c 65 20 2a 69 64 2c 0a 20 20 63 6f 6e 73 74  ile *id,.  const
7810: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 0a   char *zDirname.
7820: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
7830: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
7840: 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
7850: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44  e==0 ){.    /* D
7860: 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 64  o not open the d
7870: 69 72 65 63 74 6f 72 79 20 69 66 20 74 68 65 20  irectory if the 
7880: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69  corresponding fi
7890: 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  le is not alread
78a0: 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e 20 2a  y.    ** open. *
78b0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
78c0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
78d0: 7d 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  }.  SET_THREADID
78e0: 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73 65 72  (pFile);.  asser
78f0: 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3c  t( pFile->dirfd<
7900: 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69  0 );.  pFile->di
7910: 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e  rfd = open(zDirn
7920: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
7930: 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66  BINARY, 0);.  if
7940: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3c 30  ( pFile->dirfd<0
7950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7960: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
7970: 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f  .  }.  TRACE3("O
7980: 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
7990: 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c  ", pFile->dirfd,
79a0: 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 72 65   zDirname);.  re
79b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
79c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
79d0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
79e0: 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73   variable points
79f0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69   to a string whi
7a00: 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d  ch is the.** nam
7a10: 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
7a20: 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65  , then that dire
7a30: 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73  ctory will be us
7a40: 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74  ed to store.** t
7a50: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
7a60: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
7a70: 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f  he "PRAGMA temp_
7a80: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
7a90: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
7aa0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
7ab0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
7ac0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  0;../*.** Create
7ad0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
7ae0: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
7af0: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
7b00: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
7b10: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c  old at least SQL
7b20: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
7b30: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  E characters..*/
7b40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
7b50: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61  TempFileName(cha
7b60: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  r *zBuf){.  stat
7b70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
7b80: 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
7b90: 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74   0,.     "/var/t
7ba0: 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f  mp",.     "/usr/
7bb0: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70  tmp",.     "/tmp
7bc0: 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d  ",.     ".",.  }
7bd0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
7be0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
7bf0: 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
7c00: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
7c10: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
7c20: 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
7c30: 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
7c40: 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
7c50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75  int i, j;.  stru
7c60: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
7c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
7c80: 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72 73 5b  = ".";.  azDirs[
7c90: 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  0] = sqlite3_tem
7ca0: 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 66  p_directory;.  f
7cb0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7cc0: 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
7cd0: 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29  azDirs[0]); i++)
7ce0: 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73  {.    if( azDirs
7cf0: 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
7d00: 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28  e;.    if( stat(
7d10: 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29  azDirs[i], &buf)
7d20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d30: 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75   if( !S_ISDIR(bu
7d40: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e  f.st_mode) ) con
7d50: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61  tinue;.    if( a
7d60: 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c  ccess(azDirs[i],
7d70: 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b   07) ) continue;
7d80: 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69  .    zDir = azDi
7d90: 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b  rs[i];.    break
7da0: 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20 20  ;.  }.  do{.    
7db0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
7dc0: 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  s/"TEMP_FILE_PRE
7dd0: 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
7de0: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
7df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  ;.    sqlite3Ran
7e00: 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
7e10: 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
7e20: 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
7e30: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
7e40: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
7e50: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
7e60: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
7e70: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
7e80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
7e90: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
7ea0: 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
7eb0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
7ec0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
7ed0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
7ee0: 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d   a given pathnam
7ef0: 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  e is a directory
7f00: 20 61 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65   and is writable
7f10: 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   .**.*/.int sqli
7f20: 74 65 33 55 6e 69 78 49 73 44 69 72 57 72 69 74  te3UnixIsDirWrit
7f30: 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75 66 29  able(char *zBuf)
7f40: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
7f50: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
7f60: 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  MAS.  struct sta
7f70: 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a 42 75  t buf;.  if( zBu
7f80: 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  f==0 ) return 0;
7f90: 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d 3d 3d  .  if( zBuf[0]==
7fa0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7fb0: 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c 20 26  if( stat(zBuf, &
7fc0: 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  buf) ) return 0;
7fd0: 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28  .  if( !S_ISDIR(
7fe0: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72  buf.st_mode) ) r
7ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61  eturn 0;.  if( a
8000: 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37 29 20  ccess(zBuf, 07) 
8010: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
8020: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8030: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
8040: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
8050: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
8060: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
8070: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
8080: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
8090: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
80a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
80b0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
80c0: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
80d0: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
80e0: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
80f0: 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
8100: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
8110: 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
8120: 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 50 52 45  ;.#ifdef USE_PRE
8130: 41 44 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64  AD.  got = pread
8140: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
8150: 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a  t, id->offset);.
8160: 23 65 6c 73 65 0a 20 20 6c 73 65 65 6b 28 69 64  #else.  lseek(id
8170: 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c  ->h, id->offset,
8180: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 67 6f   SEEK_SET);.  go
8190: 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20  t = read(id->h, 
81a0: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
81b0: 69 66 0a 20 20 69 66 28 20 67 6f 74 3e 30 20 29  if.  if( got>0 )
81c0: 7b 0a 20 20 20 20 69 64 2d 3e 6f 66 66 73 65 74  {.    id->offset
81d0: 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72   += got;.  }.  r
81e0: 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a  eturn got;.}../*
81f0: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
8200: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
8210: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
8220: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
8230: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
8240: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
8250: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
8260: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
8270: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
8280: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8290: 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Read(OsFile *id,
82a0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
82b0: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   amt){.  int got
82c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
82d0: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
82e0: 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
82f0: 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29  Read((unixFile*)
8300: 69 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  id, pBuf, amt);.
8310: 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54    TIMER_END;.  T
8320: 52 41 43 45 35 28 22 52 45 41 44 20 20 20 20 25  RACE5("READ    %
8330: 2d 33 64 20 25 35 64 20 25 37 64 20 25 64 5c 6e  -3d %5d %7d %d\n
8340: 22 2c 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  ", ((unixFile*)i
8350: 64 29 2d 3e 68 2c 20 67 6f 74 2c 0a 20 20 20 20  d)->h, got,.    
8360: 20 20 20 20 20 20 6c 61 73 74 5f 70 61 67 65 2c        last_page,
8370: 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
8380: 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20 53 69  .  SEEK(0);.  Si
8390: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
83a0: 6f 74 20 3d 20 2d 31 20 29 3b 0a 20 20 69 66 28  ot = -1 );.  if(
83b0: 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
83c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
83d0: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
83e0: 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ot<0 ){.    retu
83f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
8400: 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
8410: 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
8420: 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30  r*)pBuf)[got], 0
8430: 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20  , amt-got);.    
8440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
8450: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
8460: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65    }.}../*.** See
8470: 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  k to the offset 
8480: 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68  in id->offset th
8490: 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65  en read cnt byte
84a0: 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20  s into pBuf..** 
84b0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
84c0: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
84d0: 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74  lly read.  Updat
84e0: 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f  e the offset..*/
84f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
8500: 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
8510: 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69  e *id, const voi
8520: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
8530: 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69  ){.  int got;.#i
8540: 66 64 65 66 20 55 53 45 5f 50 52 45 41 44 0a 20  fdef USE_PREAD. 
8550: 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64   got = pwrite(id
8560: 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
8570: 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 23 65 6c  id->offset);.#el
8580: 73 65 0a 20 20 6c 73 65 65 6b 28 69 64 2d 3e 68  se.  lseek(id->h
8590: 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c 20 53 45  , id->offset, SE
85a0: 45 4b 5f 53 45 54 29 3b 0a 20 20 67 6f 74 20 3d  EK_SET);.  got =
85b0: 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42   write(id->h, pB
85c0: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
85d0: 0a 20 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  .  if( got>0 ){.
85e0: 20 20 20 20 69 64 2d 3e 6f 66 66 73 65 74 20 2b      id->offset +
85f0: 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72 65 74  = got;.  }.  ret
8600: 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  urn got;.}.../*.
8610: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
8620: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
8630: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
8640: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
8650: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
8660: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
8670: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
8680: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
8690: 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  Write(OsFile *id
86a0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
86b0: 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20  uf, int amt){.  
86c0: 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
86d0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
86e0: 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
86f0: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
8700: 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
8710: 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
8720: 41 6e 64 57 72 69 74 65 28 28 75 6e 69 78 46 69  AndWrite((unixFi
8730: 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20 61 6d  le*)id, pBuf, am
8740: 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
8750: 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   -= wrote;.    p
8760: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
8770: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
8780: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
8790: 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
87a0: 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64 5c  %-3d %5d %7d %d\
87b0: 6e 22 2c 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  n", ((unixFile*)
87c0: 69 64 29 2d 3e 68 2c 20 77 72 6f 74 65 2c 0a 20  id)->h, wrote,. 
87d0: 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f 70 61           last_pa
87e0: 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ge, TIMER_ELAPSE
87f0: 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20  D);.  SEEK(0);. 
8800: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
8810: 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
8820: 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
8830: 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
8840: 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
8850: 31 20 29 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e  1 ));.  if( amt>
8860: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  0 ){.    if( wro
8870: 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  te<0 ){.      re
8880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
8890: 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
88b0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
88c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
88d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
88e0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65  *.** Move the re
88f0: 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72  ad/write pointer
8900: 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   in a file..*/.s
8910: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
8920: 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ek(OsFile *id, i
8930: 36 34 20 6f 66 66 73 65 74 29 7b 0a 20 20 61 73  64 offset){.  as
8940: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 53 45  sert( id );.  SE
8950: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
8960: 20 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   1);.#ifdef SQLI
8970: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66  TE_TEST.  if( of
8980: 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44  fset ) SimulateD
8990: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
89a0: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
89b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 28 28 75 6e 69  ;.#endif.  ((uni
89c0: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f 66 66 73  xFile*)id)->offs
89d0: 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  et = offset;.  r
89e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
89f0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
8a00: 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
8a10: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
8a20: 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
8a30: 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
8a40: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
8a50: 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
8a60: 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
8a70: 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
8a80: 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
8a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
8aa0: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
8ac0: 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
8ad0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65  endif../*.** Use
8ae0: 20 74 68 65 20 66 64 61 74 61 73 79 6e 63 28 29   the fdatasync()
8af0: 20 41 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65   API only if the
8b00: 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20   HAVE_FDATASYNC 
8b10: 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
8b20: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75  ..** Otherwise u
8b30: 73 65 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74  se fsync() in it
8b40: 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e  s place..*/.#ifn
8b50: 64 65 66 20 48 41 56 45 5f 46 44 41 54 41 53 59  def HAVE_FDATASY
8b60: 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74  NC.# define fdat
8b70: 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64  async fsync.#end
8b80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  if../*.** Define
8b90: 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
8ba0: 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64  to 0 or 1 depend
8bb0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
8bc0: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46  r not.** the F_F
8bd0: 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69  ULLFSYNC macro i
8be0: 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55  s defined.  F_FU
8bf0: 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65  LLFSYNC is curre
8c00: 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61  ntly.** only ava
8c10: 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53  ilable on Mac OS
8c20: 20 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f   X.  But that co
8c30: 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23  uld change..*/.#
8c40: 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e  ifdef F_FULLFSYN
8c50: 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  C.# define HAVE_
8c60: 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73  FULLFSYNC 1.#els
8c70: 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f  e.# define HAVE_
8c80: 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64  FULLFSYNC 0.#end
8c90: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  if.../*.** The f
8ca0: 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61  sync() system ca
8cb0: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ll does not work
8cc0: 20 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f   as advertised o
8cd0: 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73  n many.** unix s
8ce0: 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c  ystems.  The fol
8cf0: 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65  lowing procedure
8d00: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
8d10: 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72  o make.** it wor
8d20: 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  k better..**.** 
8d30: 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  The SQLITE_NO_SY
8d40: 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65  NC macro disable
8d50: 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20  s all fsync()s. 
8d60: 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a   This is useful.
8d70: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77  ** for testing w
8d80: 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72  hen we want to r
8d90: 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
8da0: 65 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c  est suite quickl
8db0: 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74  y..** You are st
8dc0: 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a  rongly advised *
8dd0: 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77  not* to deploy w
8de0: 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ith SQLITE_NO_SY
8df0: 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68  NC.** enabled, h
8e00: 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69  owever, since wi
8e10: 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
8e20: 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53  C enabled, an OS
8e30: 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77   crash.** or pow
8e40: 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20  er failure will 
8e50: 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74  likely corrupt t
8e60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8e80: 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
8e90: 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
8ea0: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
8eb0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
8ec0: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
8ed0: 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20  r of times that 
8ee0: 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66  we do a normal f
8ef0: 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a  sync() and .  **
8f00: 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73   FULLSYNC.  This
8f10: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
8f20: 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66  testing to verif
8f30: 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  y that this proc
8f40: 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20  edure.  ** gets 
8f50: 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
8f60: 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74  correct argument
8f70: 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
8f80: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
8f90: 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69   fullSync ) sqli
8fa0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
8fb0: 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
8fc0: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
8fd0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ndif..  /* If we
8fe0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
8ff0: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
9000: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
9010: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
9020: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
9030: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
9040: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9050: 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 48 41 56  ;.#else..#if HAV
9060: 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
9070: 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
9080: 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c    rc = fcntl(fd,
9090: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29   F_FULLFSYNC, 0)
90a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
90b0: 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20  c = 1;.  }.  /* 
90c0: 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43  If the FULLFSYNC
90d0: 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61   failed, fall ba
90e0: 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67  ck to attempting
90f0: 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 20   an fsync()..   
9100: 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62  * It shouldn't b
9110: 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66  e possible for f
9120: 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c  ullfsync to fail
9130: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20   on the local . 
9140: 20 20 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20    * file system 
9150: 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69  (on OSX), so fai
9160: 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74  lure indicates t
9170: 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20  hat FULLFSYNC.  
9180: 20 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74   * isn't support
9190: 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ed for this file
91a0: 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74   system. So, att
91b0: 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20  empt an fsync . 
91c0: 20 20 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77    * and (for now
91d0: 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65  ) ignore the ove
91e0: 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72  rhead of a super
91f0: 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c  fluous fcntl cal
9200: 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27 64 20 62  l.  .   * It'd b
9210: 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65  e better to dete
9220: 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70  ct fullfsync sup
9230: 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76  port once and av
9240: 6f 69 64 20 0a 20 20 20 2a 20 74 68 65 20 66 63  oid .   * the fc
9250: 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74  ntl call every t
9260: 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c  ime sync is call
9270: 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  ed..   */.  if( 
9280: 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
9290: 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69  fd);..#else .  i
92a0: 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20  f( dataOnly ){. 
92b0: 20 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e     rc = fdatasyn
92c0: 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c(fd);.  }else{.
92d0: 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66      rc = fsync(f
92e0: 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  d);.  }.#endif /
92f0: 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  * HAVE_FULLFSYNC
9300: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65   */.#endif /* de
9310: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f  fined(SQLITE_NO_
9320: 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75  SYNC) */..  retu
9330: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9340: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
9350: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
9360: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
9370: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
9380: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
9390: 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
93a0: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
93b0: 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
93c0: 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
93d0: 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
93e0: 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
93f0: 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
9400: 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
9410: 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
9420: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
9430: 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
9440: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
9450: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
9460: 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
9470: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
9480: 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
9490: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
94a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
94b0: 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
94c0: 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
94d0: 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
94e0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
94f0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
9500: 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
9510: 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
9520: 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
9530: 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
9540: 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
9550: 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
9560: 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
9570: 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
9580: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
9590: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
95a0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
95b0: 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
95c0: 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
95d0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
95e0: 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
95f0: 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
9600: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
9610: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
9620: 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
9630: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
9640: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
9650: 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
9660: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
9670: 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
9680: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41  ( pFile );.  TRA
9690: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
96a0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
96b0: 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
96c0: 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  nc(pFile->h, pFi
96d0: 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61  le->fullSync, da
96e0: 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
96f0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
9700: 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
9710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9720: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20  E_IOERR_FSYNC;. 
9730: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
9740: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
9750: 54 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20  TRACE4("DIRSYNC 
9760: 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66  %-3d (have_fullf
9770: 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63  sync=%d fullsync
9780: 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  =%d)\n", pFile->
9790: 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20  dirfd,.         
97a0: 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e     HAVE_FULLFSYN
97b0: 43 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79  C, pFile->fullSy
97c0: 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nc);.#ifndef SQL
97d0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
97e0: 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  YNC.    /* The d
97f0: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
9800: 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
9810: 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73  if full_fsync is
9820: 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f  .    ** turned o
9830: 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c  ff or unavailabl
9840: 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73  e.  If a full_fs
9850: 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ync occurred abo
9860: 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ve,.    ** then 
9870: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79  the directory sy
9880: 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  nc is superfluou
9890: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
98a0: 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59  ( (!HAVE_FULLFSY
98b0: 4e 43 20 7c 7c 20 21 70 46 69 6c 65 2d 3e 66 75  NC || !pFile->fu
98c0: 6c 6c 53 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f  llSync) && full_
98d0: 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72  fsync(pFile->dir
98e0: 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20  fd,0,0) ){.     
98f0: 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57    /*.       ** W
9900: 65 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  e have received 
9910: 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73  multiple reports
9920: 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75   of fsync() retu
9930: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20  rning.       ** 
9940: 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c  errors when appl
9950: 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69  ied to directori
9960: 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69  es on certain fi
9970: 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  le systems..    
9980: 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64     ** A failed d
9990: 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73  irectory sync is
99a0: 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e   not a big deal.
99b0: 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20    So it seems.  
99c0: 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74       ** better t
99d0: 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72  o ignore the err
99e0: 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35  or.  Ticket #165
99f0: 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  7.       */.    
9a00: 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c     /* return SQL
9a10: 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20  ITE_IOERR; */.  
9a20: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9a30: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
9a40: 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  d);  /* Only nee
9a50: 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
9a60: 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72  so close the dir
9a70: 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46  ectory */.    pF
9a80: 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b  ile->dirfd = -1;
9a90: 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61      /* when we a
9aa0: 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a  re done. */.  }.
9ab0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ac0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
9ad0: 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  c the directory 
9ae0: 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69  zDirname. This i
9af0: 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65  s a no-op on ope
9b00: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f  rating systems o
9b10: 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49  ther.** than UNI
9b20: 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  X..**.** This is
9b30: 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
9b40: 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  re the master jo
9b50: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 74  urnal file has t
9b60: 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65 74  ruely been delet
9b70: 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b  ed.** before mak
9b80: 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 69  ing changes to i
9b90: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
9ba0: 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61  ls on a multi-da
9bb0: 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a  tabase commit..*
9bc0: 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * The F_FULLFSYN
9bd0: 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20  C option is not 
9be0: 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a  needed here..*/.
9bf0: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53  int sqlite3UnixS
9c00: 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  yncDirectory(con
9c10: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
9c20: 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
9c30: 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
9c40: 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  C.  return SQLIT
9c50: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  E_OK;.#else.  in
9c60: 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20  t fd;.  int r;. 
9c70: 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
9c80: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
9c90: 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52  BINARY, 0);.  TR
9ca0: 41 43 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d  ACE3("DIRSYNC %-
9cb0: 33 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20  3d (%s)\n", fd, 
9cc0: 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28  zDirname);.  if(
9cd0: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74   fd<0 ){.    ret
9ce0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
9cf0: 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20  PEN; .  }.  r = 
9d00: 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f  fsync(fd);.  clo
9d10: 73 65 28 66 64 29 3b 0a 20 20 53 69 6d 75 6c 61  se(fd);.  Simula
9d20: 74 65 49 4f 45 72 72 6f 72 28 20 72 3d 31 20 29  teIOError( r=1 )
9d30: 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a 20 20 20  ;.  if( r ){.   
9d40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9d50: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b 0a  OERR_DIR_FSYNC;.
9d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
9d70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9d80: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
9d90: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
9da0: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
9db0: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
9dc0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
9dd0: 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a  runcate(OsFile *
9de0: 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
9df0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
9e00: 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
9e10: 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e 69   ftruncate(((uni
9e20: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 6e  xFile*)id)->h, n
9e30: 42 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Byte);.  Simulat
9e40: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
9e50: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9e60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e70: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
9e80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
9e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9ea0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
9eb0: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
9ec0: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
9ed0: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
9ee0: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
9ef0: 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Size(OsFile *id,
9f00: 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
9f10: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
9f20: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
9f30: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
9f40: 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
9f50: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
9f60: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
9f70: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
9f80: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
9f90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9fa0: 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
9fb0: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
9fc0: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
9fd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9fe0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9ff0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
a000: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
a010: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
a020: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
a030: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
a040: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
a050: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
a060: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
a070: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ** non-zero.  If
a080: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
a090: 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f  ocked or holds o
a0a0: 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  nly SHARED locks
a0b0: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
a0c0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
a0d0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
a0e0: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
a0f0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
a100: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
a110: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a120: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
a130: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 73 71  t( pFile );.  sq
a140: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
a150: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
a160: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
a170: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
a180: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
a190: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
a1a0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
a1b0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
a1c0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
a1d0: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
a1e0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
a1f0: 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d  {.    r = 1;.  }
a200: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
a210: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
a220: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
a230: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
a240: 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  !r ){.    struct
a250: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a260: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a270: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
a280: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a290: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a2a0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
a2b0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a2c0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a2d0: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a2e0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_GETLK, &lock);
a2f0: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  .    if( lock.l_
a300: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
a310: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
a320: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
a330: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
a340: 28 29 3b 0a 20 20 54 52 41 43 45 33 28 22 54 45  ();.  TRACE3("TE
a350: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
a360: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
a370: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a  );..  return r;.
a380: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
a390: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
a3a0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
a3b0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
a3c0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
a3d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
a3e0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
a3f0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
a400: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
a410: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
a420: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
a430: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
a440: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
a450: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
a460: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
a470: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
a480: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
a490: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
a4a0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
a4b0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
a4c0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
a4d0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
a4e0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
a4f0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
a500: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
a510: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
a520: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
a530: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
a540: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
a550: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
a560: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
a570: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
a580: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
a590: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
a5a0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
a5b0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
a5c0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
a5d0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
a5e0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
a5f0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
a600: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
a610: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
a620: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
a630: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
a640: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
a650: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
a660: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
a670: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
a680: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
a690: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
a6a0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
a6b0: 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65   unixLock(OsFile
a6c0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
a6d0: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
a6e0: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
a6f0: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
a700: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
a710: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
a720: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
a730: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
a740: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
a750: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
a760: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
a770: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
a780: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
a790: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
a7a0: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
a7b0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
a7c0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
a7d0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
a7e0: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
a7f0: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
a800: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
a810: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
a820: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
a830: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
a840: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
a850: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
a860: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
a870: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
a880: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
a890: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
a8a0: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
a8b0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
a8c0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
a8d0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
a8e0: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
a8f0: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
a900: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
a910: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
a920: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
a930: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
a940: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
a950: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
a960: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
a970: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
a980: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
a990: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
a9a0: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
a9b0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
a9c0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
a9d0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
a9e0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a9f0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
aa00: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
aa10: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
aa20: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
aa30: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
aa40: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
aa50: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
aa60: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
aa70: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
aa80: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
aa90: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
aaa0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
aab0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
aac0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
aad0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
aae0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
aaf0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
ab00: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
ab10: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
ab20: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
ab30: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
ab40: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
ab50: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
ab60: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
ab70: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
ab80: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
ab90: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
aba0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
abb0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
abc0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
abd0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
abe0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
abf0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
ac00: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
ac10: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
ac20: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
ac30: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
ac40: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
ac50: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
ac60: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
ac70: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
ac80: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
ac90: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
aca0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
acb0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
acc0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
acd0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
ace0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
acf0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
ad00: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
ad10: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
ad20: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
ad30: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
ad40: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
ad50: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
ad60: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
ad70: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
ad80: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
ad90: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
ada0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
adb0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
adc0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
add0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
ade0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
adf0: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
ae00: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
ae10: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
ae20: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
ae30: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
ae40: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
ae50: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
ae60: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
ae70: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
ae80: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
ae90: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
aea0: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
aeb0: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
aec0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
aed0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
aee0: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
aef0: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
af00: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
af10: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
af20: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
af30: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
af40: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72  xFile*)id;.  str
af50: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
af60: 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f  ock = pFile->pLo
af70: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
af80: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73  ck lock;.  int s
af90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
afa0: 6c 65 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22  le );.  TRACE7("
afb0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
afc0: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
afd0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
afe0: 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e  .      locktypeN
aff0: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c  ame(locktype), l
b000: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c  ocktypeName(pFil
b010: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20  e->locktype),.  
b020: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
b030: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
b040: 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
b050: 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
b060: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
b070: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
b080: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
b090: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
b0a0: 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
b0b0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
b0c0: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
b0d0: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
b0e0: 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
b0f0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
b100: 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
b110: 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
b120: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b130: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
b140: 20 20 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20    TRACE3("LOCK  
b150: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
b160: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
b170: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
b180: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
b190: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
b1a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b1b0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
b1c0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
b1d0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
b1e0: 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
b1f0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
b200: 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
b210: 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
b220: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
b230: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
b240: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
b250: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
b260: 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
b270: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
b280: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b290: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
b2a0: 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
b2b0: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c  ecause pFile->pL
b2c0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
b2d0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
b2e0: 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  /.  sqlite3OsEnt
b2f0: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
b300: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
b310: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
b320: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
b330: 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66  */.  rc = transf
b340: 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c  erOwnership(pFil
b350: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
b360: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
b370: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
b380: 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ex();.    return
b390: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b   rc;.  }.  pLock
b3a0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b   = pFile->pLock;
b3b0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
b3c0: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
b3d0: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
b3e0: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
b3f0: 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  OsFile*.  ** han
b400: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
b410: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
b420: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
b430: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
b440: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
b450: 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
b460: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
b470: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pLock->locktype>
b480: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
b490: 20 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44   locktype>SHARED
b4a0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
b4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
b4c0: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
b4d0: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
b4e0: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
b4f0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
b500: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
b510: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
b520: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
b530: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
b540: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
b550: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
b560: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
b570: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
b580: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
b590: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b5a0: 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20  _LOCK && .      
b5b0: 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
b5c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
b5d0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
b5e0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
b5f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b600: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b610: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
b620: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
b630: 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  type==0 );.    a
b640: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
b650: 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  t>0 );.    pFile
b660: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
b670: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  RED_LOCK;.    pL
b680: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
b690: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  pFile->pOpen->nL
b6a0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
b6b0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
b6c0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
b6d0: 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  ;..  lock.l_when
b6e0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a  ce = SEEK_SET;..
b6f0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
b700: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
b710: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
b720: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
b730: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
b740: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
b750: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
b760: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
b770: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
b780: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
b790: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  d..  */.  if( lo
b7a0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b7b0: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c  OCK .      || (l
b7c0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
b7d0: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
b7e0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49  ->locktype<PENDI
b7f0: 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
b800: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
b810: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
b820: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
b830: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
b840: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b850: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20  ING_BYTE;.    s 
b860: 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  = fcntl(pFile->h
b870: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b880: 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a  );.    if( s ){.
b890: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
b8a0: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
b8b0: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
b8c0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
b8d0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
b8e0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
b8f0: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
b900: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
b910: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
b920: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
b930: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
b940: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
b950: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
b960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
b970: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b980: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
b990: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20  ( pLock->cnt==0 
b9a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b9b0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b9c0: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  0 );..    /* Now
b9d0: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
b9e0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
b9f0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ba00: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
ba10: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ba20: 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  IZE;.    s = fcn
ba30: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
ba40: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20  ETLK, &lock);.. 
ba50: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
ba60: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
ba70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
ba80: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
ba90: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
baa0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
bab0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
bac0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
bad0: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
bae0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
baf0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )!=0 ){.      rc
bb00: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
bb10: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
bb20: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
bb30: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f  ppen */.      go
bb40: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
bb50: 20 7d 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a   }.    if( s ){.
bb60: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
bb70: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
bb80: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
bb90: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
bba0: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
bbb0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
bbc0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
bbd0: 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  File->pOpen->nLo
bbe0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63  ck++;.      pLoc
bbf0: 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20  k->cnt = 1;.    
bc00: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  }.  }else if( lo
bc10: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
bc20: 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d  E_LOCK && pLock-
bc30: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  >cnt>1 ){.    /*
bc40: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
bc50: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
bc60: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
bc70: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
bc80: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
bc90: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
bca0: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
bcb0: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
bcc0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
bcd0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
bce0: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
bcf0: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
bd00: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
bd10: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
bd20: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
bd30: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
bd40: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
bd50: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
bd60: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
bd70: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
bd80: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
bd90: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
bda0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
bdb0: 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65  switch( locktype
bdc0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52   ){.      case R
bdd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20  ESERVED_LOCK:.  
bde0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
bdf0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
be00: 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  TE;.        brea
be10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58  k;.      case EX
be20: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20  CLUSIVE_LOCK:.  
be30: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
be40: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
be50: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
be60: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
be70: 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  IZE;.        bre
be80: 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c  ak;.      defaul
be90: 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t:.        asser
bea0: 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
beb0: 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  s = fcntl(pFile-
bec0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
bed0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29  ck);.    if( s )
bee0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
bef0: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
bf00: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
bf10: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
bf20: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
bf30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bf40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
bf50: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
bf60: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
bf70: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
bf80: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
bf90: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
bfa0: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
bfb0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
bfc0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
bfd0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
bfe0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
bff0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
c000: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
c010: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 34 28  tex();.  TRACE4(
c020: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
c030: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
c040: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
c050: 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72  ktype), .      r
c060: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
c070: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b  ok" : "failed");
c080: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c090: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
c0a0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
c0b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
c0c0: 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74  r pFile to lockt
c0d0: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
c0e0: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
c0f0: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
c100: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
c110: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
c120: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
c130: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
c140: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
c150: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
c160: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
c170: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
c180: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
c190: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
c1a0: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
c1b0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
c1c0: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
c1d0: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
c1e0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
c1f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c200: 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
c210: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c220: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
c230: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41  ( pFile );.  TRA
c240: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c250: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c260: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
c270: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
c280: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
c290: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
c2a0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ock->locktype, p
c2b0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
c2c0: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
c2d0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
c2e0: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
c2f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
c300: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
c310: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c320: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
c330: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
c340: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
c350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c360: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
c370: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
c380: 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46  ();.  pLock = pF
c390: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73  ile->pLock;.  as
c3a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
c3b0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
c3c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
c3d0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c3e0: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
c3f0: 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e  ocktype==pFile->
c400: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
c410: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
c420: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c430: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c440: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
c450: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
c460: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
c470: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c480: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c490: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c4a0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c4b0: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
c4c0: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c4d0: 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20  &lock)!=0 ){.   
c4e0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
c4f0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c500: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
c510: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
c520: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
c530: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
c540: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c550: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c560: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c570: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c580: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
c590: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
c5a0: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
c5b0: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
c5c0: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
c5d0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
c5e0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
c5f0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
c600: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
c610: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
c620: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c630: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
c640: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
c650: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
c660: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d   happen */.    }
c670: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
c680: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype==NO_LOCK ){.
c690: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
c6a0: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
c6b0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
c6c0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
c6d0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
c6e0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
c6f0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
c700: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
c710: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
c720: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
c730: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
c740: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
c750: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
c760: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
c770: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
c780: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
c790: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
c7a0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
c7b0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
c7c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
c7d0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
c7e0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70       if( fcntl(p
c7f0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c800: 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20  , &lock)==0 ){. 
c810: 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f         pLock->lo
c820: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
c830: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c840: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c850: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
c860: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
c870: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
c880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c890: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
c8a0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
c8b0: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
c8c0: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
c8d0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
c8e0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
c8f0: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
c900: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c910: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
c920: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
c930: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
c940: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
c950: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e      */.    pOpen
c960: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
c970: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  .    pOpen->nLoc
c980: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
c990: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
c9a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65   );.    if( pOpe
c9b0: 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  n->nLock==0 && p
c9c0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30  Open->nPending>0
c9d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
c9e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c9f0: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  i<pOpen->nPendin
ca00: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ca10: 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50   close(pOpen->aP
ca20: 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  ending[i]);.    
ca30: 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70    }.      free(p
ca40: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
ca50: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
ca60: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
ca70: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
ca80: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
ca90: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
caa0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 70 46 69 6c  eMutex();.  pFil
cab0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
cac0: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
cad0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
cae0: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
caf0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
cb00: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64  ose(OsFile **pId
cb10: 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69  ){.  unixFile *i
cb20: 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
cb30: 70 49 64 3b 0a 0a 20 20 69 66 28 20 21 69 64 20  pId;..  if( !id 
cb40: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
cb50: 4f 4b 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  OK;.  unixUnlock
cb60: 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
cb70: 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
cb80: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e  >=0 ) close(id->
cb90: 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69  dirfd);.  id->di
cba0: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69  rfd = -1;.  sqli
cbb0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
cbc0: 29 3b 0a 0a 20 20 69 66 28 20 69 64 2d 3e 70 4f  );..  if( id->pO
cbd0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  pen->nLock ){.  
cbe0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
cbf0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
cc00: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
cc10: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
cc20: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20  ile just.    ** 
cc30: 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
cc40: 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
cc50: 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
cc60: 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
cc70: 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74  .    ** descript
cc80: 6f 72 20 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65  or to pOpen->aPe
cc90: 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
cca0: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
ccb0: 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
ccc0: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
ccd0: 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
cce0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e    */.    int *aN
ccf0: 65 77 3b 0a 20 20 20 20 73 74 72 75 63 74 20 6f  ew;.    struct o
cd00: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
cd10: 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61  id->pOpen;.    a
cd20: 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70  New = realloc( p
cd30: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20  Open->aPending, 
cd40: 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  (pOpen->nPending
cd50: 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20  +1)*sizeof(int) 
cd60: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
cd70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
cd80: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
cd90: 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20  , just leak the 
cda0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
cdb0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
cdc0: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
cdd0: 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  ing = aNew;.    
cde0: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
cdf0: 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  g[pOpen->nPendin
ce00: 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20  g] = id->h;.    
ce10: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
ce20: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
ce30: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
ce40: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
ce50: 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20  ing locks so we 
ce60: 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69  can close the fi
ce70: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  le immediately *
ce80: 2f 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e  /.    close(id->
ce90: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  h);.  }.  releas
cea0: 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c  eLockInfo(id->pL
ceb0: 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f  ock);.  releaseO
cec0: 70 65 6e 43 6e 74 28 69 64 2d 3e 70 4f 70 65 6e  penCnt(id->pOpen
ced0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  );..  sqlite3OsL
cee0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
cef0: 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
cf00: 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20   TRACE2("CLOSE  
cf10: 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29   %-3d\n", id->h)
cf20: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
cf30: 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68  -1);.  sqlite3Th
cf40: 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29  readSafeFree(id)
cf50: 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
cf60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf70: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
cf80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
cf90: 4e 47 5f 53 54 59 4c 45 0a 23 70 72 61 67 6d 61  NG_STYLE.#pragma
cfa0: 20 6d 61 72 6b 20 41 46 50 20 53 75 70 70 6f 72   mark AFP Suppor
cfb0: 74 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61 66  t../*. ** The af
cfc0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
cfd0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
cfe0: 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
cff0: 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 20  specific state. 
d000: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
d010: 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
d020: 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
d030: 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
d040: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
d050: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
d060: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
d070: 6b 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 66  kByte;.  char *f
d080: 69 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72  ilePath;.};..str
d090: 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
d0a0: 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
d0b0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
d0c0: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
d0d0: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
d0e0: 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
d0f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
d100: 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
d110: 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
d120: 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
d130: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d140: 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
d150: 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
d160: 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
d170: 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
d180: 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
d190: 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
d1a0: 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
d1b0: 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
d1c0: 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
d1d0: 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
d1e0: 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
d1f0: 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
d200: 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
d210: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d230: 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
d240: 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
d250: 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
d260: 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
d270: 4c 6f 63 6b 32 46 53 43 54 4c 09 5f 49 4f 57 52  Lock2FSCTL._IOWR
d280: 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
d290: 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
d2a0: 32 29 0a 0a 2f 2a 20 72 65 74 75 72 6e 20 30 20  2)../* return 0 
d2b0: 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e  on success, 1 on
d2c0: 20 66 61 69 6c 75 72 65 2e 20 20 54 6f 20 6d 61   failure.  To ma
d2d0: 74 63 68 20 74 68 65 20 62 65 68 61 76 69 6f 72  tch the behavior
d2e0: 20 6f 66 20 74 68 65 20 0a 20 20 6e 6f 72 6d 61   of the .  norma
d2f0: 6c 20 70 6f 73 69 78 20 66 69 6c 65 20 6c 6f 63  l posix file loc
d300: 6b 69 6e 67 20 28 75 73 65 64 20 69 6e 20 75 6e  king (used in un
d310: 69 78 4c 6f 63 6b 20 66 6f 72 20 65 78 61 6d 70  ixLock for examp
d320: 6c 65 29 2c 20 77 65 20 73 68 6f 75 6c 64 20 0a  le), we should .
d330: 20 20 70 72 6f 76 69 64 65 20 27 72 69 63 68 65    provide 'riche
d340: 72 27 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  r' return codes 
d350: 2d 20 73 70 65 63 69 66 69 63 61 6c 6c 79 20 74  - specifically t
d360: 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20  o differentiate 
d370: 62 65 74 77 65 65 6e 0a 20 20 27 66 69 6c 65 20  between.  'file 
d380: 62 75 73 79 27 20 61 6e 64 20 27 66 69 6c 65 20  busy' and 'file 
d390: 73 79 73 74 65 6d 20 65 72 72 6f 72 27 20 72 65  system error' re
d3a0: 73 75 6c 74 73 20 2a 2f 0a 73 74 61 74 69 63 20  sults */.static 
d3b0: 69 6e 74 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  int _AFPFSSetLoc
d3c0: 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61  k(const char *pa
d3d0: 74 68 2c 20 69 6e 74 20 66 64 2c 20 75 6e 73 69  th, int fd, unsi
d3e0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
d3f0: 66 66 73 65 74 2c 20 0a 20 20 20 20 20 20 20 20  ffset, .        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
d420: 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 69 6e 74 20  ong length, int 
d430: 73 65 74 4c 6f 63 6b 46 6c 61 67 29 0a 7b 0a 20  setLockFlag).{. 
d440: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
d450: 65 4c 6f 63 6b 50 42 32 09 70 62 3b 0a 20 20 69  eLockPB2.pb;.  i
d460: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
d470: 20 20 20 20 20 20 20 65 72 72 3b 0a 20 20 0a 20         err;.  . 
d480: 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
d490: 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
d4a0: 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
d4b0: 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
d4c0: 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
d4d0: 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
d4e0: 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
d4f0: 64 20 3d 20 66 64 3b 0a 20 20 54 52 41 43 45 35  d = fd;.  TRACE5
d500: 28 22 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e  ("AFPLOCK settin
d510: 67 20 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64  g lock %s for %d
d520: 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25   in range %llx:%
d530: 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65  llx\n", .    (se
d540: 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22  tLockFlag?"ON":"
d550: 4f 46 46 22 29 2c 20 66 64 2c 20 6f 66 66 73 65  OFF"), fd, offse
d560: 74 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72  t, length);.  er
d570: 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
d580: 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
d590: 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
d5a0: 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
d5b0: 31 20 29 20 7b 0a 20 20 20 20 54 52 41 43 45 34  1 ) {.    TRACE4
d5c0: 28 22 41 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64  ("AFPLOCK failed
d5d0: 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
d5e0: 20 25 64 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c   %d %s\n", path,
d5f0: 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20 20 20 73   errno, .      s
d600: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
d610: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
d620: 2f 20 65 72 72 6f 72 0a 20 20 7d 20 65 6c 73 65  / error.  } else
d630: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   {.    return 0;
d640: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54  .  }.}../*. ** T
d650: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
d660: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
d670: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
d680: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
d690: 66 69 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79  fied. ** file by
d6a0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
d6b0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
d6c0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
d6d0: 6c 64 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e  ld, return. ** n
d6e0: 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65  on-zero.  If the
d6f0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
d700: 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  d or holds only 
d710: 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68  SHARED locks, th
d720: 65 6e 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65  en. ** return ze
d730: 72 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ro.. */.static i
d740: 6e 74 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52  nt afpUnixCheckR
d750: 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
d760: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
d770: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
d780: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
d790: 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
d7a0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a  sert( pFile ); .
d7b0: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
d7c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
d7d0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d7e0: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
d7f0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
d800: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
d810: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
d820: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
d830: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
d840: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
d850: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
d860: 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20      r = 1;.  }. 
d870: 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
d880: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
d890: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
d8a0: 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20   it..   */.  if 
d8b0: 28 20 21 72 20 29 20 7b 0a 20 20 20 20 2f 2f 20  ( !r ) {.    // 
d8c0: 6c 6f 63 6b 20 74 68 65 20 62 79 74 65 0a 20 20  lock the byte.  
d8d0: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
d8e0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d8f0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
d900: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
d910: 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
d920: 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29  .    if (failed)
d930: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
d940: 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
d950: 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
d960: 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
d970: 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
d980: 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c   r = 1;.    } el
d990: 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
d9a0: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
d9b0: 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65   taking the rese
d9c0: 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63  rved lock, unloc
d9d0: 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a  k it to restore.
d9e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
d9f0: 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20  ginal state */. 
da00: 20 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c 6f       _AFPFSSetLo
da10: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
da20: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
da30: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
da40: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
da50: 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57    TRACE3("TEST W
da60: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c  R-LOCK %d %d\n",
da70: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 20   pFile->h, r);. 
da80: 20 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a   .  return r;.}.
da90: 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c 6f  ./* AFP-style lo
daa0: 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  cking following 
dab0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
dac0: 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74 68  unixLock, see th
dad0: 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20 66  e unixLock .** f
dae0: 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  unction comments
daf0: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66 20   for details of 
db00: 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74 2e  lock management.
db10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
db20: 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c  fpUnixLock(OsFil
db30: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
db40: 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20 72 63 20  ype).{.  int rc 
db50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
db60: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
db70: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
db80: 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
db90: 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
dba0: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
dbb0: 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
dbc0: 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
dbd0: 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
dbe0: 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
dbf0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52  t( pFile );.  TR
dc00: 41 43 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE5("LOCK    %d
dc10: 20 25 73 20 77 61 73 20 25 73 20 70 69 64 3d 25   %s was %s pid=%
dc20: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  d\n", pFile->h,.
dc30: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
dc40: 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c  eName(locktype),
dc50: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
dc60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ile->locktype), 
dc70: 67 65 74 70 69 64 28 29 29 3b 20 20 0a 20 20 2f  getpid());  .  /
dc80: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
dc90: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
dca0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
dcb0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
dcc0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 73 46 69   the.    ** OsFi
dcd0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
dce0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
dcf0: 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
dd00: 20 70 61 74 68 2c 20 61 73 0a 20 20 20 20 2a 2a   path, as.    **
dd10: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
dd20: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
dd30: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
dd40: 20 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c     */.  if( pFil
dd50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
dd60: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 54 52 41  ktype ){.    TRA
dd70: 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE3("LOCK    %d 
dd80: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
dd90: 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  eld)\n", pFile->
dda0: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
ddb0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
ddc0: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
ddd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
dde0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ddf0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
de00: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
de10: 0a 20 20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  .    */.  assert
de20: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
de30: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
de40: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
de50: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
de60: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
de70: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
de80: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
de90: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
dea0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
deb0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
dec0: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
ded0: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
dee0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
def0: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
df00: 73 73 20 74 68 72 65 61 64 73 0a 20 20 20 20 2a  ss threads.    *
df10: 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  /.  sqlite3OsEnt
df20: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
df30: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
df40: 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77  urrent thread ow
df50: 6e 73 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20  ns the pFile..  
df60: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61 6e    */.  rc = tran
df70: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70 46  sferOwnership(pF
df80: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
df90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dfa0: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
dfb0: 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 74 75  utex();.    retu
dfc0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 20 20 0a  rn rc;.  }.    .
dfd0: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
dfe0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
dff0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
e000: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
e010: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 61   before.    ** a
e020: 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
e030: 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
e040: 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
e050: 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
e060: 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c  ll.    ** be rel
e070: 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eased..    */.  
e080: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
e090: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
e0a0: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
e0b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
e0c0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
e0d0: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
e0e0: 20 20 20 20 20 29 7b 0a 20 20 20 20 69 6e 74 20       ){.    int 
e0f0: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
e100: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
e110: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
e120: 3e 68 2c 20 0a 20 20 20 20 20 20 50 45 4e 44 49  >h, .      PENDI
e130: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a  NG_BYTE, 1, 1);.
e140: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
e150: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e160: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
e170: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
e180: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  k;.    }.  }.  .
e190: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
e1a0: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
e1b0: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
e1c0: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
e1d0: 61 6b 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ake.    ** opera
e1e0: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
e1f0: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
e200: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  ied lock..    */
e210: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
e220: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
e230: 20 20 20 20 69 6e 74 20 6c 6b 2c 20 66 61 69 6c      int lk, fail
e240: 65 64 3b 0a 20 20 20 20 69 6e 74 20 74 72 69 65  ed;.    int trie
e250: 73 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20 20 20  s = 0;.    .    
e260: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
e270: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
e280: 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
e290: 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
e2a0: 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
e2b0: 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
e2c0: 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
e2d0: 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 63  random(); .    c
e2e0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e2f0: 63 6b 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30  ckByte = (lk & 0
e300: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
e310: 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
e320: 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46    failed = _AFPF
e330: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
e340: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
e350: 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 53 48 41  e->h, .      SHA
e360: 52 45 44 5f 46 49 52 53 54 2b 63 6f 6e 74 65 78  RED_FIRST+contex
e370: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
e380: 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 0a 20  e, 1, 1);.    . 
e390: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
e3a0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
e3b0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20   lock */.    if 
e3c0: 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  (_AFPFSSetLock(c
e3d0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e3e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  , pFile->h, PEND
e3f0: 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29  ING_BYTE, 1, 0))
e400: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
e410: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e420: 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  K;  /* This shou
e430: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
e440: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  */.      goto af
e450: 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
e460: 7d 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 66  }.    .    if( f
e470: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
e480: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
e490: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
e4a0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
e4b0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
e4c0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  K;.    }.  }else
e4d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
e4e0: 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
e4f0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
e500: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
e510: 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
e520: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
e530: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
e540: 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
e550: 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
e560: 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
e570: 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
e580: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
e590: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b  ile->locktype );
e5a0: 0a 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  .    if (locktyp
e5b0: 65 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  e >= RESERVED_LO
e5c0: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
e5d0: 6b 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44  ktype < RESERVED
e5e0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20  _LOCK) {.       
e5f0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
e600: 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20  SERVED lock */. 
e610: 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
e620: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e630: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e640: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
e650: 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
e660: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 66      }.    if (!f
e670: 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b 74 79 70  ailed && locktyp
e680: 65 20 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  e == EXCLUSIVE_L
e690: 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK) {.      /* 
e6a0: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
e6b0: 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  SIVE lock */.   
e6c0: 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52       .      /* R
e6d0: 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72 65 64  emove the shared
e6e0: 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79   lock before try
e6f0: 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20  ing the range.  
e700: 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20  we'll need to . 
e710: 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c       ** reestabl
e720: 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
e730: 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20  ock if we can't 
e740: 67 65 74 20 74 68 65 20 20 61 66 70 55 6e 69 78  get the  afpUnix
e750: 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
e760: 20 20 20 20 20 20 69 66 20 28 21 5f 41 46 50 46        if (!_AFPF
e770: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
e780: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
e790: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
e7a0: 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
e7c0: 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63  ntext->sharedLoc
e7d0: 6b 42 79 74 65 2c 20 31 2c 20 30 29 29 20 7b 0a  kByte, 1, 0)) {.
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61          /* now a
e7f0: 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74  ttemmpt to get t
e800: 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
e810: 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20  k range */.     
e820: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
e830: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
e840: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
e850: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
e860: 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
e890: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
e8a0: 20 28 66 61 69 6c 65 64 20 26 26 20 5f 41 46 50   (failed && _AFP
e8b0: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
e8c0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
e8d0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
e8e0: 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
e910: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
e920: 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20 20 20  e, 1, 1)) {.    
e930: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e940: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20  E_IOERR_RDLOCK; 
e950: 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* this should n
e960: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
e970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e980: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
e990: 2f 2a 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  /* */.        rc
e9a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e9b0: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20  UNLOCK; /* this 
e9c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
e9d0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
e9e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69     }.    if( fai
e9f0: 6c 65 64 20 26 26 20 72 63 20 3d 3d 20 53 51 4c  led && rc == SQL
ea00: 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 20 20 72  ITE_OK){.      r
ea10: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
ea20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
ea30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ea40: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
ea50: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
ea60: 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
ea70: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
ea80: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
ea90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eaa0: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
eab0: 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
eac0: 6c 6f 63 6b 3a 0a 20 20 20 20 73 71 6c 69 74 65  lock:.    sqlite
ead0: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
eae0: 0a 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20  .  TRACE4("LOCK 
eaf0: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
eb00: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
eb10: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
eb20: 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
eb30: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
eb40: 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20   : "failed");.  
eb50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
eb60: 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
eb70: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
eb80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
eb90: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
eba0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a  e.  locktype. **
ebb0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
ebc0: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
ebd0: 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
ebe0: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
ebf0: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
ec00: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
ec10: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
ec20: 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
ec30: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
ec40: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
ec50: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
ec60: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
ec70: 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  nixUnlock(OsFile
ec80: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
ec90: 70 65 29 20 7b 0a 20 20 73 74 72 75 63 74 20 66  pe) {.  struct f
eca0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
ecb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ecc0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
ecd0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
ece0: 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
ecf0: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
ed00: 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
ed10: 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
ed20: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
ed30: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
ed40: 20 29 3b 0a 20 20 54 52 41 43 45 35 28 22 55 4e   );.  TRACE5("UN
ed50: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
ed60: 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
ed70: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
ed80: 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  ,.         pFile
ed90: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
eda0: 69 64 28 29 29 3b 0a 20 20 0a 20 20 61 73 73 65  id());.  .  asse
edb0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
edc0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
edd0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
ede0: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
edf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ee00: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ee10: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
ee20: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ee30: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ee40: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
ee50: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
ee60: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ee70: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
ee80: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
ee90: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
eea0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
eeb0: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20 20 20  failed = 0;..   
eec0: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65     /* unlock the
eed0: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
eee0: 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62   - then re-estab
eef0: 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
ef00: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66  lock */.      if
ef10: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
ef20: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
ef30: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69  K) {.        fai
ef40: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
ef50: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
ef60: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
ef70: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
efb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66  ;.        if (!f
efc0: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ailed) {.       
efd0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c     /* successful
efe0: 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65  ly removed the e
eff0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
f000: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f  .          if (_
f010: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
f020: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f030: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f040: 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20 20 20  _FIRST+.        
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
f070: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
f080: 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1)) {.          
f090: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
f0a0: 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75 72 20  e-establish our 
f0b0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
f0c0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
f0d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f0e0: 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f  OCK; /* This sho
f0f0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
f110: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f120: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
f130: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f140: 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65 64 20  happen - failed 
f150: 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78  to unlock the ex
f160: 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2a 2f  clusive range */
f170: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f180: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f190: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  OCK;.        } .
f1a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f1b0: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49    if (rc == SQLI
f1c0: 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
f1d0: 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
f1e0: 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  G_LOCK) {.      
f1f0: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
f200: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
f210: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
f220: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
f230: 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0)){.        /* 
f240: 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73  failed to releas
f250: 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  e the pending lo
f260: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ck */.        rc
f270: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f280: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  UNLOCK; /* This 
f290: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
f2a0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
f2b0: 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63     } .    if (rc
f2c0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26   == SQLITE_OK &&
f2d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f2e0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  >=RESERVED_LOCK)
f2f0: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
f300: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
f310: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
f320: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f330: 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a  _BYTE, 1, 0)) {.
f340: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
f350: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
f360: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
f370: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
f380: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f390: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
f3a0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f3b0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
f3c0: 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  } .  }.  if( loc
f3d0: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
f3e0: 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
f3f0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
f400: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
f410: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, pFile->h, . 
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
f440: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
f450: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
f460: 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
f470: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
f480: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f490: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
f4a0: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
f4b0: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
f4c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72     }.  }.  if (r
f4d0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  c == SQLITE_OK).
f4e0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f4f0: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f500: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
f510: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
f520: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
f530: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
f540: 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
f550: 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
f560: 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ext . */.static 
f570: 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73 65  int afpUnixClose
f580: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
f590: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
f5a0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
f5b0: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
f5c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f5d0: 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c  OK;.  afpUnixUnl
f5e0: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
f5f0: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
f600: 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74  e AFP locking st
f610: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
f620: 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
f630: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
f640: 20 20 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b     if (((afpLock
f650: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d  ingContext *)id-
f660: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f670: 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55  ->filePath != NU
f680: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
f690: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
f6a0: 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
f6b0: 65 78 74 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67  ext*)id->locking
f6c0: 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
f6d0: 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
f6e0: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
f6f0: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f700: 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  t);.  }.  .  if(
f710: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
f720: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
f730: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
f740: 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  -1;.  close(id->
f750: 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  h);.  id->isOpen
f760: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22   = 0;.  TRACE2("
f770: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
f780: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
f790: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
f7a0: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
f7b0: 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20  ree(id);.  *pId 
f7c0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
f7d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72  LITE_OK;.}...#pr
f7e0: 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28  agma mark flock(
f7f0: 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a  ) style locking.
f800: 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 66 6c 6f 63  ./*. ** The floc
f810: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
f820: 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 2a 2f 0a  is not used. */.
f830: 74 79 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f  typedef void flo
f840: 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
f850: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  ;..static int fl
f860: 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
f870: 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  rvedLock(OsFile 
f880: 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  *id) {.  unixFil
f890: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
f8a0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69  File*)id;.  .  i
f8b0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
f8c0: 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c  pe == RESERVED_L
f8d0: 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72  OCK) {.    retur
f8e0: 6e 20 31 3b 20 2f 2f 20 61 6c 72 65 61 64 79 20  n 1; // already 
f8f0: 68 61 76 65 20 61 20 72 65 73 65 72 76 65 64 20  have a reserved 
f900: 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  lock.  } else {.
f910: 20 20 20 20 2f 2f 20 61 74 74 65 6d 70 74 20 74      // attempt t
f920: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 0a 20  o get the lock. 
f930: 20 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63     int rc = floc
f940: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
f950: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
f960: 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a 20      if (!rc) {. 
f970: 20 20 20 20 20 2f 2f 20 67 6f 74 20 74 68 65 20       // got the 
f980: 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 0a  lock, unlock it.
f990: 20 20 20 20 20 20 66 6c 6f 63 6b 28 70 46 69 6c        flock(pFil
f9a0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
f9b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
f9c0: 20 2f 2f 20 6e 6f 20 6f 6e 65 20 68 61 73 20 69   // no one has i
f9d0: 74 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 7d  t reserved.    }
f9e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
f9f0: 2f 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  / someone else m
fa00: 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73  ight have it res
fa10: 65 72 76 65 64 0a 20 20 7d 0a 7d 0a 0a 73 74 61  erved.  }.}..sta
fa20: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
fa30: 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xLock(OsFile *id
fa40: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
fa50: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fa60: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fa70: 29 69 64 3b 0a 20 20 0a 20 20 2f 2f 20 69 66 20  )id;.  .  // if 
fa80: 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
fa90: 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
faa0: 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2f 2f 20  clusive.  .  // 
fab0: 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
fac0: 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
fad0: 74 74 61 20 68 65 72 65 2e 0a 20 20 69 66 20 28  tta here..  if (
fae0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
faf0: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
fb00: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fb10: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
fb20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fb30: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 67  K;.  }.  .  // g
fb40: 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
fb50: 20 6c 6f 63 6b 0a 20 20 69 6e 74 20 72 63 20 3d   lock.  int rc =
fb60: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
fb70: 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f   LOCK_EX | LOCK_
fb80: 4e 42 29 3b 0a 20 20 69 66 20 28 72 63 29 20 7b  NB);.  if (rc) {
fb90: 0a 20 20 20 20 2f 2f 20 64 69 64 6e 27 74 20 67  .    // didn't g
fba0: 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
fbb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fbc0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 20 65 6c 73  TE_BUSY;.  } els
fbd0: 65 20 7b 0a 20 20 20 20 2f 2f 20 67 6f 74 20 69  e {.    // got i
fbe0: 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
fbf0: 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 0a 20 20  and return ok.  
fc00: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
fc10: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
fc20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fc30: 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  OK;.  }.}..stati
fc40: 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55  c int flockUnixU
fc50: 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
fc60: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
fc70: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fc80: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fc90: 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  )id;.  .  assert
fca0: 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
fcb0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
fcc0: 2f 2f 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  // no-op if poss
fcd0: 69 62 6c 65 0a 20 20 69 66 28 20 70 46 69 6c 65  ible.  if( pFile
fce0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
fcf0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
fd00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fd10: 7d 0a 20 20 0a 20 20 2f 2f 20 73 68 61 72 65 64  }.  .  // shared
fd20: 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
fd30: 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
fd40: 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
fd50: 73 69 76 65 0a 20 20 69 66 20 28 6c 6f 63 6b 74  sive.  if (lockt
fd60: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
fd70: 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ) {.    pFile->l
fd80: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
fd90: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
fda0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fdb0: 0a 20 20 2f 2f 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  // no, really
fdc0: 2c 20 75 6e 6c 6f 63 6b 2e 0a 20 20 69 6e 74 20  , unlock..  int 
fdd0: 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65  rc = flock(pFile
fde0: 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
fdf0: 20 69 66 20 28 72 63 29 0a 20 20 20 20 72 65 74   if (rc).    ret
fe00: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fe10: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65 20  _UNLOCK;.  else 
fe20: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
fe30: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
fe40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fe50: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
fe60: 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
fe70: 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
fe80: 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65  t flockUnixClose
fe90: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
fea0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
feb0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
fec0: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
fed0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fee0: 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69 78 55  OK;.  flockUnixU
fef0: 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c  nlock(*pId, NO_L
ff00: 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  OCK);.  .  if( i
ff10: 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
ff20: 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
ff30: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
ff40: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
ff50: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
ff60: 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20 20 0a  close(id->h);  .
ff70: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
ff80: 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69  Mutex();.  id->i
ff90: 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41  sOpen = 0;.  TRA
ffa0: 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33  CE2("CLOSE   %-3
ffb0: 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20  d\n", id->h);.  
ffc0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
ffd0: 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  .  sqlite3Thread
ffe0: 53 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20  SafeFree(id);.  
fff0: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  *pId = 0;.  retu
10000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10010 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c  .#pragma mark Ol
10020 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66  d-School .lock f
10030 69 6c 65 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e  ile based lockin
10040 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 64 6f  g../*. ** The do
10050 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10060 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f  ext structure co
10070 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f  ntains all dotlo
10080 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a  ck (.lock) lock.
10090 20 2a 2a 20 73 70 65 63 69 66 69 63 20 73 74 61   ** specific sta
100a0 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  te. */.typedef s
100b0 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  truct dotlockLoc
100c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c  kingContext dotl
100d0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
100e0 74 3b 0a 73 74 72 75 63 74 20 64 6f 74 6c 6f 63  t;.struct dotloc
100f0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10100 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  {.  char *lockPa
10110 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20  th;.};...static 
10120 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43  int dotlockUnixC
10130 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10140 28 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20  (OsFile *id) {. 
10150 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10160 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10170 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ;.  dotlockLocki
10180 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
10190 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f  xt = .    (dotlo
101a0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
101b0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
101c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
101d0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
101e0 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44 5f  ype == RESERVED_
101f0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74 75  LOCK) {.    retu
10200 72 6e 20 31 3b 20 2f 2f 20 61 6c 72 65 61 64 79  rn 1; // already
10210 20 68 61 76 65 20 61 20 72 65 73 65 72 76 65 64   have a reserved
10220 20 6c 6f 63 6b 0a 20 20 7d 20 65 6c 73 65 20 7b   lock.  } else {
10230 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
10240 20 73 74 61 74 42 75 66 3b 0a 20 20 20 20 69 66   statBuf;.    if
10250 20 28 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d   (lstat(context-
10260 3e 6c 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42  >lockPath,&statB
10270 75 66 29 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  uf) == 0).      
10280 2f 2f 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  // file exists, 
10290 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
102a0 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20 20 20   the lock.      
102b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 65 6c  return 1;.    el
102c0 73 65 0a 20 20 20 20 20 20 2f 2f 20 66 69 6c 65  se.      // file
102d0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
102e0 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
102f0 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 0a  t if we want it.
10300 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
10310 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e    }.}..static in
10320 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63  t dotlockUnixLoc
10330 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
10340 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
10350 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
10360 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10370 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  .  dotlockLockin
10380 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
10390 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63  t = .    (dotloc
103a0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
103b0 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
103c0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f  gContext;.  .  /
103d0 2f 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  / if we already 
103e0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
103f0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
10400 20 20 2f 2f 20 4a 75 73 74 20 61 64 6a 75 73 74    // Just adjust
10410 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
10420 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 0a 20  on outta here.. 
10430 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
10440 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
10450 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10460 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10470 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c  ;.    .    /* Al
10480 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
10490 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
104a0 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
104b0 20 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d   utimes(context-
104c0 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b  >lockPath,NULL);
104d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
104e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
104f0 2f 2f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  // check to see 
10500 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  if lock file alr
10510 65 61 64 79 20 65 78 69 73 74 73 0a 20 20 73 74  eady exists.  st
10520 72 75 63 74 20 73 74 61 74 20 73 74 61 74 42 75  ruct stat statBu
10530 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74 28 63  f;.  if (lstat(c
10540 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
10550 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29  ,&statBuf) == 0)
10560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10570 49 54 45 5f 42 55 53 59 3b 20 2f 2f 20 69 74 20  ITE_BUSY; // it 
10580 64 6f 65 73 2c 20 62 75 73 79 0a 20 20 7d 0a 20  does, busy.  }. 
10590 20 0a 20 20 2f 2f 20 67 72 61 62 20 61 6e 20 65   .  // grab an e
105a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 20 20  xclusive lock.  
105b0 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f  int fd = open(co
105c0 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
105d0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54  O_RDONLY|O_CREAT
105e0 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20  |O_EXCL,0600);. 
105f0 20 69 66 20 28 66 64 20 3c 20 30 29 20 7b 0a 20   if (fd < 0) {. 
10600 20 20 20 2f 2f 20 66 61 69 6c 65 64 20 74 6f 20     // failed to 
10610 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
10620 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
10630 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
10640 65 6e 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20  en the lock.    
10650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
10660 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  SY; .  }.  close
10670 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2f 20 67 6f  (fd);.  .  // go
10680 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
10690 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
106a0 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
106b0 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
106c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
106d0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
106e0 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
106f0 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
10700 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
10710 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
10720 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
10730 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ;.  dotlockLocki
10740 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
10750 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f  xt = .    (dotlo
10760 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10770 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
10780 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
10790 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
107a0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
107b0 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69  .  .  // no-op i
107c0 66 20 70 6f 73 73 69 62 6c 65 0a 20 20 69 66 28  f possible.  if(
107d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
107e0 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
107f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10800 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20  OK;.  }.  .  // 
10810 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
10820 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
10830 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
10840 20 65 78 63 6c 75 73 69 76 65 0a 20 20 69 66 20   exclusive.  if 
10850 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
10860 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
10870 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
10880 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
10890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
108a0 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20    }.  .  // no, 
108b0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a  really, unlock..
108c0 20 20 75 6e 6c 69 6e 6b 28 63 6f 6e 74 65 78 74    unlink(context
108d0 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 70  ->lockPath);.  p
108e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
108f0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
10900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10910 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
10920 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
10930 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78   int dotlockUnix
10940 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70  Close(OsFile **p
10950 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  Id) {.  unixFile
10960 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c 65   *id = (unixFile
10970 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66 28  *)*pId;.  .  if(
10980 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53 51   !id ) return SQ
10990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 64 6f 74 6c 6f  LITE_OK;.  dotlo
109a0 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49  ckUnixUnlock(*pI
109b0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f  d, NO_LOCK);.  /
109c0 2a 20 66 72 65 65 20 74 68 65 20 64 6f 74 6c 6f  * free the dotlo
109d0 63 6b 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ck locking struc
109e0 74 75 72 65 20 2a 2f 0a 20 20 69 66 20 28 69 64  ture */.  if (id
109f0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10a00 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20   != NULL) {.    
10a10 69 66 20 28 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63  if (((dotlockLoc
10a20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69 64  kingContext *)id
10a30 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10a40 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 21 3d 20 4e  )->lockPath != N
10a50 55 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74  ULL).      sqlit
10a60 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65  e3ThreadSafeFree
10a70 28 20 28 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  ( ( (dotlockLock
10a80 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 0a 20 20  ingContext *).  
10a90 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 69 6e        id->lockin
10aa0 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
10ab0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
10ac0 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
10ad0 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id->lockingConte
10ae0 78 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66  xt);.  }.  .  if
10af0 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
10b00 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
10b10 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
10b20 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
10b30 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
10b40 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b  .  close(id->h);
10b50 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  .  .  sqlite3OsL
10b60 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
10b70 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
10b80 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20   TRACE2("CLOSE  
10b90 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29   %-3d\n", id->h)
10ba0 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
10bb0 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68  -1);.  sqlite3Th
10bc0 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29  readSafeFree(id)
10bd0 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
10be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bf0 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61  ;.}...#pragma ma
10c00 72 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f  rk No locking../
10c10 2a 0a 20 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b  *. ** The nolock
10c20 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  LockingContext i
10c30 73 20 76 6f 69 64 0a 20 2a 2f 0a 74 79 70 65 64  s void. */.typed
10c40 65 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f  ef void nolockLo
10c50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73  ckingContext;..s
10c60 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
10c70 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
10c80 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  dLock(OsFile *id
10c90 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ) {.  return 0;.
10ca0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  }..static int no
10cb0 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46  lockUnixLock(OsF
10cc0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
10cd0 6b 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72  ktype) {.  retur
10ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10cf0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
10d00 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69  kUnixUnlock(OsFi
10d10 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
10d20 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e  type) {.  return
10d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10d40 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
10d50 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
10d60 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f  nt nolockUnixClo
10d70 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
10d80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69   {.  unixFile *i
10d90 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
10da0 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69  pId;.  .  if( !i
10db0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
10dc0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 2d 3e  E_OK;.  if( id->
10dd0 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
10de0 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69  (id->dirfd);.  i
10df0 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
10e00 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
10e10 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f  utex();.  .  clo
10e20 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20  se(id->h);.  .  
10e30 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
10e40 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f  tex();.  id->isO
10e50 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  pen = 0;.  TRACE
10e60 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
10e70 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
10e80 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
10e90 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
10ea0 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  feFree(id);.  *p
10eb0 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
10ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
10ed0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10ee0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
10ef0 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TYLE */../*.** T
10f00 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
10f10 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
10f20 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ull pathname.  R
10f30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
10f40 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70  ** to the full p
10f50 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69  athname stored i
10f60 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  n space obtained
10f70 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
10f80 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  oc()..** The cal
10f90 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
10fa0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10fb0 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70   freeing this sp
10fc0 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69  ace once it.** i
10fd0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64  s no longer need
10fe0 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ed..*/.char *sql
10ff0 69 74 65 33 55 6e 69 78 46 75 6c 6c 50 61 74 68  ite3UnixFullPath
11000 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
11010 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20 20 63  *zRelative){.  c
11020 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a  har *zFull = 0;.
11030 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
11040 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
11050 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
11060 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76  &zFull, zRelativ
11070 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
11080 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
11090 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 4d 61  *zBuf = sqliteMa
110a0 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20 20 20 20  lloc(5000);.    
110b0 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  if( zBuf==0 ){. 
110c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
110d0 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 30 5d     }.    zBuf[0]
110e0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
110f0 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  3SetString(&zFul
11100 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20  l, getcwd(zBuf, 
11110 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a 52 65 6c  5000), "/", zRel
11120 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20 20 20  ative,.         
11130 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
11140 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
11150 46 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  Free(zBuf);.  }.
11160 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a  .#if 0.  /*.  **
11170 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61   Remove "/./" pa
11180 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20  th elements and 
11190 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20  convert "/A/./" 
111a0 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20  path elements.  
111b0 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a  ** to just "/"..
111c0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
111d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
111e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;.    for(i=j=0;
111f0 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   zFull[i]; i++){
11200 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
11210 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
11220 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
11230 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
11240 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
11250 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20  zFull[i+1]=='.' 
11260 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27  && zFull[i+2]=='
11270 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
11280 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
11290 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
112a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
112b0 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e  ( zFull[i+1]=='.
112c0 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d  ' && zFull[i+2]=
112d0 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
112e0 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
112f0 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
11300 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27  && zFull[j-1]!='
11310 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
11320 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20         i += 3;. 
11330 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
11340 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
11350 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c     }.      zFull
11360 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d  [j++] = zFull[i]
11370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c  ;.    }.    zFul
11380 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  l[j] = 0;.  }.#e
11390 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 7a  ndif..  return z
113a0 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Full;.}../*.** C
113b0 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
113c0 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e 63 20  of the fullsync 
113d0 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69 76 65  flag in the give
113e0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
113f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
11400 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e  d unixSetFullSyn
11410 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  c(OsFile *id, in
11420 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78 46 69  t v){.  ((unixFi
11430 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53 79 6e  le*)id)->fullSyn
11440 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = v;.}../*.** 
11450 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72  Return the under
11460 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c  lying file handl
11470 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a  e for an OsFile.
11480 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11490 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46  ixFileHandle(OsF
114a0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
114b0 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rn ((unixFile*)i
114c0 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d)->h;.}../*.** 
114d0 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
114e0 72 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 74  r that indices t
114f0 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
11500 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a 2a  currently held.*
11510 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c 65  * by this handle
11520 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74 65 73  .  (Used for tes
11530 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
11540 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74  s only.).*/.stat
11550 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53  ic int unixLockS
11560 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  tate(OsFile *id)
11570 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
11580 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b  xFile*)id)->lock
11590 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  type;.}../*.** T
115a0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
115b0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
115c0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
115d0 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
115e0 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  .** for unix..*/
115f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
11600 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 55 6e  Method sqlite3Un
11610 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11620 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e   unixClose,.  un
11630 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c  ixOpenDirectory,
11640 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
11650 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
11660 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e  Seek,.  unixTrun
11670 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
11680 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  ,.  unixSetFullS
11690 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48  ync,.  unixFileH
116a0 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c  andle,.  unixFil
116b0 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63  eSize,.  unixLoc
116c0 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  k,.  unixUnlock,
116d0 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65  .  unixLockState
116e0 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  ,.  unixCheckRes
116f0 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 23  ervedLock,.};..#
11700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11710 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11720 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65  E./*. ** This ve
11730 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
11740 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
11750 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
11760 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66   an OsFile. ** f
11770 6f 72 20 75 6e 69 78 20 77 69 74 68 20 41 46 50  or unix with AFP
11780 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
11790 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ing.. */.static 
117a0 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73  const IoMethod s
117b0 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
117c0 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
117d0 0a 20 20 20 20 61 66 70 55 6e 69 78 43 6c 6f 73  .    afpUnixClos
117e0 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44  e,.    unixOpenD
117f0 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e  irectory,.    un
11800 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78  ixRead,.    unix
11810 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  Write,.    unixS
11820 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75  eek,.    unixTru
11830 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  ncate,.    unixS
11840 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74  ync,.    unixSet
11850 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e  FullSync,.    un
11860 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20  ixFileHandle,.  
11870 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
11880 20 20 20 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c      afpUnixLock,
11890 0a 20 20 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  .    afpUnixUnlo
118a0 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b  ck,.    unixLock
118b0 53 74 61 74 65 2c 0a 20 20 20 20 61 66 70 55 6e  State,.    afpUn
118c0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
118d0 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20  ock,.};../*. ** 
118e0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
118f0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
11900 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
11910 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c  rate on an OsFil
11920 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  e. ** for unix w
11930 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79 6c  ith flock() styl
11940 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
11950 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
11960 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
11970 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69  3FlockLockingUni
11980 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
11990 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65    flockUnixClose
119a0 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69  ,.    unixOpenDi
119b0 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69  rectory,.    uni
119c0 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57  xRead,.    unixW
119d0 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65  rite,.    unixSe
119e0 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e  ek,.    unixTrun
119f0 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79  cate,.    unixSy
11a00 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46  nc,.    unixSetF
11a10 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69  ullSync,.    uni
11a20 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20  xFileHandle,.   
11a30 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20   unixFileSize,. 
11a40 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b     flockUnixLock
11a50 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 55  ,.    flockUnixU
11a60 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
11a70 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 66 6c  ockState,.    fl
11a80 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
11a90 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a  rvedLock,.};../*
11aa0 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  . ** This vector
11ab0 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
11ac0 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
11ad0 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
11ae0 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75  OsFile. ** for u
11af0 6e 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b  nix with dotlock
11b00 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b   style file lock
11b10 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ing.. */.static 
11b20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73  const IoMethod s
11b30 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63  qlite3DotlockLoc
11b40 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
11b50 20 3d 20 7b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b   = {.    dotlock
11b60 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 20 20 75  UnixClose,.    u
11b70 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  nixOpenDirectory
11b80 2c 0a 20 20 20 20 75 6e 69 78 52 65 61 64 2c 0a  ,.    unixRead,.
11b90 20 20 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20      unixWrite,. 
11ba0 20 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 20     unixSeek,.   
11bb0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20   unixTruncate,. 
11bc0 20 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 20     unixSync,.   
11bd0 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63   unixSetFullSync
11be0 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 48 61  ,.    unixFileHa
11bf0 6e 64 6c 65 2c 0a 20 20 20 20 75 6e 69 78 46 69  ndle,.    unixFi
11c00 6c 65 53 69 7a 65 2c 0a 20 20 20 20 64 6f 74 6c  leSize,.    dotl
11c10 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 20  ockUnixLock,.   
11c20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
11c30 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b  ck,.    unixLock
11c40 53 74 61 74 65 2c 0a 20 20 20 20 64 6f 74 6c 6f  State,.    dotlo
11c50 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72  ckUnixCheckReser
11c60 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a  vedLock,.};../*.
11c70 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20   ** This vector 
11c80 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
11c90 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
11ca0 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f   operate on an O
11cb0 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e  sFile. ** for un
11cc0 69 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b 20  ix with dotlock 
11cd0 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69  style file locki
11ce0 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ng.. */.static c
11cf0 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71  onst IoMethod sq
11d00 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69  lite3NolockLocki
11d10 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
11d20 20 7b 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43   {.  nolockUnixC
11d30 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 4f 70 65 6e  lose,.  unixOpen
11d40 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 75 6e 69  Directory,.  uni
11d50 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69  xRead,.  unixWri
11d60 74 65 2c 0a 20 20 75 6e 69 78 53 65 65 6b 2c 0a  te,.  unixSeek,.
11d70 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a    unixTruncate,.
11d80 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e    unixSync,.  un
11d90 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20  ixSetFullSync,. 
11da0 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c   unixFileHandle,
11db0 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c  .  unixFileSize,
11dc0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63  .  nolockUnixLoc
11dd0 6b 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55  k,.  nolockUnixU
11de0 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63  nlock,.  unixLoc
11df0 6b 53 74 61 74 65 2c 0a 20 20 6e 6f 6c 6f 63 6b  kState,.  nolock
11e00 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
11e10 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 23 65 6e 64 69  dLock,.};..#endi
11e20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
11e30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
11e40 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
11e50 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
11e60 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61 6e   new unixFile an
11e70 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 61  d initialize tha
11e80 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 57  t unixFile..** W
11e90 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
11ea0 6f 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  o the new unixFi
11eb0 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a  le into *pId..**
11ec0 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   If we run out o
11ed0 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20  f memory, close 
11ee0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74  the file and ret
11ef0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  urn an error..*/
11f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11f10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11f20 59 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57 68 65 6e  YLE./* . ** When
11f30 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69   locking extensi
11f40 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c  ons are enabled,
11f50 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e   the filepath an
11f60 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  d locking style 
11f70 0a 20 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20  . ** are needed 
11f80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
11f90 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f   unixFile pMetho
11fa0 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63  d to use for loc
11fb0 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
11fc0 0a 20 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67  . ** The locking
11fd0 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20  -style specific 
11fe0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  lockingContext d
11ff0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
12000 20 63 72 65 61 74 65 64 20 0a 20 2a 2a 20 61 6e   created . ** an
12010 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20  d assigned here 
12020 61 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  also.. */.static
12030 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69   int allocateUni
12040 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
12070 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
12080 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
12090 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c  .  OsFile **pId,
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
120b0 69 74 65 20 63 6f 6d 70 6c 65 74 65 64 20 69 6e  ite completed in
120c0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 65 72  itialization her
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
12110 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67  */.  int delFlag
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12130 44 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d 62 65 66  Delete-on-or-bef
12140 6f 72 65 2d 63 6c 6f 73 65 20 66 6c 61 67 20 2a  ore-close flag *
12150 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c 6f  /.){.  sqlite3Lo
12160 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b 69  ckingStyle locki
12170 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
12180 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69  ile *pNew;.  uni
12190 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72  xFile f;.  int r
121a0 63 3b 0a 0a 20 20 6c 6f 63 6b 69 6e 67 53 74 79  c;..  lockingSty
121b0 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 65 74 65  le = sqlite3Dete
121c0 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 7a  ctLockingStyle(z
121d0 46 69 6c 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20  Filename, h);.  
121e0 69 66 20 28 20 6c 6f 63 6b 69 6e 67 53 74 79 6c  if ( lockingStyl
121f0 65 20 3d 3d 20 70 6f 73 69 78 4c 6f 63 6b 69 6e  e == posixLockin
12200 67 53 74 79 6c 65 20 29 20 7b 0a 20 20 20 20 73  gStyle ) {.    s
12210 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
12220 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
12230 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26  indLockInfo(h, &
12240 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65  f.pLock, &f.pOpe
12250 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  n);.    sqlite3O
12260 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
12270 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12280 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20     close(h);.   
12290 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
122a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
122b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
122c0 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
122d0 7b 0a 20 20 20 20 2f 2f 20 20 70 4c 6f 63 6b 20  {.    //  pLock 
122e0 61 6e 64 20 70 4f 70 65 6e 20 61 72 65 20 6f 6e  and pOpen are on
122f0 6c 79 20 75 73 65 64 20 66 6f 72 20 70 6f 73 69  ly used for posi
12300 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69  x advisory locki
12310 6e 67 20 0a 20 20 20 20 66 2e 70 4c 6f 63 6b 20  ng .    f.pLock 
12320 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 66 2e 70 4f  = NULL;.    f.pO
12330 70 65 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  pen = NULL;.  }.
12340 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b    if( delFlag ){
12350 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
12360 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 2e  ename);.  }.  f.
12370 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e  dirfd = -1;.  f.
12380 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
12390 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  f.locktype = 0;.
123a0 20 20 66 2e 6f 66 66 73 65 74 20 3d 20 30 3b 0a    f.offset = 0;.
123b0 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54    f.h = h;.  SET
123c0 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20  _THREADID(&f);. 
123d0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 54   pNew = sqlite3T
123e0 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
123f0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
12400 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
12410 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  =0 ){.    close(
12420 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  h);.    sqlite3O
12430 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
12440 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12450 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20  fo(f.pLock);.   
12460 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
12470 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  f.pOpen);.    sq
12480 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
12490 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  x();.    *pId = 
124a0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
124b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
124c0 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d  lse{.    *pNew =
124d0 20 66 3b 0a 20 20 20 20 73 77 69 74 63 68 28 6c   f;.    switch(l
124e0 6f 63 6b 69 6e 67 53 74 79 6c 65 29 20 7b 0a 20  ockingStyle) {. 
124f0 20 20 20 20 20 63 61 73 65 20 61 66 70 4c 6f 63       case afpLoc
12500 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
12510 20 20 20 2f 2a 20 61 66 70 20 6c 6f 63 6b 69 6e     /* afp lockin
12520 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
12530 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
12540 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
12550 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
12560 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
12570 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ext */.        p
12580 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  New->pMethod = &
12590 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e  sqlite3AFPLockin
125a0 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
125b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63         pNew->loc
125c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20  kingContext = . 
125d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
125e0 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63  ThreadSafeMalloc
125f0 28 73 69 7a 65 6f 66 28 61 66 70 4c 6f 63 6b 69  (sizeof(afpLocki
12600 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20  ngContext));.   
12610 20 20 20 20 20 28 28 61 66 70 4c 6f 63 6b 69 6e       ((afpLockin
12620 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d  gContext *)pNew-
12630 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
12640 2d 3e 66 69 6c 65 50 61 74 68 20 3d 20 0a 20 20  ->filePath = .  
12650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
12660 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12670 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
12680 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ) + 1);.        
12690 73 74 72 63 70 79 28 28 28 61 66 70 4c 6f 63 6b  strcpy(((afpLock
126a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
126b0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
126c0 74 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20  t)->filePath, . 
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
126e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
126f0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
12700 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12710 20 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c       case flockL
12720 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20  ockingStyle:.   
12730 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f       /* flock lo
12740 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65  cking doesn't ne
12750 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  ed additional lo
12760 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66  ckingContext inf
12770 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
12780 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
12790 64 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63  d = &sqlite3Floc
127a0 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
127b0 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72  thod;.        br
127c0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
127d0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74  dotlockLockingSt
127e0 79 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20  yle:.        /* 
127f0 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20  dotlock locking 
12800 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
12810 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
12820 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
12830 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  .         ** the
12840 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
12850 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  ontext */.      
12860 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12870 3d 20 26 73 71 6c 69 74 65 33 44 6f 74 6c 6f 63  = &sqlite3Dotloc
12880 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
12890 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 70 4e  thod;.        pN
128a0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
128b0 78 74 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  xt = sqlite3Thre
128c0 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 0a 20 20  adSafeMalloc(.  
128d0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 64          sizeof(d
128e0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
128f0 74 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20  text));.        
12900 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ((dotlockLocking
12910 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e  Context *)pNew->
12920 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
12930 3e 6c 6f 63 6b 50 61 74 68 20 3d 20 0a 20 20 20  >lockPath = .   
12940 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12950 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63  ThreadSafeMalloc
12960 28 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  (strlen(zFilenam
12970 65 29 20 2b 20 73 74 72 6c 65 6e 28 22 2e 6c 6f  e) + strlen(".lo
12980 63 6b 22 29 20 2b 20 31 29 3b 0a 20 20 20 20 20  ck") + 1);.     
12990 20 20 20 73 70 72 69 6e 74 66 28 28 28 64 6f 74     sprintf(((dot
129a0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
129b0 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69  xt *)pNew->locki
129c0 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b  ngContext)->lock
129d0 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Path, .         
129e0 20 20 20 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22         "%s.lock"
129f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
12a00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12a10 20 20 20 63 61 73 65 20 70 6f 73 69 78 4c 6f 63     case posixLoc
12a20 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
12a30 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c 6f 63 6b     /* posix lock
12a40 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
12a50 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12a60 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
12a70 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
12a80 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12a90 3d 20 26 73 71 6c 69 74 65 33 55 6e 69 78 49 6f  = &sqlite3UnixIo
12aa0 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20  Method;.        
12ab0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
12ac0 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  e noLockingStyle
12ad0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 75 6e 73  :.      case uns
12ae0 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
12af0 74 79 6c 65 3a 0a 20 20 20 20 20 20 64 65 66 61  tyle:.      defa
12b00 75 6c 74 3a 20 0a 20 20 20 20 20 20 20 20 70 4e  ult: .        pN
12b10 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12b20 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b  qlite3NolockLock
12b30 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  ingUnixIoMethod;
12b40 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 49 64 20  .    }.    *pId 
12b50 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b  = (OsFile*)pNew;
12b60 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
12b70 28 2b 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (+1);.    return
12b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12b90 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51 4c 49 54  }.#else /* SQLIT
12ba0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
12bb0 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61 74 69 63  _STYLE */.static
12bc0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69   int allocateUni
12bd0 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
12c00 63 72 69 70 74 6f 72 20 6f 6e 20 66 69 6c 65 20  criptor on file 
12c10 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
12c20 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20    OsFile **pId, 
12c30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12c40 65 20 74 68 65 20 72 65 73 75 6c 20 75 6e 69 78  e the resul unix
12c50 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
12c60 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
12c70 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12c80 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
12c90 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
12ca0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61   */.  int delFla
12cb0 67 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g            /* 
12cc0 49 66 20 74 72 75 65 2c 20 64 65 6c 65 74 65 20  If true, delete 
12cd0 74 68 65 20 66 69 6c 65 20 6f 6e 20 6f 72 20 62  the file on or b
12ce0 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 20 2a 2f  efore closing */
12cf0 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
12d00 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65  pNew;.  unixFile
12d10 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   f;.  int rc;.. 
12d20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
12d30 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66  utex();.  rc = f
12d40 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26  indLockInfo(h, &
12d50 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65  f.pLock, &f.pOpe
12d60 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  n);.  sqlite3OsL
12d70 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
12d80 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
12d90 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
12da0 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
12db0 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  c ){.    close(h
12dc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12dd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12de0 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20    TRACE3("OPEN  
12df0 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
12e00 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66   zFilename);.  f
12e10 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66  .dirfd = -1;.  f
12e20 2e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20  .fullSync = 0;. 
12e30 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b   f.locktype = 0;
12e40 0a 20 20 66 2e 6f 66 66 73 65 74 20 3d 20 30 3b  .  f.offset = 0;
12e50 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45  .  f.h = h;.  SE
12e60 54 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a  T_THREADID(&f);.
12e70 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
12e80 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63  ThreadSafeMalloc
12e90 28 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  ( sizeof(unixFil
12ea0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  e) );.  if( pNew
12eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  ==0 ){.    close
12ec0 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
12ed0 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
12ee0 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
12ef0 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20  nfo(f.pLock);.  
12f00 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74    releaseOpenCnt
12f10 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73  (f.pOpen);.    s
12f20 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
12f30 65 78 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d  ex();.    *pId =
12f40 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
12f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
12f60 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20  else{.    *pNew 
12f70 3d 20 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = f;.    pNew->p
12f80 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
12f90 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  3UnixIoMethod;. 
12fa0 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c     *pId = (OsFil
12fb0 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65  e*)pNew;.    Ope
12fc0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
12fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12fe0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  OK;.  }.}.#endif
12ff0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
13000 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
13010 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  */..#endif /* SQ
13020 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
13030 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61  .** Everything a
13090 62 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68 20  bove deals with 
130a0 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79  file I/O.  Every
130b0 74 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f  thing that follo
130c0 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68  ws deals.** with
130d0 20 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e   other miscellan
130e0 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66 20 74  ous aspects of t
130f0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
13100 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a  tem interface.**
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 23 69  **********/...#i
13160 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13170 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
13180 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
13190 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
131a0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
131b0 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
131c0 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
131d0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
131e0 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
131f0 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
13200 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  y..*/.#include <
13210 64 6c 66 63 6e 2e 68 3e 0a 76 6f 69 64 20 2a 73  dlfcn.h>.void *s
13220 71 6c 69 74 65 33 55 6e 69 78 44 6c 6f 70 65 6e  qlite3UnixDlopen
13230 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
13240 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72  lename){.  retur
13250 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
13260 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
13270 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 76  TLD_GLOBAL);.}.v
13280 6f 69 64 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  oid *sqlite3Unix
13290 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70 48 61 6e  Dlsym(void *pHan
132a0 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  dle, const char 
132b0 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74  *zSymbol){.  ret
132c0 75 72 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c  urn dlsym(pHandl
132d0 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 69  e, zSymbol);.}.i
132e0 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 44 6c  nt sqlite3UnixDl
132f0 63 6c 6f 73 65 28 76 6f 69 64 20 2a 70 48 61 6e  close(void *pHan
13300 64 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  dle){.  return d
13310 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
13320 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13330 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
13340 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  TENSION */../*.*
13350 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f  * Get informatio
13360 6e 20 74 6f 20 73 65 65 64 20 74 68 65 20 72 61  n to seed the ra
13370 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
13380 72 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64  rator.  The seed
13390 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69  .** is written i
133a0 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a  nto the buffer z
133b0 42 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63  Buf[256].  The c
133c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
133d0 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61  must.** supply a
133e0 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61   sufficiently la
133f0 72 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69  rge buffer..*/.i
13400 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61  nt sqlite3UnixRa
13410 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a  ndomSeed(char *z
13420 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61  Buf){.  /* We ha
13430 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ve to initialize
13440 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74   zBuf to prevent
13450 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72   valgrind from r
13460 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72  eporting.  ** er
13470 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72  rors.  The repor
13480 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c  ts issued by val
13490 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72  grind are incorr
134a0 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20  ect - we would. 
134b0 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20   ** prefer that 
134c0 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62  the randomness b
134d0 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d  e increased by m
134e0 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65  aking use of the
134f0 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69  .  ** uninitiali
13500 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75  zed space in zBu
13510 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64  f - but valgrind
13520 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20   errors tend to 
13530 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20  worry.  ** some 
13540 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74  users.  Rather t
13550 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65  han argue, it se
13560 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20  ems easier just 
13570 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20  to initialize.  
13580 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72  ** the whole arr
13590 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76  ay and silence v
135a0 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66  algrind, even if
135b0 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73   that means less
135c0 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a   randomness.  **
135d0 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73   in the random s
135e0 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  eed..  **.  ** W
135f0 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69  hen testing, ini
13600 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d  tializing zBuf[]
13610 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20   to zero is all 
13620 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61  we do.  That mea
13630 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20  ns.  ** that we 
13640 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73  always use the s
13650 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  ame random numbe
13660 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69  r sequence.  Thi
13670 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a  s makes the.  **
13680 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c   tests repeatabl
13690 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  e..  */.  memset
136a0 28 7a 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a  (zBuf, 0, 256);.
136b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
136c0 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20  ITE_TEST).  {.  
136d0 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20    int pid, fd;. 
136e0 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64     fd = open("/d
136f0 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
13700 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20  DONLY);.    if( 
13710 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69  fd<0 ){.      ti
13720 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69  me_t t;.      ti
13730 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65  me(&t);.      me
13740 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73  mcpy(zBuf, &t, s
13750 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20  izeof(t));.     
13760 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b   pid = getpid();
13770 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
13780 42 75 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f  Buf[sizeof(time_
13790 74 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  t)], &pid, sizeo
137a0 66 28 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c  f(pid));.    }el
137b0 73 65 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66  se{.      read(f
137c0 64 2c 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20  d, zBuf, 256);. 
137d0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
137e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
137f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c  _OK;.}../*.** Sl
13810 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
13820 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
13830 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
13840 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65  me slept..** The
13850 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
13860 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
13870 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20  seconds we want 
13880 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74  to sleep..*/.int
13890 20 73 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65   sqlite3UnixSlee
138a0 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64  p(int ms){.#if d
138b0 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
138c0 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
138d0 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31  EP.  usleep(ms*1
138e0 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  000);.  return m
138f0 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70  s;.#else.  sleep
13900 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b  ((ms+999)/1000);
13910 0a 20 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28  .  return 1000*(
13920 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  (ms+999)/1000);.
13930 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13940 53 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73  Static variables
13950 20 75 73 65 64 20 66 6f 72 20 74 68 72 65 61 64   used for thread
13960 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e   synchronization
13970 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74 65 78 20  ..**.** inMutex 
13980 20 20 20 20 20 74 68 65 20 6e 65 73 74 69 6e 67       the nesting
13990 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 72 65   depth of the re
139a0 63 75 72 73 69 76 65 20 6d 75 74 65 78 2e 20 20  cursive mutex.  
139b0 54 68 65 20 74 68 72 65 61 64 0a 2a 2a 20 20 20  The thread.**   
139c0 20 20 20 20 20 20 20 20 20 20 20 68 6f 6c 64 69             holdi
139d0 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 63 61 6e  ng mutexMain can
139e0 20 72 65 61 64 20 74 68 69 73 20 76 61 72 69 61   read this varia
139f0 62 6c 65 20 61 74 20 61 6e 79 20 74 69 6d 65 2e  ble at any time.
13a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13a10 20 42 75 74 20 69 73 20 6d 75 73 74 20 68 6f 6c   But is must hol
13a20 64 20 6d 75 74 65 78 41 75 78 20 74 6f 20 63 68  d mutexAux to ch
13a30 61 6e 67 65 20 74 68 69 73 20 76 61 72 69 61 62  ange this variab
13a40 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a 20 20 20  le.  Other.**   
13a50 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
13a60 64 73 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74  ds must hold mut
13a70 65 78 41 75 78 20 74 6f 20 72 65 61 64 20 74 68  exAux to read th
13a80 65 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 63  e variable and c
13a90 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
13aa0 20 20 20 6e 65 76 65 72 20 77 72 69 74 65 2e 0a     never write..
13ab0 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72  **.** mutexOwner
13ac0 20 20 20 54 68 65 20 74 68 72 65 61 64 20 69 64     The thread id
13ad0 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 20 68   of the thread h
13ae0 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e  olding mutexMain
13af0 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20 20 20 20  .  Same.**      
13b00 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20 72          access r
13b10 75 6c 65 73 20 61 73 20 66 6f 72 20 69 6e 4d 75  ules as for inMu
13b20 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78  tex..**.** mutex
13b30 4f 77 6e 65 72 56 61 6c 69 64 20 20 20 54 72 75  OwnerValid   Tru
13b40 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  e if the value i
13b50 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73 20  n mutexOwner is 
13b60 76 61 6c 69 64 2e 20 20 54 68 65 20 73 61 6d 65  valid.  The same
13b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13b80 20 20 20 20 20 20 61 63 63 65 73 73 20 72 75 6c        access rul
13b90 65 73 20 61 70 70 6c 79 20 61 73 20 66 6f 72 20  es apply as for 
13ba0 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d  inMutex..**.** m
13bb0 75 74 65 78 4d 61 69 6e 20 20 20 20 54 68 65 20  utexMain    The 
13bc0 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20 48 6f 6c  main mutex.  Hol
13bd0 64 20 74 68 69 73 20 6d 75 74 65 78 20 69 6e 20  d this mutex in 
13be0 6f 72 64 65 72 20 74 6f 20 67 65 74 20 65 78 63  order to get exc
13bf0 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20 20 20 20  lusive.**       
13c00 20 20 20 20 20 20 20 61 63 63 65 73 73 20 74 6f         access to
13c10 20 53 51 4c 69 74 65 20 64 61 74 61 20 73 74 72   SQLite data str
13c20 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 6d  uctures..**.** m
13c30 75 74 65 78 41 75 78 20 20 20 20 20 41 6e 20 61  utexAux     An a
13c40 75 78 69 6c 69 61 72 79 20 6d 75 74 65 78 20 6e  uxiliary mutex n
13c50 65 65 64 65 64 20 74 6f 20 61 63 63 65 73 73 20  eeded to access 
13c60 76 61 72 69 61 62 6c 65 73 20 64 65 66 69 6e 65  variables define
13c70 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 4d  d above..**.** M
13c80 75 74 65 78 65 73 20 61 72 65 20 61 6c 77 61 79  utexes are alway
13c90 73 20 61 63 71 75 69 72 65 64 20 69 6e 20 74 68  s acquired in th
13ca0 69 73 20 6f 72 64 65 72 3a 20 6d 75 74 65 78 4d  is order: mutexM
13cb0 61 69 6e 20 6d 75 74 65 78 41 75 78 2e 20 20 20  ain mutexAux.   
13cc0 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63  It.** is not nec
13cd0 65 73 73 61 72 79 20 74 6f 20 61 63 71 75 69 72  essary to acquir
13ce0 65 20 6d 75 74 65 78 4d 61 69 6e 20 69 6e 20 6f  e mutexMain in o
13cf0 72 64 65 72 20 74 6f 20 67 65 74 20 6d 75 74 65  rder to get mute
13d00 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a 2a 20 64  xAux - just.** d
13d10 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
13d20 20 61 63 71 75 69 72 65 20 74 68 65 6d 20 69 6e   acquire them in
13d30 20 74 68 65 20 72 65 76 65 72 73 65 20 6f 72 64   the reverse ord
13d40 65 72 3a 20 6d 75 74 65 78 41 75 78 20 6d 75 74  er: mutexAux mut
13d50 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69 74 68 65  exMain..** Eithe
13d60 72 20 67 65 74 20 74 68 65 20 6d 75 74 65 78 65  r get the mutexe
13d70 73 20 77 69 74 68 20 6d 75 74 65 78 4d 61 69 6e  s with mutexMain
13d80 20 66 69 72 73 74 20 6f 72 20 67 65 74 20 6d 75   first or get mu
13d90 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a 2a 2a 0a  texAux only..**.
13da0 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  ** When running 
13db0 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d 20 77 68  on a platform wh
13dc0 65 72 65 20 74 68 65 20 74 68 72 65 65 20 76 61  ere the three va
13dd0 72 69 61 62 6c 65 73 20 69 6e 4d 75 74 65 78 2c  riables inMutex,
13de0 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a 2a 2a 20   mutexOwner,.** 
13df0 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65 72 56 61  and mutexOwnerVa
13e00 6c 69 64 20 63 61 6e 20 62 65 20 73 65 74 20 61  lid can be set a
13e10 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68 65 20 6d  tomically, the m
13e20 75 74 65 78 41 75 78 20 69 73 20 6e 6f 74 20 72  utexAux is not r
13e30 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f 6e 20 6d  equired..** On m
13e40 61 6e 79 20 73 79 73 74 65 6d 73 2c 20 61 6c 6c  any systems, all
13e50 20 74 68 72 65 65 20 61 72 65 20 33 32 2d 62 69   three are 32-bi
13e60 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 77  t integers and w
13e70 72 69 74 69 6e 67 20 74 6f 20 61 20 33 32 2d 62  riting to a 32-b
13e80 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73  it.** integer is
13e90 20 61 74 6f 6d 69 63 2e 20 20 49 20 74 68 69 6e   atomic.  I thin
13ea0 6b 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  k.  But there ar
13eb0 65 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 73 2e  e no guarantees.
13ec0 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 2a 2a    So it seems.**
13ed0 20 73 61 66 65 72 20 74 6f 20 70 72 6f 74 65 63   safer to protec
13ee0 74 20 74 68 65 6d 20 75 73 69 6e 67 20 6d 75 74  t them using mut
13ef0 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  exAux..*/.static
13f00 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30   int inMutex = 0
13f10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13f20 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61  UNIX_THREADS.sta
13f30 74 69 63 20 70 74 68 72 65 61 64 5f 74 20 6d 75  tic pthread_t mu
13f40 74 65 78 4f 77 6e 65 72 3b 20 20 20 20 20 20 20  texOwner;       
13f50 20 20 20 2f 2a 20 54 68 72 65 61 64 20 68 6f 6c     /* Thread hol
13f60 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 2a  ding mutexMain *
13f70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 74  /.static int mut
13f80 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30  exOwnerValid = 0
13f90 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
13fa0 69 66 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73  if mutexOwner is
13fb0 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61 74 69 63   valid */.static
13fc0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
13fd0 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20 50 54 48   mutexMain = PTH
13fe0 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
13ff0 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68 65 20 6d  ALIZER; /* The m
14000 75 74 65 78 20 2a 2f 0a 73 74 61 74 69 63 20 70  utex */.static p
14010 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
14020 75 74 65 78 41 75 78 20 3d 20 50 54 48 52 45 41  utexAux = PTHREA
14030 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49  D_MUTEX_INITIALI
14040 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20 6d 75 74  ZER;  /* Aux mut
14050 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ex */.#endif../*
14060 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14070 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e  g pair of routin
14080 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75  e implement mutu
14090 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72  al exclusion for
140a0 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  .** multi-thread
140b0 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f  ed processes.  O
140c0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72  nly a single thr
140d0 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ead is allowed t
140e0 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f  o.** executed co
140f0 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72 6f  de that is surro
14100 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75  unded by EnterMu
14110 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d  tex() and LeaveM
14120 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  utex()..**.** SQ
14130 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61  Lite uses only a
14140 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20   single Mutex.  
14150 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  There is not muc
14160 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f  h critical.** co
14170 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74  de and what litt
14180 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65 63  le there is exec
14190 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64  utes quickly and
141a0 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e   without blockin
141b0 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20 76  g..**.** As of v
141c0 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74 68  ersion 3.3.2, th
141d0 69 73 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65  is mutex must be
141e0 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a 76   recursive..*/.v
141f0 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78 45  oid sqlite3UnixE
14200 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66  nterMutex(){.#if
14210 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
14220 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
14230 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
14240 74 65 78 41 75 78 29 3b 0a 20 20 69 66 28 20 21  texAux);.  if( !
14250 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
14260 7c 7c 20 21 70 74 68 72 65 61 64 5f 65 71 75 61  || !pthread_equa
14270 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74  l(mutexOwner, pt
14280 68 72 65 61 64 5f 73 65 6c 66 28 29 29 20 29 7b  hread_self()) ){
14290 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74  .    pthread_mut
142a0 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78  ex_unlock(&mutex
142b0 41 75 78 29 3b 0a 20 20 20 20 70 74 68 72 65 61  Aux);.    pthrea
142c0 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
142d0 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73  texMain);.    as
142e0 73 65 72 74 28 20 69 6e 4d 75 74 65 78 3d 3d 30  sert( inMutex==0
142f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14300 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64  !mutexOwnerValid
14310 20 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   );.    pthread_
14320 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
14330 78 41 75 78 29 3b 0a 20 20 20 20 6d 75 74 65 78  xAux);.    mutex
14340 4f 77 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f  Owner = pthread_
14350 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d 75 74 65  self();.    mute
14360 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 31 3b  xOwnerValid = 1;
14370 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65 78 2b 2b  .  }.  inMutex++
14380 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  ;.  pthread_mute
14390 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41  x_unlock(&mutexA
143a0 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d  ux);.#else.  inM
143b0 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69 66 0a 7d  utex++;.#endif.}
143c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
143d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20  xLeaveMutex(){. 
143e0 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
143f0 3e 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  >0 );.#ifdef SQL
14400 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
14410 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
14420 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  _lock(&mutexAux)
14430 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 20  ;.  inMutex--;. 
14440 20 61 73 73 65 72 74 28 20 70 74 68 72 65 61 64   assert( pthread
14450 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65  _equal(mutexOwne
14460 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  r, pthread_self(
14470 29 29 20 29 3b 0a 20 20 69 66 28 20 69 6e 4d 75  )) );.  if( inMu
14480 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  tex==0 ){.    as
14490 73 65 72 74 28 20 6d 75 74 65 78 4f 77 6e 65 72  sert( mutexOwner
144a0 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 6d 75 74  Valid );.    mut
144b0 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30  exOwnerValid = 0
144c0 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
144d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
144e0 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 70 74  xMain);.  }.  pt
144f0 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
14500 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23  ck(&mutexAux);.#
14510 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d 2d  else.  inMutex--
14520 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14530 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
14540 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63 75   the mutex is cu
14550 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a  rrently held..**
14560 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73 54  .** If the thisT
14570 68 72 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  hrd parameter is
14580 20 74 72 75 65 2c 20 72 65 74 75 72 6e 20 74 72   true, return tr
14590 75 65 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a  ue only if the.*
145a0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64  * calling thread
145b0 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
145c0 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
145d0 74 65 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65  ter is false, re
145e0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
145f0 61 6e 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73  any thread holds
14600 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69   the mutex..*/.i
14610 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e  nt sqlite3UnixIn
14620 4d 75 74 65 78 28 69 6e 74 20 74 68 69 73 54 68  Mutex(int thisTh
14630 72 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  rd){.#ifdef SQLI
14640 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
14650 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72    int rc;.  pthr
14660 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
14670 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72 63 20  mutexAux);.  rc 
14680 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26 26 20 28  = inMutex>0 && (
14690 74 68 69 73 54 68 72 64 3d 3d 30 20 7c 7c 20 70  thisThrd==0 || p
146a0 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74  thread_equal(mut
146b0 65 78 4f 77 6e 65 72 2c 70 74 68 72 65 61 64 5f  exOwner,pthread_
146c0 73 65 6c 66 28 29 29 29 3b 0a 20 20 70 74 68 72  self()));.  pthr
146d0 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
146e0 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72  (&mutexAux);.  r
146f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a  eturn rc;.#else.
14700 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78    return inMutex
14710 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  >0;.#endif.}../*
14720 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
14730 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61   number of threa
14740 64 2d 73 70 65 63 69 66 69 63 2d 64 61 74 61 20  d-specific-data 
14750 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64  blocks allocated
14760 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f  ..** Use this to
14770 20 76 65 72 69 66 79 20 74 68 61 74 20 77 65 20   verify that we 
14780 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20  are not leaking 
14790 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d  thread-specific-
147a0 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20  data..** Ticket 
147b0 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20  #1601.*/.#ifdef 
147c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
147d0 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
147e0 74 20 3d 20 30 3b 0a 23 20 69 66 64 65 66 20 53  t = 0;.# ifdef S
147f0 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
14800 44 53 0a 20 20 20 20 73 74 61 74 69 63 20 70 74  DS.    static pt
14810 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 74 73  hread_mutex_t ts
14820 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 20  d_counter_mutex 
14830 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
14840 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20 20  INITIALIZER;.#  
14850 20 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e   define TSD_COUN
14860 54 45 52 28 4e 29 20 5c 0a 20 20 20 20 20 20 20  TER(N) \.       
14870 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75        pthread_mu
14880 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63 6f  tex_lock(&tsd_co
14890 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c 0a  unter_mutex); \.
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
148b0 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b  ite3_tsd_count +
148c0 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20 20  = N; \.         
148d0 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
148e0 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63 6f  x_unlock(&tsd_co
148f0 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23 20  unter_mutex);.# 
14900 65 6c 73 65 0a 23 20 20 20 64 65 66 69 6e 65 20  else.#   define 
14910 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20  TSD_COUNTER(N)  
14920 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
14930 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a 23  t += N.# endif.#
14940 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53  else.# define TS
14950 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f 2a  D_COUNTER(N)  /*
14960 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
14970 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65  ../*.** If calle
14980 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46  d with allocateF
14990 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72 65 74 75  lag>0, then retu
149a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
149b0 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66  thread.** specif
149c0 69 63 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ic data for the 
149d0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
149e0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65   Allocate and ze
149f0 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64  ro the.** thread
14a00 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 69  -specific data i
14a10 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
14a20 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a  ready exist..**.
14a30 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74  ** If called wit
14a40 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d 3d  h allocateFlag==
14a50 30 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 68  0, then check th
14a60 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14a70 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 64 61 74  .** specific dat
14a80 61 2e 20 20 52 65 74 75 72 6e 20 69 74 20 69 66  a.  Return it if
14a90 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
14aa0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
14ab0 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
14ac0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
14ad0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c   called with all
14ae0 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20 63 68 65  ocateFlag<0, che
14af0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14b00 20 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63   thread specific
14b10 0a 2a 2a 20 64 61 74 61 20 69 73 20 61 6c 6c 6f  .** data is allo
14b20 63 61 74 65 64 20 61 6e 64 20 69 73 20 61 6c 6c  cated and is all
14b30 20 7a 65 72 6f 2e 20 20 49 66 20 69 74 20 69 73   zero.  If it is
14b40 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   then deallocate
14b50 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61   it..** Return a
14b60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14b70 74 68 72 65 61 64 20 73 70 65 63 69 66 69 63 20  thread specific 
14b80 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20  data or NULL if 
14b90 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63  it is.** unalloc
14ba0 61 74 65 64 20 6f 72 20 67 65 74 73 20 64 65 61  ated or gets dea
14bb0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68 72  llocated..*/.Thr
14bc0 65 61 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33  eadData *sqlite3
14bd0 55 6e 69 78 54 68 72 65 61 64 53 70 65 63 69 66  UnixThreadSpecif
14be0 69 63 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63  icData(int alloc
14bf0 61 74 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74  ateFlag){.  stat
14c00 69 63 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  ic const ThreadD
14c10 61 74 61 20 7a 65 72 6f 44 61 74 61 20 3d 20 7b  ata zeroData = {
14c20 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  0};  /* Initiali
14c30 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63 65 20 77  zer to silence w
14c40 61 72 6e 69 6e 67 73 0a 20 20 20 20 20 20 20 20  arnings.        
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b 65     ** from broke
14c80 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a 23  n compilers */.#
14c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
14ca0 58 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74  X_THREADS.  stat
14cb0 69 63 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74  ic pthread_key_t
14cc0 20 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69   key;.  static i
14cd0 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a  nt keyInit = 0;.
14ce0 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
14cf0 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79 49  sd;..  if( !keyI
14d00 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
14d10 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
14d20 3b 0a 20 20 20 20 69 66 28 20 21 6b 65 79 49 6e  ;.    if( !keyIn
14d30 69 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  it ){.      int 
14d40 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  rc;.      rc = p
14d50 74 68 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74  thread_key_creat
14d60 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20  e(&key, 0);.    
14d70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14d80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
14d90 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
14da0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14db0 20 20 20 7d 0a 20 20 20 20 20 20 6b 65 79 49 6e     }.      keyIn
14dc0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
14dd0 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
14de0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20 20  Mutex();.  }..  
14df0 70 54 73 64 20 3d 20 70 74 68 72 65 61 64 5f 67  pTsd = pthread_g
14e00 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 29 3b  etspecific(key);
14e10 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46  .  if( allocateF
14e20 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  lag>0 ){.    if(
14e30 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20   pTsd==0 ){.    
14e40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54 65    if( !sqlite3Te
14e50 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29  stMallocFail() )
14e60 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64 20 3d  {.        pTsd =
14e70 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63   sqlite3OsMalloc
14e80 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61  (sizeof(zeroData
14e90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64  ));.      }.#ifd
14ea0 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
14eb0 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
14ec0 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  _isFail = 0;.#en
14ed0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 54  dif.      if( pT
14ee0 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sd ){.        *p
14ef0 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a  Tsd = zeroData;.
14f00 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f          pthread_
14f10 73 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c  setspecific(key,
14f20 20 70 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20   pTsd);.        
14f30 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b  TSD_COUNTER(+1);
14f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14f50 20 7d 65 6c 73 65 20 69 66 28 20 70 54 73 64 21   }else if( pTsd!
14f60 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c  =0 && allocateFl
14f70 61 67 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20  ag<0 .          
14f80 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64    && memcmp(pTsd
14f90 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a  , &zeroData, siz
14fa0 65 6f 66 28 54 68 72 65 61 64 44 61 74 61 29 29  eof(ThreadData))
14fb0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
14fc0 65 33 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a  e3OsFree(pTsd);.
14fd0 20 20 20 20 70 74 68 72 65 61 64 5f 73 65 74 73      pthread_sets
14fe0 70 65 63 69 66 69 63 28 6b 65 79 2c 20 30 29 3b  pecific(key, 0);
14ff0 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52  .    TSD_COUNTER
15000 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d  (-1);.    pTsd =
15010 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
15020 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20 73   pTsd;.#else.  s
15030 74 61 74 69 63 20 54 68 72 65 61 64 44 61 74 61  tatic ThreadData
15040 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20 20 69 66   *pTsd = 0;.  if
15050 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30  ( allocateFlag>0
15060 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64   ){.    if( pTsd
15070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
15080 20 21 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c   !sqlite3TestMal
15090 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20  locFail() ){.   
150a0 20 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69       pTsd = sqli
150b0 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69 7a  te3OsMalloc( siz
150c0 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 20 29 3b  eof(zeroData) );
150d0 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
150e0 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a  SQLITE_MEMDEBUG.
150f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73        sqlite3_is
15100 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Fail = 0;.#endif
15110 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64 20  .      if( pTsd 
15120 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64  ){.        *pTsd
15130 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20   = zeroData;.   
15140 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52       TSD_COUNTER
15150 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  (+1);.      }.  
15160 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
15170 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63  pTsd!=0 && alloc
15180 61 74 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20  ateFlag<0.      
15190 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
151a0 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c  pTsd, &zeroData,
151b0 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61   sizeof(ThreadDa
151c0 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ta))==0 ){.    s
151d0 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73  qlite3OsFree(pTs
151e0 64 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e  d);.    TSD_COUN
151f0 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73  TER(-1);.    pTs
15200 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
15210 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66  urn pTsd;.#endif
15220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
15230 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
15240 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
15250 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
15260 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
15270 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
15280 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
15290 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
152a0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
152b0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
152c0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
152d0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
152e0 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
152f0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
15300 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
15310 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
15320 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
15330 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
15340 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
15350 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
15360 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
15370 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
15380 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
15390 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
153a0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
153b0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
153c0 69 74 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54  ite3UnixCurrentT
153d0 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ime(double *prNo
153e0 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45  w){.#ifdef NO_GE
153f0 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TTOD.  time_t t;
15400 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
15410 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
15420 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
15430 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
15440 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73 74  meval sNow;.  st
15450 72 75 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73 54  ruct timezone sT
15460 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  z;  /* Not used 
15470 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  */.  gettimeofda
15480 79 28 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b 0a  y(&sNow, &sTz);.
15490 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
154a0 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
154b0 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
154c0 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30  w.tv_usec/864000
154d0 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  00000.0;.#endif.
154e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
154f0 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
15500 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
15510 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
15520 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
15530 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
15540 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
15550 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  if.  return 0;.}
15560 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55  ..#endif /* OS_U
15570 4e 49 58 20 2a 2f 0a                             NIX */.