/ Hex Artifact Content
Login

Artifact d4bc8cbe1c0dc330bd55bf7821db5b7dbfbf183e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 20 64 65 66 69 6e 65 64 28 54 48 52 45 41 44 53   defined(THREADS
0740: 41 46 45 29 20 26 26 20 54 48 52 45 41 44 53 41  AFE) && THREADSA
0750: 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 74  FE.# include <pt
0760: 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e  hread.h>.# defin
0770: 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  e SQLITE_UNIX_TH
0780: 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a  READS 1.#endif..
0790: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
07a0: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
07b0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 66 69  reating a new fi
07c0: 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  le.*/.#ifndef SQ
07d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
07e0: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  E_PERMISSIONS.# 
07f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
0800: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0810: 53 53 49 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64  SSIONS 0644.#end
0820: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if..../*.** The 
0830: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
0840: 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20 6f  re is subclass o
0850: 66 20 4f 73 46 69 6c 65 20 73 70 65 63 69 66 69  f OsFile specifi
0860: 63 20 66 6f 72 20 74 68 65 20 75 6e 69 78 0a 2a  c for the unix.*
0870: 2a 20 70 72 6f 74 61 62 69 6c 69 74 79 20 6c 61  * protability la
0880: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
0890: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20  struct unixFile 
08a0: 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63 74  unixFile;.struct
08b0: 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 49 6f   unixFile {.  Io
08c0: 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a 70 4d  Method const *pM
08d0: 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79  ethod;  /* Alway
08e0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
08f0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70  y */.  struct op
0900: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20  enCnt *pOpen;   
0910: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 61   /* Info about a
0920: 6c 6c 20 6f 70 65 6e 20 66 64 27 73 20 6f 6e 20  ll open fd's on 
0930: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
0940: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
0950: 2a 70 4c 6f 63 6b 3b 20 20 20 2f 2a 20 49 6e 66  *pLock;   /* Inf
0960: 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e  o about locks on
0970: 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 23   this inode */.#
0980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0990: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
09a0: 45 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e  E.  void *lockin
09b0: 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
09c0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
09d0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
09e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
09f0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0a00: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 69 6e 74 20  _STYLE */.  int 
0a10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0a20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
0a30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
0a40: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0a50: 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f 2a 20 54  locktype;   /* T
0a60: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
0a70: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
0a80: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0a90: 61 72 20 69 73 4f 70 65 6e 3b 20 20 20 20 20 2f  ar isOpen;     /
0aa0: 2a 20 54 72 75 65 20 69 66 20 6e 65 65 64 73 20  * True if needs 
0ab0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
0ac0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0ad0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 2f 2a 20 55  fullSync;   /* U
0ae0: 73 65 20 46 5f 46 55 4c 4c 53 59 4e 43 20 69 66  se F_FULLSYNC if
0af0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
0b00: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
0b20: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
0b30: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
0b40: 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 20  /.  i64 offset; 
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0b60: 20 53 65 65 6b 20 6f 66 66 73 65 74 20 2a 2f 0a   Seek offset */.
0b70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
0b80: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
0b90: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20  read_t tid;     
0ba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68         /* The th
0bb0: 72 65 61 64 20 74 68 61 74 20 22 6f 77 6e 73 22  read that "owns"
0bc0: 20 74 68 69 73 20 4f 73 46 69 6c 65 20 2a 2f 0a   this OsFile */.
0bd0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
0be0: 20 50 72 6f 76 69 64 65 20 74 68 65 20 61 62 69   Provide the abi
0bf0: 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
0c00: 20 73 6f 6d 65 20 4f 53 2d 6c 61 79 65 72 20 66   some OS-layer f
0c10: 75 6e 63 74 69 6f 6e 73 20 64 75 72 69 6e 67 0a  unctions during.
0c20: 2a 2a 20 74 65 73 74 69 6e 67 2e 20 20 54 68 69  ** testing.  Thi
0c30: 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 69 6d  s is used to sim
0c40: 75 6c 61 74 65 20 4f 53 20 63 72 61 73 68 65 73  ulate OS crashes
0c50: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
0c60: 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 61 72 65 20  .** commits are 
0c70: 61 74 6f 6d 69 63 20 65 76 65 6e 20 69 6e 20 74  atomic even in t
0c80: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 4f  he event of an O
0c90: 53 20 63 72 61 73 68 2e 0a 2a 2f 0a 23 69 66 64  S crash..*/.#ifd
0ca0: 65 66 20 53 51 4c 49 54 45 5f 43 52 41 53 48 5f  ef SQLITE_CRASH_
0cb0: 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
0cc0: 74 20 73 71 6c 69 74 65 33 43 72 61 73 68 54 65  t sqlite3CrashTe
0cd0: 73 74 45 6e 61 62 6c 65 3b 0a 20 20 65 78 74 65  stEnable;.  exte
0ce0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72  rn int sqlite3Cr
0cf0: 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65  ashOpenReadWrite
0d00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73  (const char*, Os
0d10: 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20  File**, int*);. 
0d20: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
0d30: 74 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c  te3CrashOpenExcl
0d40: 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72  usive(const char
0d50: 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74  *, OsFile**, int
0d60: 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
0d70: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d80: 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63  ReadOnly(const c
0d90: 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20  har*, OsFile**, 
0da0: 69 6e 74 29 3b 0a 23 20 64 65 66 69 6e 65 20 43  int);.# define C
0db0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
0dc0: 44 45 28 58 2c 41 2c 42 2c 43 29 20 5c 0a 20 20  DE(X,A,B,C) \.  
0dd0: 20 20 69 66 28 73 71 6c 69 74 65 33 43 72 61 73    if(sqlite3Cras
0de0: 68 54 65 73 74 45 6e 61 62 6c 65 29 7b 20 72 65  hTestEnable){ re
0df0: 74 75 72 6e 20 58 28 41 2c 42 2c 43 29 3b 20 7d  turn X(A,B,C); }
0e00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0e10: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
0e20: 49 44 45 28 58 2c 41 2c 42 2c 43 29 20 20 2f 2a  IDE(X,A,B,C)  /*
0e30: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66   no-op */.#endif
0e40: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  .../*.** Include
0e50: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0e60: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
0e70: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
0e80: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
0e90: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  h"../*.** Do not
0ea0: 20 69 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20   include any of 
0eb0: 74 68 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74  the File I/O int
0ec0: 65 72 66 61 63 65 20 70 72 6f 63 65 64 75 72 65  erface procedure
0ed0: 73 20 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49  s if the.** SQLI
0ee0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d  TE_OMIT_DISKIO m
0ef0: 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20  acro is defined 
0f00: 28 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74  (indicating that
0f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0f20: 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f   will be in-memo
0f30: 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e  ry only).*/.#ifn
0f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0f50: 44 49 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  DISKIO.../*.** D
0f60: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
0f70: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
0f80: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
0f90: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
0fa0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
0fb0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
0fc0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
0fd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
0fe0: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
0ff0: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
1000: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
1010: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1020: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
1030: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
1040: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
1050: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
1060: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
1070: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1080: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
1090: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
10a0: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
10b0: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
10c0: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
10d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
10e0: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
10f0: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
1100: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
1110: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
1120: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
1130: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
1140: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
1150: 50 2e 20 20 42 75 74 20 69 74 27 73 20 44 4f 53  P.  But it's DOS
1160: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
1170: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
1180: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65  f __DJGPP__.# de
1190: 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43  fine fcntl(A,B,C
11a0: 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ) 0.#endif../*.*
11b0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
11c0: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
11d0: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
11e0: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
11f0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
1200: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1220: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23  E_UNIX_THREADS.#
1230: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
1240: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
1250: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
1260: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65  /*.** Set or che
1280: 63 6b 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69  ck the OsFile.ti
1290: 64 20 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66  d field.  This f
12a0: 69 65 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e  ield is set when
12b0: 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73   an OsFile.** is
12c0: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20   first opened.  
12d0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75  All subsequent u
12e0: 73 65 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c  ses of the OsFil
12f0: 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1300: 65 0a 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64  e.** same thread
1310: 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e   is operating on
1320: 20 74 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f   the OsFile.  So
1330: 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
1340: 74 65 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61  tems do.** not a
1350: 6c 6c 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65  llow locks to be
1360: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f   overridden by o
1370: 74 68 65 72 20 74 68 72 65 61 64 73 20 61 6e 64  ther threads and
1380: 20 74 68 61 74 20 72 65 73 74 72 69 63 74 69 6f   that restrictio
1390: 6e 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  n.** means that 
13a0: 73 71 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73  sqlite3* databas
13b0: 65 20 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74  e handles cannot
13c0: 20 62 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f   be moved from o
13d0: 6e 65 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20  ne thread.** to 
13e0: 61 6e 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c  another.  This l
13f0: 6f 67 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20  ogic makes sure 
1400: 61 20 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20  a user does not 
1410: 74 72 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a  try to do that.*
1420: 2a 20 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2a  * by mistake..**
1430: 0a 2a 2a 20 56 65 72 73 69 6f 6e 20 33 2e 33 2e  .** Version 3.3.
1440: 31 20 28 32 30 30 36 2d 30 31 2d 31 35 29 3a 20  1 (2006-01-15): 
1450: 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 62 65 20   OsFiles can be 
1460: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
1470: 68 72 65 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74  hread to.** anot
1480: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  her as long as w
1490: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
14a0: 20 61 20 73 79 73 74 65 6d 20 74 68 61 74 20 73   a system that s
14b0: 75 70 70 6f 72 74 73 20 74 68 72 65 61 64 73 0a  upports threads.
14c0: 2a 2a 20 6f 76 65 72 72 69 64 69 6e 67 20 65 61  ** overriding ea
14d0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
14e0: 28 77 68 69 63 68 20 6e 6f 77 20 74 68 65 20 6d  (which now the m
14f0: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
1500: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
1510: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
1520: 20 20 42 75 74 20 74 68 65 20 4f 73 46 69 6c 65    But the OsFile
1530: 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e 65 65  .pLock field nee
1540: 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65 63 6f  ds to be.** reco
1550: 6d 70 75 74 65 64 20 62 65 63 61 75 73 65 20 69  mputed because i
1560: 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65 73 20  ts key includes 
1570: 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e 20 20  the thread-id.  
1580: 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  See the .** tran
1590: 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 29 20  sferOwnership() 
15a0: 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77 20 66  function below f
15b0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15c0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23 69 66  formation.*/.#if
15d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15e0: 55 4e 49 58 5f 54 48 52 45 41 44 53 29 0a 23 20  UNIX_THREADS).# 
15f0: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
1600: 44 49 44 28 58 29 20 20 20 28 58 29 2d 3e 74 69  DID(X)   (X)->ti
1610: 64 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  d = pthread_self
1620: 28 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43  ().# define CHEC
1630: 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 28 74  K_THREADID(X) (t
1640: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
1650: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30  chOthersLocks==0
1660: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 20 20   && \.          
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c    !pthread_equal
1690: 28 28 58 29 2d 3e 74 69 64 2c 20 70 74 68 72 65  ((X)->tid, pthre
16a0: 61 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73  ad_self())).#els
16b0: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54  e.# define SET_T
16c0: 48 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66  HREADID(X).# def
16d0: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
16e0: 49 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a  ID(X) 0.#endif..
16f0: 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68  /*.** Here is th
1700: 65 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20  e dirt on POSIX 
1710: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20  advisory locks: 
1720: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
1730: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
1740: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
1750: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
1760: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
1770: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
1780: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
1790: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
17a0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
17b0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
17c0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
17d0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
17e0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
17f0: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
1800: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
1810: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
1820: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
1830: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
1840: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
1850: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
1860: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
1870: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
1880: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
1890: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
18a0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
18b0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
18c0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
18d0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
18e0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
18f0: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
1900: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
1910: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
1920: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
1930: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
1940: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
1950: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
1960: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
1970: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
1980: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1990: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
19a0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
19b0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
19c0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
19d0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
19e0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
19f0: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
1a00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
1a10: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
1a20: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
1a30: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
1a40: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
1a50: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
1a60: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
1a70: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
1a80: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
1a90: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
1aa0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
1ab0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1ac0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
1ad0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
1ae0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
1af0: 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66  *.** Bummer.  If
1b00: 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69   you ask me, thi
1b10: 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61  s is broken.  Ba
1b20: 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20  dly broken.  It 
1b30: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
1b40: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
1b50: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
1b60: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
1b70: 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70  ss among.** comp
1b80: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
1b90: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
1ba0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
1bb0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
1bc0: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
1bd0: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
1be0: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
1bf0: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
1c00: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
1c10: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
1c20: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
1c30: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
1c40: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
1c50: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
1c60: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
1c70: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
1c80: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
1c90: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
1ca0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
1cb0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
1cc0: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
1cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce0: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
1cf0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1d00: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
1d10: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
1d20: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
1d30: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
1d40: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
1d50: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
1d60: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
1d70: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
1d80: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
1d90: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
1da0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
1db0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
1dc0: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
1dd0: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
1de0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
1df0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
1e00: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
1e10: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
1e20: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
1e30: 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73  .** The OsFile s
1e40: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
1e50: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
1e60: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
1e70: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
1e80: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
1e90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1ea0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
1eb0: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
1ec0: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
1ed0: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
1ee0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1ef0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
1f00: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
1f10: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
1f20: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
1f30: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
1f40: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
1f50: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
1f60: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
1f70: 74 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69  twice, both OsFi
1f80: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
1f90: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
1fa0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
1fb0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
1fc0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1fd0: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
1fe0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
1ff0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
2000: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
2010: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
2020: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
2030: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
2040: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
2050: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
2060: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
2070: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
2080: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
2090: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
20a0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
20b0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
20c0: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
20d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
20e0: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
20f0: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
2100: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
2110: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
2120: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
2130: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2140: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
2150: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
2160: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
2170: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
2180: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
2190: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
21a0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
21b0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
21c0: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31  *.** 2004-Jan-11
21d0: 3a 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74  :.** More recent
21e0: 20 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f   discoveries abo
21f0: 75 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ut POSIX advisor
2200: 79 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d  y locks.  (The m
2210: 6f 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65  ore.** I discove
2220: 72 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65  r, the more I re
2230: 61 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49  alize the a POSI
2240: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2250: 20 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69   are.** an abomi
2260: 6e 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49  nation.).**.** I
2270: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
2280: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
2290: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
22a0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
22b0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
22c0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
22d0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
22e0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
22f0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
2300: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
2310: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
2320: 6d 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73  m, each OsFile s
2330: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
2340: 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  s.** a pointer t
2350: 6f 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72  o an openCnt str
2360: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
2370: 73 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74  s one openCnt st
2380: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f  ructure.** per o
2390: 70 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68  pen inode, which
23a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74   means that mult
23b0: 69 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e  iple OsFiles can
23c0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
23d0: 6c 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20  le.** openCnt.  
23e0: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
23f0: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
2400: 20 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74   an OsFile, if t
2410: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
2420: 72 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f  r OsFiles open o
2430: 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65  n the same inode
2440: 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e   that are holdin
2450: 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c  g locks, the cal
2460: 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20  l.** to close() 
2470: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2480: 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20  tor is deferred 
2490: 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65  until all of the
24a0: 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a   locks clear..**
24b0: 20 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   The openCnt str
24c0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
24d0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
24e0: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
24f0: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
2500: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
2510: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
2520: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
2530: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
2540: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73  ears..**.** Firs
2550: 74 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74  t, under Linux t
2560: 68 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20  hreads, because 
2570: 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
2580: 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72  a separate.** pr
2590: 6f 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f  ocess ID, lock o
25a0: 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65  perations in one
25b0: 20 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f   thread do not o
25c0: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
25d0: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
25e0: 65 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61  e in other threa
25f0: 64 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  ds.  Linux threa
2600: 64 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a  ds behave like.*
2610: 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
2620: 73 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73  sses in this res
2630: 70 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79  pect.  But, if y
2640: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a  ou close a file.
2650: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  ** descriptor in
2660: 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20   linux threads, 
2670: 61 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c  all locks are cl
2680: 65 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b  eared, even lock
2690: 73 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68  s.** on other th
26a0: 72 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74  reads and even t
26b0: 68 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20  hough the other 
26c0: 74 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66  threads have dif
26d0: 66 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73  ferent.** proces
26e0: 73 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68  s IDs.  Linux th
26f0: 72 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69  reads is inconsi
2700: 73 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65  stent in this re
2710: 73 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62  spect..** (I'm b
2720: 65 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e  eginning to thin
2730: 6b 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72  k that linux thr
2740: 65 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69  eads is an abomi
2750: 6e 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20  nation too.).** 
2760: 54 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  The consequence 
2770: 6f 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74  of this all is t
2780: 68 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62  hat the hash tab
2790: 6c 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49  le for the lockI
27a0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
27b0: 20 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20   has to include 
27c0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61  the process id a
27d0: 73 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65  s part of its ke
27e0: 79 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63  y because.** loc
27f0: 6b 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ks in different 
2800: 74 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61  threads are trea
2810: 74 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e  ted as distinct.
2820: 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70    But the .** op
2830: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2840: 73 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75  should not inclu
2850: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  de the process i
2860: 64 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20  d in its.** key 
2870: 62 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20  because close() 
2880: 63 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61  clears lock on a
2890: 6c 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20  ll threads, not 
28a0: 6a 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74  just the current
28b0: 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72  .** thread.  Wer
28c0: 65 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69  e it not for thi
28d0: 73 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c  s goofiness in l
28e0: 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65  inux threads, we
28f0: 20 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e   could.** combin
2900: 65 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  e the lockInfo a
2910: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
2920: 74 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e  tures into a sin
2930: 67 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  gle structure..*
2940: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38  *.** 2004-Jun-28
2950: 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72  :.** On some ver
2960: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20  sions of linux, 
2970: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2980: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2990: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74   locks..** On ot
29a0: 68 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74  hers not.  Somet
29b0: 69 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61  imes you can cha
29c0: 6e 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72  nge the behavior
29d0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
29e0: 73 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e  system by settin
29f0: 67 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f  g the LD_ASSUME_
2a00: 4b 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65  KERNEL environme
2a10: 6e 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68  nt variable.  Th
2a20: 65 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64  e.** POSIX stand
2a30: 61 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73  ard is silent as
2a40: 20 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69   to which behavi
2a50: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61  or is correct, a
2a60: 73 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61  s far.** as I ca
2a70: 6e 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72  n tell, so other
2a80: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
2a90: 78 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65  x might show the
2aa0: 20 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69   same.** inconsi
2ab0: 73 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69  stency.  There i
2ac0: 73 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62  s no little doub
2ad0: 74 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61  t in my mind tha
2ae0: 74 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73  t posix.** advis
2af0: 6f 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69  ory locks and li
2b00: 6e 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20  nux threads are 
2b10: 70 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65  profoundly broke
2b20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  n..**.** To work
2b30: 20 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f   around the inco
2b40: 6e 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20  nsistencies, we 
2b50: 68 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20  have to test at 
2b60: 72 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74  runtime .** whet
2b70: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
2b80: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
2b90: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
2ba0: 73 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a  s.  This test.**
2bb0: 20 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68   is run once, th
2bc0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79  e first time any
2bd0: 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74   lock is attempt
2be0: 65 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a  ed.  A static .*
2bf0: 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  * variable is se
2c00: 74 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  t to record the 
2c10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20  results of this 
2c20: 74 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a  test for future.
2c30: 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  ** use..*/../*.*
2c40: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
2c50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2c60: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
2c70: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
2c80: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2c90: 61 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e  articular lockIn
2ca0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76  fo structure giv
2cb0: 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a  en its inode..**
2cc0: 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63  .** If threads c
2cd0: 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65  annot override e
2ce0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2cf0: 2c 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68  , then we set th
2d00: 65 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64  e.** lockKey.tid
2d10: 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68   field to the th
2d20: 72 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72  read ID.  If thr
2d30: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
2d40: 65 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73  e.** each others
2d50: 20 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20   locks then tid 
2d60: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2d70: 20 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 6f   zero.  tid is o
2d80: 6d 69 74 74 65 64 0a 2a 2a 20 69 66 20 77 65 20  mitted.** if we 
2d90: 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20  compile without 
2da0: 74 68 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72  threading suppor
2db0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  t..*/.struct loc
2dc0: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
2dd0: 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76  ev;       /* Dev
2de0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
2df0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
2e00: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
2e10: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2e20: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
2e30: 20 70 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20   pthread_t tid; 
2e40: 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f    /* Thread ID o
2e50: 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64  r zero if thread
2e60: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2e70: 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e  ach other */.#en
2e80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
2e90: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2ea0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2eb0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2ec0: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
2ed0: 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68  ** inode on each
2ee0: 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20 64   thread with a d
2ef0: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
2f00: 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20 68   ID.  (Threads h
2f10: 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  ave.** different
2f20: 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20   process IDs on 
2f30: 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f  linux, but not o
2f40: 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69  n most other uni
2f50: 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69  xes.).**.** A si
2f60: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
2f70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
2f80: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
2f90: 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a  o each OsFile.**
2fa0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
2fb0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
2fc0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2fd0: 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20  this object and 
2fe0: 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b  this.** object k
2ff0: 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  eeps a count of 
3000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73  the number of Os
3010: 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74  Files pointing t
3020: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
3030: 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72  lockInfo {.  str
3040: 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b  uct lockKey key;
3050: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
3060: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  key */.  int cnt
3070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3080: 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45   Number of SHARE
3090: 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  D locks held */.
30a0: 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20    int locktype; 
30b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
30c0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
30d0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
30e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3100: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3110: 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74 75   to this structu
3120: 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  re */.};../*.** 
3130: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
3140: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3150: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
3160: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
3170: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
3180: 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20  ticular openCnt 
3190: 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e 20  structure given 
31a0: 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73  its inode.  This
31b0: 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20  .** is the same 
31c0: 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65  as the lockKey e
31d0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
31e0: 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74  hread ID is omit
31f0: 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ted..*/.struct o
3200: 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74  penKey {.  dev_t
3210: 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63   dev;   /* Devic
3220: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
3230: 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e  o_t ino;   /* In
3240: 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b  ode number */.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3260: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3270: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
3280: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3290: 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f  each open.** ino
32a0: 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63 74  de.  This struct
32b0: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
32c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
32d0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a   locks on that.*
32e0: 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63  * inode.  If a c
32f0: 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74 65  lose is attempte
3300: 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f  d against an ino
3310: 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69  de that is holdi
3320: 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65  ng.** locks, the
3330: 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72   close is deferr
3340: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63  ed until all loc
3350: 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64 69  ks clear by addi
3360: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ng the.** file d
3370: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20  escriptor to be 
3380: 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65  closed to the pe
3390: 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nding list..*/.s
33a0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a  truct openCnt {.
33b0: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79    struct openKey
33c0: 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c   key;   /* The l
33d0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
33e0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
33f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3400: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
3410: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3420: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
3430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3440: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
3450: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20   locks */.  int 
3460: 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20  nPending;       
3470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3480: 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f  ending close() o
3490: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  perations */.  i
34a0: 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20  nt *aPending;   
34b0: 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64       /* Malloced
34c0: 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66   space holding f
34d0: 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20 63  d's awaiting a c
34e0: 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lose() */.};../*
34f0: 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20   .** These hash 
3500: 74 61 62 6c 65 73 20 6d 61 70 20 69 6e 6f 64 65  tables map inode
3510: 73 20 61 6e 64 20 66 69 6c 65 20 64 65 73 63 72  s and file descr
3520: 69 70 74 6f 72 73 20 28 72 65 61 6c 6c 79 2c 20  iptors (really, 
3530: 6c 6f 63 6b 4b 65 79 20 61 6e 64 0a 2a 2a 20 6f  lockKey and.** o
3540: 70 65 6e 4b 65 79 20 73 74 72 75 63 74 75 72 65  penKey structure
3550: 73 29 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  s) into lockInfo
3560: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72   and openCnt str
3570: 75 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73  uctures.  Access
3580: 20 74 6f 20 0a 2a 2a 20 74 68 65 73 65 20 68 61   to .** these ha
3590: 73 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  sh tables must b
35a0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  e protected by a
35b0: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
35c0: 63 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20  c Hash lockHash 
35d0: 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f 42  = {SQLITE_HASH_B
35e0: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
3600: 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73 71  adSafeMalloc, sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
3620: 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 73 74 61 74  ree, 0, 0};.stat
3630: 69 63 20 48 61 73 68 20 6f 70 65 6e 48 61 73 68  ic Hash openHash
3640: 20 3d 20 7b 53 51 4c 49 54 45 5f 48 41 53 48 5f   = {SQLITE_HASH_
3650: 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c  BINARY, 0, 0, 0,
3660: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72   .    sqlite3Thr
3670: 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 2c 20 73  eadSafeMalloc, s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 46 72 65 65 2c 20 30 2c 20 30 7d 3b 0a 0a 23 69  Free, 0, 0};..#i
36a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
36b0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
36c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6c 6f 63 6b 69  ./*.** The locki
36d0: 6e 67 20 73 74 79 6c 65 73 20 61 72 65 20 61 73  ng styles are as
36e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
36f0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  e different file
3700: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 61 70 61   locking.** capa
3710: 62 69 6c 69 74 69 65 73 20 73 75 70 70 6f 72 74  bilities support
3720: 65 64 20 62 79 20 64 69 66 66 65 72 65 6e 74 20  ed by different 
3730: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 0a  file systems.  .
3740: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  **.** POSIX lock
3750: 69 6e 67 20 73 74 79 6c 65 20 66 75 6c 6c 79 20  ing style fully 
3760: 73 75 70 70 6f 72 74 73 20 73 68 61 72 65 64 20  supports shared 
3770: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 20 62 79  and exclusive by
3780: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 0a  te-range locks .
3790: 2a 2a 20 41 44 50 20 6c 6f 63 6b 69 6e 67 20 6f  ** ADP locking o
37a0: 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 65 78 63  nly supports exc
37b0: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37c0: 65 20 6c 6f 63 6b 73 0a 2a 2a 20 46 4c 4f 43 4b  e locks.** FLOCK
37d0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
37e0: 20 73 69 6e 67 6c 65 20 66 69 6c 65 2d 67 6c 6f   single file-glo
37f0: 62 61 6c 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  bal exclusive lo
3800: 63 6b 0a 2a 2a 20 44 4f 54 4c 4f 43 4b 20 69 73  ck.** DOTLOCK is
3810: 6e 27 74 20 61 20 74 72 75 65 20 6c 6f 63 6b 69  n't a true locki
3820: 6e 67 20 73 74 79 6c 65 2c 20 69 74 20 72 65 66  ng style, it ref
3830: 65 72 73 20 74 6f 20 74 68 65 20 75 73 65 20 6f  ers to the use o
3840: 66 20 61 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  f a special.**  
3850: 20 66 69 6c 65 20 6e 61 6d 65 64 20 74 68 65 20   file named the 
3860: 73 61 6d 65 20 61 73 20 74 68 65 20 64 61 74 61  same as the data
3870: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20 61  base file with a
3880: 20 27 2e 6c 6f 63 6b 27 20 65 78 74 65 6e 73 69   '.lock' extensi
3890: 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 20 20 63 61  on, this.**   ca
38a0: 6e 20 62 65 20 75 73 65 64 20 6f 6e 20 66 69 6c  n be used on fil
38b0: 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 64  e systems that d
38c0: 6f 20 6e 6f 74 20 6f 66 66 65 72 20 61 6e 79 20  o not offer any 
38d0: 72 65 6c 69 61 62 6c 65 20 66 69 6c 65 20 6c 6f  reliable file lo
38e0: 63 6b 69 6e 67 0a 2a 2a 20 4e 4f 20 6c 6f 63 6b  cking.** NO lock
38f0: 69 6e 67 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ing means that n
3900: 6f 20 6c 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62  o locking will b
3910: 65 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  e attempted, thi
3920: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66  s is only used f
3930: 6f 72 0a 2a 2a 20 20 20 72 65 61 64 2d 6f 6e 6c  or.**   read-onl
3940: 79 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 63  y file systems c
3950: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 55 4e 53 55  urrently.** UNSU
3960: 50 50 4f 52 54 45 44 20 6d 65 61 6e 73 20 74 68  PPORTED means th
3970: 61 74 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 77 69  at no locking wi
3980: 6c 6c 20 62 65 20 61 74 74 65 6d 70 74 65 64 2c  ll be attempted,
3990: 20 74 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73   this is only us
39a0: 65 64 20 66 6f 72 0a 2a 2a 20 20 20 66 69 6c 65  ed for.**   file
39b0: 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
39c0: 65 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 75 6e  e known to be un
39d0: 73 75 70 70 6f 72 74 65 64 0a 2a 2f 0a 74 79 70  supported.*/.typ
39e0: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 70 6f 73  edef enum {..pos
39f0: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ixLockingStyle =
3a00: 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74 61   0,       /* sta
3a10: 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76 69  ndard posix-advi
3a20: 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 09 61  sory locks */..a
3a30: 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20  fpLockingStyle, 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75              /* u
3a50: 73 65 20 61 66 70 20 6c 6f 63 6b 73 20 2a 2f 0a  se afp locks */.
3a60: 09 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  .flockLockingSty
3a70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  le,           /*
3a80: 20 75 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a   use flock() */.
3a90: 09 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  .dotlockLockingS
3aa0: 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  tyle,         /*
3ab0: 20 75 73 65 20 3c 66 69 6c 65 3e 2e 6c 6f 63 6b   use <file>.lock
3ac0: 20 66 69 6c 65 73 20 2a 2f 0a 09 6e 6f 4c 6f 63   files */..noLoc
3ad0: 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20  kingStyle,      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 75 73 65 66 75          /* usefu
3af0: 6c 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  l for read-only 
3b00: 66 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 09  file system */..
3b10: 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
3b20: 6e 67 53 74 79 6c 65 20 20 20 20 20 20 2f 2a 20  ngStyle      /* 
3b30: 69 6e 64 69 63 61 74 65 73 20 75 6e 73 75 70 70  indicates unsupp
3b40: 6f 72 74 65 64 20 66 69 6c 65 20 73 79 73 74 65  orted file syste
3b50: 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65 33 4c 6f  m */.} sqlite3Lo
3b60: 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23 65 6e 64  ckingStyle;.#end
3b70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
3b80: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3b90: 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  E */..#ifdef SQL
3ba0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
3bb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
3bc0: 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65  able records whe
3bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
3be0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
3bf0: 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20   each others.** 
3c00: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  locks..**.**    
3c10: 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73  0:  No.  Threads
3c20: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
3c30: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
3c40: 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65  ks..**    1:  Ye
3c50: 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20  s.  Threads can 
3c60: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
3c70: 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20  hers locks..**  
3c80: 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b   -1:  We don't k
3c90: 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20 4f  now yet..**.** O
3ca0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
3cb0: 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  we know at compi
3cc0: 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65 61  le-time if threa
3cd0: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3ce0: 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20 6c  each.** others l
3cf0: 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65 20  ocks.  On those 
3d00: 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51 4c  systems, the SQL
3d10: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
3d20: 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a 2a  IDE_LOCK macro.*
3d30: 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61 70  * will be set ap
3d40: 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f 6e  propriately.  On
3d50: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c 20   other systems, 
3d60: 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63 6b  we have to check
3d70: 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e 20   at.** runtime. 
3d80: 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65 72   On these latter
3d90: 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49 45   systems, SQLTIE
3da0: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3db0: 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64 65  _LOCK is.** unde
3dc0: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  fined..**.** Thi
3dd0: 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d 61  s variable norma
3de0: 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63 6f  lly has file sco
3df0: 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64 75  pe only.  But du
3e00: 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77 65  ring testing, we
3e10: 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67 6c   make.** it a gl
3e20: 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  obal so that the
3e30: 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20 63   test code can c
3e40: 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65 20  hange its value 
3e50: 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72 69  in order to veri
3e60: 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  fy.** that the r
3e70: 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70 65  ight stuff happe
3e80: 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  ns in either cas
3e90: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
3ea0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
3eb0: 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RIDE_LOCK.# defi
3ec0: 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ne SQLITE_THREAD
3ed0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 2d  _OVERRIDE_LOCK -
3ee0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  1.#endif.#ifdef 
3ef0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
3f00: 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45  threadsOverrideE
3f10: 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d  achOthersLocks =
3f20: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3f30: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65  VERRIDE_LOCK;.#e
3f40: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 74  lse.static int t
3f50: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
3f60: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20  chOthersLocks = 
3f70: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3f80: 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a 23 65 6e  ERRIDE_LOCK;.#en
3f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
3fa0: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
3fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  information pass
3fc0: 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64 75  ed into individu
3fd0: 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65 61  al test.** threa
3fe0: 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54 68  ds by the testTh
3ff0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
4000: 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a  ior() routine..*
4010: 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64 54  /.struct threadT
4020: 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  estData {.  int 
4030: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
4040: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62 65     /* File to be
4050: 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74 72   locked */.  str
4060: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 20  uct flock lock; 
4070: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 69      /* The locki
4080: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
4090: 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20 20    int result;   
40a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
40b0: 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  lt of the lockin
40c0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 7d  g operation */.}
40d0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
40e0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
40f0: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
4100: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
4110: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
4120: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
4130: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
4140: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
4150: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
4160: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
4170: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
4180: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
4190: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
41a0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
41b0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
41c0: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
41d0: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
41e0: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
41f0: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
4200: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
4210: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
4220: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
4230: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
4240: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
4250: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
4260: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
4270: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
4280: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
4290: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
42a0: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
42b0: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
42c0: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
42d0: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c     s = fcntl(fd,
42e0: 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c   op, p);.    sql
42f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
4300: 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25  "fcntl unknown %
4310: 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20  d %d %d\n", fd, 
4320: 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75  op, s);.    retu
4330: 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn s;.  }.  if( 
4340: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
4350: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
4360: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "RDLCK";.  }el
4370: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
4380: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
4390: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
43a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
43b0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  >l_type==F_UNLCK
43c0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
43d0: 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "UNLCK";.  }else
43e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
43f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
4400: 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45   p->l_whence==SE
4410: 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20  EK_SET );.  s = 
4420: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4430: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
4440: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
4450: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
4460: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
4470: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
4480: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
4490: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
44a0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
44b0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
44c0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
44d0: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
44e0: 20 73 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c   s && op==F_SETL
44f0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
4500: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
4510: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
4520: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
4530: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
4540: 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66   *p;.    fcntl(f
4550: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
4560: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
4570: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
4580: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
4590: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
45a0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
45b0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
45c0: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
45d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
45e0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
45f0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
4600: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
4610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
4620: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
4630: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4640: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
4650: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
4660: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
4670: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
4680: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
4690: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
46a0: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
46b0: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
46c0: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
46d0: 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e  s;.}.#define fcn
46e0: 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e  tl lockTrace.#en
46f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f  dif /* SQLITE_LO
4700: 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  CK_TRACE */../*.
4710: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
4720: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
4730: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
4740: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
4750: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
4760: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
4770: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
4780: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
4790: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
47a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
47b0: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
47c0: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
47d0: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
47e0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
47f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
4800: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
4810: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
4820: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
4830: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
4840: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
4870: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
4880: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
4890: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
48a0: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
48b0: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
48c0: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
48d0: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
48e0: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
48f0: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
4900: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
4910: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
4920: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
4930: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
4940: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
4950: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
4960: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
4970: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
4980: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
4990: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
49a0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
49b0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
49c0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
49d0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
49e0: 6f 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b  or(int fd_orig){
49f0: 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72  .  int fd;.  str
4a00: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
4a10: 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65  ta d[2];.  pthre
4a20: 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64  ad_t t[2];..  fd
4a30: 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b   = dup(fd_orig);
4a40: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65  .  if( fd<0 ) re
4a50: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64  turn;.  memset(d
4a60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
4a70: 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b  .  d[0].fd = fd;
4a80: 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74  .  d[0].lock.l_t
4a90: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
4aa0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e   d[0].lock.l_len
4ab0: 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 1;.  d[0].loc
4ac0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20  k.l_start = 0;. 
4ad0: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65   d[0].lock.l_whe
4ae0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
4af0: 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20    d[1] = d[0];. 
4b00: 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70   d[1].lock.l_typ
4b10: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70  e = F_WRLCK;.  p
4b20: 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74  thread_create(&t
4b30: 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f  [0], 0, threadLo
4b40: 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d  ckingTest, &d[0]
4b50: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65  );.  pthread_cre
4b60: 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68  ate(&t[1], 0, th
4b70: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c  readLockingTest,
4b80: 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65   &d[1]);.  pthre
4b90: 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29  ad_join(t[0], 0)
4ba0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4bb0: 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f  (t[1], 0);.  clo
4bc0: 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64  se(fd);.  thread
4bd0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4be0: 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d  ersLocks =  d[0]
4bf0: 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b  .result==0 && d[
4c00: 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a  1].result==0;.}.
4c10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4c20: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f  _UNIX_THREADS */
4c30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4c40: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
4c50: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
4c60: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
4c70: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
4c80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
4c90: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
4ca0: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
4cb0: 63 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ck){.  assert( s
4cc0: 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
4cd0: 31 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63  1) );.  if (pLoc
4ce0: 6b 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72  k == NULL).    r
4cf0: 65 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e  eturn;.  pLock->
4d00: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c  nRef--;.  if( pL
4d10: 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ock->nRef==0 ){.
4d20: 20 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49      sqlite3HashI
4d30: 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c  nsert(&lockHash,
4d40: 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69   &pLock->key, si
4d50: 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29  zeof(pLock->key)
4d60: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4d70: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
4d80: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pLock);.  }.}../
4d90: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f  *.** Release a o
4da0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
4db0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
4dc0: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
4dd0: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
4de0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f  ic void releaseO
4df0: 70 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70  penCnt(struct op
4e00: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20  enCnt *pOpen){. 
4e10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4e20: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
4e30: 20 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e    if (pOpen == N
4e40: 55 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b  ULL).    return;
4e50: 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d  .  pOpen->nRef--
4e60: 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e  ;.  if( pOpen->n
4e70: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Ref==0 ){.    sq
4e80: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
4e90: 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65  &openHash, &pOpe
4ea0: 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  n->key, sizeof(p
4eb0: 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Open->key), 0);.
4ec0: 20 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e      free(pOpen->
4ed0: 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73  aPending);.    s
4ee0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
4ef0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d  Free(pOpen);.  }
4f00: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4f10: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
4f20: 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73  _STYLE./*.** Tes
4f30: 74 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20  ts a byte-range 
4f40: 6c 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f  locking query to
4f50: 20 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e   see if byte ran
4f60: 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a  ge locks are .**
4f70: 20 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e   supported, if n
4f80: 6f 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20  ot we fall back 
4f90: 74 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  to dotlockLockin
4fa0: 67 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  gStyle..*/.stati
4fb0: 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67  c sqlite3Locking
4fc0: 53 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73  Style sqlite3Tes
4fd0: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f  tLockingStyle(co
4fe0: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
4ff0: 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b  th, .  int fd) {
5000: 0a 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d  .  /* test byte-
5010: 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
5020: 20 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75   fcntl */.  stru
5030: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
5040: 6f 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f  o;.  .  lockInfo
5050: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
5060: 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
5070: 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
5080: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
5090: 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
50a0: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
50b0: 0a 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28  .  .  if (fcntl(
50c0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 28 69 6e  fd, F_GETLK, (in
50d0: 74 29 20 26 6c 6f 63 6b 49 6e 66 6f 29 20 21 3d  t) &lockInfo) !=
50e0: 20 2d 31 29 20 7b 0a 20 20 20 20 72 65 74 75 72   -1) {.    retur
50f0: 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74  n posixLockingSt
5100: 79 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f  yle;.  } .  .  /
5110: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 66 6c  * testing for fl
5120: 6f 63 6b 20 63 61 6e 20 67 69 76 65 20 66 61 6c  ock can give fal
5130: 73 65 20 70 6f 73 69 74 69 76 65 73 2e 20 20 53  se positives.  S
5140: 6f 20 69 66 20 69 66 20 74 68 65 20 61 62 6f 76  o if if the abov
5150: 65 20 74 65 73 74 0a 20 20 2a 2a 20 66 61 69 6c  e test.  ** fail
5160: 73 2c 20 74 68 65 6e 20 77 65 20 66 61 6c 6c 20  s, then we fall 
5170: 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 64 6f  back to using do
5180: 74 2d 6c 6f 63 6b 20 73 74 79 6c 65 20 6c 6f 63  t-lock style loc
5190: 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a 20 20 72  king..  */  .  r
51a0: 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63  eturn dotlockLoc
51b0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a 0a 2f 2a  kingStyle;.}../*
51c0: 20 0a 2a 2a 20 45 78 61 6d 69 6e 65 73 20 74 68   .** Examines th
51d0: 65 20 66 5f 66 73 74 79 70 65 6e 61 6d 65 20 65  e f_fstypename e
51e0: 6e 74 72 79 20 69 6e 20 74 68 65 20 73 74 61 74  ntry in the stat
51f0: 66 73 20 73 74 72 75 63 74 75 72 65 20 61 73 20  fs structure as 
5200: 72 65 74 75 72 6e 65 64 20 62 79 20 0a 2a 2a 20  returned by .** 
5210: 73 74 61 74 28 29 20 66 6f 72 20 74 68 65 20 66  stat() for the f
5220: 69 6c 65 20 73 79 73 74 65 6d 20 68 6f 73 74 69  ile system hosti
5230: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
5240: 66 69 6c 65 2c 20 61 73 73 69 67 6e 73 20 74 68  file, assigns th
5250: 65 20 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  e .** appropriat
5260: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  e locking style 
5270: 62 61 73 65 64 20 6f 6e 20 69 74 27 73 20 76 61  based on it's va
5280: 6c 75 65 2e 20 20 54 68 65 73 65 20 76 61 6c 75  lue.  These valu
5290: 65 73 20 61 6e 64 20 0a 2a 2a 20 61 73 73 69 67  es and .** assig
52a0: 6e 6d 65 6e 74 73 20 61 72 65 20 62 61 73 65 64  nments are based
52b0: 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53 58 20 62   on Darwin/OSX b
52c0: 65 68 61 76 69 6f 72 20 61 6e 64 20 68 61 76 65  ehavior and have
52d0: 20 6e 6f 74 20 62 65 65 6e 20 74 65 73 74 65 64   not been tested
52e0: 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72 20 73 79   on .** other sy
52f0: 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stems..*/.static
5300: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
5310: 74 79 6c 65 20 73 71 6c 69 74 65 33 44 65 74 65  tyle sqlite3Dete
5320: 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63  ctLockingStyle(c
5330: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
5340: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20  ath, .  int fd) 
5350: 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  {..#ifdef SQLITE
5360: 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53  _FIXED_LOCKING_S
5370: 54 59 4c 45 0a 20 20 72 65 74 75 72 6e 20 28 73  TYLE.  return (s
5380: 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79  qlite3LockingSty
5390: 6c 65 29 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  le)SQLITE_FIXED_
53a0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 3b 0a 23  LOCKING_STYLE;.#
53b0: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74  else.  struct st
53c0: 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 0a 20 20  atfs fsInfo;..  
53d0: 69 66 20 28 73 74 61 74 66 73 28 66 69 6c 65 50  if (statfs(fileP
53e0: 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
53f0: 20 2d 31 29 0a 20 20 20 20 72 65 74 75 72 6e 20   -1).    return 
5400: 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69  sqlite3TestLocki
5410: 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68  ngStyle(filePath
5420: 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 20 28  , fd);.  .  if (
5430: 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26  fsInfo.f_flags &
5440: 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a 20 20 20   MNT_RDONLY).   
5450: 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63 6b 69 6e   return noLockin
5460: 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28  gStyle;.  .  if(
5470: 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f   (!strcmp(fsInfo
5480: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5490: 68 66 73 22 29 29 20 7c 7c 0a 20 20 20 20 28 21  hfs")) ||.    (!
54a0: 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
54b0: 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 75 66 73  fstypename, "ufs
54c0: 22 29 29 20 29 0a 09 09 72 65 74 75 72 6e 20 70  ")) )...return p
54d0: 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  osixLockingStyle
54e0: 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d  ;.  .  if(!strcm
54f0: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5500: 65 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29 29  ename, "afpfs"))
5510: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66 70 4c  .    return afpL
5520: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5530: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
5540: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
5550: 2c 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20 72  , "nfs")) .    r
5560: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65 73  eturn sqlite3Tes
5570: 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66 69  tLockingStyle(fi
5580: 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a  lePath, fd);.  .
5590: 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73 49    if(!strcmp(fsI
55a0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
55b0: 2c 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20 20  , "smbfs")).    
55c0: 72 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63 6b  return flockLock
55d0: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69  ingStyle;.  .  i
55e0: 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f(!strcmp(fsInfo
55f0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5600: 6d 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65 74  msdos")).    ret
5610: 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  urn dotlockLocki
5620: 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66  ngStyle;.  .  if
5630: 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  (!strcmp(fsInfo.
5640: 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 77  f_fstypename, "w
5650: 65 62 64 61 76 22 29 29 0a 20 20 20 20 72 65 74  ebdav")).    ret
5660: 75 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64 4c  urn unsupportedL
5670: 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a  ockingStyle;.  .
5680: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5690: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
56a0: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 20  (filePath, fd); 
56b0: 20 0a 23 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49   .#endif // SQLI
56c0: 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47  TE_FIXED_LOCKING
56d0: 5f 53 54 59 4c 45 0a 7d 0a 0a 23 65 6e 64 69 66  _STYLE.}..#endif
56e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
56f0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
5700: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
5710: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5720: 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e  r, locate lockIn
5730: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73  fo and openCnt s
5740: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a  tructures that.*
5750: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
5760: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5770: 2e 20 20 43 72 65 61 74 65 20 6e 65 77 20 6f 6e  .  Create new on
5780: 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  es if necessary.
5790: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
57a0: 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20  values might be 
57b0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
57c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
57d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
57e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
57f0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ors..*/.static i
5800: 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  nt findLockInfo(
5810: 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
5840: 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74  riptor used in t
5850: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
5860: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70  ct lockInfo **pp
5870: 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75  Lock,    /* Retu
5880: 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20  rn the lockInfo 
5890: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
58a0: 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  /.  struct openC
58b0: 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20  nt **ppOpen     
58c0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f   /* Return the o
58d0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
58e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
58f0: 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 6c  t rc;.  struct l
5900: 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73  ockKey key1;.  s
5910: 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65  truct openKey ke
5920: 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  y2;.  struct sta
5930: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73 74 72  t statbuf;.  str
5940: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
5950: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f 70  ock;.  struct op
5960: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20  enCnt *pOpen;.  
5970: 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26  rc = fstat(fd, &
5980: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
5990: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc!=0 ) return 1
59a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
59b0: 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31 29  ite3OsInMutex(1)
59c0: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65   );.  memset(&ke
59d0: 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  y1, 0, sizeof(ke
59e0: 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76  y1));.  key1.dev
59f0: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
5a00: 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  v;.  key1.ino = 
5a10: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
5a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
5a30: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 69 66 28  IX_THREADS.  if(
5a40: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
5a50: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c  EachOthersLocks<
5a60: 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72  0 ){.    testThr
5a70: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
5a80: 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65  or(fd);.  }.  ke
5a90: 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73  y1.tid = threads
5aa0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
5ab0: 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74  rsLocks ? 0 : pt
5ac0: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65  hread_self();.#e
5ad0: 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b  ndif.  memset(&k
5ae0: 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey2, 0, sizeof(k
5af0: 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65  ey2));.  key2.de
5b00: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
5b10: 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d  ev;.  key2.ino =
5b20: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
5b30: 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75  .  pLock = (stru
5b40: 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c  ct lockInfo*)sql
5b50: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c 6f  ite3HashFind(&lo
5b60: 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20 73  ckHash, &key1, s
5b70: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
5b80: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
5b90: 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49      struct lockI
5ba0: 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  nfo *pOld;.    p
5bb0: 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 54 68  Lock = sqlite3Th
5bc0: 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
5bd0: 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29  sizeof(*pLock) )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ;.    if( pLock=
5bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
5c00: 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
5c10: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
5c20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
5c30: 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20  k->key = key1;. 
5c40: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d     pLock->nRef =
5c50: 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   1;.    pLock->c
5c60: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63  nt = 0;.    pLoc
5c70: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b  k->locktype = 0;
5c80: 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69  .    pOld = sqli
5c90: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c  te3HashInsert(&l
5ca0: 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d  ockHash, &pLock-
5cb0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
5cc0: 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  1), pLock);.    
5cd0: 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20  if( pOld!=0 ){. 
5ce0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5cf0: 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  d==pLock );.    
5d00: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
5d10: 61 66 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  afeFree(pLock);.
5d20: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5d30: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69      goto exit_fi
5d40: 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20  ndlockinfo;.    
5d50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
5d60: 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Lock->nRef++;.  
5d70: 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c  }.  *ppLock = pL
5d80: 6f 63 6b 3b 0a 20 20 69 66 28 20 70 70 4f 70 65  ock;.  if( ppOpe
5d90: 6e 21 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 65  n!=0 ){.    pOpe
5da0: 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e  n = (struct open
5db0: 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68  Cnt*)sqlite3Hash
5dc0: 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20  Find(&openHash, 
5dd0: 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65  &key2, sizeof(ke
5de0: 79 32 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  y2));.    if( pO
5df0: 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
5e00: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5e10: 70 4f 6c 64 3b 0a 20 20 20 20 20 20 70 4f 70 65  pOld;.      pOpe
5e20: 6e 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  n = sqlite3Threa
5e30: 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  dSafeMalloc( siz
5e40: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
5e50: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
5e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
5e70: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
5e80: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
5e90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
5ea0: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5eb0: 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nfo;.      }.   
5ec0: 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20     pOpen->key = 
5ed0: 6b 65 79 32 3b 0a 20 20 20 20 20 20 70 4f 70 65  key2;.      pOpe
5ee0: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
5ef0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20     pOpen->nLock 
5f00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
5f10: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
5f20: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
5f30: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  nding = 0;.     
5f40: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5f50: 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48  ashInsert(&openH
5f60: 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79  ash, &pOpen->key
5f70: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20  , sizeof(key2), 
5f80: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  pOpen);.      if
5f90: 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20  ( pOld!=0 ){.   
5fa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
5fb0: 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  d==pOpen );.    
5fc0: 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
5fd0: 64 53 61 66 65 46 72 65 65 28 70 4f 70 65 6e 29  dSafeFree(pOpen)
5fe0: 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
5ff0: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
6000: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
6010: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
6020: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
6030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6040: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
6050: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
6060: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
6070: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
6080: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
6090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
60a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
60b0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
60c0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
60d0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
60e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
60f0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
6100: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
6110: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
6120: 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74  presetation of t
6130: 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69  he supplied.** i
6140: 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65  nteger lock-type
6150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
6160: 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65  t char *locktype
6170: 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70  Name(int locktyp
6180: 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f  e){.  switch( lo
6190: 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61 73 65  cktype ){.  case
61a0: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
61b0: 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73 65 20   "NONE";.  case 
61c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
61d0: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
61e0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
61f0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45  CK: return "RESE
6200: 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20 50 45  RVED";.  case PE
6210: 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75  NDING_LOCK: retu
6220: 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20  rn "PENDING";.  
6230: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
6240: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
6250: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
6260: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
6270: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
6280: 66 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  f we are current
6290: 6c 79 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ly in a differen
62a0: 74 20 74 68 72 65 61 64 20 74 68 61 6e 20 74 68  t thread than th
62b0: 65 20 74 68 72 65 61 64 20 74 68 61 74 20 74 68  e thread that th
62c0: 65 0a 2a 2a 20 75 6e 69 78 46 69 6c 65 20 61 72  e.** unixFile ar
62d0: 67 75 6d 65 6e 74 20 62 65 6c 6f 6e 67 73 20 74  gument belongs t
62e0: 6f 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  o, then transfer
62f0: 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68   ownership of th
6300: 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 6f 76  e unixFile.** ov
6310: 65 72 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  er to the curren
6320: 74 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  t thread..**.** 
6330: 41 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6f 6e  A unixFile is on
6340: 6c 79 20 6f 77 6e 65 64 20 62 79 20 61 20 74 68  ly owned by a th
6350: 72 65 61 64 20 6f 6e 20 73 79 73 74 65 6d 73 20  read on systems 
6360: 77 68 65 72 65 20 6f 6e 65 20 74 68 72 65 61 64  where one thread
6370: 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20 74 6f   is.** unable to
6380: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
6390: 63 72 65 61 74 65 64 20 62 79 20 61 20 64 69 66  created by a dif
63a0: 66 65 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20  ferent thread.  
63b0: 52 65 64 48 61 74 39 20 69 73 0a 2a 2a 20 61 6e  RedHat9 is.** an
63c0: 20 65 78 61 6d 70 6c 65 20 6f 66 20 73 75 63 68   example of such
63d0: 20 61 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a   a system..**.**
63e0: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
63f0: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
6400: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
6410: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
6420: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
6430: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
6440: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
6450: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
6460: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
6470: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
6480: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
6490: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
64a0: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
64b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
64c0: 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
64d0: 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f 77  c int transferOw
64e0: 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c 65  nership(unixFile
64f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
6500: 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20  rc;.  pthread_t 
6510: 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68 72  hSelf;.  if( thr
6520: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
6530: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a 20  OthersLocks ){. 
6540: 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70 20     /* Ownership 
6550: 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e 65  transfers not ne
6560: 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79 73  eded on this sys
6570: 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tem */.    retur
6580: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6590: 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72 65  .  hSelf = pthre
65a0: 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66 28  ad_self();.  if(
65b0: 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 70   pthread_equal(p
65c0: 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66  File->tid, hSelf
65d0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  ) ){.    /* We a
65e0: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  re still in the 
65f0: 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a 20  same thread */. 
6600: 20 20 20 54 52 41 43 45 31 28 22 4e 6f 2d 74 72     TRACE1("No-tr
6610: 61 6e 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72  ansfer, same thr
6620: 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ead\n");.    ret
6630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6640: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
6650: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
6660: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63  K ){.    /* We c
6670: 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e  annot change own
6680: 65 72 73 68 69 70 20 77 68 69 6c 65 20 77 65 20  ership while we 
6690: 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  are holding a lo
66a0: 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ck! */.    retur
66b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
66c0: 0a 20 20 7d 0a 20 20 54 52 41 43 45 34 28 22 54  .  }.  TRACE4("T
66d0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
66e0: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
66f0: 74 6f 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  to %d\n", pFile-
6700: 3e 68 2c 70 46 69 6c 65 2d 3e 74 69 64 2c 68 53  >h,pFile->tid,hS
6710: 65 6c 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74  elf);.  pFile->t
6720: 69 64 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66  id = hSelf;.  if
6730: 20 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21   (pFile->pLock !
6740: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65  = NULL) {.    re
6750: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46  leaseLockInfo(pF
6760: 69 6c 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20  ile->pLock);.   
6770: 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
6780: 66 6f 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46  fo(pFile->h, &pF
6790: 69 6c 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a  ile->pLock, 0);.
67a0: 20 20 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b      TRACE5("LOCK
67b0: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
67c0: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
67d0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
67e0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
67f0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
6800: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6810: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  ypeName(pFile->p
6820: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
6830: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
6840: 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nt);.    return 
6850: 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
6860: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6870: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
6880: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
6890: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
68a0: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
68b0: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
68c0: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
68d0: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
68e0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
68f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
6900: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
6910: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6920: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
6930: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6940: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
6950: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
6960: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6970: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
6980: 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65  the named file e
6990: 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
69a0: 6c 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69  lite3UnixFileExi
69b0: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
69c0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
69d0: 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c  turn access(zFil
69e0: 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a  ename, 0)==0;.}.
69f0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
6a00: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
6a10: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
6a20: 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c  ixFile(.  int h,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
6a50: 72 69 70 74 6f 72 20 6f 66 20 74 68 65 20 6f 70  riptor of the op
6a60: 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46  en file */.  OsF
6a70: 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20  ile **pId,      
6a80: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
6a90: 74 68 65 20 72 65 61 6c 20 66 69 6c 65 20 64 65  the real file de
6aa0: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
6ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ac0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
6ad0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
6ae0: 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
6af0: 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20  .  int delFlag  
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6b10: 49 66 20 74 72 75 65 2c 20 6d 61 6b 65 20 73 75  If true, make su
6b20: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 6c 65  re the file dele
6b30: 74 65 73 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  tes on close */.
6b40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  );../*.** Attemp
6b50: 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65  t to open a file
6b60: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
6b70: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
6b80: 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73  If that.** fails
6b90: 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74  , try opening it
6ba0: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20   read-only.  If 
6bb0: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
6bc0: 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20  t exist,.** try 
6bd0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a  to create it..**
6be0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
6bf0: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  a handle for the
6c00: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72   open file is wr
6c10: 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20  itten to *id.** 
6c20: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69  and *pReadonly i
6c30: 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68  s set to 0 if th
6c40: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
6c50: 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e  d for reading an
6c60: 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20  d.** writing or 
6c70: 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  1 if the file wa
6c80: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
6c90: 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  ly.  The functio
6ca0: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  n returns.** SQL
6cb0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
6cc0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
6cd0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
6ce0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
6cf0: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
6d00: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
6d10: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
6d20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65  t sqlite3UnixOpe
6d30: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f  nReadWrite(.  co
6d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
6d50: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a  ame,.  OsFile **
6d60: 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61  pId,.  int *pRea
6d70: 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68  donly.){.  int h
6d80: 3b 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53  ;.  .  CRASH_TES
6d90: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
6da0: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57  e3CrashOpenReadW
6db0: 72 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  rite, zFilename,
6dc0: 20 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29   pId, pReadonly)
6dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a  ;.  assert( 0==*
6de0: 70 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65  pId );.  h = ope
6df0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
6e00: 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41  DWR|O_CREAT|O_LA
6e10: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6e20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6e30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6e40: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
6e50: 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66  RMISSIONS);.  if
6e60: 28 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20  ( h<0 ){.#ifdef 
6e70: 45 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65  EISDIR.    if( e
6e80: 72 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a  rrno==EISDIR ){.
6e90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6ea0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
6eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 68    }.#endif.    h
6ec0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
6ed0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
6ee0: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
6ef0: 29 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20 29  );.    if( h<0 )
6f00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6f10: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
6f20: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61  .    }.    *pRea
6f30: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c  donly = 1;.  }el
6f40: 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e  se{.    *pReadon
6f50: 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ly = 0;.  }.  re
6f60: 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69  turn allocateUni
6f70: 78 46 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46  xFile(h, pId, zF
6f80: 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a  ilename, 0);.}..
6f90: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
6fa0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
6fb0: 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  e for exclusive 
6fc0: 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70  access by this p
6fd0: 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66  rocess..** The f
6fe0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ile will be open
6ff0: 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
7000: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
7010: 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20    To avoid.** a 
7020: 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69  potential securi
7030: 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ty problem, we d
7040: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
7050: 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20  file to have.** 
7060: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
7070: 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61  ed.  Nor do we a
7080: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
7090: 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a   be a symbolic.*
70a0: 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * link..**.** If
70b0: 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65   delFlag is true
70c0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61  , then make arra
70d0: 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f  ngements to auto
70e0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
70f0: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65  .** the file whe
7100: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
7110: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
7120: 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  , write the file
7130: 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64   handle into *id
7140: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
7150: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
7160: 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20  failure, return 
7170: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e  SQLITE_CANTOPEN.
7180: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
7190: 6e 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  nixOpenExclusive
71a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
71b0: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
71c0: 2a 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61  *pId, int delFla
71d0: 67 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  g){.  int h;..  
71e0: 43 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52  CRASH_TEST_OVERR
71f0: 49 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68  IDE(sqlite3Crash
7200: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a  OpenExclusive, z
7210: 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64  Filename, pId, d
7220: 65 6c 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72  elFlag);.  asser
7230: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
7240: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
7250: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
7260: 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45      O_RDWR|O_CRE
7270: 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  AT|O_EXCL|O_NOFO
7280: 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  LLOW|O_LARGEFILE
7290: 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20  |O_BINARY,.     
72a0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
72b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
72c0: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
72d0: 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65  f( h<0 ){.    re
72e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
72f0: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OPEN;.  }.  retu
7300: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
7310: 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c  ile(h, pId, zFil
7320: 65 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b  ename, delFlag);
7330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
7340: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
7350: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e  file for read-on
7360: 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  ly access..**.**
7370: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
7380: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
7390: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
73a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
73b0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
73c0: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
73d0: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
73e0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
73f0: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
7400: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7410: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
7420: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43  .  int h;.  .  C
7430: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
7440: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
7450: 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69  penReadOnly, zFi
7460: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b  lename, pId, 0);
7470: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
7480: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
7490: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
74a0: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
74b0: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
74c0: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( h<0 ){.    ret
74d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
74e0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PEN;.  }.  retur
74f0: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
7500: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7510: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  name, 0);.}../*.
7520: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
7530: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
7540: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
7550: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7560: 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20  ains a.** file. 
7570: 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   This file descr
7580: 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65  iptor can be use
7590: 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65  d to fsync() the
75a0: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e   directory.** in
75b0: 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
75c0: 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ure the creation
75d0: 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69   of a new file i
75e0: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
75f0: 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  en.** to disk..*
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e  e is only meanin
7620: 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20  gful for Unix.  
7630: 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
7640: 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73  der.** windows s
7650: 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65  ince windows doe
7660: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61  s not support ha
7670: 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20  rd links..**.** 
7680: 49 66 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73  If FULL_FSYNC is
7690: 20 65 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66   enabled, this f
76a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c  unction is not l
76b0: 6f 6e 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a  onger useful, .*
76c0: 2a 20 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73  * a FULL_FSYNC s
76d0: 79 6e 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ync applies to a
76e0: 6c 6c 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20  ll pending disk 
76f0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7700: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
7710: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
7720: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
7730: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
7740: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
7750: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
7760: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
7770: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
7780: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
7790: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
77a0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
77b0: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
77c0: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
77d0: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
77e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
77f0: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
7800: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
7810: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
7820: 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46  rname.){.  unixF
7830: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
7840: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
7850: 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( pFile==0 ){.  
7860: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e    /* Do not open
7870: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
7880: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
7890: 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ing file is not 
78a0: 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f  already.    ** o
78b0: 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  pen. */.    retu
78c0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
78d0: 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48  EN;.  }.  SET_TH
78e0: 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b 0a 20  READID(pFile);. 
78f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
7900: 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70 46 69  dirfd<0 );.  pFi
7910: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e  le->dirfd = open
7920: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
7930: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
7940: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64  ;.  if( pFile->d
7950: 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  irfd<0 ){.    re
7960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
7970: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41  OPEN; .  }.  TRA
7980: 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE3("OPENDIR %-3
7990: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
79a0: 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  dirfd, zDirname)
79b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
79c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
79d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
79e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
79f0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
7a00: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
7a10: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
7a20: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
7a30: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
7a40: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
7a50: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
7a60: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
7a70: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
7a80: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
7a90: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
7aa0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
7ab0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
7ac0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
7ad0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
7ae0: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
7af0: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
7b00: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
7b10: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
7b20: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
7b30: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
7b40: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
7b50: 65 33 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61  e3UnixTempFileNa
7b60: 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  me(char *zBuf){.
7b70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7b80: 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
7b90: 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  {.     0,.     "
7ba0: 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
7bb0: 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
7bc0: 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
7bd0: 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
7be0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
7bf0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
7c00: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
7c10: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
7c20: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
7c30: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
7c40: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
7c50: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
7c60: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
7c70: 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  f;.  const char 
7c80: 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61  *zDir = ".";.  a
7c90: 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
7ca0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
7cb0: 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  y;.  for(i=0; i<
7cc0: 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
7cd0: 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
7ce0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7cf0: 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63  azDirs[i]==0 ) c
7d00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7d10: 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c   stat(azDirs[i],
7d20: 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75   &buf) ) continu
7d30: 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53  e;.    if( !S_IS
7d40: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
7d50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7d60: 20 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69   if( access(azDi
7d70: 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e  rs[i], 07) ) con
7d80: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20  tinue;.    zDir 
7d90: 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20  = azDirs[i];.   
7da0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f   break;.  }.  do
7db0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
7dc0: 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49  uf, "%s/"TEMP_FI
7dd0: 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29  LE_PREFIX, zDir)
7de0: 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e  ;.    j = strlen
7df0: 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
7e00: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35  te3Randomness(15
7e10: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
7e20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
7e30: 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
7e40: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
7e50: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
7e60: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
7e70: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
7e80: 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
7e90: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
7ea0: 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73 73 28   }while( access(
7eb0: 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
7ec0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7ed0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ; .}../*.** Chec
7ee0: 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70  k that a given p
7ef0: 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72  athname is a dir
7f00: 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72  ectory and is wr
7f10: 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e  itable .**.*/.in
7f20: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44  t sqlite3UnixIsD
7f30: 69 72 57 72 69 74 61 62 6c 65 28 63 68 61 72 20  irWritable(char 
7f40: 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20  *zBuf){.#ifndef 
7f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
7f60: 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75  R_PRAGMAS.  stru
7f70: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
7f80: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
7f90: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
7fa0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
7fb0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
7fc0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
7fd0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
7fe0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
7ff0: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
8000: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
8010: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
8020: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
8030: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
8040: 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72  AGMAS */.  retur
8050: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 1;.}../*.** Se
8060: 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
8070: 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
8080: 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
8090: 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
80a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
80b0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
80c0: 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
80d0: 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
80e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
80f0: 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
8100: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
8110: 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
8120: 6e 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20 55  nt got;.#ifdef U
8130: 53 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20 3d  SE_PREAD.  got =
8140: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
8150: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8160: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73  set);.#else.  ls
8170: 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f  eek(id->h, id->o
8180: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
8190: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
81a0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
81b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 67  ;.#endif.  if( g
81c0: 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e  ot>0 ){.    id->
81d0: 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
81e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b   }.  return got;
81f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
8200: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
8210: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
8220: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8230: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
8240: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
8250: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
8260: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
8270: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
8280: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
8290: 74 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c  t unixRead(OsFil
82a0: 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75  e *id, void *pBu
82b0: 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69  f, int amt){.  i
82c0: 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74  nt got;.  assert
82d0: 28 20 69 64 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ( id );.  TIMER_
82e0: 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20 73  START;.  got = s
82f0: 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
8300: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
8310: 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e  amt);.  TIMER_EN
8320: 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52 45 41  D;.  TRACE5("REA
8330: 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
8340: 64 20 25 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46  d %d\n", ((unixF
8350: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 67 6f 74  ile*)id)->h, got
8360: 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74  ,.          last
8370: 5f 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41  _page, TIMER_ELA
8380: 50 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29  PSED);.  SEEK(0)
8390: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
83a0: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
83b0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
83c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
83d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
83e0: 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
83f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8400: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
8410: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
8420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
8430: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
8440: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
8450: 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
8460: 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
8470: 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
8480: 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
8490: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
84a0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
84b0: 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
84c0: 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ffset..*/.static
84d0: 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
84e0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
84f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
8500: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
8510: 74 20 67 6f 74 3b 0a 23 69 66 64 65 66 20 55 53  t got;.#ifdef US
8520: 45 5f 50 52 45 41 44 0a 20 20 67 6f 74 20 3d 20  E_PREAD.  got = 
8530: 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
8540: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8550: 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6c 73  set);.#else.  ls
8560: 65 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f  eek(id->h, id->o
8570: 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
8580: 3b 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28  ;.  got = write(
8590: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
85a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
85b0: 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d  got>0 ){.    id-
85c0: 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a  >offset += got;.
85d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74    }.  return got
85e0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
85f0: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
8600: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
8610: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
8620: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
8630: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
8640: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
8650: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
8660: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 4f   int unixWrite(O
8670: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
8680: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
8690: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f   amt){.  int wro
86a0: 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
86b0: 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
86c0: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 54 49 4d  ( amt>0 );.  TIM
86d0: 45 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c  ER_START;.  whil
86e0: 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f  e( amt>0 && (wro
86f0: 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74  te = seekAndWrit
8700: 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  e((unixFile*)id,
8710: 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
8720: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
8730: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
8740: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
8750: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45  ote];.  }.  TIME
8760: 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28  R_END;.  TRACE5(
8770: 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
8780: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 28 28 75  d %7d %d\n", ((u
8790: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
87a0: 20 77 72 6f 74 65 2c 0a 20 20 20 20 20 20 20 20   wrote,.        
87b0: 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d    last_page, TIM
87c0: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53  ER_ELAPSED);.  S
87d0: 45 45 4b 28 30 29 3b 0a 20 20 53 69 6d 75 6c 61  EEK(0);.  Simula
87e0: 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74  teIOError(( wrot
87f0: 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29  e=(-1), amt=1 ))
8800: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
8810: 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74  fullError(( wrot
8820: 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  e=0, amt=1 ));. 
8830: 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
8840: 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b    if( wrote<0 ){
8850: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8860: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
8870: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8880: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8890: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
88a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
88b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
88c0: 76 65 20 74 68 65 20 72 65 61 64 2f 77 72 69 74  ve the read/writ
88d0: 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66  e pointer in a f
88e0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
88f0: 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f 73 46 69  nt unixSeek(OsFi
8900: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
8910: 65 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  et){.  assert( i
8920: 64 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66 73  d );.  SEEK(offs
8930: 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 23 69  et/1024 + 1);.#i
8940: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8950: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 20 29 20  .  if( offset ) 
8960: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
8970: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
8980: 49 54 45 5f 46 55 4c 4c 29 3b 0a 23 65 6e 64 69  ITE_FULL);.#endi
8990: 66 0a 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  f.  ((unixFile*)
89a0: 69 64 29 2d 3e 6f 66 66 73 65 74 20 3d 20 6f 66  id)->offset = of
89b0: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 53  fset;.  return S
89c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
89d0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
89e0: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
89f0: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
8a00: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
8a10: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
8a20: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
8a30: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
8a40: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
8a50: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
8a60: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
8a70: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
8a80: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
8a90: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
8aa0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
8ab0: 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66 64  /*.** Use the fd
8ac0: 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f 6e  atasync() API on
8ad0: 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f 46  ly if the HAVE_F
8ae0: 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20 69  DATASYNC macro i
8af0: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f 74  s defined..** Ot
8b00: 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79 6e  herwise use fsyn
8b10: 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  c() in its place
8b20: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41 56  ..*/.#ifndef HAV
8b30: 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
8b40: 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
8b50: 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
8b60: 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
8b70: 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
8b80: 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
8b90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
8ba0: 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
8bb0: 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
8bc0: 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
8bd0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
8be0: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
8bf0: 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
8c00: 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
8c10: 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
8c20: 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
8c30: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
8c40: 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
8c50: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
8c60: 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
8c70: 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
8c80: 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
8c90: 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
8ca0: 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
8cb0: 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
8cc0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8cd0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
8ce0: 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
8cf0: 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
8d00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
8d10: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
8d20: 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
8d30: 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
8d40: 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
8d50: 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
8d60: 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
8d70: 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
8d80: 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
8d90: 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
8da0: 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
8db0: 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
8dc0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
8dd0: 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
8de0: 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
8df0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
8e00: 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
8e10: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
8e20: 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
8e30: 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
8e40: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
8e50: 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73  atic int full_fs
8e60: 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20  ync(int fd, int 
8e70: 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61  fullSync, int da
8e80: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
8e90: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
8ea0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
8eb0: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
8ec0: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
8ed0: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
8ee0: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
8ef0: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
8f00: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
8f10: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
8f20: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
8f30: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
8f40: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
8f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8f60: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
8f70: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
8f80: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
8f90: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
8fa0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
8fb0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
8fc0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
8fd0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
8fe0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
8ff0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
9000: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9010: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
9020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
9030: 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  ..#if HAVE_FULLF
9040: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
9050: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
9060: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
9070: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
9080: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56  se.#endif /* HAV
9090: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 20  E_FULLFSYNC */. 
90a0: 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29 7b   if( dataOnly ){
90b0: 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61 73  .    rc = fdatas
90c0: 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73 65  ync(fd);.  }else
90d0: 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
90e0: 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
90f0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
9100: 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a  TE_NO_SYNC) */..
9110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9120: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
9130: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
9140: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
9150: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
9160: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   disk..**.** If 
9170: 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e  dataOnly==0 then
9180: 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69   both the file i
9190: 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65  tself and its me
91a0: 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20  tadata (file.** 
91b0: 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d  size, access tim
91c0: 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e 63  e, etc) are sync
91d0: 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79  ed.  If dataOnly
91e0: 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68  !=0 then only th
91f0: 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69  e.** file data i
9200: 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
9210: 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f  Under Unix, also
9220: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9230: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
9240: 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  try for the file
9250: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
9260: 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e  ated by fsync-in
9270: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  g the directory 
9280: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
9290: 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65  e file..** If we
92a0: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
92b0: 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72  and we encounter
92c0: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
92d0: 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  , the directory.
92e0: 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
92f0: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
9300: 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20 77  ot exist after w
9310: 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e  e reboot.  The n
9320: 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f  ext.** SQLite to
9330: 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
9340: 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74   will not know t
9350: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
9360: 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65 0a  exists (because.
9370: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
9380: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
9390: 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72  ournal was never
93a0: 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74 68   created) and th
93b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
93c0: 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62   will not roll b
93d0: 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c  ack - possibly l
93e0: 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61  eading to databa
93f0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  se corruption..*
9400: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
9410: 78 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64  xSync(OsFile *id
9420: 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b  , int dataOnly){
9430: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
9440: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9450: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
9460: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
9470: 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20  .  TRACE2("SYNC 
9480: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
9490: 65 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75  e->h);.  rc = fu
94a0: 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
94b0: 68 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79  h, pFile->fullSy
94c0: 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 3b 0a 20  nc, dataOnly);. 
94d0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
94e0: 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
94f0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
9500: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
9510: 59 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  YNC;.  }.  if( p
9520: 46 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29  File->dirfd>=0 )
9530: 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22 44 49  {.    TRACE4("DI
9540: 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76 65  RSYNC %-3d (have
9550: 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
9560: 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
9570: 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20 20  File->dirfd,.   
9580: 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
9590: 4c 4c 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  LLFSYNC, pFile->
95a0: 66 75 6c 6c 53 79 6e 63 29 3b 0a 23 69 66 6e 64  fullSync);.#ifnd
95b0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
95c0: 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f 2a  E_DIRSYNC.    /*
95d0: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
95e0: 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ync is only atte
95f0: 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66 73  mpted if full_fs
9600: 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74 75  ync is.    ** tu
9610: 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61 76  rned off or unav
9620: 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20 66  ailable.  If a f
9630: 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72 72  ull_fsync occurr
9640: 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a 2a  ed above,.    **
9650: 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63 74   then the direct
9660: 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70 65  ory sync is supe
9670: 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a  rfluous..    */.
9680: 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f 46      if( (!HAVE_F
9690: 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 70 46 69  ULLFSYNC || !pFi
96a0: 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 29 20 26 26  le->fullSync) &&
96b0: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c   full_fsync(pFil
96c0: 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b  e->dirfd,0,0) ){
96d0: 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  .       /*.     
96e0: 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63    ** We have rec
96f0: 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72  eived multiple r
9700: 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28  eports of fsync(
9710: 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  ) returning.    
9720: 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65     ** errors whe
9730: 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72  n applied to dir
9740: 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74  ectories on cert
9750: 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ain file systems
9760: 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61  ..       ** A fa
9770: 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20 73  iled directory s
9780: 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67  ync is not a big
9790: 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65   deal.  So it se
97a0: 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65  ems.       ** be
97b0: 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74  tter to ignore t
97c0: 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65  he error.  Ticke
97d0: 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a  t #1657.       *
97e0: 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  /.       /* retu
97f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
9800: 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
9810: 0a 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65  .    close(pFile
9820: 2d 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e  ->dirfd);  /* On
9830: 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20  ly need to sync 
9840: 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74  once, so close t
9850: 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  he directory */.
9860: 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64      pFile->dirfd
9870: 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65   = -1;    /* whe
9880: 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a  n we are done. *
9890: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  /.  }.  return S
98a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
98b0: 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 72 65  ** Sync the dire
98c0: 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20  ctory zDirname. 
98d0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
98e0: 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  on operating sys
98f0: 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68  tems other.** th
9900: 61 6e 20 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54  an UNIX..**.** T
9910: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 6d  his is used to m
9920: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 61 73  ake sure the mas
9930: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9940: 20 68 61 73 20 74 72 75 65 6c 79 20 62 65 65 6e   has truely been
9950: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 62 65 66 6f   deleted.** befo
9960: 72 65 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  re making change
9970: 73 20 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20  s to individual 
9980: 6a 6f 75 72 6e 61 6c 73 20 6f 6e 20 61 20 6d 75  journals on a mu
9990: 6c 74 69 2d 64 61 74 61 62 61 73 65 20 63 6f 6d  lti-database com
99a0: 6d 69 74 2e 0a 2a 2a 20 54 68 65 20 46 5f 46 55  mit..** The F_FU
99b0: 4c 4c 46 53 59 4e 43 20 6f 70 74 69 6f 6e 20 69  LLFSYNC option i
99c0: 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 68 65 72  s not needed her
99d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
99e0: 33 55 6e 69 78 53 79 6e 63 44 69 72 65 63 74 6f  3UnixSyncDirecto
99f0: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
9a00: 44 69 72 6e 61 6d 65 29 7b 0a 23 69 66 64 65 66  Dirname){.#ifdef
9a10: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
9a20: 44 49 52 53 59 4e 43 0a 20 20 72 65 74 75 72 6e  DIRSYNC.  return
9a30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
9a40: 65 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69 6e  e.  int fd;.  in
9a50: 74 20 72 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e  t r;.  fd = open
9a60: 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f  (zDirname, O_RDO
9a70: 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29  NLY|O_BINARY, 0)
9a80: 3b 0a 20 20 54 52 41 43 45 33 28 22 44 49 52 53  ;.  TRACE3("DIRS
9a90: 59 4e 43 20 25 2d 33 64 20 28 25 73 29 5c 6e 22  YNC %-3d (%s)\n"
9aa0: 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  , fd, zDirname);
9ab0: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
9ac0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ad0: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a  _CANTOPEN; .  }.
9ae0: 20 20 72 20 3d 20 66 73 79 6e 63 28 66 64 29 3b    r = fsync(fd);
9af0: 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20  .  close(fd);.  
9b00: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9b10: 20 72 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 20   r=1 );.  if( r 
9b20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9b30: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
9b40: 53 59 4e 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  SYNC;.  }else{. 
9b50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b60: 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  _OK;.  }.#endif.
9b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
9b80: 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
9b90: 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
9ba0: 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
9bb0: 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 4f 73   unixTruncate(Os
9bc0: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42  File *id, i64 nB
9bd0: 79 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  yte){.  int rc;.
9be0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
9bf0: 20 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65    rc = ftruncate
9c00: 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
9c10: 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53  ->h, nByte);.  S
9c20: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
9c30: 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
9c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9c50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
9c60: 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  CATE;.  }else{. 
9c70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9c80: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
9c90: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
9ca0: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
9cb0: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
9cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
9cd0: 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c  ixFileSize(OsFil
9ce0: 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
9cf0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
9d00: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
9d10: 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
9d20: 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 28 28  .  rc = fstat(((
9d30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
9d40: 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c  , &buf);.  Simul
9d50: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
9d60: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20   );.  if( rc!=0 
9d70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9d80: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
9d90: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
9da0: 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20   buf.st_size;.  
9db0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9dd0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
9de0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
9df0: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
9e00: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
9e10: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
9e20: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
9e30: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
9e40: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
9e50: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
9e60: 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  o.  If the file 
9e70: 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68  is unlocked or h
9e80: 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44  olds only SHARED
9e90: 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20   locks, then.** 
9ea0: 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a  return zero..*/.
9eb0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
9ec0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
9ed0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
9ee0: 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69  int r = 0;.  uni
9ef0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9f00: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
9f10: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
9f20: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
9f30: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
9f40: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f  cause pFile->pLo
9f50: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
9f60: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
9f70: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
9f80: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
9f90: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
9fa0: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
9fb0: 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e  ( pFile->pLock->
9fc0: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
9fd0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20  LOCK ){.    r = 
9fe0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
9ff0: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
a000: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
a010: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
a020: 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20 20 20    if( !r ){.    
a030: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
a040: 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  k;.    lock.l_wh
a050: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a060: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a070: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
a080: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
a090: 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e  n = 1;.    lock.
a0a0: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
a0b0: 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46 69 6c  ;.    fcntl(pFil
a0c0: 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  e->h, F_GETLK, &
a0d0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c  lock);.    if( l
a0e0: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
a0f0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  LCK ){.      r =
a100: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
a110: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
a120: 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41 43  eMutex();.  TRAC
a130: 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E3("TEST WR-LOCK
a140: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
a150: 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75  ->h, r);..  retu
a160: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn r;.}../*.** L
a170: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
a180: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
a190: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
a1a0: 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
a1b0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
a1c0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
a1d0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
a1e0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
a1f0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
a200: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
a210: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
a220: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
a230: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
a240: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
a250: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
a260: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
a270: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
a280: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
a290: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
a2a0: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
a2b0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
a2c0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
a2d0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
a2e0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
a2f0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
a300: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
a310: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
a320: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
a330: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
a340: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
a350: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
a360: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
a370: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
a380: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
a390: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
a3a0: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
a3b0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a3c0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
a3d0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
a3e0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
a3f0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a400: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
a410: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
a420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
a430: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
a440: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
a450: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
a460: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
a470: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
a480: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
a490: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
a4a0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
a4b0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20  locktype){.  /* 
a4c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
a4d0: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
a4e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
a4f0: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
a500: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
a510: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
a520: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
a530: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
a540: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
a550: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
a560: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
a570: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
a580: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
a590: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
a5a0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
a5b0: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
a5c0: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
a5d0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
a5e0: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
a5f0: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
a600: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
a610: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
a620: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
a630: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
a640: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
a650: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
a660: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
a670: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
a680: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
a690: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
a6a0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
a6b0: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
a6c0: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
a6d0: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
a6e0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a6f0: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
a700: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
a710: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
a720: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
a730: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a740: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
a750: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
a760: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
a770: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
a780: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
a790: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
a7a0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
a7b0: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
a7c0: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
a7d0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a7e0: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
a7f0: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
a800: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
a810: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
a820: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
a830: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
a840: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
a850: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
a860: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
a870: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
a880: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
a890: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
a8a0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
a8b0: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
a8c0: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
a8d0: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
a8e0: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
a8f0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
a900: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
a910: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
a920: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
a930: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
a940: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
a950: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
a960: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
a970: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
a980: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
a990: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
a9a0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
a9b0: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
a9c0: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
a9d0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
a9e0: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
a9f0: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
aa00: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
aa10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aa20: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
aa30: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
aa40: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
aa50: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
aa60: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
aa70: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
aa80: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
aa90: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
aaa0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
aab0: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
aac0: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
aad0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
aae0: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
aaf0: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
ab00: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
ab10: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
ab20: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ab30: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
ab40: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
ab50: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
ab60: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
ab70: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
ab80: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
ab90: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
aba0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
abb0: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
abc0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
abd0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
abe0: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
abf0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
ac00: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
ac10: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
ac20: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
ac30: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
ac40: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
ac50: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
ac60: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
ac70: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
ac80: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
ac90: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
aca0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
acb0: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
acc0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
acd0: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
ace0: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
acf0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
ad00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ad10: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ad20: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
ad30: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
ad40: 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  fo *pLock = pFil
ad50: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  e->pLock;.  stru
ad60: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
ad70: 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72   int s;..  asser
ad80: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52  t( pFile );.  TR
ad90: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
ada0: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
adb0: 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69  ) pid=%d\n", pFi
adc0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63  le->h,.      loc
add0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
ade0: 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  pe), locktypeNam
adf0: 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  e(pFile->locktyp
ae00: 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79  e),.      lockty
ae10: 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f  peName(pLock->lo
ae20: 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e  cktype), pLock->
ae30: 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b  cnt , getpid());
ae40: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
ae50: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
ae60: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
ae70: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
ae80: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
ae90: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
aea0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
aeb0: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
aec0: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
aed0: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
aee0: 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
aef0: 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
af00: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
af10: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
af20: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 33 28 22   ){.    TRACE3("
af30: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
af40: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
af50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
af60: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
af70: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
af80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
af90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
afa0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
afb0: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
afc0: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
afd0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
afe0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
aff0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
b000: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b010: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
b020: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
b030: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
b040: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
b050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
b060: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
b070: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
b080: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
b090: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
b0a0: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
b0b0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
b0c0: 64 73 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ds.  */.  sqlite
b0d0: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
b0e0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
b0f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
b100: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
b110: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
b120: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
b130: 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
b140: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b150: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
b160: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
b170: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
b180: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
b190: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
b1a0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
b1b0: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
b1c0: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
b1d0: 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20  erent OsFile*.  
b1e0: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
b1f0: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
b200: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
b210: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
b220: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63   if( (pFile->loc
b230: 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f  ktype!=pLock->lo
b240: 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20  cktype && .     
b250: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
b260: 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
b270: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e  OCK || locktype>
b280: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
b290: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b2a0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
b2b0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
b2c0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
b2d0: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
b2e0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
b2f0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
b300: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
b310: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
b320: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
b330: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
b340: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
b350: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
b360: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
b370: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
b380: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
b390: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
b3a0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b3b0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f  OCK || pLock->lo
b3c0: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
b3d0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
b3e0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
b3f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b400: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
b410: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
b420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
b430: 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20  ck->cnt>0 );.   
b440: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b450: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
b460: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b      pLock->cnt++
b470: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70  ;.    pFile->pOp
b480: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
b490: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b4a0: 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    }..  lock.l_le
b4b0: 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e  n = 1L;..  lock.
b4c0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b4d0: 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e  SET;..  /* A PEN
b4e0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
b4f0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
b500: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
b510: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
b520: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
b530: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
b540: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
b550: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
b560: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
b570: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
b580: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b590: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
b5a0: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
b5b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
b5c0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b5d0: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
b5e0: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
b5f0: 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d  ype = (locktype=
b600: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
b610: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
b620: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b630: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
b640: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
b650: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
b660: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
b670: 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   s ){.      rc =
b680: 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29   (errno==EINVAL)
b690: 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20   ? SQLITE_NOLFS 
b6a0: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
b6b0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
b6c0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
b6d0: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
b6e0: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
b6f0: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
b700: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
b710: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
b720: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
b730: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
b740: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
b750: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
b760: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
b770: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
b780: 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nt==0 );.    ass
b790: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ert( pLock->lock
b7a0: 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  type==0 );..    
b7b0: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
b7c0: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
b7d0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
b7e0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
b7f0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
b800: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73  ARED_SIZE;.    s
b810: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
b820: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
b830: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  k);..    /* Drop
b840: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
b850: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
b860: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b870: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
b880: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
b890: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
b8a0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
b8b0: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
b8c0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
b8d0: 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20   &lock)!=0 ){.  
b8e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b8f0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
b900: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
b910: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
b920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
b930: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
b940: 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   s ){.      rc =
b950: 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29   (errno==EINVAL)
b960: 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20   ? SQLITE_NOLFS 
b970: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
b980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b990: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b9a0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
b9b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65       pFile->pOpe
b9c0: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
b9d0: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31    pLock->cnt = 1
b9e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
b9f0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
ba00: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
ba10: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a  pLock->cnt>1 ){.
ba20: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
ba30: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
ba40: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
ba50: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
ba60: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
ba70: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
ba80: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
ba90: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
baa0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
bab0: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
bac0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
bad0: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
bae0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
baf0: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
bb00: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
bb10: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
bb20: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
bb30: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
bb40: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
bb50: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bb60: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
bb70: 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ype );.    lock.
bb80: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
bb90: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f  ;.    switch( lo
bba0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  cktype ){.      
bbb0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
bbc0: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
bbd0: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
bbe0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
bbf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc00: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
bc10: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
bc20: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bc30: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
bc40: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
bc50: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
bc60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc70: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
bc80: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
bc90: 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  }.    s = fcntl(
bca0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bcb0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
bcc0: 66 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63  f( s ){.      rc
bcd0: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
bce0: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
bcf0: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
bd00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
bd10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bd20: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
bd30: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
bd40: 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ype;.    pLock->
bd50: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
bd60: 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ype;.  }else if(
bd70: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
bd80: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
bd90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
bda0: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
bdb0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
bdc0: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
bdd0: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
bde0: 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  ck:.  sqlite3OsL
bdf0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 54  eaveMutex();.  T
be00: 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25  RACE4("LOCK    %
be10: 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c  d %s %s\n", pFil
be20: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  e->h, locktypeNa
be30: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
be40: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
be50: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
be60: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
be70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
be80: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
be90: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
bea0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
beb0: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
bec0: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
bed0: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
bee0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
bef0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
bf00: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
bf10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bf20: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
bf30: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
bf40: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
bf50: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
bf60: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
bf70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
bf80: 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  nixUnlock(OsFile
bf90: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
bfa0: 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f  pe){.  struct lo
bfb0: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
bfc0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
bfd0: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
bfe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
bff0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
c000: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
c010: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
c020: 0a 20 20 54 52 41 43 45 37 28 22 55 4e 4c 4f 43  .  TRACE7("UNLOC
c030: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
c040: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22  %d,%d) pid=%d\n"
c050: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
c060: 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c  type,.      pFil
c070: 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
c080: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
c090: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ype, pFile->pLoc
c0a0: 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29  k->cnt, getpid()
c0b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  );..  assert( lo
c0c0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
c0d0: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
c0e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f  le->locktype<=lo
c0f0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
c100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c110: 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f    }.  if( CHECK_
c120: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20  THREADID(pFile) 
c130: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c140: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
c150: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
c160: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63  rMutex();.  pLoc
c170: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
c180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
c190: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
c1a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
c1b0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
c1c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
c1d0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
c1e0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
c1f0: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
c200: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
c210: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
c220: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
c230: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
c240: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c250: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
c260: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
c270: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c280: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
c290: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  E;.      if( fcn
c2a0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
c2b0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
c2c0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
c2d0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
c2e0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
c2f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
c300: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
c310: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
c320: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
c330: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
c340: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c350: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
c360: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
c370: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
c380: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
c390: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
c3a0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
c3b0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
c3c0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c3d0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  LK, &lock)==0 ){
c3e0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
c3f0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
c400: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
c410: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c420: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
c430: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
c440: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
c450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c460: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
c470: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
c480: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
c490: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
c4a0: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
c4b0: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
c4c0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
c4d0: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
c4e0: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
c4f0: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
c500: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
c510: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
c520: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
c530: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b      */.    pLock
c540: 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  ->cnt--;.    if(
c550: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
c560: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
c570: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c580: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
c590: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c5a0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
c5b0: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
c5c0: 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 66   0L;.      if( f
c5d0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c5e0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d  _SETLK, &lock)==
c5f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
c600: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
c610: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
c620: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c630: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
c640: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
c650: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c660: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
c670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
c680: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
c690: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
c6a0: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
c6b0: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
c6c0: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
c6d0: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
c6e0: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
c6f0: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
c700: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
c710: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
c720: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
c730: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
c740: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
c750: 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e  pOpen;.    pOpen
c760: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
c770: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c  ssert( pOpen->nL
c780: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
c790: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
c7a0: 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
c7b0: 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
c7c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
c7d0: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
c7e0: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
c7f0: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70         close(pOp
c800: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29  en->aPending[i])
c810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c820: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
c830: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70  ding);.      pOp
c840: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
c850: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
c860: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
c870: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
c880: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
c890: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
c8a0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
c8b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c8c0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
c8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c8e0: 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  unixClose(OsFile
c8f0: 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46   **pId){.  unixF
c900: 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
c910: 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66  ile*)*pId;..  if
c920: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
c930: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
c940: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
c950: 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d  LOCK);.  if( id-
c960: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
c970: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
c980: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
c990: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
c9a0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20  Mutex();..  if( 
c9b0: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
c9c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
c9d0: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
c9e0: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
c9f0: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
ca00: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
ca10: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
ca20: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
ca30: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
ca40: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
ca50: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
ca60: 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65  scriptor to pOpe
ca70: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  n->aPending.  It
ca80: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
ca90: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
caa0: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
cab0: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
cac0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
cad0: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74  nt *aNew;.    st
cae0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
caf0: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b  pen = id->pOpen;
cb00: 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c  .    aNew = real
cb10: 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  loc( pOpen->aPen
cb20: 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50  ding, (pOpen->nP
cb30: 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66  ending+1)*sizeof
cb40: 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28  (int) );.    if(
cb50: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
cb60: 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63    /* If a malloc
cb70: 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61   fails, just lea
cb80: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
cb90: 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c  iptor */.    }el
cba0: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
cbb0: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
cbc0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
cbd0: 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e  Pending[pOpen->n
cbe0: 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68  Pending] = id->h
cbf0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
cc00: 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d  Pending++;.    }
cc10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
cc20: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   There are no ou
cc30: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
cc40: 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20  so we can close 
cc50: 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  the file immedia
cc60: 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  tely */.    clos
cc70: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20  e(id->h);.  }.  
cc80: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
cc90: 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65  id->pLock);.  re
cca0: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d  leaseOpenCnt(id-
ccb0: 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69  >pOpen);..  sqli
ccc0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
ccd0: 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20  );.  id->isOpen 
cce0: 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22 43  = 0;.  TRACE2("C
ccf0: 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
cd00: 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
cd10: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
cd20: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
cd30: 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d  ee(id);.  *pId =
cd40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
cd50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 64  ITE_OK;.}...#ifd
cd60: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cd70: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
cd80: 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50 20  pragma mark AFP 
cd90: 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a 20  Support../*. ** 
cda0: 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
cdb0: 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
cdc0: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
cdd0: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
cde0: 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65 66  tate. */.typedef
cdf0: 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
ce00: 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
ce10: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
ce20: 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
ce30: 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67 6e  ntext {.  unsign
ce40: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
ce50: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20 63  redLockByte;.  c
ce60: 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a 7d  har *filePath;.}
ce70: 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
ce80: 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
ce90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
cea0: 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
ceb0: 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
cec0: 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
ced0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
cee0: 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
cef0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
cf00: 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
cf10: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
cf20: 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
cf30: 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
cf40: 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
cf50: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
cf60: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cf70: 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
cf80: 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
cf90: 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
cfa0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
cfb0: 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
cfc0: 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
cfd0: 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
cfe0: 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
cff0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
d020: 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
d030: 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
d040: 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
d050: 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
d060: 09 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20  ._IOWR('z', 23, 
d070: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
d080: 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 72 65 74  LockPB2)../* ret
d090: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
d0a0: 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  , 1 on failure. 
d0b0: 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20 62 65   To match the be
d0c0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 0a 20  havior of the . 
d0d0: 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20 66 69   normal posix fi
d0e0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64  le locking (used
d0f0: 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72   in unixLock for
d100: 20 65 78 61 6d 70 6c 65 29 2c 20 77 65 20 73 68   example), we sh
d110: 6f 75 6c 64 20 0a 20 20 70 72 6f 76 69 64 65 20  ould .  provide 
d120: 27 72 69 63 68 65 72 27 20 72 65 74 75 72 6e 20  'richer' return 
d130: 63 6f 64 65 73 20 2d 20 73 70 65 63 69 66 69 63  codes - specific
d140: 61 6c 6c 79 20 74 6f 20 64 69 66 66 65 72 65 6e  ally to differen
d150: 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
d160: 27 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64 20  'file busy' and 
d170: 27 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72 72  'file system err
d180: 6f 72 27 20 72 65 73 75 6c 74 73 20 2a 2f 0a 73  or' results */.s
d190: 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53  tatic int _AFPFS
d1a0: 53 65 74 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  SetLock(const ch
d1b0: 61 72 20 2a 70 61 74 68 2c 20 69 6e 74 20 66 64  ar *path, int fd
d1c0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
d1d0: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20  long offset, .  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
d200: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
d210: 2c 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61  , int setLockFla
d220: 67 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 42 79  g).{.  struct By
d230: 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 09 70  teRangeLockPB2.p
d240: 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20 20  b;.  int        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
d260: 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b  ;.  .  pb.unLock
d270: 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c  Flag = setLockFl
d280: 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62  ag ? 0 : 1;.  pb
d290: 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20  .startEndFlag = 
d2a0: 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d  0;.  pb.offset =
d2b0: 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65   offset;.  pb.le
d2c0: 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a  ngth = length; .
d2d0: 20 20 70 62 2e 66 64 20 3d 20 66 64 3b 0a 20 20    pb.fd = fd;.  
d2e0: 54 52 41 43 45 35 28 22 41 46 50 4c 4f 43 4b 20  TRACE5("AFPLOCK 
d2f0: 73 65 74 74 69 6e 67 20 6c 6f 63 6b 20 25 73 20  setting lock %s 
d300: 66 6f 72 20 25 64 20 69 6e 20 72 61 6e 67 65 20  for %d in range 
d310: 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
d320: 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
d330: 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 66 64 2c  "ON":"OFF"), fd,
d340: 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
d350: 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
d360: 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
d370: 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
d380: 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
d390: 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
d3a0: 54 52 41 43 45 34 28 22 41 46 50 4c 4f 43 4b 20  TRACE4("AFPLOCK 
d3b0: 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
d3c0: 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
d3d0: 20 70 61 74 68 2c 20 65 72 72 6e 6f 2c 20 0a 20   path, errno, . 
d3e0: 20 20 20 20 20 73 74 72 65 72 72 6f 72 28 65 72       strerror(er
d3f0: 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72  rno));.    retur
d400: 6e 20 31 3b 20 2f 2f 20 65 72 72 6f 72 0a 20 20  n 1; // error.  
d410: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
d420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
d430: 0a 20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  . ** This routin
d440: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
d450: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
d460: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
d470: 20 73 70 65 63 69 66 69 65 64 0a 20 2a 2a 20 66   specified. ** f
d480: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
d490: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
d4a0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
d4b0: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
d4c0: 0a 20 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  . ** non-zero.  
d4d0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
d4e0: 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73  nlocked or holds
d4f0: 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63   only SHARED loc
d500: 6b 73 2c 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74  ks, then. ** ret
d510: 75 72 6e 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74  urn zero.. */.st
d520: 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78  atic int afpUnix
d530: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
d540: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  k(OsFile *id){. 
d550: 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e   int r = 0;.  un
d560: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
d570: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
d580: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
d590: 65 20 29 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69  e ); .  afpLocki
d5a0: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
d5b0: 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
d5c0: 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
d5d0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d5e0: 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
d5f0: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
d600: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
d610: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
d620: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
d630: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
d640: 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b  CK ){.    r = 1;
d650: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
d660: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
d670: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
d680: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
d690: 0a 20 20 69 66 20 28 20 21 72 20 29 20 7b 0a 20  .  if ( !r ) {. 
d6a0: 20 20 20 2f 2f 20 6c 6f 63 6b 20 74 68 65 20 62     // lock the b
d6b0: 79 74 65 0a 20 20 20 20 69 6e 74 20 66 61 69 6c  yte.    int fail
d6c0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
d6d0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
d6e0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
d6f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
d700: 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20 28 66  ,1);  .    if (f
d710: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 2f  ailed) {.      /
d720: 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
d730: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
d740: 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
d750: 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
d760: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
d770: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d780: 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
d790: 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
d7a0: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
d7b0: 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
d7c0: 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
d7d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
d7e0: 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46 50 46  e */.      _AFPF
d7f0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
d800: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
d810: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
d820: 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
d830: 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22  }.  }.  TRACE3("
d840: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
d850: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
d860: 20 72 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   r);.  .  return
d870: 20 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74   r;.}../* AFP-st
d880: 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c  yle locking foll
d890: 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61 76 69  owing the behavi
d8a0: 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20  or of unixLock, 
d8b0: 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  see the unixLock
d8c0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f   .** function co
d8d0: 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69  mments for detai
d8e0: 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67  ls of lock manag
d8f0: 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63  ement. */.static
d900: 20 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b   int afpUnixLock
d910: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
d920: 20 6c 6f 63 6b 74 79 70 65 29 0a 7b 0a 20 20 69   locktype).{.  i
d930: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d940: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
d950: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
d960: 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
d970: 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
d980: 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
d990: 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
d9a0: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
d9b0: 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  ;.  int gotPendi
d9c0: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a 20  ngLock = 0;.  . 
d9d0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d9e0: 3b 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b  ;.  TRACE5("LOCK
d9f0: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
da00: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
da10: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 6c  e->h,.         l
da20: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
da30: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
da40: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
da50: 79 70 65 29 2c 20 67 65 74 70 69 64 28 29 29 3b  ype), getpid());
da60: 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65    .  /* If there
da70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
da80: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
da90: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
daa0: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ive on the.    *
dab0: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
dac0: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
dad0: 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
dae0: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
daf0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73      ** sqlite3Os
db00: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
db10: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
db20: 79 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66  yet..    */.  if
db30: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
db40: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
db50: 20 20 20 54 52 41 43 45 33 28 22 4c 4f 43 4b 20     TRACE3("LOCK 
db60: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
db70: 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70  eady held)\n", p
db80: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
db90: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
dba0: 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20  (locktype));.   
dbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dbc0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
dbd0: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
dbe0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
dbf0: 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20  orrect.    */.  
dc00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
dc10: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
dc20: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
dc30: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
dc40: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
dc50: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
dc60: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
dc70: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
dc80: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
dc90: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
dca0: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
dcb0: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
dcc0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
dcd0: 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65  ->pLock is share
dce0: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
dcf0: 0a 20 20 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  .    */.  sqlite
dd00: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
dd10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
dd20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
dd30: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
dd40: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 72 63 20  le..    */.  rc 
dd50: 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  = transferOwners
dd60: 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  hip(pFile);.  if
dd70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dd80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
dd90: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
dda0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
ddb0: 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
ddc0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
ddd0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
dde0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
ddf0: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
de00: 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
de10: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
de20: 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
de30: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
de40: 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ING will.    ** 
de50: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20  be released..   
de60: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
de70: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
de80: 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
de90: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
dea0: 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
deb0: 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
dec0: 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  OCK).      ){.  
ded0: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
dee0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
def0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
df00: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
df10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
df20: 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
df30: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
df40: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
df50: 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65        goto afp_e
df60: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
df70: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f   }.  .  /* If co
df80: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
df90: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
dfa0: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
dfb0: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a   and make.    **
dfc0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
dfd0: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
dfe0: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
dff0: 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63      */.  if( loc
e000: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
e010: 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  CK ){.    int lk
e020: 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e  , failed;.    in
e030: 74 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20  t tries = 0;.   
e040: 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74   .    /* Now get
e050: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
e060: 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
e070: 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
e080: 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
e090: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
e0a0: 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
e0b0: 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
e0c0: 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68  .    context->sh
e0d0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
e0e0: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
e0f0: 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
e100: 31 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  1);.    failed =
e110: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e120: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e130: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20  , pFile->h, .   
e140: 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
e150: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
e160: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
e170: 20 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70      .    /* Drop
e180: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
e190: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
e1a0: 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74     if (_AFPFSSet
e1b0: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e1c0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e1d0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
e1e0: 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 72  1, 0)) {.      r
e1f0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
e200: 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69  _UNLOCK;  /* Thi
e210: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
e220: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67  appen */.      g
e230: 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
e240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
e250: 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20   if( failed ){. 
e260: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e270: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
e280: 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
e290: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
e2a0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  ED_LOCK;.    }. 
e2b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
e2c0: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
e2d0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
e2e0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e2f0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
e300: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
e310: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
e320: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
e330: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
e340: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
e350: 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
e360: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
e370: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
e380: 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c  ype );.    if (l
e390: 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52  ocktype >= RESER
e3a0: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
e3b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45  e->locktype < RE
e3c0: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
e3d0: 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72         /* Acquir
e3e0: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
e3f0: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69  k */.        fai
e400: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
e410: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
e420: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
e430: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
e440: 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1,1);.    }.    
e450: 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c  if (!failed && l
e460: 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55  ocktype == EXCLU
e470: 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
e480: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
e490: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
e4a0: 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
e4b0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
e4c0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
e4d0: 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
e4e0: 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
e4f0: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
e500: 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
e510: 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
e520: 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
e530: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20  fpUnixUnlock.   
e540: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28     */.      if (
e550: 21 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63  !_AFPFSSetLock(c
e560: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e570: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e580: 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
e5b0: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
e5c0: 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0)) {.        /*
e5d0: 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f   now attemmpt to
e5e0: 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
e5f0: 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  ve lock range */
e600: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
e610: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
e620: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e630: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
e640: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
e670: 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
e680: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20 26      if (failed &
e690: 26 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  & _AFPFSSetLock(
e6a0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e6b0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
e6c0: 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
e6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
e700: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20  ockByte, 1, 1)) 
e710: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
e720: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
e730: 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68  LOCK; /* this sh
e740: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
e750: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  n */.        }. 
e760: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
e770: 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20        /* */.    
e780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e790: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a  IOERR_UNLOCK; /*
e7a0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   this should nev
e7b0: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
e7c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
e7d0: 66 28 20 66 61 69 6c 65 64 20 26 26 20 72 63 20  f( failed && rc 
e7e0: 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  == SQLITE_OK){. 
e7f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e800: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
e810: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
e820: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
e830: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
e840: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
e850: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
e860: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e870: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
e880: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
e890: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66  _LOCK;.  }.  .af
e8a0: 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20  p_end_lock:.    
e8b0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
e8c0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 34 28  tex();.  TRACE4(
e8d0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
e8e0: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
e8f0: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
e900: 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 20  ktype), .       
e910: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e920: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e930: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ");.  return rc;
e940: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  .}../*. ** Lower
e950: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
e960: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
e970: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c  iptor pFile to l
e980: 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
e990: 70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  pe. ** must be e
e9a0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
e9b0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
e9c0: 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
e9d0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
e9e0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e9f0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
ea00: 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
ea10: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
ea20: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
ea30: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ea40: 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
ea50: 74 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28  t afpUnixUnlock(
ea60: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
ea70: 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 73 74  locktype) {.  st
ea80: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
ea90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
eaa0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
eab0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
eac0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c  File*)id;.  afpL
ead0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
eae0: 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
eaf0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
eb00: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
eb10: 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  text;..  assert(
eb20: 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43   pFile );.  TRAC
eb30: 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E5("UNLOCK  %d %
eb40: 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 5c  d was %d pid=%d\
eb50: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
eb60: 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
eb70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eb80: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 0a  , getpid());.  .
eb90: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
eba0: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
ebb0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ebc0: 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79  locktype<=lockty
ebd0: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
ebe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ebf0: 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45    if( CHECK_THRE
ec00: 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20  ADID(pFile) ){. 
ec10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ec20: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
ec30: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
ec40: 65 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ex();.  if( pFil
ec50: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52  e->locktype>SHAR
ec60: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
ec70: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
ec80: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
ec90: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30    int failed = 0
eca0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  ;..      /* unlo
ecb0: 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ck the exclusive
ecc0: 20 72 61 6e 67 65 20 2d 20 74 68 65 6e 20 72 65   range - then re
ecd0: 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
ece0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  hared lock */.  
ecf0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
ed00: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
ed10: 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
ed20: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
ed30: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
ed40: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
ed50: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
ed60: 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
ed90: 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ZE, 0);.        
eda0: 69 66 20 28 21 66 61 69 6c 65 64 29 20 7b 0a 20  if (!failed) {. 
edb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 75 63 63           /* succ
edc0: 65 73 73 66 75 6c 6c 79 20 72 65 6d 6f 76 65 64  essfully removed
edd0: 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
ede0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ock */.         
edf0: 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f   if (_AFPFSSetLo
ee00: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
ee10: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
ee20: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 0a 20 20  SHARED_FIRST+.  
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
ee50: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
ee60: 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20 20 20 20  e, 1, 1)) {.    
ee70: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
ee80: 64 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  d to re-establis
ee90: 68 20 6f 75 72 20 73 68 61 72 65 64 20 6c 6f 63  h our shared loc
eea0: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
eeb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
eec0: 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 54 68  RR_RDLOCK; /* Th
eed0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
eee0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
eef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
ef00: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
ef10: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
ef20: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2d 20 66  never happen - f
ef30: 61 69 6c 65 64 20 74 6f 20 75 6e 6c 6f 63 6b 20  ailed to unlock 
ef40: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 72 61  the exclusive ra
ef50: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nge */.         
ef60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ef70: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ef80: 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 20 20     } .      }.  
ef90: 20 20 7d 0a 20 20 20 20 69 66 20 28 72 63 20 3d    }.    if (rc =
efa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  = SQLITE_OK && p
efb0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
efc0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 20 7b 0a  PENDING_LOCK) {.
efd0: 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53        if (_AFPFS
efe0: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
eff0: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
f000: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
f010: 45 2c 20 31 2c 20 30 29 29 7b 0a 20 20 20 20 20  E, 1, 0)){.     
f020: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
f030: 72 65 6c 65 61 73 65 20 74 68 65 20 70 65 6e 64  release the pend
f040: 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ing lock */.    
f050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f060: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a  IOERR_UNLOCK; /*
f070: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
f080: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
f090: 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20     }.    } .    
f0a0: 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45  if (rc == SQLITE
f0b0: 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  _OK && pFile->lo
f0c0: 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
f0d0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 69  _LOCK) {.      i
f0e0: 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  f (_AFPFSSetLock
f0f0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
f100: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45  th, pFile->h, RE
f110: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
f120: 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0)) {.        /*
f130: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61   failed to relea
f140: 73 65 20 74 68 65 20 72 65 73 65 72 76 65 64 20  se the reserved 
f150: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
f160: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f170: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
f180: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f190: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
f1a0: 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 20 20 69  }.    } .  }.  i
f1b0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
f1c0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
f1d0: 66 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53  failed = _AFPFSS
f1e0: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
f1f0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
f200: 3e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  >h, .           
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
f230: 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72   + context->shar
f240: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
f250: 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
f260: 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
f270: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f280: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
f290: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
f2a0: 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n */.    }.  }. 
f2b0: 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49 54   if (rc == SQLIT
f2c0: 45 5f 4f 4b 29 0a 20 20 20 20 70 46 69 6c 65 2d  E_OK).    pFile-
f2d0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
f2e0: 74 79 70 65 3b 0a 20 20 73 71 6c 69 74 65 33 4f  type;.  sqlite3O
f2f0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
f300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f310: 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
f320: 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
f330: 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
f340: 67 20 63 6f 6e 74 65 78 74 20 0a 20 2a 2f 0a 73  g context . */.s
f350: 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69  tatic int afpUni
f360: 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a  xClose(OsFile **
f370: 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  pId) {.  unixFil
f380: 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c  e *id = (unixFil
f390: 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66  e*)*pId;.  .  if
f3a0: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
f3b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 66 70 55  QLITE_OK;.  afpU
f3c0: 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20  nixUnlock(*pId, 
f3d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66  NO_LOCK);.  /* f
f3e0: 72 65 65 20 74 68 65 20 41 46 50 20 6c 6f 63 6b  ree the AFP lock
f3f0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
f400: 0a 20 20 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69  .  if (id->locki
f410: 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c  ngContext != NUL
f420: 4c 29 20 7b 0a 20 20 20 20 69 66 20 28 28 28 61  L) {.    if (((a
f430: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
f440: 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   *)id->lockingCo
f450: 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68  ntext)->filePath
f460: 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20   != NULL).      
f470: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
f480: 65 46 72 65 65 28 28 28 61 66 70 4c 6f 63 6b 69  eFree(((afpLocki
f490: 6e 67 43 6f 6e 74 65 78 74 2a 29 69 64 2d 3e 6c  ngContext*)id->l
f4a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
f4b0: 66 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20 73  filePath);.    s
f4c0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
f4d0: 46 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67  Free(id->locking
f4e0: 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20  Context);.  }.  
f4f0: 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
f500: 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e  >=0 ) close(id->
f510: 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69  dirfd);.  id->di
f520: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 63 6c 6f 73  rfd = -1;.  clos
f530: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 69 64 2d 3e  e(id->h);.  id->
f540: 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52  isOpen = 0;.  TR
f550: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
f560: 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20  3d\n", id->h);. 
f570: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
f580: 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65 61  ;.  sqlite3Threa
f590: 64 53 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20  dSafeFree(id);. 
f5a0: 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74   *pId = 0;.  ret
f5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f5c0: 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20  ...#pragma mark 
f5d0: 66 6c 6f 63 6b 28 29 20 73 74 79 6c 65 20 6c 6f  flock() style lo
f5e0: 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  cking../*. ** Th
f5f0: 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  e flockLockingCo
f600: 6e 74 65 78 74 20 69 73 20 6e 6f 74 20 75 73 65  ntext is not use
f610: 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f  d. */.typedef vo
f620: 69 64 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  id flockLockingC
f630: 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20  ontext;..static 
f640: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65  int flockUnixChe
f650: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
f660: 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  sFile *id) {.  u
f670: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
f680: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
f690: 20 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e    .  if (pFile->
f6a0: 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45  locktype == RESE
f6b0: 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
f6c0: 20 72 65 74 75 72 6e 20 31 3b 20 2f 2f 20 61 6c   return 1; // al
f6d0: 72 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73  ready have a res
f6e0: 65 72 76 65 64 20 6c 6f 63 6b 0a 20 20 7d 20 65  erved lock.  } e
f6f0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2f 20 61 74 74  lse {.    // att
f700: 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
f710: 6c 6f 63 6b 0a 20 20 20 20 69 6e 74 20 72 63 20  lock.    int rc 
f720: 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  = flock(pFile->h
f730: 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
f740: 5f 4e 42 29 3b 0a 20 20 20 20 69 66 20 28 21 72  _NB);.    if (!r
f750: 63 29 20 7b 0a 20 20 20 20 20 20 2f 2f 20 67 6f  c) {.      // go
f760: 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  t the lock, unlo
f770: 63 6b 20 69 74 0a 20 20 20 20 20 20 66 6c 6f 63  ck it.      floc
f780: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
f790: 5f 55 4e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  _UN);.      retu
f7a0: 72 6e 20 30 3b 20 20 2f 2f 20 6e 6f 20 6f 6e 65  rn 0;  // no one
f7b0: 20 68 61 73 20 69 74 20 72 65 73 65 72 76 65 64   has it reserved
f7c0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f7d0: 6e 20 31 3b 20 2f 2f 20 73 6f 6d 65 6f 6e 65 20  n 1; // someone 
f7e0: 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
f7f0: 69 74 20 72 65 73 65 72 76 65 64 0a 20 20 7d 0a  it reserved.  }.
f800: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  }..static int fl
f810: 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  ockUnixLock(OsFi
f820: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
f830: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
f840: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
f850: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
f860: 2f 2f 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  // if we already
f870: 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
f880: 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
f890: 0a 20 20 2f 2f 20 4a 75 73 74 20 61 64 6a 75 73  .  // Just adjus
f8a0: 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
f8b0: 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 0a   on outta here..
f8c0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f8d0: 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  ktype > NO_LOCK)
f8e0: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
f8f0: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
f900: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
f910: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
f920: 20 20 2f 2f 20 67 72 61 62 20 61 6e 20 65 78 63    // grab an exc
f930: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 20 20 69 6e  lusive lock.  in
f940: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f950: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
f960: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 69 66 20   LOCK_NB);.  if 
f970: 28 72 63 29 20 7b 0a 20 20 20 20 2f 2f 20 64 69  (rc) {.    // di
f980: 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
f990: 65 20 62 75 73 79 0a 20 20 20 20 72 65 74 75 72  e busy.    retur
f9a0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
f9b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2f   } else {.    //
f9c0: 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
f9d0: 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
f9e0: 20 6f 6b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ok.    pFile->l
f9f0: 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79  ocktype = lockty
fa00: 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  pe;.    return S
fa10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
fa20: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
fa30: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69  kUnixUnlock(OsFi
fa40: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
fa50: 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69  type) {.  unixFi
fa60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
fa70: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
fa80: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
fa90: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
faa0: 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69  .  .  // no-op i
fab0: 66 20 70 6f 73 73 69 62 6c 65 0a 20 20 69 66 28  f possible.  if(
fac0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fad0: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
fae0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
faf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20  OK;.  }.  .  // 
fb00: 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
fb10: 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
fb20: 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
fb30: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 69 66 20   exclusive.  if 
fb40: 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
fb50: 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
fb60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
fb70: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
fb80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fb90: 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20    }.  .  // no, 
fba0: 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a  really, unlock..
fbb0: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
fbc0: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
fbd0: 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 0a 20  UN);.  if (rc). 
fbe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbf0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
fc00: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
fc10: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
fc20: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
fc30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fc40: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
fc50: 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
fc60: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
fc70: 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a  xClose(OsFile **
fc80: 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  pId) {.  unixFil
fc90: 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c  e *id = (unixFil
fca0: 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66  e*)*pId;.  .  if
fcb0: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
fcc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63  QLITE_OK;.  floc
fcd0: 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64  kUnixUnlock(*pId
fce0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20  , NO_LOCK);.  . 
fcf0: 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
fd00: 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
fd10: 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
fd20: 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
fd30: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
fd40: 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  .  .  close(id->
fd50: 68 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 4f  h);  .  sqlite3O
fd60: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
fd70: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b   id->isOpen = 0;
fd80: 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45  .  TRACE2("CLOSE
fd90: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e     %-3d\n", id->
fda0: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
fdb0: 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
fdc0: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
fdd0: 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a  d);.  *pId = 0;.
fde0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fdf0: 4f 4b 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d  OK;.}..#pragma m
fe00: 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e  ark Old-School .
fe10: 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20  lock file based 
fe20: 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20  locking../*. ** 
fe30: 54 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  The dotlockLocki
fe40: 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
fe50: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
fe60: 20 64 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29   dotlock (.lock)
fe70: 20 6c 6f 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66   lock. ** specif
fe80: 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70  ic state. */.typ
fe90: 65 64 65 66 20 73 74 72 75 63 74 20 64 6f 74 6c  edef struct dotl
fea0: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
feb0: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  t dotlockLocking
fec0: 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
fed0: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
fee0: 6e 74 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a  ntext {.  char *
fef0: 6c 6f 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73  lockPath;.};...s
ff00: 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
ff10: 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  kUnixCheckReserv
ff20: 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  edLock(OsFile *i
ff30: 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  d) {.  unixFile 
ff40: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ff50: 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63  le*)id;.  dotloc
ff60: 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
ff70: 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20  *context = .    
ff80: 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
ff90: 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
ffa0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
ffb0: 0a 20 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  .  .  if (pFile-
ffc0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53  >locktype == RES
ffd0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
ffe0: 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2f 20 61    return 1; // a
fff0: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 72 65  lready have a re
10000 73 65 72 76 65 64 20 6c 6f 63 6b 0a 20 20 7d 20  served lock.  } 
10010 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63  else {.    struc
10020 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
10030 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f      if (lstat(co
10040 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
10050 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a  &statBuf) == 0).
10060 20 20 20 20 20 20 2f 2f 20 66 69 6c 65 20 65 78        // file ex
10070 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  ists, someone el
10080 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 0a  se has the lock.
10090 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
100a0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 2f      else.      /
100b0 2f 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  / file does not 
100c0 65 78 69 73 74 2c 20 77 65 20 63 6f 75 6c 64 20  exist, we could 
100d0 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
100e0 6e 74 20 69 74 0a 20 20 20 20 20 20 72 65 74 75  nt it.      retu
100f0 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  rn 0;.  }.}..sta
10100 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
10110 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  nixLock(OsFile *
10120 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
10130 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
10140 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10150 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b  e*)id;.  dotlock
10160 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10170 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28  context = .    (
10180 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10190 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
101a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
101b0 20 20 0a 20 20 2f 2f 20 69 66 20 77 65 20 61 6c    .  // if we al
101c0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
101d0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
101e0 76 65 2e 20 20 0a 20 20 2f 2f 20 4a 75 73 74 20  ve.  .  // Just 
101f0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
10200 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
10210 65 72 65 2e 0a 20 20 69 66 20 28 70 46 69 6c 65  ere..  if (pFile
10220 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f  ->locktype > NO_
10230 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
10240 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
10250 63 6b 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20  cktype;.    .   
10260 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74   /* Always updat
10270 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20  e the timestamp 
10280 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20  on the old file 
10290 2a 2f 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f  */.    utimes(co
102a0 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
102b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72  NULL);.    retur
102c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
102d0 0a 20 20 0a 20 20 2f 2f 20 63 68 65 63 6b 20 74  .  .  // check t
102e0 6f 20 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69  o see if lock fi
102f0 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
10300 73 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  s.  struct stat 
10310 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20 28 6c  statBuf;.  if (l
10320 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  stat(context->lo
10330 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66 29  ckPath,&statBuf)
10340 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65 74 75   == 0){.    retu
10350 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20  rn SQLITE_BUSY; 
10360 2f 2f 20 69 74 20 64 6f 65 73 2c 20 62 75 73 79  // it does, busy
10370 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 67 72 61  .  }.  .  // gra
10380 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
10390 6f 63 6b 0a 20 20 69 6e 74 20 66 64 20 3d 20 6f  ock.  int fd = o
103a0 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63  pen(context->loc
103b0 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f  kPath,O_RDONLY|O
103c0 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36  _CREAT|O_EXCL,06
103d0 30 30 29 3b 0a 20 20 69 66 20 28 66 64 20 3c 20  00);.  if (fd < 
103e0 30 29 20 7b 0a 20 20 20 20 2f 2f 20 66 61 69 6c  0) {.    // fail
103f0 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ed to open/creat
10400 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f 6d 65  e the file, some
10410 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68 61 76  one else may hav
10420 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c 6f 63  e stolen the loc
10430 6b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  k.    return SQL
10440 49 54 45 5f 42 55 53 59 3b 20 0a 20 20 7d 0a 20  ITE_BUSY; .  }. 
10450 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 0a 20   close(fd);.  . 
10460 20 2f 2f 20 67 6f 74 20 69 74 2c 20 73 65 74 20   // got it, set 
10470 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
10480 75 72 6e 20 6f 6b 0a 20 20 70 46 69 6c 65 2d 3e  urn ok.  pFile->
10490 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
104a0 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ype;.  return SQ
104b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
104c0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
104d0 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20  ixUnlock(OsFile 
104e0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
104f0 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
10500 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
10510 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63  le*)id;.  dotloc
10520 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10530 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20  *context = .    
10540 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
10550 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
10560 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
10570 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f  .  .  assert( lo
10580 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
10590 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2f 20 6e  OCK );.  .  // n
105a0 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
105b0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
105c0 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
105d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
105e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
105f0 0a 20 20 2f 2f 20 73 68 61 72 65 64 20 63 61 6e  .  // shared can
10600 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
10610 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
10620 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
10630 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d  .  if (locktype=
10640 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
10650 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
10660 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
10670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10680 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10690 2f 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  / no, really, un
106a0 6c 6f 63 6b 2e 0a 20 20 75 6e 6c 69 6e 6b 28 63  lock..  unlink(c
106b0 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
106c0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  );.  pFile->lock
106d0 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
106e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
10700 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
10710 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
10720 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
10730 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
10740 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
10750 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
10760 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
10770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10780 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f   dotlockUnixUnlo
10790 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b  ck(*pId, NO_LOCK
107a0 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68 65  );.  /* free the
107b0 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67   dotlock locking
107c0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
107d0 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  if (id->lockingC
107e0 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20  ontext != NULL) 
107f0 7b 0a 20 20 20 20 69 66 20 28 28 28 64 6f 74 6c  {.    if (((dotl
10800 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10810 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43  t *)id->lockingC
10820 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74  ontext)->lockPat
10830 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20  h != NULL).     
10840 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
10850 66 65 46 72 65 65 28 20 28 20 28 64 6f 74 6c 6f  feFree( ( (dotlo
10860 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10870 20 2a 29 0a 20 20 20 20 20 20 20 20 69 64 2d 3e   *).        id->
10880 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d  lockingContext)-
10890 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20 20  >lockPath);.    
108a0 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
108b0 65 46 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69 6e  eFree(id->lockin
108c0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20  gContext);.  }. 
108d0 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66   .  if( id->dirf
108e0 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d  d>=0 ) close(id-
108f0 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64  >dirfd);.  id->d
10900 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c  irfd = -1;.  sql
10910 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
10920 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69  ();.  .  close(i
10930 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69  d->h);.  .  sqli
10940 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
10950 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20  );.  id->isOpen 
10960 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22 43  = 0;.  TRACE2("C
10970 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
10980 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
10990 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
109a0 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
109b0 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d  ee(id);.  *pId =
109c0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
109d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61  ITE_OK;.}...#pra
109e0 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c 6f 63 6b  gma mark No lock
109f0 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20  ing../*. ** The 
10a00 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  nolockLockingCon
10a10 74 65 78 74 20 69 73 20 76 6f 69 64 0a 20 2a 2f  text is void. */
10a20 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 6e 6f  .typedef void no
10a30 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10a40 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  xt;..static int 
10a50 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52  nolockUnixCheckR
10a60 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
10a70 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75  le *id) {.  retu
10a80 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
10a90 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f  int nolockUnixLo
10aa0 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
10ab0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
10ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ad0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
10ae0 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63   nolockUnixUnloc
10af0 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
10b00 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
10b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10b20 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
10b30 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
10b40 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10b50 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  nixClose(OsFile 
10b60 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46  **pId) {.  unixF
10b70 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
10b80 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20  ile*)*pId;.  .  
10b90 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72 6e  if( !id ) return
10ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
10bb0 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29  ( id->dirfd>=0 )
10bc0 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64   close(id->dirfd
10bd0 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d  );.  id->dirfd =
10be0 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73   -1;.  sqlite3Os
10bf0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
10c00 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b  .  close(id->h);
10c10 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  .  .  sqlite3OsL
10c20 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
10c30 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
10c40 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20   TRACE2("CLOSE  
10c50 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29   %-3d\n", id->h)
10c60 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
10c70 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68  -1);.  sqlite3Th
10c80 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29  readSafeFree(id)
10c90 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
10ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10cb0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
10cc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
10cd0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f  KING_STYLE */../
10ce0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
10cf0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
10d00 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
10d10 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  me.  Return a po
10d20 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
10d30 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74  full pathname st
10d40 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62  ored in space ob
10d50 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
10d60 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  teMalloc()..** T
10d70 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
10d80 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
10d90 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  le for freeing t
10da0 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69  his space once i
10db0 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  t.** is no longe
10dc0 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61  r needed..*/.cha
10dd0 72 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 46 75  r *sqlite3UnixFu
10de0 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74  llPathname(const
10df0 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
10e00 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  ){.  char *zFull
10e10 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c   = 0;.  if( zRel
10e20 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b  ative[0]=='/' ){
10e30 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
10e40 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52  tring(&zFull, zR
10e50 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72 2a 29  elative, (char*)
10e60 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
10e70 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 73 71   char *zBuf = sq
10e80 6c 69 74 65 4d 61 6c 6c 6f 63 28 35 30 30 30 29  liteMalloc(5000)
10e90 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 3d 3d  ;.    if( zBuf==
10ea0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
10eb0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  n 0;.    }.    z
10ec0 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[0] = 0;.    
10ed0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
10ee0 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77 64 28  (&zFull, getcwd(
10ef0 7a 42 75 66 2c 20 35 30 30 30 29 2c 20 22 2f 22  zBuf, 5000), "/"
10f00 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 20  , zRelative,.   
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
10f30 73 71 6c 69 74 65 46 72 65 65 28 7a 42 75 66 29  sqliteFree(zBuf)
10f40 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f  ;.  }..#if 0.  /
10f50 2a 0a 20 20 2a 2a 20 52 65 6d 6f 76 65 20 22 2f  *.  ** Remove "/
10f60 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65 6e 74  ./" path element
10f70 73 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 22 2f  s and convert "/
10f80 41 2f 2e 2f 22 20 70 61 74 68 20 65 6c 65 6d 65  A/./" path eleme
10f90 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 6a 75 73 74  nts.  ** to just
10fa0 20 22 2f 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   "/"..  */.  if(
10fb0 20 7a 46 75 6c 6c 20 29 7b 0a 20 20 20 20 69 6e   zFull ){.    in
10fc0 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28  t i, j;.    for(
10fd0 69 3d 6a 3d 30 3b 20 7a 46 75 6c 6c 5b 69 5d 3b  i=j=0; zFull[i];
10fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
10ff0 20 7a 46 75 6c 6c 5b 69 5d 3d 3d 27 2f 27 20 29   zFull[i]=='/' )
11000 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
11010 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20  ull[i+1]=='/' ) 
11020 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11030 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d    if( zFull[i+1]
11040 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
11050 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +2]=='/' ){.    
11060 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
11070 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
11080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11090 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
110a0 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c  1]=='.' && zFull
110b0 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 46  [i+2]=='.' && zF
110c0 75 6c 6c 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  ull[i+3]=='/' ){
110d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
110e0 28 20 6a 3e 30 20 26 26 20 7a 46 75 6c 6c 5b 6a  ( j>0 && zFull[j
110f0 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
11100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b   }.          i +
11110 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 63  = 3;.          c
11120 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11130 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11140 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46   zFull[j++] = zF
11150 75 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ull[i];.    }.  
11160 20 20 7a 46 75 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a    zFull[j] = 0;.
11170 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
11180 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f  turn zFull;.}../
11190 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
111a0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75 6c  value of the ful
111b0 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20 74 68  lsync flag in th
111c0 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
111d0 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
111e0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 65 74 46  ic void unixSetF
111f0 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  ullSync(OsFile *
11200 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20 28 28  id, int v){.  ((
11210 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66  unixFile*)id)->f
11220 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 7d 0a 0a  ullSync = v;.}..
11230 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11240 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
11250 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f   handle for an O
11260 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  sFile.*/.static 
11270 69 6e 74 20 75 6e 69 78 46 69 6c 65 48 61 6e 64  int unixFileHand
11280 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  le(OsFile *id){.
11290 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69 78 46    return ((unixF
112a0 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a  ile*)id)->h;.}..
112b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  /*.** Return an 
112c0 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 6e 64  integer that ind
112d0 69 63 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ices the type of
112e0 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
112f0 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69 73 20  held.** by this 
11300 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64 20 66  handle.  (Used f
11310 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
11320 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a  nalysis only.).*
11330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
11340 78 4c 6f 63 6b 53 74 61 74 65 28 4f 73 46 69 6c  xLockState(OsFil
11350 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  e *id){.  return
11360 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
11370 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a 0a 2f  ->locktype;.}../
11380 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
11390 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
113a0 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
113b0 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20  n operate on an 
113c0 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72 20 75 6e  OsFile.** for un
113d0 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ix..*/.static co
113e0 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
113f0 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
11400 20 3d 20 7b 0a 20 20 75 6e 69 78 43 6c 6f 73 65   = {.  unixClose
11410 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65  ,.  unixOpenDire
11420 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78 52 65 61  ctory,.  unixRea
11430 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a  d,.  unixWrite,.
11440 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e    unixSeek,.  un
11450 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e  ixTruncate,.  un
11460 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65  ixSync,.  unixSe
11470 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69  tFullSync,.  uni
11480 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75  xFileHandle,.  u
11490 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 75  nixFileSize,.  u
114a0 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 55  nixLock,.  unixU
114b0 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63  nlock,.  unixLoc
114c0 6b 53 74 61 74 65 2c 0a 20 20 75 6e 69 78 43 68  kState,.  unixCh
114d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
114e0 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
114f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11500 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 54  G_STYLE./*. ** T
11510 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
11520 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
11530 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
11540 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
11550 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69  . ** for unix wi
11560 74 68 20 41 46 50 20 73 74 79 6c 65 20 66 69 6c  th AFP style fil
11570 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73  e locking.. */.s
11580 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65  tatic const IoMe
11590 74 68 6f 64 20 73 71 6c 69 74 65 33 41 46 50 4c  thod sqlite3AFPL
115a0 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
115b0 6f 64 20 3d 20 7b 0a 20 20 20 20 61 66 70 55 6e  od = {.    afpUn
115c0 69 78 43 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69  ixClose,.    uni
115d0 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  xOpenDirectory,.
115e0 20 20 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20      unixRead,.  
115f0 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 20    unixWrite,.   
11600 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 20 20 75   unixSeek,.    u
11610 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 20  nixTruncate,.   
11620 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 20 20 75   unixSync,.    u
11630 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a  nixSetFullSync,.
11640 20 20 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64      unixFileHand
11650 6c 65 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  le,.    unixFile
11660 53 69 7a 65 2c 0a 20 20 20 20 61 66 70 55 6e 69  Size,.    afpUni
11670 78 4c 6f 63 6b 2c 0a 20 20 20 20 61 66 70 55 6e  xLock,.    afpUn
11680 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e  ixUnlock,.    un
11690 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20  ixLockState,.   
116a0 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73   afpUnixCheckRes
116b0 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a 0a 2f  ervedLock,.};../
116c0 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  *. ** This vecto
116d0 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
116e0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
116f0 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
11700 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20   OsFile. ** for 
11710 75 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b 28  unix with flock(
11720 29 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  ) style file loc
11730 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  king.. */.static
11740 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20   const IoMethod 
11750 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b  sqlite3FlockLock
11760 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
11770 3d 20 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69  = {.    flockUni
11780 78 43 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78  xClose,.    unix
11790 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20  OpenDirectory,. 
117a0 20 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20     unixRead,.   
117b0 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20   unixWrite,.    
117c0 75 6e 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e  unixSeek,.    un
117d0 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20  ixTruncate,.    
117e0 75 6e 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e  unixSync,.    un
117f0 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20  ixSetFullSync,. 
11800 20 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c     unixFileHandl
11810 65 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53  e,.    unixFileS
11820 69 7a 65 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  ize,.    flockUn
11830 69 78 4c 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f 63  ixLock,.    floc
11840 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20  kUnixUnlock,.   
11850 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a   unixLockState,.
11860 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65      flockUnixChe
11870 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
11880 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20  };../*. ** This 
11890 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
118a0 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
118b0 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
118c0 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a  on an OsFile. **
118d0 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
118e0 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
118f0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73  e locking.. */.s
11900 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65  tatic const IoMe
11910 74 68 6f 64 20 73 71 6c 69 74 65 33 44 6f 74 6c  thod sqlite3Dotl
11920 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
11930 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64  Method = {.    d
11940 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c  otlockUnixClose,
11950 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72  .    unixOpenDir
11960 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78  ectory,.    unix
11970 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72  Read,.    unixWr
11980 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65  ite,.    unixSee
11990 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63  k,.    unixTrunc
119a0 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e  ate,.    unixSyn
119b0 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75  c,.    unixSetFu
119c0 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  llSync,.    unix
119d0 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20  FileHandle,.    
119e0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
119f0 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63    dotlockUnixLoc
11a00 6b 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  k,.    dotlockUn
11a10 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e  ixUnlock,.    un
11a20 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20  ixLockState,.   
11a30 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
11a40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d  kReservedLock,.}
11a50 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76  ;../*. ** This v
11a60 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
11a70 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
11a80 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
11a90 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20  n an OsFile. ** 
11aa0 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f  for unix with do
11ab0 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65  tlock style file
11ac0 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74   locking.. */.st
11ad0 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74  atic const IoMet
11ae0 68 6f 64 20 73 71 6c 69 74 65 33 4e 6f 6c 6f 63  hod sqlite3Noloc
11af0 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65  kLockingUnixIoMe
11b00 74 68 6f 64 20 3d 20 7b 0a 20 20 6e 6f 6c 6f 63  thod = {.  noloc
11b10 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e  kUnixClose,.  un
11b20 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c  ixOpenDirectory,
11b30 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
11b40 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
11b50 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e  Seek,.  unixTrun
11b60 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
11b70 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  ,.  unixSetFullS
11b80 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48  ync,.  unixFileH
11b90 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c  andle,.  unixFil
11ba0 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55  eSize,.  nolockU
11bb0 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f 6c 6f 63  nixLock,.  noloc
11bc0 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75  kUnixUnlock,.  u
11bd0 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20  nixLockState,.  
11be0 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52  nolockUnixCheckR
11bf0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b 0a  eservedLock,.};.
11c00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11c10 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
11c20 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STYLE */../*.**
11c30 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
11c40 20 66 6f 72 20 61 20 6e 65 77 20 75 6e 69 78 46   for a new unixF
11c50 69 6c 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ile and initiali
11c60 7a 65 20 74 68 61 74 20 75 6e 69 78 46 69 6c 65  ze that unixFile
11c70 2e 0a 2a 2a 20 57 72 69 74 65 20 61 20 70 6f 69  ..** Write a poi
11c80 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
11c90 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 2a 70  unixFile into *p
11ca0 49 64 2e 0a 2a 2a 20 49 66 20 77 65 20 72 75 6e  Id..** If we run
11cb0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20   out of memory, 
11cc0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61  close the file a
11cd0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
11ce0 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  or..*/.#ifdef SQ
11cf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
11d00 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 20 2a  ING_STYLE./* . *
11d10 2a 20 57 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 65  * When locking e
11d20 78 74 65 6e 73 69 6f 6e 73 20 61 72 65 20 65 6e  xtensions are en
11d30 61 62 6c 65 64 2c 20 74 68 65 20 66 69 6c 65 70  abled, the filep
11d40 61 74 68 20 61 6e 64 20 6c 6f 63 6b 69 6e 67 20  ath and locking 
11d50 73 74 79 6c 65 20 0a 20 2a 2a 20 61 72 65 20 6e  style . ** are n
11d60 65 65 64 65 64 20 74 6f 20 64 65 74 65 72 6d 69  eeded to determi
11d70 6e 65 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  ne the unixFile 
11d80 70 4d 65 74 68 6f 64 20 74 6f 20 75 73 65 20 66  pMethod to use f
11d90 6f 72 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  or locking opera
11da0 74 69 6f 6e 73 2e 0a 20 2a 2a 20 54 68 65 20 6c  tions.. ** The l
11db0 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20 73 70 65  ocking-style spe
11dc0 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 43 6f 6e  cific lockingCon
11dd0 74 65 78 74 20 64 61 74 61 20 73 74 72 75 63 74  text data struct
11de0 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 0a  ure is created .
11df0 20 2a 2a 20 61 6e 64 20 61 73 73 69 67 6e 65 64   ** and assigned
11e00 20 68 65 72 65 20 61 6c 73 6f 2e 0a 20 2a 2f 0a   here also.. */.
11e10 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
11e20 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 69  ateUnixFile(.  i
11e30 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
11e40 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
11e50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
11e60 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
11e70 6e 65 64 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  ned */.  OsFile 
11e80 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20 20  **pId,          
11e90 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d 70 6c 65   /* Write comple
11ea0 74 65 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ted initializati
11eb0 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  on here */.  con
11ec0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
11ed0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
11ee0 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
11ef0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  pened */.  int d
11f00 65 6c 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  elFlag          
11f10 20 20 20 2f 2a 20 44 65 6c 65 74 65 2d 6f 6e 2d     /* Delete-on-
11f20 6f 72 2d 62 65 66 6f 72 65 2d 63 6c 6f 73 65 20  or-before-close 
11f30 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  flag */.){.  sql
11f40 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  ite3LockingStyle
11f50 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20   lockingStyle;. 
11f60 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
11f70 0a 20 20 75 6e 69 78 46 69 6c 65 20 66 3b 0a 20  .  unixFile f;. 
11f80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6c 6f 63 6b   int rc;..  lock
11f90 69 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c 69 74  ingStyle = sqlit
11fa0 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53  e3DetectLockingS
11fb0 74 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  tyle(zFilename, 
11fc0 68 29 3b 0a 20 20 69 66 20 28 20 6c 6f 63 6b 69  h);.  if ( locki
11fd0 6e 67 53 74 79 6c 65 20 3d 3d 20 70 6f 73 69 78  ngStyle == posix
11fe0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29 20 7b  LockingStyle ) {
11ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  .    sqlite3OsEn
12000 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
12010 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
12020 6f 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26  o(h, &f.pLock, &
12030 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71  f.pOpen);.    sq
12040 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
12050 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  x();.    if( rc 
12060 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68  ){.      close(h
12070 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28  );.      unlink(
12080 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
12090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
120a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
120b0 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2f 20 20   else {.    //  
120c0 70 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65 6e 20  pLock and pOpen 
120d0 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
120e0 72 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  r posix advisory
120f0 20 6c 6f 63 6b 69 6e 67 20 0a 20 20 20 20 66 2e   locking .    f.
12100 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pLock = NULL;.  
12110 20 20 66 2e 70 4f 70 65 6e 20 3d 20 4e 55 4c 4c    f.pOpen = NULL
12120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 65 6c 46  ;.  }.  if( delF
12130 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e  lag ){.    unlin
12140 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
12150 7d 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31  }.  f.dirfd = -1
12160 3b 0a 20 20 66 2e 66 75 6c 6c 53 79 6e 63 20 3d  ;.  f.fullSync =
12170 20 30 3b 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65   0;.  f.locktype
12180 20 3d 20 30 3b 0a 20 20 66 2e 6f 66 66 73 65 74   = 0;.  f.offset
12190 20 3d 20 30 3b 0a 20 20 66 2e 68 20 3d 20 68 3b   = 0;.  f.h = h;
121a0 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
121b0 26 66 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  &f);.  pNew = sq
121c0 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
121d0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e  alloc( sizeof(un
121e0 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  ixFile) );.  if(
121f0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
12200 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71  close(h);.    sq
12210 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
12220 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
12230 4c 6f 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b  LockInfo(f.pLock
12240 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
12250 65 6e 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a  enCnt(f.pOpen);.
12260 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
12270 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a  veMutex();.    *
12280 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  pId = 0;.    ret
12290 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
122a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
122b0 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20 73 77  pNew = f;.    sw
122c0 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c  itch(lockingStyl
122d0 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e) {.      case 
122e0 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  afpLockingStyle:
122f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66 70 20  .        /* afp 
12300 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
12310 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
12320 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
12330 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20 20  luded in.       
12340 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
12350 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  ngContext */.   
12360 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
12370 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 41 46 50  od = &sqlite3AFP
12380 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12390 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  hod;.        pNe
123a0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
123b0 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  t = .          s
123c0 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
123d0 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66  Malloc(sizeof(af
123e0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  pLockingContext)
123f0 29 3b 0a 20 20 20 20 20 20 20 20 28 28 61 66 70  );.        ((afp
12400 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
12410 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  )pNew->lockingCo
12420 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68  ntext)->filePath
12430 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73 71   = .          sq
12440 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
12450 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 46 69  alloc(strlen(zFi
12460 6c 65 6e 61 6d 65 29 20 2b 20 31 29 3b 0a 20 20  lename) + 1);.  
12470 20 20 20 20 20 20 73 74 72 63 70 79 28 28 28 61        strcpy(((a
12480 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
12490 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67   *)pNew->locking
124a0 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
124b0 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  th, .           
124c0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
124d0 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64          srandomd
124e0 65 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ev();.        br
124f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
12500 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  flockLockingStyl
12510 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 6c  e:.        /* fl
12520 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  ock locking does
12530 6e 27 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f  n't need additio
12540 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  nal lockingConte
12550 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  xt information *
12560 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
12570 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
12580 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  e3FlockLockingUn
12590 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
125a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
125b0 20 63 61 73 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63   case dotlockLoc
125c0 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
125d0 20 20 20 2f 2a 20 64 6f 74 6c 6f 63 6b 20 6c 6f     /* dotlock lo
125e0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
125f0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
12600 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
12610 64 65 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  ded in.         
12620 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f  ** the dotlockLo
12630 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a  ckingContext */.
12640 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
12650 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12660 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  DotlockLockingUn
12670 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
12680 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
12690 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69 74  gContext = sqlit
126a0 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c  e3ThreadSafeMall
126b0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 73 69  oc(.          si
126c0 7a 65 6f 66 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  zeof(dotlockLock
126d0 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  ingContext));.  
126e0 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c        ((dotlockL
126f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
12700 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
12710 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20  text)->lockPath 
12720 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  = .            s
12730 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
12740 4d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 46  Malloc(strlen(zF
12750 69 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65  ilename) + strle
12760 6e 28 22 2e 6c 6f 63 6b 22 29 20 2b 20 31 29 3b  n(".lock") + 1);
12770 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
12780 28 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  (((dotlockLockin
12790 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d  gContext *)pNew-
127a0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
127b0 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a 20 20 20  ->lockPath, .   
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
127d0 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65 6e 61 6d  .lock", zFilenam
127e0 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
127f0 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 70 6f  k;.      case po
12800 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  sixLockingStyle:
12810 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69  .        /* posi
12820 78 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27  x locking doesn'
12830 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61  t need additiona
12840 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  l lockingContext
12850 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
12860 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
12870 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12880 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12890 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
128a0 20 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e     case noLockin
128b0 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 63 61  gStyle:.      ca
128c0 73 65 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f  se unsupportedLo
128d0 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
128e0 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
128f0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
12900 64 20 3d 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f  d = &sqlite3Nolo
12910 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
12920 65 74 68 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ethod;.    }.   
12930 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a   *pId = (OsFile*
12940 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43  )pNew;.    OpenC
12950 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
12960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12970 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a  ;.  }.}.#else /*
12980 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
12990 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
129a0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
129b0 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 69  ateUnixFile(.  i
129c0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
129d0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
129e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
129f0 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
12a00 65 64 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  ed */.  OsFile *
12a10 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20 20 2f  *pId,          /
12a20 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
12a30 6c 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  l unixFile struc
12a40 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
12a50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12a60 6e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  name, /* Name of
12a70 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
12a80 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
12a90 64 65 6c 46 6c 61 67 20 20 20 20 20 20 20 20 20  delFlag         
12aa0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 64     /* If true, d
12ab0 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
12ac0 6e 20 6f 72 20 62 65 66 6f 72 65 20 63 6c 6f 73  n or before clos
12ad0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ing */.){.  unix
12ae0 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e  File *pNew;.  un
12af0 69 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20  ixFile f;.  int 
12b00 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33 4f 73  rc;..  sqlite3Os
12b10 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
12b20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
12b30 6f 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26  o(h, &f.pLock, &
12b40 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69  f.pOpen);.  sqli
12b50 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
12b60 29 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67  );.  if( delFlag
12b70 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
12b80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
12b90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
12ba0 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65 74  lose(h);.    ret
12bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12bc0 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22  ;.  }.  TRACE3("
12bd0 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
12be0 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
12bf0 29 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d  );.  f.dirfd = -
12c00 31 3b 0a 20 20 66 2e 66 75 6c 6c 53 79 6e 63 20  1;.  f.fullSync 
12c10 3d 20 30 3b 0a 20 20 66 2e 6c 6f 63 6b 74 79 70  = 0;.  f.locktyp
12c20 65 20 3d 20 30 3b 0a 20 20 66 2e 6f 66 66 73 65  e = 0;.  f.offse
12c30 74 20 3d 20 30 3b 0a 20 20 66 2e 68 20 3d 20 68  t = 0;.  f.h = h
12c40 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
12c50 28 26 66 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  (&f);.  pNew = s
12c60 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
12c70 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75  Malloc( sizeof(u
12c80 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66  nixFile) );.  if
12c90 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
12ca0 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 73   close(h);.    s
12cb0 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
12cc0 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ex();.    releas
12cd0 65 4c 6f 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63  eLockInfo(f.pLoc
12ce0 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f  k);.    releaseO
12cf0 70 65 6e 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b  penCnt(f.pOpen);
12d00 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
12d10 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
12d20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  *pId = 0;.    re
12d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12d40 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
12d50 2a 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20 70  *pNew = f;.    p
12d60 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  New->pMethod = &
12d70 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74  sqlite3UnixIoMet
12d80 68 6f 64 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  hod;.    *pId = 
12d90 28 4f 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20  (OsFile*)pNew;. 
12da0 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
12db0 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  1);.    return S
12dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
12dd0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12de0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12df0 53 54 59 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66  STYLE */..#endif
12e00 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12e10 44 49 53 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  DISKIO */./*****
12e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e60 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74  ******.** Everyt
12e70 68 69 6e 67 20 61 62 6f 76 65 20 64 65 61 6c 73  hing above deals
12e80 20 77 69 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20   with file I/O. 
12e90 20 45 76 65 72 79 74 68 69 6e 67 20 74 68 61 74   Everything that
12ea0 20 66 6f 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a   follows deals.*
12eb0 2a 20 77 69 74 68 20 6f 74 68 65 72 20 6d 69 73  * with other mis
12ec0 63 65 6c 6c 61 6e 6f 75 73 20 61 73 70 65 63 74  cellanous aspect
12ed0 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
12ee0 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
12ef0 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ace.************
12f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f40 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
12f50 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
12f60 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
12f70 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
12f80 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
12f90 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
12fa0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
12fb0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
12fc0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
12fd0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
12fe0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
12ff0 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 76  lude <dlfcn.h>.v
13000 6f 69 64 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  oid *sqlite3Unix
13010 44 6c 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  Dlopen(const cha
13020 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
13030 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
13040 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
13050 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
13060 29 3b 0a 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74  );.}.void *sqlit
13070 65 33 55 6e 69 78 44 6c 73 79 6d 28 76 6f 69 64  e3UnixDlsym(void
13080 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
13090 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b   char *zSymbol){
130a0 0a 20 20 72 65 74 75 72 6e 20 64 6c 73 79 6d 28  .  return dlsym(
130b0 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c  pHandle, zSymbol
130c0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
130d0 55 6e 69 78 44 6c 63 6c 6f 73 65 28 76 6f 69 64  UnixDlclose(void
130e0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 72 65   *pHandle){.  re
130f0 74 75 72 6e 20 64 6c 63 6c 6f 73 65 28 70 48 61  turn dlclose(pHa
13100 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ndle);.}.#endif 
13110 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
13120 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f  OAD_EXTENSION */
13130 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f  ../*.** Get info
13140 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20  rmation to seed 
13150 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
13160 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68  r generator.  Th
13170 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69  e seed.** is wri
13180 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75  tten into the bu
13190 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20  ffer zBuf[256]. 
131a0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
131b0 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75  ction must.** su
131c0 70 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e  pply a sufficien
131d0 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72  tly large buffer
131e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
131f0 55 6e 69 78 52 61 6e 64 6f 6d 53 65 65 64 28 63  UnixRandomSeed(c
13200 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
13210 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
13220 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
13230 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
13240 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
13250 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
13260 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
13270 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
13280 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
13290 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
132a0 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
132b0 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
132c0 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
132d0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
132e0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
132f0 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
13300 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
13310 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
13320 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
13330 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
13340 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
13350 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
13360 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
13370 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
13380 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
13390 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
133a0 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
133b0 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
133c0 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
133d0 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
133e0 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
133f0 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
13400 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
13410 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
13420 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
13430 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
13440 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
13450 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .  This makes th
13460 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
13470 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
13480 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
13490 32 35 36 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  256);.#if !defin
134a0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
134b0 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 2c    {.    int pid,
134c0 20 66 64 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70   fd;.    fd = op
134d0 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
134e0 22 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  ", O_RDONLY);.  
134f0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
13500 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20      time_t t;.  
13510 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20      time(&t);.  
13520 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c      memcpy(zBuf,
13530 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b   &t, sizeof(t));
13540 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65 74  .      pid = get
13550 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d  pid();.      mem
13560 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
13570 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c  (time_t)], &pid,
13580 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
13590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
135a0 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 32  read(fd, zBuf, 2
135b0 35 36 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65  56);.      close
135c0 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (fd);.    }.  }.
135d0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
135e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
135f0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
13600 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
13610 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
13620 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
13630 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
13640 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
13650 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 77 65   milliseconds we
13660 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
13670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
13680 69 78 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b  ixSleep(int ms){
13690 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
136a0 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
136b0 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65  E_USLEEP.  uslee
136c0 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20 72 65  p(ms*1000);.  re
136d0 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20  turn ms;.#else. 
136e0 20 73 6c 65 65 70 28 28 6d 73 2b 39 39 39 29 2f   sleep((ms+999)/
136f0 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
13700 31 30 30 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31  1000*((ms+999)/1
13710 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  000);.#endif.}..
13720 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61 72  /*.** Static var
13730 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72 20  iables used for 
13740 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e 69  thread synchroni
13750 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e  zation..**.** in
13760 4d 75 74 65 78 20 20 20 20 20 20 74 68 65 20 6e  Mutex      the n
13770 65 73 74 69 6e 67 20 64 65 70 74 68 20 6f 66 20  esting depth of 
13780 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
13790 74 65 78 2e 20 20 54 68 65 20 74 68 72 65 61 64  tex.  The thread
137a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
137b0 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61   holding mutexMa
137c0 69 6e 20 63 61 6e 20 72 65 61 64 20 74 68 69 73  in can read this
137d0 20 76 61 72 69 61 62 6c 65 20 61 74 20 61 6e 79   variable at any
137e0 20 74 69 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 20   time..**       
137f0 20 20 20 20 20 20 20 42 75 74 20 69 73 20 6d 75         But is mu
13800 73 74 20 68 6f 6c 64 20 6d 75 74 65 78 41 75 78  st hold mutexAux
13810 20 74 6f 20 63 68 61 6e 67 65 20 74 68 69 73 20   to change this 
13820 76 61 72 69 61 62 6c 65 2e 20 20 4f 74 68 65 72  variable.  Other
13830 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13840 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 68 6f   threads must ho
13850 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f 20 72  ld mutexAux to r
13860 65 61 64 20 74 68 65 20 76 61 72 69 61 62 6c 65  ead the variable
13870 20 61 6e 64 20 63 61 6e 0a 2a 2a 20 20 20 20 20   and can.**     
13880 20 20 20 20 20 20 20 20 20 6e 65 76 65 72 20 77           never w
13890 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65  rite..**.** mute
138a0 78 4f 77 6e 65 72 20 20 20 54 68 65 20 74 68 72  xOwner   The thr
138b0 65 61 64 20 69 64 20 6f 66 20 74 68 65 20 74 68  ead id of the th
138c0 72 65 61 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74  read holding mut
138d0 65 78 4d 61 69 6e 2e 20 20 53 61 6d 65 0a 2a 2a  exMain.  Same.**
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
138f0 63 65 73 73 20 72 75 6c 65 73 20 61 73 20 66 6f  cess rules as fo
13900 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a  r inMutex..**.**
13910 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64   mutexOwnerValid
13920 20 20 20 54 72 75 65 20 69 66 20 74 68 65 20 76     True if the v
13930 61 6c 75 65 20 69 6e 20 6d 75 74 65 78 4f 77 6e  alue in mutexOwn
13940 65 72 20 69 73 20 76 61 6c 69 64 2e 20 20 54 68  er is valid.  Th
13950 65 20 73 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20  e same.**       
13960 20 20 20 20 20 20 20 20 20 20 20 20 61 63 63 65              acce
13970 73 73 20 72 75 6c 65 73 20 61 70 70 6c 79 20 61  ss rules apply a
13980 73 20 66 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a  s for inMutex..*
13990 2a 0a 2a 2a 20 6d 75 74 65 78 4d 61 69 6e 20 20  *.** mutexMain  
139a0 20 20 54 68 65 20 6d 61 69 6e 20 6d 75 74 65 78    The main mutex
139b0 2e 20 20 48 6f 6c 64 20 74 68 69 73 20 6d 75 74  .  Hold this mut
139c0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
139d0 65 74 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  et exclusive.** 
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 63               acc
139f0 65 73 73 20 74 6f 20 53 51 4c 69 74 65 20 64 61  ess to SQLite da
13a00 74 61 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  ta structures..*
13a10 2a 0a 2a 2a 20 6d 75 74 65 78 41 75 78 20 20 20  *.** mutexAux   
13a20 20 20 41 6e 20 61 75 78 69 6c 69 61 72 79 20 6d    An auxiliary m
13a30 75 74 65 78 20 6e 65 65 64 65 64 20 74 6f 20 61  utex needed to a
13a40 63 63 65 73 73 20 76 61 72 69 61 62 6c 65 73 20  ccess variables 
13a50 64 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a  defined above..*
13a60 2a 0a 2a 2a 20 4d 75 74 65 78 65 73 20 61 72 65  *.** Mutexes are
13a70 20 61 6c 77 61 79 73 20 61 63 71 75 69 72 65 64   always acquired
13a80 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 3a 20   in this order: 
13a90 6d 75 74 65 78 4d 61 69 6e 20 6d 75 74 65 78 41  mutexMain mutexA
13aa0 75 78 2e 20 20 20 49 74 0a 2a 2a 20 69 73 20 6e  ux.   It.** is n
13ab0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
13ac0 61 63 71 75 69 72 65 20 6d 75 74 65 78 4d 61 69  acquire mutexMai
13ad0 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  n in order to ge
13ae0 74 20 6d 75 74 65 78 41 75 78 20 2d 20 6a 75 73  t mutexAux - jus
13af0 74 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65  t.** do not atte
13b00 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
13b10 68 65 6d 20 69 6e 20 74 68 65 20 72 65 76 65 72  hem in the rever
13b20 73 65 20 6f 72 64 65 72 3a 20 6d 75 74 65 78 41  se order: mutexA
13b30 75 78 20 6d 75 74 65 78 4d 61 69 6e 2e 0a 2a 2a  ux mutexMain..**
13b40 20 45 69 74 68 65 72 20 67 65 74 20 74 68 65 20   Either get the 
13b50 6d 75 74 65 78 65 73 20 77 69 74 68 20 6d 75 74  mutexes with mut
13b60 65 78 4d 61 69 6e 20 66 69 72 73 74 20 6f 72 20  exMain first or 
13b70 67 65 74 20 6d 75 74 65 78 41 75 78 20 6f 6e 6c  get mutexAux onl
13b80 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 72 75  y..**.** When ru
13b90 6e 6e 69 6e 67 20 6f 6e 20 61 20 70 6c 61 74 66  nning on a platf
13ba0 6f 72 6d 20 77 68 65 72 65 20 74 68 65 20 74 68  orm where the th
13bb0 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 69 6e  ree variables in
13bc0 4d 75 74 65 78 2c 20 6d 75 74 65 78 4f 77 6e 65  Mutex, mutexOwne
13bd0 72 2c 0a 2a 2a 20 61 6e 64 20 6d 75 74 65 78 4f  r,.** and mutexO
13be0 77 6e 65 72 56 61 6c 69 64 20 63 61 6e 20 62 65  wnerValid can be
13bf0 20 73 65 74 20 61 74 6f 6d 69 63 61 6c 6c 79 2c   set atomically,
13c00 20 74 68 65 20 6d 75 74 65 78 41 75 78 20 69 73   the mutexAux is
13c10 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a   not required..*
13c20 2a 20 4f 6e 20 6d 61 6e 79 20 73 79 73 74 65 6d  * On many system
13c30 73 2c 20 61 6c 6c 20 74 68 72 65 65 20 61 72 65  s, all three are
13c40 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73   32-bit integers
13c50 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 6f 20   and writing to 
13c60 61 20 33 32 2d 62 69 74 0a 2a 2a 20 69 6e 74 65  a 32-bit.** inte
13c70 67 65 72 20 69 73 20 61 74 6f 6d 69 63 2e 20 20  ger is atomic.  
13c80 49 20 74 68 69 6e 6b 2e 20 20 42 75 74 20 74 68  I think.  But th
13c90 65 72 65 20 61 72 65 20 6e 6f 20 67 75 61 72 61  ere are no guara
13ca0 6e 74 65 65 73 2e 20 20 53 6f 20 69 74 20 73 65  ntees.  So it se
13cb0 65 6d 73 0a 2a 2a 20 73 61 66 65 72 20 74 6f 20  ems.** safer to 
13cc0 70 72 6f 74 65 63 74 20 74 68 65 6d 20 75 73 69  protect them usi
13cd0 6e 67 20 6d 75 74 65 78 41 75 78 2e 0a 2a 2f 0a  ng mutexAux..*/.
13ce0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74  static int inMut
13cf0 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ex = 0;.#ifdef S
13d00 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
13d10 44 53 0a 73 74 61 74 69 63 20 70 74 68 72 65 61  DS.static pthrea
13d20 64 5f 74 20 6d 75 74 65 78 4f 77 6e 65 72 3b 20  d_t mutexOwner; 
13d30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 72 65           /* Thre
13d40 61 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78  ad holding mutex
13d50 4d 61 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  Main */.static i
13d60 6e 74 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  nt mutexOwnerVal
13d70 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  id = 0;       /*
13d80 20 54 72 75 65 20 69 66 20 6d 75 74 65 78 4f 77   True if mutexOw
13d90 6e 65 72 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ner is valid */.
13da0 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
13db0 75 74 65 78 5f 74 20 6d 75 74 65 78 4d 61 69 6e  utex_t mutexMain
13dc0 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58   = PTHREAD_MUTEX
13dd0 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 20 2f 2a  _INITIALIZER; /*
13de0 20 54 68 65 20 6d 75 74 65 78 20 2a 2f 0a 73 74   The mutex */.st
13df0 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74  atic pthread_mut
13e00 65 78 5f 74 20 6d 75 74 65 78 41 75 78 20 3d 20  ex_t mutexAux = 
13e10 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
13e20 49 54 49 41 4c 49 5a 45 52 3b 20 20 2f 2a 20 41  ITIALIZER;  /* A
13e30 75 78 20 6d 75 74 65 78 20 2a 2f 0a 23 65 6e 64  ux mutex */.#end
13e40 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
13e50 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20  llowing pair of 
13e60 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
13e70 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  t mutual exclusi
13e80 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d  on for.** multi-
13e90 74 68 72 65 61 64 65 64 20 70 72 6f 63 65 73 73  threaded process
13ea0 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  es.  Only a sing
13eb0 6c 65 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c  le thread is all
13ec0 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75  owed to.** execu
13ed0 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 69 73  ted code that is
13ee0 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45   surrounded by E
13ef0 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20  nterMutex() and 
13f00 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a  LeaveMutex()..**
13f10 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20  .** SQLite uses 
13f20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75  only a single Mu
13f30 74 65 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e  tex.  There is n
13f40 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c  ot much critical
13f50 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61  .** code and wha
13f60 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69  t little there i
13f70 73 20 65 78 65 63 75 74 65 73 20 71 75 69 63 6b  s executes quick
13f80 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62  ly and without b
13f90 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  locking..**.** A
13fa0 73 20 6f 66 20 76 65 72 73 69 6f 6e 20 33 2e 33  s of version 3.3
13fb0 2e 32 2c 20 74 68 69 73 20 6d 75 74 65 78 20 6d  .2, this mutex m
13fc0 75 73 74 20 62 65 20 72 65 63 75 72 73 69 76 65  ust be recursive
13fd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13fe0 33 55 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28  3UnixEnterMutex(
13ff0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14000 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
14010 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
14020 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20  ck(&mutexAux);. 
14030 20 69 66 28 20 21 6d 75 74 65 78 4f 77 6e 65 72   if( !mutexOwner
14040 56 61 6c 69 64 20 7c 7c 20 21 70 74 68 72 65 61  Valid || !pthrea
14050 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e  d_equal(mutexOwn
14060 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  er, pthread_self
14070 28 29 29 20 29 7b 0a 20 20 20 20 70 74 68 72 65  ()) ){.    pthre
14080 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
14090 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 20 20  &mutexAux);.    
140a0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
140b0 63 6b 28 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a  ck(&mutexMain);.
140c0 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75      assert( inMu
140d0 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  tex==0 );.    as
140e0 73 65 72 74 28 20 21 6d 75 74 65 78 4f 77 6e 65  sert( !mutexOwne
140f0 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 70 74  rValid );.    pt
14100 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
14110 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 20  (&mutexAux);.   
14120 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 20 70 74   mutexOwner = pt
14130 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20  hread_self();.  
14140 20 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69    mutexOwnerVali
14150 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 4d  d = 1;.  }.  inM
14160 75 74 65 78 2b 2b 3b 0a 20 20 70 74 68 72 65 61  utex++;.  pthrea
14170 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
14180 6d 75 74 65 78 41 75 78 29 3b 0a 23 65 6c 73 65  mutexAux);.#else
14190 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a 23 65  .  inMutex++;.#e
141a0 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ndif.}.void sqli
141b0 74 65 33 55 6e 69 78 4c 65 61 76 65 4d 75 74 65  te3UnixLeaveMute
141c0 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  x(){.  assert( i
141d0 6e 4d 75 74 65 78 3e 30 20 29 3b 0a 23 69 66 64  nMutex>0 );.#ifd
141e0 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
141f0 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64  HREADS.  pthread
14200 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74  _mutex_lock(&mut
14210 65 78 41 75 78 29 3b 0a 20 20 69 6e 4d 75 74 65  exAux);.  inMute
14220 78 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x--;.  assert( p
14230 74 68 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74  thread_equal(mut
14240 65 78 4f 77 6e 65 72 2c 20 70 74 68 72 65 61 64  exOwner, pthread
14250 5f 73 65 6c 66 28 29 29 20 29 3b 0a 20 20 69 66  _self()) );.  if
14260 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  ( inMutex==0 ){.
14270 20 20 20 20 61 73 73 65 72 74 28 20 6d 75 74 65      assert( mute
14280 78 4f 77 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20  xOwnerValid );. 
14290 20 20 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c     mutexOwnerVal
142a0 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 74 68 72  id = 0;.    pthr
142b0 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
142c0 28 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20  (&mutexMain);.  
142d0 7d 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  }.  pthread_mute
142e0 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41  x_unlock(&mutexA
142f0 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d  ux);.#else.  inM
14300 75 74 65 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d  utex--;.#endif.}
14310 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
14320 52 55 45 20 69 66 20 74 68 65 20 6d 75 74 65 78  RUE if the mutex
14330 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65   is currently he
14340 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ld..**.** If the
14350 20 74 68 69 73 54 68 72 64 20 70 61 72 61 6d 65   thisThrd parame
14360 74 65 72 20 69 73 20 74 72 75 65 2c 20 72 65 74  ter is true, ret
14370 75 72 6e 20 74 72 75 65 20 6f 6e 6c 79 20 69 66  urn true only if
14380 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   the.** calling 
14390 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74 68 65  thread holds the
143a0 20 6d 75 74 65 78 2e 20 20 49 66 20 74 68 65 20   mutex.  If the 
143b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
143c0 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72  se, return.** tr
143d0 75 65 20 69 66 20 61 6e 79 20 74 68 72 65 61 64  ue if any thread
143e0 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
143f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14400 55 6e 69 78 49 6e 4d 75 74 65 78 28 69 6e 74 20  UnixInMutex(int 
14410 74 68 69 73 54 68 72 64 29 7b 0a 23 69 66 64 65  thisThrd){.#ifde
14420 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
14430 52 45 41 44 53 0a 20 20 69 6e 74 20 72 63 3b 0a  READS.  int rc;.
14440 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
14450 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b  lock(&mutexAux);
14460 0a 20 20 72 63 20 3d 20 69 6e 4d 75 74 65 78 3e  .  rc = inMutex>
14470 30 20 26 26 20 28 74 68 69 73 54 68 72 64 3d 3d  0 && (thisThrd==
14480 30 20 7c 7c 20 70 74 68 72 65 61 64 5f 65 71 75  0 || pthread_equ
14490 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c 70 74  al(mutexOwner,pt
144a0 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a  hread_self()));.
144b0 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
144c0 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  unlock(&mutexAux
144d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
144e0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 69  #else.  return i
144f0 6e 4d 75 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66  nMutex>0;.#endif
14500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
14510 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  er the number of
14520 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
14530 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c  -data blocks all
14540 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74  ocated..** Use t
14550 68 69 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  his to verify th
14560 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65  at we are not le
14570 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73 70 65  aking thread-spe
14580 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54  cific-data..** T
14590 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23  icket #1601.*/.#
145a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
145b0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 73  T.int sqlite3_ts
145c0 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 69  d_count = 0;.# i
145d0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
145e0 5f 54 48 52 45 41 44 53 0a 20 20 20 20 73 74 61  _THREADS.    sta
145f0 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
14600 78 5f 74 20 74 73 64 5f 63 6f 75 6e 74 65 72 5f  x_t tsd_counter_
14610 6d 75 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f  mutex = PTHREAD_
14620 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
14630 52 3b 0a 23 20 20 20 64 65 66 69 6e 65 20 54 53  R;.#   define TS
14640 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 5c 0a 20  D_COUNTER(N) \. 
14650 20 20 20 20 20 20 20 20 20 20 20 20 70 74 68 72              pthr
14660 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
14670 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65  tsd_counter_mute
14680 78 29 3b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  x); \.          
14690 20 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63     sqlite3_tsd_c
146a0 6f 75 6e 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20 20  ount += N; \.   
146b0 20 20 20 20 20 20 20 20 20 20 70 74 68 72 65 61            pthrea
146c0 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
146d0 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65  tsd_counter_mute
146e0 78 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 20 64  x);.# else.#   d
146f0 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
14700 52 28 4e 29 20 20 73 71 6c 69 74 65 33 5f 74 73  R(N)  sqlite3_ts
14710 64 5f 63 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20 65  d_count += N.# e
14720 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 64 65 66  ndif.#else.# def
14730 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28  ine TSD_COUNTER(
14740 4e 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  N)  /* no-op */.
14750 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
14760 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c   called with all
14770 6f 63 61 74 65 46 6c 61 67 3e 30 2c 20 74 68 65  ocateFlag>0, the
14780 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
14790 65 72 20 74 6f 20 74 68 72 65 61 64 0a 2a 2a 20  er to thread.** 
147a0 73 70 65 63 69 66 69 63 20 64 61 74 61 20 66 6f  specific data fo
147b0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
147c0 72 65 61 64 2e 20 20 41 6c 6c 6f 63 61 74 65 20  read.  Allocate 
147d0 61 6e 64 20 7a 65 72 6f 20 74 68 65 0a 2a 2a 20  and zero the.** 
147e0 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
147f0 64 61 74 61 20 69 66 20 69 74 20 64 6f 65 73 20  data if it does 
14800 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
14810 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c  t..**.** If call
14820 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74 65  ed with allocate
14830 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63 68  Flag==0, then ch
14840 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20  eck the current 
14850 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66  thread.** specif
14860 69 63 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  ic data.  Return
14870 20 69 74 20 69 66 20 69 74 20 65 78 69 73 74 73   it if it exists
14880 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
14890 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 68 65 6e  t exist,.** then
148a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
148b0 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69  .** If called wi
148c0 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c  th allocateFlag<
148d0 30 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  0, check to see 
148e0 69 66 20 74 68 65 20 74 68 72 65 61 64 20 73 70  if the thread sp
148f0 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 69  ecific.** data i
14900 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
14910 69 73 20 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66  is all zero.  If
14920 20 69 74 20 69 73 20 74 68 65 6e 20 64 65 61 6c   it is then deal
14930 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a 20 52 65  locate it..** Re
14940 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14950 6f 20 74 68 65 20 74 68 72 65 61 64 20 73 70 65  o the thread spe
14960 63 69 66 69 63 20 64 61 74 61 20 6f 72 20 4e 55  cific data or NU
14970 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 75  LL if it is.** u
14980 6e 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 67 65  nallocated or ge
14990 74 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  ts deallocated..
149a0 2a 2f 0a 54 68 72 65 61 64 44 61 74 61 20 2a 73  */.ThreadData *s
149b0 71 6c 69 74 65 33 55 6e 69 78 54 68 72 65 61 64  qlite3UnixThread
149c0 53 70 65 63 69 66 69 63 44 61 74 61 28 69 6e 74  SpecificData(int
149d0 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a   allocateFlag){.
149e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
149f0 68 72 65 61 64 44 61 74 61 20 7a 65 72 6f 44 61  hreadData zeroDa
14a00 74 61 20 3d 20 7b 30 7d 3b 20 20 2f 2a 20 49 6e  ta = {0};  /* In
14a10 69 74 69 61 6c 69 7a 65 72 20 74 6f 20 73 69 6c  itializer to sil
14a20 65 6e 63 65 20 77 61 72 6e 69 6e 67 73 0a 20 20  ence warnings.  
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d           ** from
14a60 20 62 72 6f 6b 65 6e 20 63 6f 6d 70 69 6c 65 72   broken compiler
14a70 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
14a80 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
14a90 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61 64    static pthread
14aa0 5f 6b 65 79 5f 74 20 6b 65 79 3b 0a 20 20 73 74  _key_t key;.  st
14ab0 61 74 69 63 20 69 6e 74 20 6b 65 79 49 6e 69 74  atic int keyInit
14ac0 20 3d 20 30 3b 0a 20 20 54 68 72 65 61 64 44 61   = 0;.  ThreadDa
14ad0 74 61 20 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28  ta *pTsd;..  if(
14ae0 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20   !keyInit ){.   
14af0 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
14b00 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20  utex();.    if( 
14b10 21 6b 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20  !keyInit ){.    
14b20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
14b30 72 63 20 3d 20 70 74 68 72 65 61 64 5f 6b 65 79  rc = pthread_key
14b40 5f 63 72 65 61 74 65 28 26 6b 65 79 2c 20 30 29  _create(&key, 0)
14b50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14b60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14b70 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
14b80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14b90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14ba0 20 6b 65 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20   keyInit = 1;.  
14bb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
14bc0 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
14bd0 20 7d 0a 0a 20 20 70 54 73 64 20 3d 20 70 74 68   }..  pTsd = pth
14be0 72 65 61 64 5f 67 65 74 73 70 65 63 69 66 69 63  read_getspecific
14bf0 28 6b 65 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c  (key);.  if( all
14c00 6f 63 61 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20  ocateFlag>0 ){. 
14c10 20 20 20 69 66 28 20 70 54 73 64 3d 3d 30 20 29     if( pTsd==0 )
14c20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  {.      if( !sql
14c30 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61  ite3TestMallocFa
14c40 69 6c 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  il() ){.        
14c50 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f 73  pTsd = sqlite3Os
14c60 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65  Malloc(sizeof(ze
14c70 72 6f 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  roData));.      
14c80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
14c90 4d 45 4d 44 45 42 55 47 0a 20 20 20 20 20 20 73  MEMDEBUG.      s
14ca0 71 6c 69 74 65 33 5f 69 73 46 61 69 6c 20 3d 20  qlite3_isFail = 
14cb0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  0;.#endif.      
14cc0 69 66 28 20 70 54 73 64 20 29 7b 0a 20 20 20 20  if( pTsd ){.    
14cd0 20 20 20 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f      *pTsd = zero
14ce0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 74  Data;.        pt
14cf0 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69  hread_setspecifi
14d00 63 28 6b 65 79 2c 20 70 54 73 64 29 3b 0a 20 20  c(key, pTsd);.  
14d10 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45        TSD_COUNTE
14d20 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  R(+1);.      }. 
14d30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
14d40 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f   pTsd!=0 && allo
14d50 63 61 74 65 46 6c 61 67 3c 30 20 0a 20 20 20 20  cateFlag<0 .    
14d60 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
14d70 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61 74  p(pTsd, &zeroDat
14d80 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61 64  a, sizeof(Thread
14d90 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Data))==0 ){.   
14da0 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70   sqlite3OsFree(p
14db0 54 73 64 29 3b 0a 20 20 20 20 70 74 68 72 65 61  Tsd);.    pthrea
14dc0 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b 65  d_setspecific(ke
14dd0 79 2c 20 30 29 3b 0a 20 20 20 20 54 53 44 5f 43  y, 0);.    TSD_C
14de0 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20  OUNTER(-1);.    
14df0 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
14e00 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6c  return pTsd;.#el
14e10 73 65 0a 20 20 73 74 61 74 69 63 20 54 68 72 65  se.  static Thre
14e20 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 30  adData *pTsd = 0
14e30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61 74 65  ;.  if( allocate
14e40 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20 69 66  Flag>0 ){.    if
14e50 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20  ( pTsd==0 ){.   
14e60 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 54     if( !sqlite3T
14e70 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20  estMallocFail() 
14e80 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73 64 20  ){.        pTsd 
14e90 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  = sqlite3OsMallo
14ea0 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61  c( sizeof(zeroDa
14eb0 74 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ta) );.      }.#
14ec0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
14ed0 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
14ee0 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a  te3_isFail = 0;.
14ef0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
14f00 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
14f10 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
14f20 61 3b 0a 20 20 20 20 20 20 20 20 54 53 44 5f 43  a;.        TSD_C
14f30 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20 20 20 20  OUNTER(+1);.    
14f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
14f50 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26 26  e if( pTsd!=0 &&
14f60 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 0a   allocateFlag<0.
14f70 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6d              && m
14f80 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a 65 72  emcmp(pTsd, &zer
14f90 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28 54 68  oData, sizeof(Th
14fa0 72 65 61 64 44 61 74 61 29 29 3d 3d 30 20 29 7b  readData))==0 ){
14fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72  .    sqlite3OsFr
14fc0 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 54 53  ee(pTsd);.    TS
14fd0 44 5f 43 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20  D_COUNTER(-1);. 
14fe0 20 20 20 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d     pTsd = 0;.  }
14ff0 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64 3b 0a  .  return pTsd;.
15000 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15010 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
15020 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
15030 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
15040 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
15050 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
15060 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
15070 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
15080 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
15090 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
150a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
150b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
150c0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
150d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
150e0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
150f0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
15100 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
15110 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
15120 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
15130 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
15140 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
15150 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
15160 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
15170 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
15180 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
15190 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
151a0 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 43 75  nt sqlite3UnixCu
151b0 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65  rrentTime(double
151c0 20 2a 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66   *prNow){.#ifdef
151d0 20 4e 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d   NO_GETTOD.  tim
151e0 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74  e_t t;.  time(&t
151f0 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f  );.  *prNow = t/
15200 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
15210 37 2e 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  7.5;.#else.  str
15220 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
15230 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 7a  ;.  struct timez
15240 6f 6e 65 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f 74  one sTz;  /* Not
15250 20 75 73 65 64 20 2a 2f 0a 20 20 67 65 74 74 69   used */.  getti
15260 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 26  meofday(&sNow, &
15270 73 54 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  sTz);.  *prNow =
15280 20 32 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f   2440587.5 + sNo
15290 77 2e 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30  w.tv_sec/86400.0
152a0 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
152b0 38 36 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23  86400000000.0;.#
152c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
152d0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
152e0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
152f0 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
15300 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
15310 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
15320 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
15330 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
15340 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  n 0;.}..#endif /
15350 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a           * OS_UNIX */.