/ Hex Artifact Content
Login

Artifact 4099d05dc4b01997e80a289f3c6a220688e5cff5:


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: 6e 64 65 66 20 54 48 52 45 41 44 53 41 46 45 0a  ndef THREADSAFE.
0740: 23 20 64 65 66 69 6e 65 20 54 48 52 45 41 44 53  # define THREADS
0750: 41 46 45 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  AFE 1.#endif.#if
0760: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
0770: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
0780: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0790: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
07a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
07b0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
07c0: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
07d0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
07e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
07f0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0800: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
0810: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0820: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
0830: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  0644.#endif..../
0840: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
0850: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
0860: 75 62 63 6c 61 73 73 20 6f 66 20 4f 73 46 69 6c  ubclass of OsFil
0870: 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20 74  e specific for t
0880: 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61  he unix.** prota
0890: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
08a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
08b0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
08c0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
08d0: 6c 65 20 7b 0a 20 20 49 6f 4d 65 74 68 6f 64 20  le {.  IoMethod 
08e0: 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20  const *pMethod; 
08f0: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
0900: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  irst entry */.  
0910: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
0920: 70 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49 6e 66  pOpen;    /* Inf
0930: 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e  o about all open
0940: 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e   fd's on this in
0950: 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
0960: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
0970: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0980: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
0990: 6e 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  node */.#ifdef S
09a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
09b0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 76 6f 69  KING_STYLE.  voi
09c0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
09d0: 74 3b 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e  t;     /* Lockin
09e0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
09f0: 20 73 74 61 74 65 20 2a 2f 0a 23 65 6e 64 69 66   state */.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
0a10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0a20: 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a40: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
0a50: 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  iptor */.  unsig
0a60: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
0a70: 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65  e;   /* The type
0a80: 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   of lock held on
0a90: 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e   this fd */.  un
0aa0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70  signed char isOp
0ab0: 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  en;     /* True 
0ac0: 69 66 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  if needs to be c
0ad0: 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  losed */.  unsig
0ae0: 6e 65 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e  ned char fullSyn
0af0: 63 3b 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55  c;   /* Use F_FU
0b00: 4c 4c 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61  LLSYNC if availa
0b10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ble */.  int dir
0b20: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
0b30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
0b40: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
0b50: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 69 36 34  rectory */.  i64
0b60: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
0b70: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f         /* Seek o
0b80: 66 66 73 65 74 20 2a 2f 0a 23 69 66 64 65 66 20  ffset */.#ifdef 
0b90: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0ba0: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0bb0: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0bc0: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0bd0: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0be0: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0bf0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0c00: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0c10: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0c20: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0c30: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0c40: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0c50: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0c60: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0c70: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0c80: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0c90: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0ca0: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0cb0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0cc0: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0cd0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0ce0: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0cf0: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0d00: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d10: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0d20: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0d30: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0d40: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0d50: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0d60: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0d70: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0d80: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0d90: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0da0: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0db0: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0dc0: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0dd0: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0de0: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0df0: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0e00: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0e10: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0e20: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0e30: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0e40: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0e50: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0e60: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0e70: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0e80: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0e90: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0ea0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0eb0: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0ec0: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0ed0: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0ee0: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0ef0: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0f00: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0f10: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0f20: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0f30: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0f40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0f50: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0f60: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0f70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0f80: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0f90: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0fa0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0fb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0fc0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0fd0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0fe0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
1010: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
1020: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
1030: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
1040: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
1050: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
1060: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
1070: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
1080: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
1090: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
10a0: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
10b0: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
10c0: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
10d0: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
10e0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
10f0: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
1100: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
1110: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
1120: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
1130: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
1140: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
1150: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
1160: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
1170: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
1180: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1190: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
11a0: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
11b0: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
11c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
11d0: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
11e0: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
11f0: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1200: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1210: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1220: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
1230: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
1240: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
1250: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
1260: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
1270: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
1280: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1290: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
12a0: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
12b0: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
12c0: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
12d0: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
12e0: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
12f0: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1300: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1310: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1320: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
1330: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
1340: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
1350: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
1360: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
1370: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
1380: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1390: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
13a0: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
13b0: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
13c0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
13d0: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
13e0: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
13f0: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1400: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1410: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1420: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
1430: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
1440: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
1450: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
1460: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
1470: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
1480: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1490: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
14a0: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
14b0: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
14c0: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
14d0: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
14e0: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
14f0: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1500: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1510: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1520: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
1530: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
1540: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
1550: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
1560: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
1570: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
1580: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1590: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
15a0: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
15b0: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
15c0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
15d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
15e0: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
15f0: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1600: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1610: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1620: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
1630: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
1640: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
1650: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
1660: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
1670: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
16a0: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
16b0: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
16c0: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
16d0: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
16e0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
16f0: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1700: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1710: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1720: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
1730: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
1740: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
1750: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
1760: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
1770: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
1780: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1790: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
17a0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
17b0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
17c0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
17d0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
17e0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
17f0: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1800: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1810: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1820: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
1830: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
1840: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
1850: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
1860: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1870: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
1880: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1890: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
18a0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
18b0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
18c0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
18d0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
18e0: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
18f0: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1900: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1910: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1920: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
1930: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
1940: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
1950: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
1960: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
1970: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
1980: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1990: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
19a0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
19b0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
19c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
19d0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
19e0: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
19f0: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1a00: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1a10: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1a20: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
1a30: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
1a40: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
1a50: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
1a60: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
1a70: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
1a80: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1a90: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1aa0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1ab0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1ac0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1ad0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1ae0: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1af0: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1b00: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1b10: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1b20: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
1b30: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
1b40: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
1b50: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
1b60: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
1b70: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
1b80: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1b90: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1ba0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1bb0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1bc0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1bd0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1be0: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1bf0: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1c00: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1c10: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1c20: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1c30: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1c40: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1c50: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1c60: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1c70: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1c80: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1c90: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1ca0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1cb0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1cc0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1cd0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1ce0: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1cf0: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1d00: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1d10: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1d20: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1d30: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1d40: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1d50: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1d60: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1d70: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1d80: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1d90: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1da0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1db0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1dc0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1dd0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1de0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1df0: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1e00: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1e10: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1e20: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1e30: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1e40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1e50: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1e60: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1e70: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1e80: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1e90: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1ea0: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1eb0: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1ec0: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1ed0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1ee0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1ef0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1f00: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1f10: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1f20: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1f30: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1f40: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1f50: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1f60: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1f70: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1f80: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1f90: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1fa0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1fb0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1fc0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1fd0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1fe0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1ff0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2000: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
2010: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
2020: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
2030: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
2040: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
2050: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
2060: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
2070: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
2080: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
2090: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
20a0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
20b0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
20c0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
20d0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
20e0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
20f0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
2100: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
2110: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
2120: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
2130: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
2140: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
2150: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
2160: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
2170: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
2180: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2190: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
21a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
21b0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
21c0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
21d0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
21e0: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
21f0: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2200: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2210: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2220: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
2230: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
2240: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
2250: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
2260: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
2270: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
2280: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2290: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
22a0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
22b0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
22c0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
22d0: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
22e0: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
22f0: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2300: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2310: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2320: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
2330: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
2340: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
2350: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
2370: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
2380: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2390: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
23a0: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
23b0: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
23c0: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
23d0: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
23e0: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
23f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2400: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2410: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2420: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
2430: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
2440: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
2450: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
2460: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
2470: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
2480: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2490: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
24a0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
24b0: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
24c0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
24d0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
24e0: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
24f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2500: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2510: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2520: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
2530: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
2540: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
2550: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
2560: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
2570: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
2580: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2590: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
25a0: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
25b0: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
25c0: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
25d0: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
25e0: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
25f0: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2600: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2610: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2620: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
2630: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
2640: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
2650: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
2660: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
2670: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
2680: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2690: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
26a0: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
26b0: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
26c0: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
26d0: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
26e0: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
26f0: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2700: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2710: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2720: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
2730: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
2740: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
2750: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
2760: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
2770: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
2780: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2790: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
27a0: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
27b0: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
27c0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
27d0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
27e0: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
27f0: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2800: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2810: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2820: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
2830: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
2840: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
2850: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
2860: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
2870: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
2880: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2890: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
28a0: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
28b0: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
28c0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
28d0: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
28e0: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
28f0: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2900: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2910: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2920: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
2930: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
2940: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
2950: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
2960: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
2970: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
2980: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2990: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
29a0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
29b0: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
29c0: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
29d0: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
29e0: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
29f0: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2a00: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2a10: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2a20: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
2a30: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
2a40: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
2a50: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
2a60: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
2a70: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
2a80: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2a90: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2aa0: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2ab0: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2ac0: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2ad0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2ae0: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2af0: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2b00: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2b10: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2b20: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
2b30: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
2b40: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
2b50: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
2b60: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
2b70: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
2b80: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2b90: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2ba0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2bb0: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2bc0: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2bd0: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2be0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2bf0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2c00: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2c10: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2c20: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2c30: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2c40: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2c50: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2c60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2c70: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2c80: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2c90: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2ca0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2cb0: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2cc0: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2cd0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2ce0: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2d10: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2d20: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2d30: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2d40: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2d50: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2d60: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2d70: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2d80: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2d90: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2da0: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2db0: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2dc0: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2dd0: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2de0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2df0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2e00: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2e10: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2e20: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2e30: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2e40: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2e50: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2e60: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2e70: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2e80: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2e90: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2ea0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2eb0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2ec0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2ed0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2ee0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2ef0: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2f00: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2f10: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2f20: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2f30: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2f40: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2f50: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2f60: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2f70: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2f80: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2f90: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2fa0: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2fb0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2fc0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2fd0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2fe0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2ff0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
3000: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
3010: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
3020: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
3030: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
3040: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
3050: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
3060: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
3070: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
3080: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
3090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30a0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
30b0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
30c0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
30d0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
30e0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
30f0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
3100: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3120: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
3130: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
3140: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
3150: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3160: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3170: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
3180: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3190: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
31a0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
31b0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
31c0: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
31d0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
31e0: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
31f0: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3200: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3210: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3220: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
3230: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
3240: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
3250: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
3260: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
3270: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
3280: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3290: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
32a0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
32b0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
32c0: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
32d0: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
32e0: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
32f0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3300: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3310: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3320: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
3330: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
3340: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
3350: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
3360: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
3370: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
3380: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3390: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
33a0: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
33b0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
33c0: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
33d0: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
33e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
33f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3410: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3420: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
3430: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3440: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
3450: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
3460: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
3470: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
3480: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3490: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
34a0: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
34b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
34c0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
34d0: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
34e0: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
34f0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3500: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3510: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3520: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
3530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3540: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
3550: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
3560: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
3570: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
3580: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3590: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
35a0: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
35b0: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
35c0: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
35d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
35e0: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49  lockHash = {SQLI
35f0: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3600: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 73 71  0, 0, 0, .    sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
3620: 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54 68  alloc, sqlite3Th
3630: 72 65 61 64 53 61 66 65 46 72 65 65 2c 20 30 2c  readSafeFree, 0,
3640: 20 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68   0};.static Hash
3650: 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51 4c   openHash = {SQL
3660: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3670: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 73   0, 0, 0, .    s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 4d 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54  Malloc, sqlite3T
36a0: 68 72 65 61 64 53 61 66 65 46 72 65 65 2c 20 30  hreadSafeFree, 0
36b0: 2c 20 30 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  , 0};..#ifdef SQ
36c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36d0: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
36e0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  The locking styl
36f0: 65 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65  es are associate
3700: 64 20 77 69 74 68 20 74 68 65 20 64 69 66 66 65  d with the diffe
3710: 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  rent file lockin
3720: 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69 74 69 65  g.** capabilitie
3730: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 64  s supported by d
3740: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 73 79  ifferent file sy
3750: 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  stems.  .**.** P
3760: 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 73 74 79  OSIX locking sty
3770: 6c 65 20 66 75 6c 6c 79 20 73 75 70 70 6f 72 74  le fully support
3780: 73 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  s shared and exc
3790: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37a0: 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41 44 50 20  e locks .** ADP 
37b0: 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20 73 75 70  locking only sup
37c0: 70 6f 72 74 73 20 65 78 63 6c 75 73 69 76 65 20  ports exclusive 
37d0: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
37e0: 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c 79 20 73  .** FLOCK only s
37f0: 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65  upports a single
3800: 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20 65 78 63   file-global exc
3810: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 44  lusive lock.** D
3820: 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20 61 20 74  OTLOCK isn't a t
3830: 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  rue locking styl
3840: 65 2c 20 69 74 20 72 65 66 65 72 73 20 74 6f 20  e, it refers to 
3850: 74 68 65 20 75 73 65 20 6f 66 20 61 20 73 70 65  the use of a spe
3860: 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c 65 20 6e  cial.**   file n
3870: 61 6d 65 64 20 74 68 65 20 73 61 6d 65 20 61 73  amed the same as
3880: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3890: 6c 65 20 77 69 74 68 20 61 20 27 2e 6c 6f 63 6b  le with a '.lock
38a0: 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69  ' extension, thi
38b0: 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65 20 75 73  s.**   can be us
38c0: 65 64 20 6f 6e 20 66 69 6c 65 20 73 79 73 74 65  ed on file syste
38d0: 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 6f  ms that do not o
38e0: 66 66 65 72 20 61 6e 79 20 72 65 6c 69 61 62 6c  ffer any reliabl
38f0: 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
3900: 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20 6d 65 61  * NO locking mea
3910: 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69  ns that no locki
3920: 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d  ng will be attem
3930: 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e  pted, this is on
3940: 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ly used for.**  
3950: 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
3960: 73 79 73 74 65 6d 73 20 63 75 72 72 65 6e 74 6c  systems currentl
3970: 79 0a 2a 2a 20 55 4e 53 55 50 50 4f 52 54 45 44  y.** UNSUPPORTED
3980: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c   means that no l
3990: 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20 61  ocking will be a
39a0: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 69  ttempted, this i
39b0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
39c0: 2a 2a 20 20 20 66 69 6c 65 20 73 79 73 74 65 6d  **   file system
39d0: 73 20 74 68 61 74 20 61 72 65 20 6b 6e 6f 77 6e  s that are known
39e0: 20 74 6f 20 62 65 20 75 6e 73 75 70 70 6f 72 74   to be unsupport
39f0: 65 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 65 6e  ed.*/.typedef en
3a00: 75 6d 20 7b 0a 09 70 6f 73 69 78 4c 6f 63 6b 69  um {..posixLocki
3a10: 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20 20 20 20  ngStyle = 0,    
3a20: 20 20 20 2f 2a 20 73 74 61 6e 64 61 72 64 20 70     /* standard p
3a30: 6f 73 69 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f  osix-advisory lo
3a40: 63 6b 73 20 2a 2f 0a 09 61 66 70 4c 6f 63 6b 69  cks */..afpLocki
3a50: 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20  ngStyle,        
3a60: 20 20 20 20 20 2f 2a 20 75 73 65 20 61 66 70 20       /* use afp 
3a70: 6c 6f 63 6b 73 20 2a 2f 0a 09 66 6c 6f 63 6b 4c  locks */..flockL
3a80: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
3a90: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 66 6c         /* use fl
3aa0: 6f 63 6b 28 29 20 2a 2f 0a 09 64 6f 74 6c 6f 63  ock() */..dotloc
3ab0: 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20  kLockingStyle,  
3ac0: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 3c 66         /* use <f
3ad0: 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65 73 20  ile>.lock files 
3ae0: 2a 2f 0a 09 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79  */..noLockingSty
3af0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
3b00: 20 2f 2a 20 75 73 65 66 75 6c 20 66 6f 72 20 72   /* useful for r
3b10: 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79  ead-only file sy
3b20: 73 74 65 6d 20 2a 2f 0a 09 75 6e 73 75 70 70 6f  stem */..unsuppo
3b30: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
3b40: 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61 74        /* indicat
3b50: 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66  es unsupported f
3b60: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20  ile system */.} 
3b70: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
3b80: 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  yle;.#endif /* S
3b90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3ba0: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
3bb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
3bc0: 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a 2a 2a 20  X_THREADS./*.** 
3bd0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65  This variable re
3be0: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f 72  cords whether or
3bf0: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
3c00: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3c10: 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a  thers.** locks..
3c20: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e  **.**    0:  No.
3c30: 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74    Threads cannot
3c40: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3c50: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
3c60: 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72     1:  Yes.  Thr
3c70: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
3c80: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
3c90: 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20 57  cks..**   -1:  W
3ca0: 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74  e don't know yet
3cb0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ..**.** On some 
3cc0: 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77  systems, we know
3cd0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
3ce0: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
3cf0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a  override each.**
3d00: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
3d10: 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  On those systems
3d20: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  , the SQLITE_THR
3d30: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3d40: 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20  K macro.** will 
3d50: 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  be set appropria
3d60: 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20  tely.  On other 
3d70: 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65  systems, we have
3d80: 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20   to check at.** 
3d90: 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65  runtime.  On the
3da0: 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d  se latter system
3db0: 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44  s, SQLTIE_THREAD
3dc0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69  _OVERRIDE_LOCK i
3dd0: 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s.** undefined..
3de0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  **.** This varia
3df0: 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73  ble normally has
3e00: 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79   file scope only
3e10: 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65  .  But during te
3e20: 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a  sting, we make.*
3e30: 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f  * it a global so
3e40: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63   that the test c
3e50: 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69  ode can change i
3e60: 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ts value in orde
3e70: 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74  r to verify.** t
3e80: 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74  hat the right st
3e90: 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65  uff happens in e
3ea0: 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23  ither case..*/.#
3eb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48  ifndef SQLITE_TH
3ec0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
3ed0: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
3ee0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
3ef0: 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64 69  DE_LOCK -1.#endi
3f00: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
3f10: 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64 73  TEST.int threads
3f20: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
3f30: 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45  rsLocks = SQLITE
3f40: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3f50: 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74 61  _LOCK;.#else.sta
3f60: 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f  tic int threadsO
3f70: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
3f80: 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f  sLocks = SQLITE_
3f90: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3fa0: 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK;.#endif../*
3fb0: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
3fc0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
3fd0: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
3fe0: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
3ff0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
4000: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
4010: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
4020: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
4030: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4040: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4060: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
4070: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
4080: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
4090: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
40a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
40b0: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
40c0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
40d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
40e0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
40f0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
4100: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
4110: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
4120: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
4130: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
4140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4150: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
4160: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
4170: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
4180: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
4190: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
41a0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
41b0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
41c0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
41d0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
41e0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
41f0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
4200: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
4210: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
4220: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
4230: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
4240: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
4250: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
4260: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
4270: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
4280: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
4290: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
42a0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
42b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
42c0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
42d0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
42e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
42f0: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
4310: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
4320: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
4330: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
4340: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
4350: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
4360: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
4370: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
4380: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
4390: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
43a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
43b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
43c0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
43d0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
43e0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
43f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4400: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
4410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
4420: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
4430: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
4440: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
4450: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
4460: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4470: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
4480: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
4490: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
44a0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
44b0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
44c0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
44d0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
44e0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
44f0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
4500: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
4510: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
4520: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
4530: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
4540: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
4550: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
4560: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
4570: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
4580: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
4590: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
45a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
45b0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
45c0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
45d0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
45e0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
45f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
4600: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
4610: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4620: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
4640: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
4650: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4660: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
4670: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
4680: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4690: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
46a0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
46b0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
46c0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
46d0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
46e0: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
46f0: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
4700: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
4710: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
4720: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
4730: 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61 64  * The testThread
4740: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
4750: 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68  ) routine launch
4760: 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 0a  es two separate.
4770: 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74 68  ** threads on th
4780: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69  is routine.  Thi
4790: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
47a0: 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c  ts to lock a fil
47b0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
47c0: 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20 54  then returns.  T
47d0: 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66 61  he success or fa
47e0: 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61 74  ilure of that at
47f0: 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20  tempt.** allows 
4800: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
4810: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
4820: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65 74  procedure to det
4830: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
4840: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
4850: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4860: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
4870: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4880: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
4890: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
48a0: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
48b0: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
48c0: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
48d0: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
48e0: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
48f0: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
4900: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74  , F_SETLK, &pDat
4910: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
4920: 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pArg;.}../*.*
4930: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
4940: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
4950: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
4960: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a  r not threads.**
4970: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4980: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
4990: 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a  then sets the .*
49a0: 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  * threadsOverrid
49b0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
49c0: 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70   variable approp
49d0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
49e0: 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65  ic void testThre
49f0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
4a00: 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a  r(int fd_orig){.
4a10: 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75    int fd;.  stru
4a20: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4a30: 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61  a d[2];.  pthrea
4a40: 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20  d_t t[2];..  fd 
4a50: 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a  = dup(fd_orig);.
4a60: 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74    if( fd<0 ) ret
4a70: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c  urn;.  memset(d,
4a80: 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a   0, sizeof(d));.
4a90: 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a    d[0].fd = fd;.
4aa0: 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79    d[0].lock.l_ty
4ab0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
4ac0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  d[0].lock.l_len 
4ad0: 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b  = 1;.  d[0].lock
4ae0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
4af0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  d[0].lock.l_when
4b00: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
4b10: 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20   d[1] = d[0];.  
4b20: 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  d[1].lock.l_type
4b30: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74   = F_WRLCK;.  pt
4b40: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
4b50: 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  0], 0, threadLoc
4b60: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d 29  kingTest, &d[0])
4b70: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
4b80: 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72  te(&t[1], 0, thr
4b90: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
4ba0: 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[1]);.  pthrea
4bb0: 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b  d_join(t[0], 0);
4bc0: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
4bd0: 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73  t[1], 0);.  clos
4be0: 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64 73  e(fd);.  threads
4bf0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
4c00: 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e  rsLocks =  d[0].
4c10: 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31  result==0 && d[1
4c20: 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23  ].result==0;.}.#
4c30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4c40: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a  UNIX_THREADS */.
4c50: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4c60: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
4c70: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
4c80: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
4c90: 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73  LockInfo()..*/.s
4ca0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
4cb0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63  seLockInfo(struc
4cc0: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
4cd0: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  k){.  assert( sq
4ce0: 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31  lite3OsInMutex(1
4cf0: 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63 6b  ) );.  if (pLock
4d00: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4d10: 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e  turn;.  pLock->n
4d20: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f  Ref--;.  if( pLo
4d30: 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ck->nRef==0 ){. 
4d40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4d50: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
4d60: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
4d70: 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c  eof(pLock->key),
4d80: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4d90: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 70  ThreadSafeFree(p
4da0: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Lock);.  }.}../*
4db0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70  .** Release a op
4dc0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
4dd0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
4de0: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b  ated by findLock
4df0: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
4e00: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70  c void releaseOp
4e10: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65  enCnt(struct ope
4e20: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20  nCnt *pOpen){.  
4e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4e40: 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20  sInMutex(1) );. 
4e50: 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e 55   if (pOpen == NU
4e60: 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  LL).    return;.
4e70: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
4e80: 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52  .  if( pOpen->nR
4e90: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ef==0 ){.    sql
4ea0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4eb0: 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e  openHash, &pOpen
4ec0: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f  ->key, sizeof(pO
4ed0: 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20  pen->key), 0);. 
4ee0: 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61     free(pOpen->a
4ef0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71  Pending);.    sq
4f00: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
4f10: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a  ree(pOpen);.  }.
4f20: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
4f30: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
4f40: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74  STYLE./*.** Test
4f50: 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  s a byte-range l
4f60: 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20  ocking query to 
4f70: 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67  see if byte rang
4f80: 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20  e locks are .** 
4f90: 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f  supported, if no
4fa0: 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  t we fall back t
4fb0: 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  o dotlockLocking
4fc0: 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Style..*/.static
4fd0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
4fe0: 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73 74  tyle sqlite3Test
4ff0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f 6e  LockingStyle(con
5000: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
5010: 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b 0a  h, .  int fd) {.
5020: 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d 72    /* test byte-r
5030: 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
5040: 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75 63  fcntl */.  struc
5050: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
5060: 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  ;.  .  lockInfo.
5070: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
5080: 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
5090: 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
50a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
50b0: 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
50c0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
50d0: 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28 66    .  if (fcntl(f
50e0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  d, F_GETLK, &loc
50f0: 6b 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 7b 0a  kInfo) != -1) {.
5100: 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78      return posix
5110: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5120: 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73 74 69  } .  .  /* testi
5130: 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63 61 6e  ng for flock can
5140: 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73 69   give false posi
5150: 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69 66  tives.  So if if
5160: 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74 0a   the above test.
5170: 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68 65 6e    ** fails, then
5180: 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   we fall back to
5190: 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b 20   using dot-lock 
51a0: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20  style locking.. 
51b0: 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20 64   */  .  return d
51c0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
51d0: 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45 78  le;.}../* .** Ex
51e0: 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66 73 74  amines the f_fst
51f0: 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69 6e  ypename entry in
5200: 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72 75   the statfs stru
5210: 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e 65  cture as returne
5220: 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28 29 20  d by .** stat() 
5230: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73 79 73  for the file sys
5240: 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65 20  tem hosting the 
5250: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
5260: 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a 20 61  ssigns the .** a
5270: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
5280: 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f  ng style based o
5290: 6e 20 69 74 27 73 20 76 61 6c 75 65 2e 20 20 54  n it's value.  T
52a0: 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64 20  hese values and 
52b0: 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73 20  .** assignments 
52c0: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61 72  are based on Dar
52d0: 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f 72  win/OSX behavior
52e0: 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62 65   and have not be
52f0: 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a  en tested on .**
5300: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
5310: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
5320: 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73 71  3LockingStyle sq
5330: 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69  lite3DetectLocki
5340: 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63 68  ngStyle(const ch
5350: 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20  ar *filePath, . 
5360: 20 69 6e 74 20 66 64 29 20 7b 0a 0a 23 69 66 64   int fd) {..#ifd
5370: 65 66 20 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  ef SQLITE_FIXED_
5380: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5390: 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 4c  return (sqlite3L
53a0: 6f 63 6b 69 6e 67 53 74 79 6c 65 29 53 51 4c 49  ockingStyle)SQLI
53b0: 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47  TE_FIXED_LOCKING
53c0: 5f 53 54 59 4c 45 3b 0a 23 65 6c 73 65 0a 20 20  _STYLE;.#else.  
53d0: 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
53e0: 49 6e 66 6f 3b 0a 0a 20 20 69 66 20 28 73 74 61  Info;..  if (sta
53f0: 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
5400: 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 29 0a 20 20  sInfo) == -1).  
5410: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5420: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
5430: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a  (filePath, fd);.
5440: 20 20 0a 20 20 69 66 20 28 66 73 49 6e 66 6f 2e    .  if (fsInfo.
5450: 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
5460: 4f 4e 4c 59 29 0a 20 20 20 20 72 65 74 75 72 6e  ONLY).    return
5470: 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   noLockingStyle;
5480: 0a 20 20 0a 20 20 69 66 28 20 28 21 73 74 72 63  .  .  if( (!strc
5490: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
54a0: 70 65 6e 61 6d 65 2c 20 22 68 66 73 22 29 29 20  pename, "hfs")) 
54b0: 7c 7c 0a 20 20 20 20 28 21 73 74 72 63 6d 70 28  ||.    (!strcmp(
54c0: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
54d0: 61 6d 65 2c 20 22 75 66 73 22 29 29 20 29 0a 09  ame, "ufs")) )..
54e0: 09 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63  .return posixLoc
54f0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20  kingStyle;.  .  
5500: 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  if(!strcmp(fsInf
5510: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5520: 22 61 66 70 66 73 22 29 29 0a 20 20 20 20 72 65  "afpfs")).    re
5530: 74 75 72 6e 20 61 66 70 4c 6f 63 6b 69 6e 67 53  turn afpLockingS
5540: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73  tyle;.  .  if(!s
5550: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
5560: 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
5570: 29 29 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  )) .    return s
5580: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5590: 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c  gStyle(filePath,
55a0: 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 28 21 73   fd);.  .  if(!s
55b0: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
55c0: 73 74 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62 66  stypename, "smbf
55d0: 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  s")).    return 
55e0: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  flockLockingStyl
55f0: 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63  e;.  .  if(!strc
5600: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
5610: 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22 29  pename, "msdos")
5620: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 64 6f 74  ).    return dot
5630: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
5640: 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d  ;.  .  if(!strcm
5650: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5660: 65 6e 61 6d 65 2c 20 22 77 65 62 64 61 76 22 29  ename, "webdav")
5670: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 73  ).    return uns
5680: 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
5690: 74 79 6c 65 3b 0a 20 20 0a 20 20 72 65 74 75 72  tyle;.  .  retur
56a0: 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  n sqlite3TestLoc
56b0: 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61  kingStyle(filePa
56c0: 74 68 2c 20 66 64 29 3b 20 20 0a 23 65 6e 64 69  th, fd);  .#endi
56d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 46 49 58 45  f /* SQLITE_FIXE
56e0: 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  D_LOCKING_STYLE 
56f0: 2a 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  */.}..#endif /* 
5700: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5710: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
5720: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
5730: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
5740: 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  ocate lockInfo a
5750: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
5760: 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65  tures that.** de
5770: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
5780: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
5790: 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69  reate new ones i
57a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
57b0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
57c0: 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  es might be unin
57d0: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
57e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
57f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5800: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
5810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5820: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69  indLockInfo(.  i
5830: 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
5840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5850: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5860: 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  or used in the k
5870: 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  ey */.  struct l
5880: 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b  ockInfo **ppLock
5890: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
58a0: 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  he lockInfo stru
58b0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
58c0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
58d0: 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20  *ppOpen      /* 
58e0: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43  Return the openC
58f0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72  nt structure her
5900: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
5910: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b  ;.  struct lockK
5920: 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63  ey key1;.  struc
5930: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a  t openKey key2;.
5940: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
5950: 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20  atbuf;.  struct 
5960: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
5970: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  .  struct openCn
5980: 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d  t *pOpen;.  rc =
5990: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
59a0: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
59b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  0 ) return 1;.. 
59c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
59d0: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
59e0: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20    memset(&key1, 
59f0: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  0, sizeof(key1))
5a00: 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73  ;.  key1.dev = s
5a10: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
5a20: 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74   key1.ino = stat
5a30: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64  buf.st_ino;.#ifd
5a40: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
5a50: 48 52 45 41 44 53 0a 20 20 69 66 28 20 74 68 72  HREADS.  if( thr
5a60: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
5a70: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
5a80: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
5a90: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
5aa0: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
5ab0: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
5ac0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5ad0: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
5ae0: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
5af0: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
5b00: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
5b10: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
5b20: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
5b30: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
5b40: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
5b50: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
5b60: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
5b70: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
5b80: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
5b90: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
5ba0: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
5bb0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5bc0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
5bd0: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
5be0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
5bf0: 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20  of(*pLock) );.  
5c00: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
5c10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
5c20: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5c30: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5c40: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
5c50: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
5c60: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
5c70: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
5c80: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
5c90: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
5ca0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5cb0: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
5cc0: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
5cd0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20  , sizeof(key1), 
5ce0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  pLock);.    if( 
5cf0: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
5d00: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5d10: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71  Lock );.      sq
5d20: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
5d30: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
5d40: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
5d50: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
5d60: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20  ckinfo;.    }.  
5d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
5d80: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
5d90: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
5da0: 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30  .  if( ppOpen!=0
5db0: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   ){.    pOpen = 
5dc0: 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a  (struct openCnt*
5dd0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
5de0: 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79  (&openHash, &key
5df0: 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29  2, sizeof(key2))
5e00: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  ;.    if( pOpen=
5e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
5e20: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64  ct openCnt *pOld
5e30: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20  ;.      pOpen = 
5e40: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
5e50: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5e60: 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20  *pOpen) );.     
5e70: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
5e80: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
5e90: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
5ea0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
5eb0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
5ec0: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
5ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5ee0: 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32  Open->key = key2
5ef0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
5f00: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
5f10: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b  Open->nLock = 0;
5f20: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
5f30: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
5f40: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
5f50: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c  g = 0;.      pOl
5f60: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
5f70: 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c  nsert(&openHash,
5f80: 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69   &pOpen->key, si
5f90: 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65  zeof(key2), pOpe
5fa0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  n);.      if( pO
5fb0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld!=0 ){.       
5fc0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5fd0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
5fe0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
5ff0: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
6000: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
6010: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
6020: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
6030: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
6040: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
6050: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6060: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
6070: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
6080: 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b  *ppOpen = pOpen;
6090: 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c  .  }..exit_findl
60a0: 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72  ockinfo:.  retur
60b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
60c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
60d0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
60e0: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
60f0: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
6100: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
6110: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
6120: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
6130: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
6140: 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  etation of the s
6150: 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67  upplied.** integ
6160: 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f  er lock-type..*/
6170: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6180: 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  ar *locktypeName
6190: 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a  (int locktype){.
61a0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
61b0: 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f  pe ){.  case NO_
61c0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
61d0: 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52  NE";.  case SHAR
61e0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
61f0: 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65  "SHARED";.  case
6200: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
6210: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
6220: 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e  ";.  case PENDIN
6230: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
6240: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65  PENDING";.  case
6250: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
6260: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
6270: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
6280: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
6290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  dif../*.** If we
62a0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
62b0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  n a different th
62c0: 72 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68  read than the th
62d0: 72 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  read that the.**
62e0: 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65   unixFile argume
62f0: 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74  nt belongs to, t
6300: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e  hen transfer own
6310: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e  ership of the un
6320: 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74  ixFile.** over t
6330: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  o the current th
6340: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e  read..**.** A un
6350: 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f  ixFile is only o
6360: 77 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64  wned by a thread
6370: 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72   on systems wher
6380: 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a  e one thread is.
6390: 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65  ** unable to ove
63a0: 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61  rride locks crea
63b0: 74 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65  ted by a differe
63c0: 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48  nt thread.  RedH
63d0: 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61  at9 is.** an exa
63e0: 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73  mple of such a s
63f0: 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e  ystem..**.** Own
6400: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20  ership transfer 
6410: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
6420: 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  if the unixFile 
6430: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
6440: 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ocked..** If the
6450: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63   unixFile is loc
6460: 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72  ked and an owner
6470: 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74  ship is wrong, t
6480: 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  hen return.** SQ
6490: 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51  LITE_MISUSE.  SQ
64a0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
64b0: 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
64c0: 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64  g works..*/.#ifd
64d0: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
64e0: 48 52 45 41 44 53 0a 73 74 61 74 69 63 20 69 6e  HREADS.static in
64f0: 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  t transferOwners
6500: 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  hip(unixFile *pF
6510: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
6520: 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c    pthread_t hSel
6530: 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73  f;.  if( threads
6540: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
6550: 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f  rsLocks ){.    /
6560: 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  * Ownership tran
6570: 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64  sfers not needed
6580: 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20   on this system 
6590: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
65a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68  LITE_OK;.  }.  h
65b0: 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73  Self = pthread_s
65c0: 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68  elf();.  if( pth
65d0: 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65  read_equal(pFile
65e0: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b  ->tid, hSelf) ){
65f0: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73  .    /* We are s
6600: 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65  till in the same
6610: 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f   thread */.    O
6620: 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e  STRACE1("No-tran
6630: 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61  sfer, same threa
6640: 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  d\n");.    retur
6650: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6660: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
6670: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
6680: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e  ){.    /* We can
6690: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72  not change owner
66a0: 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72  ship while we ar
66b0: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  e holding a lock
66c0: 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ! */.    return 
66d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
66e0: 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54   }.  OSTRACE4("T
66f0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
6700: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
6710: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
6720: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
6730: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
6740: 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64  f);.  pFile->tid
6750: 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28   = hSelf;.  if (
6760: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20  pFile->pLock != 
6770: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65  NULL) {.    rele
6780: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
6790: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
67a0: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
67b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c  (pFile->h, &pFil
67c0: 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20  e->pLock, 0);.  
67d0: 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b    OSTRACE5("LOCK
67e0: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
67f0: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
6800: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
6810: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
6820: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
6830: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6840: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  ypeName(pFile->p
6850: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
6860: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
6870: 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nt);.    return 
6880: 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
6890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
68a0: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
68b0: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
68c0: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
68d0: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
68e0: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
68f0: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
6900: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
6910: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
6920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
6930: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
6940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6950: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
6960: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6970: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6980: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
6990: 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
69a0: 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
69b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
69c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
69d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
69e0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65 78  he named file ex
69f0: 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
6a00: 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69 73  ite3UnixFileExis
6a10: 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ts(const char *z
6a20: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74  Filename){.  ret
6a30: 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65  urn access(zFile
6a40: 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a  name, 0)==0;.}..
6a50: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
6a60: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
6a70: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69   int allocateUni
6a80: 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
6ab0: 69 70 74 6f 72 20 6f 66 20 74 68 65 20 6f 70 65  iptor of the ope
6ac0: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69  n file */.  OsFi
6ad0: 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20  le **pId,       
6ae0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
6af0: 68 65 20 72 65 61 6c 20 66 69 6c 65 20 64 65 73  he real file des
6b00: 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
6b10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6b20: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e  ilename,    /* N
6b30: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
6b40: 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
6b50: 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20    int delFlag   
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6b70: 66 20 74 72 75 65 2c 20 6d 61 6b 65 20 73 75 72  f true, make sur
6b80: 65 20 74 68 65 20 66 69 6c 65 20 64 65 6c 65 74  e the file delet
6b90: 65 73 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 29  es on close */.)
6ba0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ;../*.** Attempt
6bb0: 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20   to open a file 
6bc0: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
6bd0: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49   and writing.  I
6be0: 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c  f that.** fails,
6bf0: 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20   try opening it 
6c00: 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74  read-only.  If t
6c10: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
6c20: 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74   exist,.** try t
6c30: 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a  o create it..**.
6c40: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
6c50: 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
6c60: 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69  open file is wri
6c70: 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61  tten to *id.** a
6c80: 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73  nd *pReadonly is
6c90: 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68 65   set to 0 if the
6ca0: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
6cb0: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64   for reading and
6cc0: 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20 31  .** writing or 1
6cd0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   if the file was
6ce0: 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
6cf0: 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  y.  The function
6d00: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49   returns.** SQLI
6d10: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
6d20: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e  failure, the fun
6d30: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
6d40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e  LITE_CANTOPEN an
6d50: 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20  d leaves.** *id 
6d60: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75  and *pReadonly u
6d70: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
6d80: 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e   sqlite3UnixOpen
6d90: 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f 6e  ReadWrite(.  con
6da0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6db0: 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70  me,.  OsFile **p
6dc0: 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64  Id,.  int *pRead
6dd0: 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b  only.){.  int h;
6de0: 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53 54  .  .  CRASH_TEST
6df0: 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65  _OVERRIDE(sqlite
6e00: 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57 72  3CrashOpenReadWr
6e10: 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ite, zFilename, 
6e20: 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29 3b  pId, pReadonly);
6e30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
6e40: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
6e50: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
6e60: 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52  WR|O_CREAT|O_LAR
6e70: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c  GEFILE|O_BINARY,
6e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e90: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6ea0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
6eb0: 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
6ec0: 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45   h<0 ){.#ifdef E
6ed0: 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72  ISDIR.    if( er
6ee0: 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20  rno==EISDIR ){. 
6ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6f00: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
6f10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 68 20   }.#endif.    h 
6f20: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
6f30: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
6f40: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
6f50: 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20 29 7b  ;.    if( h<0 ){
6f60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6f70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
6f80: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
6f90: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
6fa0: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
6fb0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
6fc0: 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  urn allocateUnix
6fd0: 46 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69  File(h, pId, zFi
6fe0: 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 0a  lename, 0);.}...
6ff0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
7000: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
7010: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
7020: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
7030: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
7040: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
7050: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
7060: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
7070: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
7080: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
7090: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
70a0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
70b0: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
70c0: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
70d0: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
70e0: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
70f0: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
7100: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
7110: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
7120: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
7130: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
7140: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
7150: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
7160: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
7170: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
7180: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
7190: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
71a0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
71b0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
71c0: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
71d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
71e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
71f0: 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  ixOpenExclusive(
7200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
7210: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  ename, OsFile **
7220: 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  pId, int delFlag
7230: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 43  ){.  int h;..  C
7240: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
7250: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
7260: 70 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a 46  penExclusive, zF
7270: 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65  ilename, pId, de
7280: 6c 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72 74  lFlag);.  assert
7290: 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68  ( 0==*pId );.  h
72a0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
72b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
72c0: 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41     O_RDWR|O_CREA
72d0: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
72e0: 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  LOW|O_LARGEFILE|
72f0: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
7300: 20 20 20 20 20 20 20 20 20 20 64 65 6c 46 6c 61            delFla
7310: 67 20 3f 20 30 36 30 30 20 3a 20 53 51 4c 49 54  g ? 0600 : SQLIT
7320: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
7330: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
7340: 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65  f( h<0 ){.    re
7350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
7360: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OPEN;.  }.  retu
7370: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
7380: 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c  ile(h, pId, zFil
7390: 65 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b  ename, delFlag);
73a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
73b0: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
73c0: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e  file for read-on
73d0: 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  ly access..**.**
73e0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
73f0: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
7400: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
7410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7420: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
7430: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
7440: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
7450: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
7460: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
7470: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7480: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
7490: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43  .  int h;.  .  C
74a0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
74b0: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
74c0: 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69  penReadOnly, zFi
74d0: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b  lename, pId, 0);
74e0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
74f0: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
7500: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
7510: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
7520: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
7530: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( h<0 ){.    ret
7540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
7550: 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PEN;.  }.  retur
7560: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
7570: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7580: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  name, 0);.}../*.
7590: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
75a0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
75b0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
75c0: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
75d0: 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20  ains a.** file. 
75e0: 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   This file descr
75f0: 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65  iptor can be use
7600: 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65  d to fsync() the
7610: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e   directory.** in
7620: 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
7630: 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ure the creation
7640: 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69   of a new file i
7650: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
7660: 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  en.** to disk..*
7670: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7680: 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e  e is only meanin
7690: 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20  gful for Unix.  
76a0: 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
76b0: 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73  der.** windows s
76c0: 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65  ince windows doe
76d0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61  s not support ha
76e0: 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20  rd links..**.** 
76f0: 49 66 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73  If FULL_FSYNC is
7700: 20 65 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66   enabled, this f
7710: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c  unction is not l
7720: 6f 6e 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a  onger useful, .*
7730: 2a 20 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73  * a FULL_FSYNC s
7740: 79 6e 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ync applies to a
7750: 6c 6c 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20  ll pending disk 
7760: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7770: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
7780: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
7790: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
77a0: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
77b0: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
77c0: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
77d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
77e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
77f0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
7800: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
7810: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
7820: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
7830: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
7840: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
7850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
7860: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
7870: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
7880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
7890: 72 6e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 68  rname.){.  int h
78a0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
78b0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
78c0: 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )id;.  assert( p
78d0: 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 53 45 54  File!=0 );.  SET
78e0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
78f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
7900: 65 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20  e->dirfd<0 );.  
7910: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 68  pFile->dirfd = h
7920: 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65   = open(zDirname
7930: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
7940: 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 68  ARY, 0);.  if( h
7950: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
7960: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7970: 3b 20 0a 20 20 7d 0a 23 69 66 64 65 66 20 46 44  ; .  }.#ifdef FD
7980: 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
7990: 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e  (h, F_SETFD, fcn
79a0: 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30  tl(h, F_GETFD, 0
79b0: 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
79c0: 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
79d0: 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
79e0: 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 44 69 72 6e   %s\n", h, zDirn
79f0: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ame);.  return S
7a00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7a10: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
7a20: 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
7a30: 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
7a40: 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
7a50: 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
7a60: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
7a70: 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72 61  PNAME_SIZE chara
7a80: 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cters..*/.int sq
7a90: 6c 69 74 65 33 55 6e 69 78 54 65 6d 70 46 69 6c  lite3UnixTempFil
7aa0: 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66  eName(char *zBuf
7ab0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
7ac0: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
7ad0: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
7ae0: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
7af0: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
7b00: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
7b10: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
7b20: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
7b30: 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ed char zChars[]
7b40: 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
7b50: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
7b60: 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
7b70: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
7b80: 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
7b90: 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20  6789";.  int i, 
7ba0: 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  j;.  struct stat
7bb0: 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68   buf;.  const ch
7bc0: 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  ar *zDir = ".";.
7bd0: 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
7be0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
7bf0: 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  tory;.  for(i=0;
7c00: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
7c10: 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
7c20: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
7c30: 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20  f( azDirs[i]==0 
7c40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7c50: 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b  if( stat(azDirs[
7c60: 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  i], &buf) ) cont
7c70: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
7c80: 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
7c90: 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
7ca0: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61      if( access(a
7cb0: 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20  zDirs[i], 07) ) 
7cc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44  continue;.    zD
7cd0: 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a  ir = azDirs[i];.
7ce0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
7cf0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
7d00: 5f 73 6e 70 72 69 6e 74 66 28 53 51 4c 49 54 45  _snprintf(SQLITE
7d10: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2c 20  _TEMPNAME_SIZE, 
7d20: 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f  zBuf, "%s/"TEMP_
7d30: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
7d40: 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  r);.    j = strl
7d50: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
7d60: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
7d70: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
7d80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
7d90: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
7da0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
7db0: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
7dc0: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
7dd0: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
7de0: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
7df0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
7e00: 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
7e10: 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
7e20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e30: 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  OK; .}../*.** Ch
7e40: 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 65 6e  eck that a given
7e50: 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20 64   pathname is a d
7e60: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73 20  irectory and is 
7e70: 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a  writable .**.*/.
7e80: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 49  int sqlite3UnixI
7e90: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61  sDirWritable(cha
7ea0: 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e 64 65  r *zBuf){.#ifnde
7eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
7ec0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20 73 74  GER_PRAGMAS.  st
7ed0: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
7ee0: 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72   if( zBuf==0 ) r
7ef0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
7f00: 42 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75  Buf[0]==0 ) retu
7f10: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74  rn 0;.  if( stat
7f20: 28 7a 42 75 66 2c 20 26 62 75 66 29 20 29 20 72  (zBuf, &buf) ) r
7f30: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
7f40: 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
7f50: 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ode) ) return 0;
7f60: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 42  .  if( access(zB
7f70: 75 66 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e  uf, 07) ) return
7f80: 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
7f90: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
7fa0: 50 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72 65 74  PRAGMAS */.  ret
7fb0: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
7fc0: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
7fd0: 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
7fe0: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
7ff0: 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
8000: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8010: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
8020: 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
8030: 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
8040: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8050: 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
8060: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
8070: 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
8080: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20   int got;.  i64 
8090: 6e 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d  newOffset;.  TIM
80a0: 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65  ER_START;.#if de
80b0: 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
80c0: 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 69  .  got = pread(i
80d0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
80e0: 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 20 20   id->offset);.  
80f0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8100: 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
8110: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
8120: 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
8130: 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
8140: 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66  Buf, cnt, id->of
8150: 66 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74  fset);.  Simulat
8160: 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
8170: 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65  -1 );.#else.  ne
8180: 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
8190: 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65  id->h, id->offse
81a0: 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  t, SEEK_SET);.  
81b0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
81c0: 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
81d0: 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
81e0: 3d 69 64 2d 3e 6f 66 66 73 65 74 20 29 7b 0a 20  =id->offset ){. 
81f0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
8200: 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
8210: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
8220: 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
8230: 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 35  _END;.  OSTRACE5
8240: 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
8250: 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20  5d %7lld %d\n", 
8260: 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e  id->h, got, id->
8270: 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c  offset, TIMER_EL
8280: 41 50 53 45 44 29 3b 0a 20 20 69 66 28 20 67 6f  APSED);.  if( go
8290: 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f  t>0 ){.    id->o
82a0: 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
82b0: 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  }.  return got;.
82c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
82d0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
82e0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
82f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
8300: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
8310: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
8320: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
8330: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
8340: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
8350: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
8360: 20 75 6e 69 78 52 65 61 64 28 4f 73 46 69 6c 65   unixRead(OsFile
8370: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
8380: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
8390: 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28  t got;.  assert(
83a0: 20 69 64 20 29 3b 0a 20 20 67 6f 74 20 3d 20 73   id );.  got = s
83b0: 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78  eekAndRead((unix
83c0: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
83d0: 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
83e0: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
83f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8400: 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
8410: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8420: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
8430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
8440: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
8450: 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74  uf)[got], 0, amt
8460: 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72  -got);.    retur
8470: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
8480: 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d  HORT_READ;.  }.}
8490: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
84a0: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
84b0: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
84c0: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
84d0: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
84e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
84f0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
8500: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
8510: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
8520: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
8530: 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
8540: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
8550: 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
8560: 69 6e 74 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e  int got;.  i64 n
8570: 65 77 4f 66 66 73 65 74 3b 0a 20 20 54 49 4d 45  ewOffset;.  TIME
8580: 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66  R_START;.#if def
8590: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
85a0: 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69    got = pwrite(i
85b0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
85c0: 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 23 65   id->offset);.#e
85d0: 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
85e0: 50 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d  PREAD64).  got =
85f0: 20 70 77 72 69 74 65 36 34 28 69 64 2d 3e 68 2c   pwrite64(id->h,
8600: 20 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e   pBuf, cnt, id->
8610: 6f 66 66 73 65 74 29 3b 0a 23 65 6c 73 65 0a 20  offset);.#else. 
8620: 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
8630: 65 6b 28 69 64 2d 3e 68 2c 20 69 64 2d 3e 6f 66  ek(id->h, id->of
8640: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
8650: 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
8660: 21 3d 69 64 2d 3e 6f 66 66 73 65 74 20 29 7b 0a  !=id->offset ){.
8670: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
8680: 20 7d 0a 20 20 67 6f 74 20 3d 20 77 72 69 74 65   }.  got = write
8690: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
86a0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  t);.#endif.  TIM
86b0: 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43  ER_END;.  OSTRAC
86c0: 45 35 28 22 57 52 49 54 45 20 20 20 25 2d 33 64  E5("WRITE   %-3d
86d0: 20 25 35 64 20 25 37 6c 6c 64 20 25 64 5c 6e 22   %5d %7lld %d\n"
86e0: 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 69 64  , id->h, got, id
86f0: 2d 3e 6f 66 66 73 65 74 2c 20 54 49 4d 45 52 5f  ->offset, TIMER_
8700: 45 4c 41 50 53 45 44 29 3b 0a 20 20 69 66 28 20  ELAPSED);.  if( 
8710: 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 69 64 2d  got>0 ){.    id-
8720: 3e 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a  >offset += got;.
8730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 6f 74    }.  return got
8740: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
8750: 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
8760: 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
8770: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
8780: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
8790: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
87a0: 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
87b0: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
87c0: 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 4f   int unixWrite(O
87d0: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
87e0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
87f0: 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f   amt){.  int wro
8800: 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  te = 0;.  assert
8810: 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  ( id );.  assert
8820: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69  ( amt>0 );.  whi
8830: 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
8840: 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
8850: 74 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  te((unixFile*)id
8860: 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
8870: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
8880: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
8890: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
88a0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
88b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
88c0: 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
88d0: 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
88e0: 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
88f0: 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
8900: 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ;.  if( amt>0 ){
8910: 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
8920: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8930: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
8940: 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
8950: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8960: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
8970: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8980: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8990: 20 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77   Move the read/w
89a0: 72 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rite pointer in 
89b0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
89c0: 63 20 69 6e 74 20 75 6e 69 78 53 65 65 6b 28 4f  c int unixSeek(O
89d0: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f  sFile *id, i64 o
89e0: 66 66 73 65 74 29 7b 0a 20 20 61 73 73 65 72 74  ffset){.  assert
89f0: 28 20 69 64 20 29 3b 0a 23 69 66 64 65 66 20 53  ( id );.#ifdef S
8a00: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
8a10: 20 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61   offset ) Simula
8a20: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
8a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
8a40: 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 28 28  LL);.#endif.  ((
8a50: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6f  unixFile*)id)->o
8a60: 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
8a70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a80: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
8a90: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
8aa0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
8ab0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
8ac0: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
8ad0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
8ae0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
8af0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
8b00: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
8b10: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
8b20: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8b30: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
8b40: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
8b50: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
8b60: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
8b70: 55 73 65 20 74 68 65 20 66 64 61 74 61 73 79 6e  Use the fdatasyn
8b80: 63 28 29 20 41 50 49 20 6f 6e 6c 79 20 69 66 20  c() API only if 
8b90: 74 68 65 20 48 41 56 45 5f 46 44 41 54 41 53 59  the HAVE_FDATASY
8ba0: 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
8bb0: 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
8bc0: 65 20 75 73 65 20 66 73 79 6e 63 28 29 20 69 6e  e use fsync() in
8bd0: 20 69 74 73 20 70 6c 61 63 65 2e 0a 2a 2f 0a 23   its place..*/.#
8be0: 69 66 6e 64 65 66 20 48 41 56 45 5f 46 44 41 54  ifndef HAVE_FDAT
8bf0: 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
8c00: 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
8c10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
8c20: 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
8c30: 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
8c40: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
8c50: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
8c60: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
8c70: 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
8c80: 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
8c90: 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
8ca0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
8cb0: 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
8cc0: 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
8cd0: 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
8ce0: 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
8cf0: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
8d00: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
8d10: 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
8d20: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
8d30: 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
8d40: 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
8d50: 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
8d60: 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
8d70: 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
8d80: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
8d90: 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
8da0: 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
8db0: 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
8dc0: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
8dd0: 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
8de0: 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
8df0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
8e00: 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
8e10: 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
8e20: 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
8e30: 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
8e40: 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
8e50: 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
8e60: 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
8e70: 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
8e80: 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
8e90: 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
8ea0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
8eb0: 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
8ec0: 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
8ed0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
8ee0: 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
8ef0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
8f00: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
8f10: 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
8f20: 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
8f30: 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
8f40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
8f50: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
8f60: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
8f70: 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61  at we do a norma
8f80: 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20  l fsync() and . 
8f90: 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54   ** FULLSYNC.  T
8fa0: 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69  his is used duri
8fb0: 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65  ng testing to ve
8fc0: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70  rify that this p
8fd0: 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65  rocedure.  ** ge
8fe0: 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  ts called with t
8ff0: 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d  he correct argum
9000: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ents..  */.#ifde
9010: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
9020: 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73  if( fullSync ) s
9030: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
9040: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74  count++;.  sqlit
9050: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
9060: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
9070: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
9080: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
9090: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
90a0: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
90b0: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
90c0: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
90d0: 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45  NC.  rc = SQLITE
90e0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20  _OK;.#else..#if 
90f0: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
9100: 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
9110: 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 28  .    rc = fcntl(
9120: 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c  fd, F_FULLFSYNC,
9130: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
9140: 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
9150: 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53  /* If the FULLFS
9160: 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c  YNC failed, fall
9170: 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74   back to attempt
9180: 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a  ing an fsync()..
9190: 20 20 20 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27     * It shouldn'
91a0: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f  t be possible fo
91b0: 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66  r fullfsync to f
91c0: 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ail on the local
91d0: 20 0a 20 20 20 2a 20 66 69 6c 65 20 73 79 73 74   .   * file syst
91e0: 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20  em (on OSX), so 
91f0: 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65  failure indicate
9200: 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43  s that FULLFSYNC
9210: 0a 20 20 20 2a 20 69 73 6e 27 74 20 73 75 70 70  .   * isn't supp
9220: 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66  orted for this f
9230: 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20  ile system. So, 
9240: 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63  attempt an fsync
9250: 20 0a 20 20 20 2a 20 61 6e 64 20 28 66 6f 72 20   .   * and (for 
9260: 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20  now) ignore the 
9270: 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75  overhead of a su
9280: 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20  perfluous fcntl 
9290: 63 61 6c 6c 2e 20 20 0a 20 20 20 2a 20 49 74 27  call.  .   * It'
92a0: 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64  d be better to d
92b0: 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20  etect fullfsync 
92c0: 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64  support once and
92d0: 20 61 76 6f 69 64 20 0a 20 20 20 2a 20 74 68 65   avoid .   * the
92e0: 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72   fcntl call ever
92f0: 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63  y time sync is c
9300: 61 6c 6c 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 69  alled..   */.  i
9310: 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
9320: 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65 20 0a  nc(fd);..#else .
9330: 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29    if( dataOnly )
9340: 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61  {.    rc = fdata
9350: 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73  sync(fd);.  }els
9360: 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  e{.    rc = fsyn
9370: 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
9380: 66 20 2f 2a 20 48 41 56 45 5f 46 55 4c 4c 46 53  f /* HAVE_FULLFS
9390: 59 4e 43 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  YNC */.#endif /*
93a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
93b0: 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72  NO_SYNC) */..  r
93c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
93d0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
93e0: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
93f0: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
9400: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
9410: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
9420: 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
9430: 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
9440: 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
9450: 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
9460: 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
9470: 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
9480: 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
9490: 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
94a0: 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
94b0: 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
94c0: 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
94d0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
94e0: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
94f0: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
9500: 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
9510: 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
9520: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
9530: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
9540: 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
9550: 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
9560: 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
9570: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
9580: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
9590: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
95a0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
95b0: 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
95c0: 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
95d0: 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
95e0: 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
95f0: 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
9600: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
9610: 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
9620: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
9630: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
9640: 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
9650: 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
9660: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
9670: 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
9680: 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
9690: 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
96a0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
96b0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
96c0: 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  nc(OsFile *id, i
96d0: 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
96e0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
96f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
9700: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
9710: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
9720: 4f 53 54 52 41 43 45 32 28 22 53 59 4e 43 20 20  OSTRACE2("SYNC  
9730: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
9740: 2d 3e 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c  ->h);.  rc = ful
9750: 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68  l_fsync(pFile->h
9760: 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e  , pFile->fullSyn
9770: 63 2c 20 64 61 74 61 4f 6e 6c 79 29 3b 0a 20 20  c, dataOnly);.  
9780: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
9790: 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
97a0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
97b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
97c0: 4e 43 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46  NC;.  }.  if( pF
97d0: 69 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b  ile->dirfd>=0 ){
97e0: 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 44  .    OSTRACE4("D
97f0: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 68 61 76  IRSYNC %-3d (hav
9800: 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
9810: 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
9820: 70 46 69 6c 65 2d 3e 64 69 72 66 64 2c 0a 20 20  pFile->dirfd,.  
9830: 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
9840: 55 4c 4c 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d  ULLFSYNC, pFile-
9850: 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 23 69 66 6e  >fullSync);.#ifn
9860: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
9870: 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 2f  LE_DIRSYNC.    /
9880: 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
9890: 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74 74  sync is only att
98a0: 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f 66  empted if full_f
98b0: 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20 74  sync is.    ** t
98c0: 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e 61  urned off or una
98d0: 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61 20  vailable.  If a 
98e0: 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75 72  full_fsync occur
98f0: 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20 2a  red above,.    *
9900: 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65 63  * then the direc
9910: 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75 70  tory sync is sup
9920: 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a 2f  erfluous..    */
9930: 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45 5f  .    if( (!HAVE_
9940: 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 70 46  FULLFSYNC || !pF
9950: 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 29 20 26  ile->fullSync) &
9960: 26 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  & full_fsync(pFi
9970: 6c 65 2d 3e 64 69 72 66 64 2c 30 2c 30 29 20 29  le->dirfd,0,0) )
9980: 7b 0a 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  {.       /*.    
9990: 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 72 65     ** We have re
99a0: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
99b0: 72 65 70 6f 72 74 73 20 6f 66 20 66 73 79 6e 63  reports of fsync
99c0: 28 29 20 72 65 74 75 72 6e 69 6e 67 0a 20 20 20  () returning.   
99d0: 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 77 68      ** errors wh
99e0: 65 6e 20 61 70 70 6c 69 65 64 20 74 6f 20 64 69  en applied to di
99f0: 72 65 63 74 6f 72 69 65 73 20 6f 6e 20 63 65 72  rectories on cer
9a00: 74 61 69 6e 20 66 69 6c 65 20 73 79 73 74 65 6d  tain file system
9a10: 73 2e 0a 20 20 20 20 20 20 20 2a 2a 20 41 20 66  s..       ** A f
9a20: 61 69 6c 65 64 20 64 69 72 65 63 74 6f 72 79 20  ailed directory 
9a30: 73 79 6e 63 20 69 73 20 6e 6f 74 20 61 20 62 69  sync is not a bi
9a40: 67 20 64 65 61 6c 2e 20 20 53 6f 20 69 74 20 73  g deal.  So it s
9a50: 65 65 6d 73 0a 20 20 20 20 20 20 20 2a 2a 20 62  eems.       ** b
9a60: 65 74 74 65 72 20 74 6f 20 69 67 6e 6f 72 65 20  etter to ignore 
9a70: 74 68 65 20 65 72 72 6f 72 2e 20 20 54 69 63 6b  the error.  Tick
9a80: 65 74 20 23 31 36 35 37 0a 20 20 20 20 20 20 20  et #1657.       
9a90: 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20 72 65 74  */.       /* ret
9aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9ab0: 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ; */.    }.#endi
9ac0: 66 0a 20 20 20 20 63 6c 6f 73 65 28 70 46 69 6c  f.    close(pFil
9ad0: 65 2d 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f  e->dirfd);  /* O
9ae0: 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63  nly need to sync
9af0: 20 6f 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20   once, so close 
9b00: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  the directory */
9b10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66  .    pFile->dirf
9b20: 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77 68  d = -1;    /* wh
9b30: 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 20  en we are done. 
9b40: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
9b50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9b60: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69 72  .** Sync the dir
9b70: 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e  ectory zDirname.
9b80: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
9b90: 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73 79   on operating sy
9ba0: 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74  stems other.** t
9bb0: 68 61 6e 20 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20  han UNIX..**.** 
9bc0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
9bd0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 61  make sure the ma
9be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9bf0: 65 20 68 61 73 20 74 72 75 65 6c 79 20 62 65 65  e has truely bee
9c00: 6e 20 64 65 6c 65 74 65 64 0a 2a 2a 20 62 65 66  n deleted.** bef
9c10: 6f 72 65 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ore making chang
9c20: 65 73 20 74 6f 20 69 6e 64 69 76 69 64 75 61 6c  es to individual
9c30: 20 6a 6f 75 72 6e 61 6c 73 20 6f 6e 20 61 20 6d   journals on a m
9c40: 75 6c 74 69 2d 64 61 74 61 62 61 73 65 20 63 6f  ulti-database co
9c50: 6d 6d 69 74 2e 0a 2a 2a 20 54 68 65 20 46 5f 46  mmit..** The F_F
9c60: 55 4c 4c 46 53 59 4e 43 20 6f 70 74 69 6f 6e 20  ULLFSYNC option 
9c70: 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 68 65  is not needed he
9c80: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
9c90: 65 33 55 6e 69 78 53 79 6e 63 44 69 72 65 63 74  e3UnixSyncDirect
9ca0: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
9cb0: 7a 44 69 72 6e 61 6d 65 29 7b 0a 23 69 66 64 65  zDirname){.#ifde
9cc0: 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
9cd0: 5f 44 49 52 53 59 4e 43 0a 20 20 72 65 74 75 72  _DIRSYNC.  retur
9ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
9cf0: 73 65 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69  se.  int fd;.  i
9d00: 6e 74 20 72 3b 0a 20 20 66 64 20 3d 20 6f 70 65  nt r;.  fd = ope
9d10: 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
9d20: 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
9d30: 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 44  );.  OSTRACE3("D
9d40: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 25 73 29  IRSYNC %-3d (%s)
9d50: 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
9d60: 65 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  e);.  if( fd<0 )
9d70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9d80: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20  ITE_CANTOPEN; . 
9d90: 20 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63 28 66   }.  r = fsync(f
9da0: 64 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  d);.  close(fd);
9db0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
9dc0: 6f 72 28 20 72 3d 31 20 29 3b 0a 20 20 69 66 28  or( r=1 );.  if(
9dd0: 20 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   r ){.    return
9de0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
9df0: 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 65 6c 73 65  R_FSYNC;.  }else
9e00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9e10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64  ITE_OK;.  }.#end
9e20: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  if.}../*.** Trun
9e30: 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
9e40: 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
9e50: 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
9e60: 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
9e70: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34  (OsFile *id, i64
9e80: 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
9e90: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  c;.  assert( id 
9ea0: 29 3b 0a 20 20 72 63 20 3d 20 66 74 72 75 6e 63  );.  rc = ftrunc
9eb0: 61 74 65 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  ate(((unixFile*)
9ec0: 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f 74 29 6e  id)->h, (off_t)n
9ed0: 42 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Byte);.  Simulat
9ee0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
9ef0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
9f00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9f10: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
9f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
9f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
9f50: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
9f60: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
9f70: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
9f80: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
9f90: 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Size(OsFile *id,
9fa0: 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
9fb0: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
9fc0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
9fd0: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
9fe0: 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
9ff0: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
a000: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
a010: 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
a020: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
a030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a040: 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
a050: 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73    *pSize = buf.s
a060: 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  t_size;.  return
a070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a080: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a090: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
a0a0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
a0b0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
a0c0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
a0d0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
a0e0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
a0f0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
a100: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
a110: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66  ** non-zero.  If
a120: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
a130: 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f  ocked or holds o
a140: 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  nly SHARED locks
a150: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
a160: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
a170: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
a180: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
a190: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
a1a0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
a1b0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
a1c0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
a1d0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 73 71  t( pFile );.  sq
a1e0: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
a1f0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
a200: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
a210: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
a220: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
a230: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
a240: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
a250: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
a260: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
a270: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
a280: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
a290: 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d  {.    r = 1;.  }
a2a0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
a2b0: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
a2c0: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
a2d0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
a2e0: 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  !r ){.    struct
a2f0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a300: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
a310: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
a320: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
a330: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
a340: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
a350: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
a360: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
a370: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
a380: 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_GETLK, &lock);
a390: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  .    if( lock.l_
a3a0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
a3b0: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
a3c0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
a3d0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
a3e0: 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22  ();.  OSTRACE3("
a3f0: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
a400: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
a410: 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72   r);..  return r
a420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
a430: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
a440: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
a450: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
a460: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
a470: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
a480: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
a490: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
a4a0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
a4b0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
a4c0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
a4d0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
a4e0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
a4f0: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
a500: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
a510: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
a520: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
a530: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
a540: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
a550: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
a560: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
a570: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
a580: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
a590: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
a5a0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
a5b0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
a5c0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
a5d0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
a5e0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
a5f0: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
a600: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
a610: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
a620: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
a630: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
a640: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
a650: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
a660: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
a670: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
a680: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
a690: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
a6a0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
a6b0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
a6c0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
a6d0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
a6e0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
a6f0: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
a700: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
a710: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
a720: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
a730: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
a740: 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
a750: 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  nt unixLock(OsFi
a760: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
a770: 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20  type){.  /* The 
a780: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
a790: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
a7a0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
a7b0: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
a7c0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
a7d0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
a7e0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
a7f0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
a800: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
a810: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
a820: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
a830: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
a840: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
a850: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
a860: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
a870: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
a880: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
a890: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
a8a0: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
a8b0: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
a8c0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
a8d0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
a8e0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
a8f0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
a900: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
a910: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
a920: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
a930: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
a940: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
a950: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
a960: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
a970: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
a980: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
a990: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
a9a0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
a9b0: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
a9c0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
a9d0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
a9e0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
a9f0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
aa00: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
aa10: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
aa20: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
aa30: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
aa40: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
aa50: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
aa60: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
aa70: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
aa80: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
aa90: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
aaa0: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
aab0: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
aac0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
aad0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
aae0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
aaf0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
ab00: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
ab10: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
ab20: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
ab30: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
ab40: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
ab50: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
ab60: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
ab70: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
ab80: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
ab90: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
aba0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
abb0: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
abc0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
abd0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
abe0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
abf0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
ac00: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
ac10: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
ac20: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
ac30: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
ac40: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
ac50: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
ac60: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
ac70: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
ac80: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
ac90: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
aca0: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
acb0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
acc0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
acd0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
ace0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
acf0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
ad00: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
ad10: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
ad20: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
ad30: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
ad40: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
ad50: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
ad60: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
ad70: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
ad80: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
ad90: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
ada0: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
adb0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
adc0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
add0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
ade0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
adf0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
ae00: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
ae10: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
ae20: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
ae30: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
ae40: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
ae50: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
ae60: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
ae70: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
ae80: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
ae90: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
aea0: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
aeb0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
aec0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
aed0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
aee0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
aef0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
af00: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
af10: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
af20: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
af30: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
af40: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
af50: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
af60: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
af70: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
af80: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
af90: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
afa0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
afb0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
afc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
afd0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
afe0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
aff0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
b000: 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70  pLock = pFile->p
b010: 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66  Lock;.  struct f
b020: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
b030: 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   s;..  assert( p
b040: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
b050: 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E7("LOCK    %d %
b060: 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
b070: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
b080: 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74  ->h,.      lockt
b090: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b0a0: 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  ), locktypeName(
b0b0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
b0c0: 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65  ,.      locktype
b0d0: 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  Name(pLock->lock
b0e0: 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e  type), pLock->cn
b0f0: 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a  t , getpid());..
b100: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
b110: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
b120: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
b130: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
b140: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
b150: 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
b160: 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
b170: 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
b180: 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
b190: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
b1a0: 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
b1b0: 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
b1c0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
b1d0: 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
b1e0: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28 22  {.    OSTRACE3("
b1f0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
b200: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
b210: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
b220: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
b230: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
b240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
b250: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
b260: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
b270: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
b280: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
b290: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
b2a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
b2b0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
b2c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
b2d0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
b2e0: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
b2f0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
b300: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
b310: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
b320: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
b330: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
b340: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
b350: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
b360: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
b370: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
b380: 64 73 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ds.  */.  sqlite
b390: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
b3a0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
b3b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
b3c0: 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69  ead owns the pFi
b3d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  le..  */.  rc = 
b3e0: 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69  transferOwnershi
b3f0: 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  p(pFile);.  if( 
b400: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b410: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
b420: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
b430: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
b440: 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e   pLock = pFile->
b450: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
b460: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
b470: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
b480: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
b490: 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20  erent OsFile*.  
b4a0: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
b4b0: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
b4c0: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
b4d0: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
b4e0: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63   if( (pFile->loc
b4f0: 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f  ktype!=pLock->lo
b500: 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20  cktype && .     
b510: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
b520: 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
b530: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e  OCK || locktype>
b540: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
b550: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b560: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
b570: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
b580: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
b590: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
b5a0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
b5b0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
b5c0: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
b5d0: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
b5e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
b5f0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
b600: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
b610: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
b620: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
b630: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
b640: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
b650: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
b660: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b670: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f  OCK || pLock->lo
b680: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
b690: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
b6a0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
b6b0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b6c0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
b6d0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
b6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
b6f0: 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20  ck->cnt>0 );.   
b700: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b710: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
b720: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b      pLock->cnt++
b730: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70  ;.    pFile->pOp
b740: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
b750: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b760: 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    }..  lock.l_le
b770: 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e  n = 1L;..  lock.
b780: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
b790: 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e  SET;..  /* A PEN
b7a0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
b7b0: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
b7c0: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
b7d0: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
b7e0: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
b7f0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
b800: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
b810: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
b820: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
b830: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
b840: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b850: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
b860: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
b870: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
b880: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
b890: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
b8a0: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
b8b0: 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d  ype = (locktype=
b8c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
b8d0: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
b8e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
b8f0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
b900: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
b910: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
b920: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
b930: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
b940: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
b950: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
b960: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
b970: 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  USY;.      goto 
b980: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
b990: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f    }...  /* If co
b9a0: 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68  ntrol gets to th
b9b0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61  is point, then a
b9c0: 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64  ctually go ahead
b9d0: 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f   and make.  ** o
b9e0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
b9f0: 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70  calls for the sp
ba00: 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20  ecified lock..  
ba10: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
ba20: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
ba30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
ba40: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20  ock->cnt==0 );. 
ba50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
ba60: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
ba70: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
ba80: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
ba90: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
baa0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
bab0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
bac0: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
bad0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
bae0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
baf0: 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f  , &lock);..    /
bb00: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
bb10: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
bb20: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
bb30: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
bb40: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
bb50: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
bb60: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
bb70: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63  NLCK;.    if( fc
bb80: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bb90: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30  SETLK, &lock)!=0
bba0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
bbb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
bbc0: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
bbd0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
bbe0: 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   */.      goto e
bbf0: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  nd_lock;.    }. 
bc00: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
bc10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
bc20: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
bc30: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
bc40: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
bc50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
bc60: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
bc70: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
bc80: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e   pFile->pOpen->n
bc90: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c  Lock++;.      pL
bca0: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
bcb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
bcc0: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
bcd0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  IVE_LOCK && pLoc
bce0: 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20  k->cnt>1 ){.    
bcf0: 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67  /* We are trying
bd00: 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76   for an exclusiv
bd10: 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68  e lock but anoth
bd20: 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69  er thread in thi
bd30: 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  s.    ** same pr
bd40: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
bd50: 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
bd60: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
bd70: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
bd80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
bd90: 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
bda0: 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
bdb0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
bdc0: 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
bdd0: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
bde0: 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
bdf0: 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
be00: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
be10: 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
be20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
be30: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
be40: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
be50: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
be60: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
be70: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
be80: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
be90: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
bea0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
beb0: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
bec0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bed0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
bee0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
bef0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
bf00: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
bf10: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
bf20: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
bf30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
bf40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
bf50: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
bf60: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
bf70: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
bf80: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
bf90: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bfa0: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
bfb0: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
bfc0: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
bfd0: 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  Y;.    }.  }.  .
bfe0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bff0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
c000: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c010: 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  ktype;.    pLock
c020: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
c030: 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20 69  ktype;.  }else i
c040: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
c050: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
c060: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
c070: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
c080: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
c090: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c0a0: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
c0b0: 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33 4f  lock:.  sqlite3O
c0c0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
c0d0: 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20   OSTRACE4("LOCK 
c0e0: 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20     %d %s %s\n", 
c0f0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
c100: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
c110: 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  , .      rc==SQL
c120: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
c130: 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65 74  "failed");.  ret
c140: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c150: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
c160: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
c170: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
c180: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
c190: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
c1a0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
c1b0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
c1c0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
c1d0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
c1e0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
c1f0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
c200: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
c210: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
c220: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
c230: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c240: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
c250: 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73  nt unixUnlock(Os
c260: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
c270: 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75 63  cktype){.  struc
c280: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
c290: 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  k;.  struct floc
c2a0: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c2c0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
c2d0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
c2e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
c2f0: 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
c300: 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
c310: 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
c320: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
c330: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
c340: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
c350: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
c360: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
c370: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65  ->pLock->cnt, ge
c380: 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73 65  tpid());..  asse
c390: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
c3a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
c3b0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
c3c0: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
c3d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3e0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
c3f0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
c400: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
c410: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c420: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
c430: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
c440: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
c450: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
c460: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
c470: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
c480: 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f  locktype>SHARED_
c490: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
c4a0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
c4b0: 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype==pFile->lock
c4c0: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28 20  type );.    if( 
c4d0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
c4e0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c  _LOCK ){.      l
c4f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
c500: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  DLCK;.      lock
c510: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
c520: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
c530: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
c540: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
c550: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
c560: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  ED_SIZE;.      i
c570: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
c580: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
c590: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
c5a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
c5b0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
c5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
c5d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
c5e0: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
c5f0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
c600: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
c610: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c620: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c630: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
c640: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
c650: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
c660: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
c670: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
c680: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
c690: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
c6a0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
c6b0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
c6c0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
c6d0: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
c6e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c6f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c700: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
c710: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
c720: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
c730: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63   }.  }.  if( loc
c740: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
c750: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65  {.    struct ope
c760: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20  nCnt *pOpen;..  
c770: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
c780: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
c790: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
c7a0: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
c7b0: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
c7c0: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
c7d0: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
c7e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
c7f0: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
c800: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
c810: 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  */.    pLock->cn
c820: 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  t--;.    if( pLo
c830: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  ck->cnt==0 ){.  
c840: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c850: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
c860: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
c870: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
c880: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c890: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
c8a0: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
c8b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c8c0: 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29  LK, &lock)!=(-1)
c8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 63   ){.        pLoc
c8e0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  k->locktype = NO
c8f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
c900: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
c910: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
c920: 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73  LOCK;  /* This s
c930: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
c940: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  en */.      }.  
c950: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
c960: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
c970: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
c980: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
c990: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
c9a0: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
c9b0: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
c9c0: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
c9d0: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
c9e0: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
c9f0: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
ca00: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
ca10: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
ca20: 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
ca30: 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d  Open;.    pOpen-
ca40: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
ca50: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  sert( pOpen->nLo
ca60: 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
ca70: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30   pOpen->nLock==0
ca80: 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64   && pOpen->nPend
ca90: 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ing>0 ){.      i
caa0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
cab0: 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50  i=0; i<pOpen->nP
cac0: 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  ending; i++){.  
cad0: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65        close(pOpe
cae0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b  n->aPending[i]);
caf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
cb00: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
cb10: 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65  ing);.      pOpe
cb20: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
cb30: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
cb40: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
cb50: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  }.  }.  sqlite3O
cb60: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
cb70: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
cb80: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
cb90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cba0: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
cbb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
cbc0: 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  nixClose(OsFile 
cbd0: 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46 69  **pId){.  unixFi
cbe0: 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69  le *id = (unixFi
cbf0: 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66 28  le*)*pId;..  if(
cc00: 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53 51   !id ) return SQ
cc10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 55  LITE_OK;.  unixU
cc20: 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c  nlock(*pId, NO_L
cc30: 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  OCK);.  if( id->
cc40: 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
cc50: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69  (id->dirfd);.  i
cc60: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
cc70: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
cc80: 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20 69  utex();..  if( i
cc90: 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  d->pOpen->nLock 
cca0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
ccb0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
ccc0: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
ccd0: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
cce0: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
ccf0: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
cd00: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
cd10: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
cd20: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
cd30: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
cd40: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
cd50: 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
cd60: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
cd70: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
cd80: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73  n.    ** the las
cd90: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
cda0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
cdb0: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72  t *aNew;.    str
cdc0: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
cdd0: 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a  en = id->pOpen;.
cde0: 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c 6c      aNew = reall
cdf0: 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  oc( pOpen->aPend
ce00: 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65  ing, (pOpen->nPe
ce10: 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28  nding+1)*sizeof(
ce20: 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  int) );.    if( 
ce30: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
ce40: 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20   /* If a malloc 
ce50: 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b  fails, just leak
ce60: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ce70: 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  ptor */.    }els
ce80: 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  e{.      pOpen->
ce90: 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b  aPending = aNew;
cea0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
ceb0: 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50  ending[pOpen->nP
cec0: 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68 3b  ending] = id->h;
ced0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
cee0: 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a  ending++;.    }.
cef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
cf00: 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  There are no out
cf10: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73  standing locks s
cf20: 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20 74  o we can close t
cf30: 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  he file immediat
cf40: 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65  ely */.    close
cf50: 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72  (id->h);.  }.  r
cf60: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 69  eleaseLockInfo(i
cf70: 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c  d->pLock);.  rel
cf80: 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d 3e  easeOpenCnt(id->
cf90: 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pOpen);..  sqlit
cfa0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
cfb0: 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
cfc0: 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22   0;.  OSTRACE2("
cfd0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
cfe0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
cff0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71  ounter(-1);.  sq
d000: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
d010: 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20  ree(id);.  *pId 
d020: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
d030: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66  LITE_OK;.}...#if
d040: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d050: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
d060: 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46 50  #pragma mark AFP
d070: 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a 2a   Support../*. **
d080: 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
d090: 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
d0a0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
d0b0: 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
d0c0: 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
d0d0: 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  f struct afpLock
d0e0: 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f  ingContext afpLo
d0f0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
d100: 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ruct afpLockingC
d110: 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69 67  ontext {.  unsig
d120: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
d130: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20 20  aredLockByte;.  
d140: 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b 0a  char *filePath;.
d150: 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
d160: 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
d170: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
d180: 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
d190: 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
d1a0: 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
d1b0: 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
d1c0: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
d1d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
d1e0: 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
d1f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
d200: 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
d210: 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
d220: 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
d230: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
d240: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d250: 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
d260: 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
d270: 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
d280: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d290: 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
d2a0: 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
d2b0: 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
d2c0: 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
d2d0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
d300: 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
d310: 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
d320: 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
d330: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
d340: 4c 09 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c  L._IOWR('z', 23,
d350: 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
d360: 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 72 65  eLockPB2)../* re
d370: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
d380: 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e  s, 1 on failure.
d390: 20 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20 62    To match the b
d3a0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 0a  ehavior of the .
d3b0: 20 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20 66    normal posix f
d3c0: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73 65  ile locking (use
d3d0: 64 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66 6f  d in unixLock fo
d3e0: 72 20 65 78 61 6d 70 6c 65 29 2c 20 77 65 20 73  r example), we s
d3f0: 68 6f 75 6c 64 20 0a 20 20 70 72 6f 76 69 64 65  hould .  provide
d400: 20 27 72 69 63 68 65 72 27 20 72 65 74 75 72 6e   'richer' return
d410: 20 63 6f 64 65 73 20 2d 20 73 70 65 63 69 66 69   codes - specifi
d420: 63 61 6c 6c 79 20 74 6f 20 64 69 66 66 65 72 65  cally to differe
d430: 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
d440: 20 27 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64   'file busy' and
d450: 20 27 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72   'file system er
d460: 72 6f 72 27 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ror' results */.
d470: 73 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46  static int _AFPF
d480: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  SSetLock(const c
d490: 68 61 72 20 2a 70 61 74 68 2c 20 69 6e 74 20 66  har *path, int f
d4a0: 64 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  d, unsigned long
d4b0: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20   long offset, . 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
d4e0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
d4f0: 68 2c 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  h, int setLockFl
d500: 61 67 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 42  ag).{.  struct B
d510: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 09  yteRangeLockPB2.
d520: 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20 20  pb;.  int       
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
d540: 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
d550: 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
d560: 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
d570: 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
d580: 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
d590: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
d5a0: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
d5b0: 0a 20 20 70 62 2e 66 64 20 3d 20 66 64 3b 0a 20  .  pb.fd = fd;. 
d5c0: 20 4f 53 54 52 41 43 45 35 28 22 41 46 50 4c 4f   OSTRACE5("AFPLO
d5d0: 43 4b 20 73 65 74 74 69 6e 67 20 6c 6f 63 6b 20  CK setting lock 
d5e0: 25 73 20 66 6f 72 20 25 64 20 69 6e 20 72 61 6e  %s for %d in ran
d5f0: 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c  ge %llx:%llx\n",
d600: 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c   .    (setLockFl
d610: 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20  ag?"ON":"OFF"), 
d620: 66 64 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67  fd, offset, leng
d630: 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63  th);.  err = fsc
d640: 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42 79  tl(path, afpfsBy
d650: 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
d660: 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66  L, &pb, 0);.  if
d670: 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20   ( err==-1 ) {. 
d680: 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46 50     OSTRACE4("AFP
d690: 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66  LOCK failed to f
d6a0: 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25  sctl() '%s' %d %
d6b0: 73 5c 6e 22 2c 20 70 61 74 68 2c 20 65 72 72 6e  s\n", path, errn
d6c0: 6f 2c 20 0a 20 20 20 20 20 20 73 74 72 65 72 72  o, .      strerr
d6d0: 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20 20  or(errno));.    
d6e0: 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 65 72 72  return 1; /* err
d6f0: 6f 72 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b  or */.  } else {
d700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d710: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69   }.}../*. ** Thi
d720: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
d730: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
d740: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
d750: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
d760: 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79 20 74  ed. ** file by t
d770: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
d780: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
d790: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
d7a0: 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f 6e  , return. ** non
d7b0: 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66  -zero.  If the f
d7c0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
d7d0: 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48  or holds only SH
d7e0: 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e  ARED locks, then
d7f0: 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f  . ** return zero
d800: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
d810: 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65 73   afpUnixCheckRes
d820: 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65  ervedLock(OsFile
d830: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20 3d   *id){.  int r =
d840: 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
d850: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
d860: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65  e*)id;.  .  asse
d870: 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a 20 20  rt( pFile ); .  
d880: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
d890: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
d8a0: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
d8b0: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
d8c0: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f  gContext;.  .  /
d8d0: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
d8e0: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
d8f0: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
d900: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
d910: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
d920: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
d930: 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a    r = 1;.  }.  .
d940: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
d950: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
d960: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
d970: 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 20  t..   */.  if ( 
d980: 21 72 20 29 20 7b 0a 20 20 20 20 2f 2a 20 6c 6f  !r ) {.    /* lo
d990: 63 6b 20 74 68 65 20 62 79 74 65 20 2a 2f 0a 20  ck the byte */. 
d9a0: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
d9b0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
d9c0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
d9d0: 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52   pFile->h, RESER
d9e0: 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20  VED_BYTE, 1,1); 
d9f0: 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64   .    if (failed
da00: 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  ) {.      /* if 
da10: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
da20: 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
da30: 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
da40: 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
da50: 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65    r = 1;.    } e
da60: 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
da70: 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
da80: 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
da90: 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
daa0: 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
dab0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
dac0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
dad0: 20 20 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c        _AFPFSSetL
dae0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
daf0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
db00: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
db10: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
db20: 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 45 53  .  OSTRACE3("TES
db30: 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c  T WR-LOCK %d %d\
db40: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29  n", pFile->h, r)
db50: 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b  ;.  .  return r;
db60: 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65  .}../* AFP-style
db70: 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69   locking followi
db80: 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ng the behavior 
db90: 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65  of unixLock, see
dba0: 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a   the unixLock .*
dbb0: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65  * function comme
dbc0: 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20  nts for details 
dbd0: 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65  of lock manageme
dbe0: 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt. */.static in
dbf0: 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73  t afpUnixLock(Os
dc00: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
dc10: 63 6b 74 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20  cktype).{.  int 
dc20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
dc30: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
dc40: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
dc50: 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  d;.  afpLockingC
dc60: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
dc70: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
dc80: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
dc90: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
dca0: 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
dcb0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  ock = 0;.  .  as
dcc0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
dcd0: 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20   OSTRACE5("LOCK 
dce0: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 20     %d %s was %s 
dcf0: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
dd00: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f  ->h,.         lo
dd10: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
dd20: 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  ype), locktypeNa
dd30: 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  me(pFile->lockty
dd40: 70 65 29 2c 20 67 65 74 70 69 64 28 29 29 3b 20  pe), getpid()); 
dd50: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
dd60: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
dd70: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
dd80: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
dd90: 76 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ve on the.    **
dda0: 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
ddb0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
ddc0: 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a  he afp_end_lock:
ddd0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
dde0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45     ** sqlite3OsE
ddf0: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
de00: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
de10: 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28  et..    */.  if(
de20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
de30: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
de40: 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b    OSTRACE3("LOCK
de50: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
de60: 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20  ready held)\n", 
de70: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
de80: 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d       locktypeNam
de90: 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  e(locktype));.  
dea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
deb0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
dec0: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
ded0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
dee0: 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20  correct.    */. 
def0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
df00: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
df10: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
df20: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
df30: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
df40: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
df50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
df60: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
df70: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
df80: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
df90: 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  OCK );.  .  /* T
dfa0: 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65  his mutex is nee
dfb0: 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c  ded because pFil
dfc0: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
dfd0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
dfe0: 73 0a 20 20 20 20 2a 2f 0a 20 20 73 71 6c 69 74  s.    */.  sqlit
dff0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
e000: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
e010: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
e020: 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
e030: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 72 63  ile..    */.  rc
e040: 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72   = transferOwner
e050: 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69  ship(pFile);.  i
e060: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e080: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
e090: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e0a0: 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
e0b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
e0c0: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
e0d0: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
e0e0: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
e0f0: 20 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20     ** acquiring 
e100: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
e110: 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52  k.  For the SHAR
e120: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e  ED lock, the PEN
e130: 44 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  DING will.    **
e140: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
e150: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
e160: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
e170: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
e180: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
e190: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
e1a0: 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f  ocktype<PENDING_
e1b0: 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  LOCK).      ){. 
e1c0: 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
e1d0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e1e0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e1f0: 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20   pFile->h, .    
e200: 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
e210: 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66  1, 1);.    if (f
e220: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72  ailed) {.      r
e230: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
e240: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
e250: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
e260: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
e270: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
e280: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
e290: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
e2a0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a  d and make.    *
e2b0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
e2c0: 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
e2d0: 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
e2e0: 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  .    */.  if( lo
e2f0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
e300: 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  OCK ){.    int l
e310: 6b 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69  k, failed;.    i
e320: 6e 74 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20  nt tries = 0;.  
e330: 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65    .    /* Now ge
e340: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
e350: 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
e360: 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
e370: 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
e380: 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
e390: 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
e3a0: 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
e3b0: 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73   .    context->s
e3c0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
e3d0: 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66  (lk & 0x7fffffff
e3e0: 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d  )%(SHARED_SIZE -
e3f0: 20 31 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20   1);.    failed 
e400: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
e410: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e420: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20  h, pFile->h, .  
e430: 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54      SHARED_FIRST
e440: 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64  +context->shared
e450: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b  LockByte, 1, 1);
e460: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f  .    .    /* Dro
e470: 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
e480: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
e490: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
e4a0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e4b0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
e4c0: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
e4d0: 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20   1, 0)) {.      
e4e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e4f0: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
e500: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
e510: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
e520: 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
e530: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  k;.    }.    .  
e540: 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a    if( failed ){.
e550: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e560: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
e570: 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
e580: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
e590: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
e5a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e5b0: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
e5c0: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
e5d0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
e5e0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
e5f0: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
e600: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
e610: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
e620: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
e630: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
e640: 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  /.    int failed
e650: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
e660: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ( 0!=pFile->lock
e670: 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28  type );.    if (
e680: 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45  locktype >= RESE
e690: 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
e6a0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52  le->locktype < R
e6b0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
e6c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
e6d0: 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
e6e0: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
e6f0: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
e700: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e710: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e720: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
e730: 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   1,1);.    }.   
e740: 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
e750: 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c  locktype == EXCL
e760: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
e770: 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
e780: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
e790: 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20   */.        .   
e7a0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
e7b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66   shared lock bef
e7c0: 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72  ore trying the r
e7d0: 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65  ange.  we'll nee
e7e0: 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72  d to .      ** r
e7f0: 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
e800: 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65  hared lock if we
e810: 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20   can't get the  
e820: 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20  afpUnixUnlock.  
e830: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20      */.      if 
e840: 28 21 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  (!_AFPFSSetLock(
e850: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
e860: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
e870: 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68       context->sh
e8a0: 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
e8b0: 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f   0)) {.        /
e8c0: 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
e8d0: 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
e8e0: 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
e8f0: 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
e900: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e910: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e920: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48  th, pFile->h, SH
e930: 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
e960: 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
e970: 20 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 20       if (failed 
e980: 26 26 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b  && _AFPFSSetLock
e990: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e9a0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48  th, pFile->h, SH
e9b0: 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64   context->shared
e9f0: 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29  LockByte, 1, 1))
ea00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
ea10: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
ea20: 44 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73  DLOCK; /* this s
ea30: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
ea40: 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  en */.        }.
ea50: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
ea60: 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20         /* */.   
ea70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ea80: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f  _IOERR_UNLOCK; /
ea90: 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * this should ne
eaa0: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
eab0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
eac0: 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 72 63  if( failed && rc
ead0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a   == SQLITE_OK){.
eae0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
eaf0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
eb00: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53  }.  .  if( rc==S
eb10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
eb20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
eb30: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65  = locktype;.  }e
eb40: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
eb50: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
eb60: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
eb70: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
eb80: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
eb90: 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20  fp_end_lock:.   
eba0: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
ebb0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
ebc0: 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E4("LOCK    %d %
ebd0: 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %s\n", pFile->
ebe0: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
ebf0: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
ec00: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
ec10: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
ec20: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
ec30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f  rc;.}../*. ** Lo
ec40: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
ec50: 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
ec60: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
ec70: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
ec80: 6b 74 79 70 65 0a 20 2a 2a 20 6d 75 73 74 20 62  ktype. ** must b
ec90: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
eca0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
ecb0: 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
ecc0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
ecd0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
ece0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
ecf0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
ed00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
ed10: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
ed20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
ed30: 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
ed40: 20 69 6e 74 20 61 66 70 55 6e 69 78 55 6e 6c 6f   int afpUnixUnlo
ed50: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
ed60: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
ed70: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
ed80: 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
ed90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
eda0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
edb0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
edc0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
edd0: 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
ede0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
edf0: 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
ee00: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65  Context;..  asse
ee10: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
ee20: 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20  STRACE5("UNLOCK 
ee30: 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
ee40: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
ee50: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
ee60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
ee70: 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29 29  ktype, getpid())
ee80: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c  ;.  .  assert( l
ee90: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
eea0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
eeb0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
eec0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
eed0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eee0: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
eef0: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
ef00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ef10: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
ef20: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  }.  sqlite3OsEnt
ef30: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
ef40: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ef50: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
ef60: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
ef70: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
ef80: 0a 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65  .      int faile
ef90: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  d = 0;..      /*
efa0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c   unlock the excl
efb0: 75 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74 68  usive range - th
efc0: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  en re-establish 
efd0: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
efe0: 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  */.      if (pFi
eff0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  le->locktype==EX
f000: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
f010: 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
f020: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
f030: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
f040: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
f050: 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
f080: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
f090: 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64       if (!failed
f0a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ) {.          /*
f0b0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
f0c0: 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75 73  moved the exclus
f0d0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ive lock */.    
f0e0: 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53        if (_AFPFS
f0f0: 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
f100: 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65  >filePath, pFile
f110: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
f120: 54 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T+.             
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
f140: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
f150: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b  ckByte, 1, 1)) {
f160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
f170: 66 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74  failed to re-est
f180: 61 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65  ablish our share
f190: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
f1a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f1b0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20  E_IOERR_RDLOCK; 
f1c0: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
f1d0: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
f1e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f1f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
f200: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
f210: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
f220: 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75 6e  n - failed to un
f230: 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69  lock the exclusi
f240: 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ve range */.    
f250: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f260: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
f270: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
f280: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
f290: 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  (rc == SQLITE_OK
f2a0: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
f2b0: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
f2c0: 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f  K) {.      if (_
f2d0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
f2e0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f2f0: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
f300: 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b 0a  G_BYTE, 1, 0)){.
f310: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
f320: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
f330: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f   pending lock */
f340: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
f350: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
f360: 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  K; /* This shoul
f370: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
f380: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  /.      }.    } 
f390: 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53  .    if (rc == S
f3a0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
f3b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
f3c0: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
f3d0: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
f3e0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
f3f0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
f400: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
f410: 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20  , 1, 0)) {.     
f420: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
f430: 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73 65  release the rese
f440: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  rved lock */.   
f450: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f460: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
f470: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
f480: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
f490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20       }.    } .  
f4a0: 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
f4b0: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ==NO_LOCK ){.   
f4c0: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
f4d0: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
f4e0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
f4f0: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
f520: 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d  FIRST + context-
f530: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
f540: 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28   1, 0);.    if (
f550: 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
f560: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f570: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
f580: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f590: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a  happen */.    }.
f5a0: 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d 20    }.  if (rc == 
f5b0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 70  SQLITE_OK).    p
f5c0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
f5d0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 73 71 6c   locktype;.  sql
f5e0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
f5f0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
f600: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
f610: 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
f620: 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
f630: 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
f640: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
f650: 66 70 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  fpUnixClose(OsFi
f660: 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
f670: 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
f680: 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
f690: 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
f6a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f6b0: 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a   afpUnixUnlock(*
f6c0: 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  pId, NO_LOCK);. 
f6d0: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 41 46 50   /* free the AFP
f6e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
f6f0: 72 65 20 2a 2f 0a 20 20 69 66 20 28 69 64 2d 3e  re */.  if (id->
f700: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21  lockingContext !
f710: 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66  = NULL) {.    if
f720: 20 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   (((afpLockingCo
f730: 6e 74 65 78 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b  ntext *)id->lock
f740: 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c  ingContext)->fil
f750: 65 50 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20  ePath != NULL). 
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65       sqlite3Thre
f770: 61 64 53 61 66 65 46 72 65 65 28 28 28 61 66 70  adSafeFree(((afp
f780: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29  LockingContext*)
f790: 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id->lockingConte
f7a0: 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 29 3b 0a  xt)->filePath);.
f7b0: 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
f7c0: 64 53 61 66 65 46 72 65 65 28 69 64 2d 3e 6c 6f  dSafeFree(id->lo
f7d0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20  ckingContext);. 
f7e0: 20 7d 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e   }.  .  if( id->
f7f0: 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
f800: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69  (id->dirfd);.  i
f810: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
f820: 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
f830: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b   id->isOpen = 0;
f840: 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f  .  OSTRACE2("CLO
f850: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SE   %-3d\n", id
f860: 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
f870: 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
f880: 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65  e3ThreadSafeFree
f890: 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30  (id);.  *pId = 0
f8a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
f8b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d  E_OK;.}...#pragm
f8c0: 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28 29 20 73  a mark flock() s
f8d0: 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a  tyle locking../*
f8e0: 0a 20 2a 2a 20 54 68 65 20 66 6c 6f 63 6b 4c 6f  . ** The flockLo
f8f0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73 20  ckingContext is 
f900: 6e 6f 74 20 75 73 65 64 0a 20 2a 2f 0a 74 79 70  not used. */.typ
f910: 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b 4c  edef void flockL
f920: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ockingContext;..
f930: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
f940: 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
f950: 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  dLock(OsFile *id
f960: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
f970: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f980: 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 20 28  e*)id;.  .  if (
f990: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
f9a0: 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  == RESERVED_LOCK
f9b0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ) {.    return 1
f9c0: 3b 20 2f 2a 20 61 6c 72 65 61 64 79 20 68 61 76  ; /* already hav
f9d0: 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  e a reserved loc
f9e0: 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  k */.  } else {.
f9f0: 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74      /* attempt t
fa00: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a  o get the lock *
fa10: 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66  /.    int rc = f
fa20: 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
fa30: 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
fa40: 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29 20  );.    if (!rc) 
fa50: 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
fa60: 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
fa70: 69 74 20 2a 2f 0a 20 20 20 20 20 20 66 6c 6f 63  it */.      floc
fa80: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
fa90: 5f 55 4e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  _UN);.      retu
faa0: 72 6e 20 30 3b 20 20 2f 2a 20 6e 6f 20 6f 6e 65  rn 0;  /* no one
fab0: 20 68 61 73 20 69 74 20 72 65 73 65 72 76 65 64   has it reserved
fac0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   */.    }.    re
fad0: 74 75 72 6e 20 31 3b 20 2f 2a 20 73 6f 6d 65 6f  turn 1; /* someo
fae0: 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
faf0: 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
fb00: 2f 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  /.  }.}..static 
fb10: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63  int flockUnixLoc
fb20: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
fb30: 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
fb40: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
fb50: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
fb60: 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  .  .  /* if we a
fb70: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
fb80: 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
fb90: 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
fba0: 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
fbb0: 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
fbc0: 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
fbd0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e  File->locktype >
fbe0: 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
fbf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
fc00: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
fc10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fc20: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
fc30: 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
fc40: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63  lock */.  int rc
fc50: 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e   = flock(pFile->
fc60: 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
fc70: 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28 72 63 29  K_NB);.  if (rc)
fc80: 20 7b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74   {.    /* didn't
fc90: 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
fca0: 73 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  sy */.    return
fcb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
fcc0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
fcd0: 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
fce0: 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
fcf0: 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ok */.    pFile-
fd00: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fd10: 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  type;.    return
fd20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fd30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  }..static int fl
fd40: 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73  ockUnixUnlock(Os
fd50: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
fd60: 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
fd70: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
fd80: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a  nixFile*)id;.  .
fd90: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
fda0: 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
fdb0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
fdc0: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
fdd0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
fde0: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
fdf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fe00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
fe10: 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
fe20: 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
fe30: 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
fe40: 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
fe50: 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79 70  */.  if (locktyp
fe60: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  e==SHARED_LOCK) 
fe70: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
fe80: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
fe90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fea0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
feb0: 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
fec0: 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74  unlock. */.  int
fed0: 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c   rc = flock(pFil
fee0: 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a  e->h, LOCK_UN);.
fef0: 20 20 69 66 20 28 72 63 29 0a 20 20 20 20 72 65    if (rc).    re
ff00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ff10: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73 65  R_UNLOCK;.  else
ff20: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
ff30: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
ff40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ff50: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
ff60: 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
ff70: 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
ff80: 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73  nt flockUnixClos
ff90: 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20  e(OsFile **pId) 
ffa0: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64  {.  unixFile *id
ffb0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70   = (unixFile*)*p
ffc0: 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64  Id;.  .  if( !id
ffd0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ffe0: 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69 78  _OK;.  flockUnix
fff0: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
10000 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28 20  LOCK);.  .  if( 
10010 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63  id->dirfd>=0 ) c
10020 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b  lose(id->dirfd);
10030 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d  .  id->dirfd = -
10040 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  1;.  sqlite3OsEn
10050 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20  terMutex();.  . 
10060 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20 20   close(id->h);  
10070 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
10080 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
10090 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53  isOpen = 0;.  OS
100a0 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
100b0 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b  %-3d\n", id->h);
100c0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
100d0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  1);.  sqlite3Thr
100e0 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b  eadSafeFree(id);
100f0 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72  .  *pId = 0;.  r
10100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10110 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  .}..#pragma mark
10120 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f 63   Old-School .loc
10130 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f 63  k file based loc
10140 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65  king../*. ** The
10150 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
10160 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
10170 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64 6f   contains all do
10180 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c 6f  tlock (.lock) lo
10190 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63 20  ck. ** specific 
101a0 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64 65  state. */.typede
101b0 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b  f struct dotlock
101c0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  LockingContext d
101d0 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
101e0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f 74  text;.struct dot
101f0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10200 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f 63  xt {.  char *loc
10210 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61 74  kPath;.};...stat
10220 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
10230 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
10240 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20  ock(OsFile *id) 
10250 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10260 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10270 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
10280 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
10290 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
102a0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
102b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
102c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
102d0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  .  if (pFile->lo
102e0 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56  cktype == RESERV
102f0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72  ED_LOCK) {.    r
10300 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65  eturn 1; /* alre
10310 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65 72  ady have a reser
10320 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20  ved lock */.  } 
10330 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75 63  else {.    struc
10340 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
10350 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f      if (lstat(co
10360 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c  ntext->lockPath,
10370 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29 0a  &statBuf) == 0).
10380 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65 78        /* file ex
10390 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  ists, someone el
103a0 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
103b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
103c0 31 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20  1;.    else.    
103d0 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20 6e    /* file does n
103e0 6f 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f 75  ot exist, we cou
103f0 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
10400 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
10410 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10420 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  }..static int do
10430 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73  tlockUnixLock(Os
10440 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  File *id, int lo
10450 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78  cktype) {.  unix
10460 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
10470 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64  nixFile*)id;.  d
10480 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
10490 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
104a0 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63  .    (dotlockLoc
104b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
104c0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
104d0 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 69 66  text;.  .  /* if
104e0 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
104f0 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
10500 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
10510 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
10520 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
10530 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
10540 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
10550 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
10560 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
10570 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
10580 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77  .    .    /* Alw
10590 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
105a0 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
105b0 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
105c0 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d 3e  utimes(context->
105d0 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a  lockPath,NULL);.
105e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
105f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
10600 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * check to see i
10610 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  f lock file alre
10620 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ady exists */.  
10630 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
10640 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61 74  Buf;.  if (lstat
10650 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
10660 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20  th,&statBuf) == 
10670 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  0){.    return S
10680 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a 20 69  QLITE_BUSY; /* i
10690 74 20 64 6f 65 73 2c 20 62 75 73 79 20 2a 2f 0a  t does, busy */.
106a0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62    }.  .  /* grab
106b0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
106c0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20 3d  ck */.  int fd =
106d0 20 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e 6c   open(context->l
106e0 6f 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c 59  ockPath,O_RDONLY
106f0 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 2c  |O_CREAT|O_EXCL,
10700 30 36 30 30 29 3b 0a 20 20 69 66 20 28 66 64 20  0600);.  if (fd 
10710 3c 20 30 29 20 7b 0a 20 20 20 20 2f 2a 20 66 61  < 0) {.    /* fa
10720 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
10730 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73 6f  ate the file, so
10740 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20 68  meone else may h
10750 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20 6c  ave stolen the l
10760 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ock */.    retur
10770 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 0a  n SQLITE_BUSY; .
10780 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b    }.  close(fd);
10790 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
107a0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
107b0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
107c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
107d0 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72   = locktype;.  r
107e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
107f0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
10800 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b  otlockUnixUnlock
10810 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
10820 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
10830 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
10840 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
10850 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67    dotlockLocking
10860 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
10870 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b   = .    (dotlock
10880 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
10890 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
108a0 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73  Context;.  .  as
108b0 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
108c0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
108d0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
108e0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
108f0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
10900 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e==locktype ){. 
10910 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10920 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
10930 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
10940 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
10950 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
10960 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
10970 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53   if (locktype==S
10980 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
10990 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
109a0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
109b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
109c0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
109d0 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
109e0 63 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 28  ck. */.  unlink(
109f0 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74  context->lockPat
10a00 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  h);.  pFile->loc
10a10 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
10a20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10a30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
10a40 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
10a50 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10a60 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46  ockUnixClose(OsF
10a70 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75  ile **pId) {.  u
10a80 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75  nixFile *id = (u
10a90 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20  nixFile*)*pId;. 
10aa0 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65   .  if( !id ) re
10ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ac0 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c    dotlockUnixUnl
10ad0 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
10ae0 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
10af0 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e  e dotlock lockin
10b00 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
10b10 20 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67   if (id->locking
10b20 43 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c 29  Context != NULL)
10b30 20 7b 0a 20 20 20 20 69 66 20 28 28 28 64 6f 74   {.    if (((dot
10b40 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10b50 78 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67  xt *)id->locking
10b60 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
10b70 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20 20  th != NULL).    
10b80 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
10b90 61 66 65 46 72 65 65 28 20 28 20 28 64 6f 74 6c  afeFree( ( (dotl
10ba0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
10bb0 74 20 2a 29 0a 20 20 20 20 20 20 20 20 69 64 2d  t *).        id-
10bc0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10bd0 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 20  ->lockPath);.   
10be0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
10bf0 66 65 46 72 65 65 28 69 64 2d 3e 6c 6f 63 6b 69  feFree(id->locki
10c00 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 0a  ngContext);.  }.
10c10 20 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72    .  if( id->dir
10c20 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69 64  fd>=0 ) close(id
10c30 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e  ->dirfd);.  id->
10c40 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71  dirfd = -1;.  sq
10c50 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
10c60 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28  x();.  .  close(
10c70 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 73 71 6c  id->h);.  .  sql
10c80 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
10c90 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
10ca0 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
10cb0 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
10cc0 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
10cd0 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
10ce0 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
10cf0 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  eFree(id);.  *pI
10d00 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
10d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
10d20 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20 6c  pragma mark No l
10d30 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54  ocking../*. ** T
10d40 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  he nolockLocking
10d50 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64 0a  Context is void.
10d60 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64   */.typedef void
10d70 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f   nolockLockingCo
10d80 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20 69  ntext;..static i
10d90 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  nt nolockUnixChe
10da0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
10db0 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72  sFile *id) {.  r
10dc0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
10dd0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69  ic int nolockUni
10de0 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  xLock(OsFile *id
10df0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10e00 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
10e10 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
10e20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e  int nolockUnixUn
10e30 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  lock(OsFile *id,
10e40 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b   int locktype) {
10e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
10e70 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
10e80 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10e90 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
10ea0 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
10eb0 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
10ec0 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
10ed0 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
10ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ef0 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
10f00 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
10f10 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
10f20 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
10f30 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
10f40 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  .  .  close(id->
10f50 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  h);.  .  sqlite3
10f60 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
10f70 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
10f80 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
10f90 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
10fa0 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
10fb0 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
10fc0 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
10fd0 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20  e(id);.  *pId = 
10fe0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
10ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
11000 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11010 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
11020 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  */../*.** Turn a
11030 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
11040 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
11050 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
11060 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
11070 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
11080 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61  me stored in spa
11090 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
110a0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
110b0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
110c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
110d0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
110e0 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f  ing this space o
110f0 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20  nce it.** is no 
11100 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
11110 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 55  /.char *sqlite3U
11120 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  nixFullPathname(
11130 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
11140 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a  ative){.  char *
11150 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28  zFull = 0;.  if(
11160 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
11170 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
11180 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  3SetString(&zFul
11190 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63  l, zRelative, (c
111a0 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
111b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66  {.    char *zBuf
111c0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
111d0 35 30 30 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  5000);.    if( z
111e0 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
111f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
11200 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b      zBuf[0] = 0;
11210 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
11220 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65  tring(&zFull, ge
11230 74 63 77 64 28 7a 42 75 66 2c 20 35 30 30 30 29  tcwd(zBuf, 5000)
11240 2c 20 22 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65  , "/", zRelative
11250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11260 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
11270 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
11280 7a 42 75 66 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  zBuf);.  }..#if 
11290 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d 6f  0.  /*.  ** Remo
112a0 76 65 20 22 2f 2e 2f 22 20 70 61 74 68 20 65 6c  ve "/./" path el
112b0 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e 76 65  ements and conve
112c0 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74 68 20  rt "/A/./" path 
112d0 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 6f  elements.  ** to
112e0 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a 2f 0a   just "/"..  */.
112f0 20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b 0a 20    if( zFull ){. 
11300 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
11310 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 75 6c   for(i=j=0; zFul
11320 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
11330 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d 3d    if( zFull[i]==
11340 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
11350 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27  f( zFull[i+1]=='
11360 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  /' ) continue;. 
11370 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c         if( zFull
11380 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a 46  [i+1]=='.' && zF
11390 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b  ull[i+2]=='/' ){
113a0 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
113b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  1;.          con
113c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
113d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75  .        if( zFu
113e0 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20  ll[i+1]=='.' && 
113f0 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27 20  zFull[i+2]=='.' 
11400 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d 27  && zFull[i+3]=='
11410 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
11420 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 46  while( j>0 && zF
11430 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  ull[j-1]!='/' ){
11440 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
11450 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    i += 3;.      
11460 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11480 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b 5d        zFull[j++]
11490 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20 20   = zFull[i];.   
114a0 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d 20   }.    zFull[j] 
114b0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
114c0 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b  .  return zFull;
114d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
114e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
114f0 65 20 66 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20  e fullsync flag 
11500 69 6e 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  in the given fil
11510 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f  e descriptor..*/
11520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
11530 78 53 65 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46  xSetFullSync(OsF
11540 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 76 29 7b  ile *id, int v){
11550 0a 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  .  ((unixFile*)i
11560 64 29 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 76  d)->fullSync = v
11570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11580 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  n the underlying
11590 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
115a0 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74   an OsFile.*/.st
115b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
115c0 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a  eHandle(OsFile *
115d0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28  id){.  return ((
115e0 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68  unixFile*)id)->h
115f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11600 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  n an integer tha
11610 74 20 69 6e 64 69 63 65 73 20 74 68 65 20 74 79  t indices the ty
11620 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65  pe of lock curre
11630 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20  ntly held.** by 
11640 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 28 55  this handle.  (U
11650 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
11660 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
11670 79 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y.).*/.static in
11680 74 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 28  t unixLockState(
11690 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
116a0 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65  eturn ((unixFile
116b0 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
116c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
116d0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
116e0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
116f0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
11700 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
11710 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
11720 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
11730 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
11740 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
11750 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
11760 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
11770 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
11780 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
11790 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
117a0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
117b0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
117c0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
117d0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
117e0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
117f0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
11800 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 27 73  atabase and it's
11810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
11820 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
11830 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
11840 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
11850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11860 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 4f  unixSectorSize(O
11870 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65  sFile *id){.  re
11880 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
11890 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
118a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
118b0 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
118c0 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
118d0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
118e0 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 66  n an OsFile.** f
118f0 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74  or unix..*/.stat
11900 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
11910 64 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d  d sqlite3UnixIoM
11920 65 74 68 6f 64 20 3d 20 7b 0a 20 20 75 6e 69 78  ethod = {.  unix
11930 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 4f 70 65  Close,.  unixOpe
11940 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 75 6e  nDirectory,.  un
11950 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72  ixRead,.  unixWr
11960 69 74 65 2c 0a 20 20 75 6e 69 78 53 65 65 6b 2c  ite,.  unixSeek,
11970 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c  .  unixTruncate,
11980 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75  .  unixSync,.  u
11990 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a  nixSetFullSync,.
119a0 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65    unixFileHandle
119b0 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  ,.  unixFileSize
119c0 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20 20  ,.  unixLock,.  
119d0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e  unixUnlock,.  un
119e0 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 75  ixLockState,.  u
119f0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
11a00 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63 74  Lock,.  unixSect
11a10 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 23 69 66 64  orSize,.};..#ifd
11a20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11a30 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
11a40 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  *. ** This vecto
11a50 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
11a60 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
11a70 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
11a80 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20   OsFile. ** for 
11a90 75 6e 69 78 20 77 69 74 68 20 41 46 50 20 73 74  unix with AFP st
11aa0 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
11ab0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  .. */.static con
11ac0 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69  st IoMethod sqli
11ad0 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69  te3AFPLockingUni
11ae0 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  xIoMethod = {.  
11af0 20 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c 0a    afpUnixClose,.
11b00 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65      unixOpenDire
11b10 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52  ctory,.    unixR
11b20 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69  ead,.    unixWri
11b30 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b  te,.    unixSeek
11b40 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61  ,.    unixTrunca
11b50 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63  te,.    unixSync
11b60 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c  ,.    unixSetFul
11b70 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46  lSync,.    unixF
11b80 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75  ileHandle,.    u
11b90 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20  nixFileSize,.   
11ba0 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20   afpUnixLock,.  
11bb0 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 2c    afpUnixUnlock,
11bc0 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61  .    unixLockSta
11bd0 74 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 43  te,.    afpUnixC
11be0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
11bf0 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72  ,.    unixSector
11c00 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a  Size,.};../*. **
11c10 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
11c20 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
11c30 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
11c40 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69  erate on an OsFi
11c50 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20  le. ** for unix 
11c60 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74 79  with flock() sty
11c70 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  le file locking.
11c80 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
11c90 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74  t IoMethod sqlit
11ca0 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  e3FlockLockingUn
11cb0 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11cc0 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73     flockUnixClos
11cd0 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44  e,.    unixOpenD
11ce0 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e  irectory,.    un
11cf0 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78  ixRead,.    unix
11d00 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  Write,.    unixS
11d10 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75  eek,.    unixTru
11d20 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53  ncate,.    unixS
11d30 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74  ync,.    unixSet
11d40 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e  FullSync,.    un
11d50 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20  ixFileHandle,.  
11d60 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
11d70 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63      flockUnixLoc
11d80 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78  k,.    flockUnix
11d90 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78  Unlock,.    unix
11da0 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 66  LockState,.    f
11db0 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73  lockUnixCheckRes
11dc0 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20 75  ervedLock,.    u
11dd0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d  nixSectorSize,.}
11de0 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76  ;../*. ** This v
11df0 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
11e00 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
11e10 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
11e20 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20  n an OsFile. ** 
11e30 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64 6f  for unix with do
11e40 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c 65  tlock style file
11e50 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74   locking.. */.st
11e60 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74  atic const IoMet
11e70 68 6f 64 20 73 71 6c 69 74 65 33 44 6f 74 6c 6f  hod sqlite3Dotlo
11e80 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d  ckLockingUnixIoM
11e90 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64 6f  ethod = {.    do
11ea0 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a  tlockUnixClose,.
11eb0 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65      unixOpenDire
11ec0 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78 52  ctory,.    unixR
11ed0 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72 69  ead,.    unixWri
11ee0 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65 6b  te,.    unixSeek
11ef0 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63 61  ,.    unixTrunca
11f00 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e 63  te,.    unixSync
11f10 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75 6c  ,.    unixSetFul
11f20 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 46  lSync,.    unixF
11f30 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20 75  ileHandle,.    u
11f40 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 20  nixFileSize,.   
11f50 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b   dotlockUnixLock
11f60 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ,.    dotlockUni
11f70 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69  xUnlock,.    uni
11f80 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20  xLockState,.    
11f90 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b  dotlockUnixCheck
11fa0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
11fb0 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
11fc0 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69  ,.};../*. ** Thi
11fd0 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
11fe0 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
11ff0 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
12000 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20  e on an OsFile. 
12010 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68  ** for unix with
12020 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66   dotlock style f
12030 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f  ile locking.. */
12040 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
12050 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 4e 6f  Method sqlite3No
12060 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
12070 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 6e 6f  oMethod = {.  no
12080 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a 20  lockUnixClose,. 
12090 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f   unixOpenDirecto
120a0 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a  ry,.  unixRead,.
120b0 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75    unixWrite,.  u
120c0 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54  nixSeek,.  unixT
120d0 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53  runcate,.  unixS
120e0 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75  ync,.  unixSetFu
120f0 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69  llSync,.  unixFi
12100 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78  leHandle,.  unix
12110 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c 6f  FileSize,.  nolo
12120 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e 6f  ckUnixLock,.  no
12130 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a  lockUnixUnlock,.
12140 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
12150 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68 65  .  nolockUnixChe
12160 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
12170 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65    unixSectorSize
12180 2c 0a 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ,.};..#endif /* 
12190 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
121a0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
121b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  /*.** Allocate m
121c0 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
121d0 75 6e 69 78 46 69 6c 65 20 61 6e 64 20 69 6e 69  unixFile and ini
121e0 74 69 61 6c 69 7a 65 20 74 68 61 74 20 75 6e 69  tialize that uni
121f0 78 46 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65 20  xFile..** Write 
12200 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12210 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 69 6e   new unixFile in
12220 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20 77  to *pId..** If w
12230 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
12240 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  ory, close the f
12250 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ile and return a
12260 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 64  n error..*/.#ifd
12270 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
12280 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
12290 2a 20 0a 20 2a 2a 20 57 68 65 6e 20 6c 6f 63 6b  * . ** When lock
122a0 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 73 20 61  ing extensions a
122b0 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20  re enabled, the 
122c0 66 69 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f 63  filepath and loc
122d0 6b 69 6e 67 20 73 74 79 6c 65 20 0a 20 2a 2a 20  king style . ** 
122e0 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20 64 65  are needed to de
122f0 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
12300 46 69 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f 20  File pMethod to 
12310 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  use for locking 
12320 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 20 2a 2a 20  operations.. ** 
12330 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c  The locking-styl
12340 65 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69  e specific locki
12350 6e 67 43 6f 6e 74 65 78 74 20 64 61 74 61 20 73  ngContext data s
12360 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
12370 74 65 64 20 0a 20 2a 2a 20 61 6e 64 20 61 73 73  ted . ** and ass
12380 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73 6f 2e  igned here also.
12390 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
123a0 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
123b0 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  (.  int h,      
123c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
123d0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
123e0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
123f0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 4f 73  g opened */.  Os
12400 46 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20  File **pId,     
12410 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
12420 6f 6d 70 6c 65 74 65 64 20 69 6e 69 74 69 61 6c  ompleted initial
12430 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a  ization here */.
12440 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12450 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
12460 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65  e of the file be
12470 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
12480 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20  int delFlag     
12490 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
124a0 65 2d 6f 6e 2d 6f 72 2d 62 65 66 6f 72 65 2d 63  e-on-or-before-c
124b0 6c 6f 73 65 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a  lose flag */.){.
124c0 20 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67    sqlite3Locking
124d0 53 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74 79  Style lockingSty
124e0 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
124f0 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c 65  pNew;.  unixFile
12500 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   f;.  int rc;.. 
12510 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73   memset(&f, 0, s
12520 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 6c 6f 63  izeof(f));.  loc
12530 6b 69 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c 69  kingStyle = sqli
12540 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e 67  te3DetectLocking
12550 53 74 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  Style(zFilename,
12560 20 68 29 3b 0a 20 20 69 66 20 28 20 6c 6f 63 6b   h);.  if ( lock
12570 69 6e 67 53 74 79 6c 65 20 3d 3d 20 70 6f 73 69  ingStyle == posi
12580 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29 20  xLockingStyle ) 
12590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45  {.    sqlite3OsE
125a0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
125b0 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e   rc = findLockIn
125c0 66 6f 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20  fo(h, &f.pLock, 
125d0 26 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73  &f.pOpen);.    s
125e0 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
125f0 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ex();.    if( rc
12600 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28   ){.      close(
12610 68 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  h);.      unlink
12620 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
12630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12640 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
12650 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20  } else {.    /* 
12660 20 70 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65 6e   pLock and pOpen
12670 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
12680 6f 72 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  or posix advisor
12690 79 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  y locking */.   
126a0 20 66 2e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b   f.pLock = NULL;
126b0 0a 20 20 20 20 66 2e 70 4f 70 65 6e 20 3d 20 4e  .    f.pOpen = N
126c0 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ULL;.  }.  if( d
126d0 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e  elFlag ){.    un
126e0 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
126f0 0a 20 20 7d 0a 20 20 66 2e 64 69 72 66 64 20 3d  .  }.  f.dirfd =
12700 20 2d 31 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a   -1;.  f.h = h;.
12710 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 26    SET_THREADID(&
12720 66 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  f);.  pNew = sql
12730 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61  ite3ThreadSafeMa
12740 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69  lloc( sizeof(uni
12750 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  xFile) );.  if( 
12760 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63  pNew==0 ){.    c
12770 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71 6c  lose(h);.    sql
12780 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
12790 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c  ();.    releaseL
127a0 6f 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29  ockInfo(f.pLock)
127b0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
127c0 6e 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20  nCnt(f.pOpen);. 
127d0 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76     sqlite3OsLeav
127e0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70  eMutex();.    *p
127f0 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  Id = 0;.    retu
12800 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12810 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12820 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20 73 77 69  New = f;.    swi
12830 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c 65  tch(lockingStyle
12840 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 61  ) {.      case a
12850 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 20  fpLockingStyle: 
12860 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66 70  {.        /* afp
12870 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
12880 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
12890 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
128a0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20  cluded in.      
128b0 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b    ** the afpLock
128c0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ingContext */.  
128d0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
128e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ame;.        pNe
128f0 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
12900 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55  lite3AFPLockingU
12910 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
12920 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
12930 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20  ngContext = .   
12940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68         sqlite3Th
12950 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 73  readSafeMalloc(s
12960 69 7a 65 6f 66 28 61 66 70 4c 6f 63 6b 69 6e 67  izeof(afpLocking
12970 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20 20  Context));.     
12980 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73     nFilename = s
12990 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
129a0 2b 31 3b 0a 20 20 20 20 20 20 20 20 28 28 61 66  +1;.        ((af
129b0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
129c0 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  *)pNew->lockingC
129d0 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61 74  ontext)->filePat
129e0 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 73  h = .          s
129f0 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
12a00 4d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  Malloc(nFilename
12a10 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
12a20 79 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  y(((afpLockingCo
12a30 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f  ntext *)pNew->lo
12a40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66  ckingContext)->f
12a50 69 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20 20  ilePath, .      
12a60 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
12a70 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
12a80 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64          srandomd
12a90 65 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ev();.        br
12aa0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12ab0 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f 63     case flockLoc
12ac0 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
12ad0 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63 6b     /* flock lock
12ae0 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  ing doesn't need
12af0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
12b00 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f 72  ingContext infor
12b10 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
12b20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12b30 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c  = &sqlite3FlockL
12b40 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
12b50 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  od;.        brea
12b60 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64 6f  k;.      case do
12b70 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  tlockLockingStyl
12b80 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e: {.        /* 
12b90 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20  dotlock locking 
12ba0 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
12bb0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
12bc0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
12bd0 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  .         ** the
12be0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
12bf0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  ontext */.      
12c00 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
12c10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
12c20 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65  Method = &sqlite
12c30 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  3DotlockLockingU
12c40 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
12c50 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69       pNew->locki
12c60 6e 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c 69  ngContext = sqli
12c70 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
12c80 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 73  loc(.          s
12c90 69 7a 65 6f 66 28 64 6f 74 6c 6f 63 6b 4c 6f 63  izeof(dotlockLoc
12ca0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20  kingContext));. 
12cb0 20 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65         nFilename
12cc0 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e   = strlen(zFilen
12cd0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 20 20  ame) + 6;.      
12ce0 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69    ((dotlockLocki
12cf0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77  ngContext *)pNew
12d00 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12d10 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 3d 20 0a 20  )->lockPath = . 
12d20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12d30 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c  e3ThreadSafeMall
12d40 6f 63 28 20 6e 46 69 6c 65 6e 61 6d 65 20 29 3b  oc( nFilename );
12d50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12d60 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
12d70 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ame, .          
12d80 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c        ((dotlockL
12d90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
12da0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
12db0 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c  text)->lockPath,
12dc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
12dd0 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69    "%s.lock", zFi
12de0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
12df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12e00 20 20 20 20 20 20 63 61 73 65 20 70 6f 73 69 78        case posix
12e10 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
12e20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78 20 6c        /* posix l
12e30 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e  ocking doesn't n
12e40 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  eed additional l
12e50 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e  ockingContext in
12e60 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
12e70 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68       pNew->pMeth
12e80 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e 69  od = &sqlite3Uni
12e90 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20  xIoMethod;.     
12ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12eb0 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74  case noLockingSt
12ec0 79 6c 65 3a 0a 20 20 20 20 20 20 63 61 73 65 20  yle:.      case 
12ed0 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69  unsupportedLocki
12ee0 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20 64  ngStyle:.      d
12ef0 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20 20  efault: .       
12f00 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
12f10 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b 4c   &sqlite3NolockL
12f20 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68  ockingUnixIoMeth
12f30 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  od;.    }.    *p
12f40 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e  Id = (OsFile*)pN
12f50 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  ew;.    OpenCoun
12f60 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65 74  ter(+1);.    ret
12f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12f80 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 53 51   }.}.#else /* SQ
12f90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12fa0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73 74 61  ING_STYLE */.sta
12fb0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
12fc0 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20  UnixFile(.  int 
12fd0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
12fe0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
12ff0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 66 69  descriptor on fi
13000 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
13010 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49  */.  OsFile **pI
13020 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  d,          /* W
13030 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 20 75  rite the resul u
13040 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
13050 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
13060 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13070 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  e, /* Name of th
13080 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
13090 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ned */.  int del
130a0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
130b0 2f 2a 20 49 66 20 74 72 75 65 2c 20 64 65 6c 65  /* If true, dele
130c0 74 65 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 6f  te the file on o
130d0 72 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  r before closing
130e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
130f0 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46  e *pNew;.  unixF
13100 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b  ile f;.  int rc;
13110 0a 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45  ..#ifdef FD_CLOE
13120 58 45 43 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46  XEC.  fcntl(h, F
13130 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c  _SETFD, fcntl(h,
13140 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46   F_GETFD, 0) | F
13150 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64  D_CLOEXEC);.#end
13160 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  if.  memset(&f, 
13170 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
13180 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
13190 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66  utex();.  rc = f
131a0 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26  indLockInfo(h, &
131b0 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65  f.pLock, &f.pOpe
131c0 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  n);.  sqlite3OsL
131d0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
131e0 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
131f0 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
13200 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
13210 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  c ){.    close(h
13220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13230 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13240 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e    OSTRACE3("OPEN
13250 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
13260 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
13270 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20   f.dirfd = -1;. 
13280 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54 5f   f.h = h;.  SET_
13290 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20  THREADID(&f);.  
132a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 54 68  pNew = sqlite3Th
132b0 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
132c0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
132d0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
132e0 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  0 ){.    close(h
132f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
13300 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13310 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
13320 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  o(f.pLock);.    
13330 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 66  releaseOpenCnt(f
13340 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c  .pOpen);.    sql
13350 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
13360 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30  ();.    *pId = 0
13370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13380 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
13390 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20  se{.    *pNew = 
133a0 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  f;.    pNew->pMe
133b0 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55  thod = &sqlite3U
133c0 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
133d0 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a   *pId = (OsFile*
133e0 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43  )pNew;.    OpenC
133f0 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
13400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13410 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
13420 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
13430 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
13440 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
13450 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
13460 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
13470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
134b0 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f  * Everything abo
134c0 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69  ve deals with fi
134d0 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68  le I/O.  Everyth
134e0 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ing that follows
134f0 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f   deals.** with o
13500 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75  ther miscellanou
13510 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65  s aspects of the
13520 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
13530 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a  m interface.****
13540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13580 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 23 69 66 6e  ********/...#ifn
13590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
135a0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
135b0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
135c0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
135d0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
135e0 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
135f0 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
13600 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
13610 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
13620 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
13630 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
13640 66 63 6e 2e 68 3e 0a 76 6f 69 64 20 2a 73 71 6c  fcn.h>.void *sql
13650 69 74 65 33 55 6e 69 78 44 6c 6f 70 65 6e 28 63  ite3UnixDlopen(c
13660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13670 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  name){.  return 
13680 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
13690 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
136a0 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 76 6f 69  D_GLOBAL);.}.voi
136b0 64 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 44 6c  d *sqlite3UnixDl
136c0 73 79 6d 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c  sym(void *pHandl
136d0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
136e0 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72  Symbol){.  retur
136f0 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c  n dlsym(pHandle,
13700 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 69 6e 74   zSymbol);.}.int
13710 20 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 63 6c   sqlite3UnixDlcl
13720 6f 73 65 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ose(void *pHandl
13730 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 63  e){.  return dlc
13740 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
13750 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13760 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
13770 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
13780 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
13790 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
137a0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
137b0 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
137c0 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
137d0 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
137e0 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
137f0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
13800 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
13810 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
13820 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
13830 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64   sqlite3UnixRand
13840 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
13850 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
13860 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
13870 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
13880 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
13890 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
138a0 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
138b0 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
138c0 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
138d0 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
138e0 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
138f0 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
13900 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
13910 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
13920 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
13930 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
13940 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
13950 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
13960 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
13970 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
13980 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
13990 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
139a0 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
139b0 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
139c0 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
139d0 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
139e0 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
139f0 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
13a00 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
13a10 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
13a20 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
13a30 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
13a40 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
13a50 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
13a60 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
13a70 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
13a80 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
13a90 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
13aa0 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
13ab0 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
13ac0 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
13ad0 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69  Buf, 0, 256);.#i
13ae0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13af0 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
13b00 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
13b10 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
13b20 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
13b30 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
13b40 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
13b50 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
13b60 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
13b70 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
13b80 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
13b90 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
13ba0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
13bb0 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  f[sizeof(time_t)
13bc0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
13bd0 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
13be0 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
13bf0 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20   zBuf, 256);.   
13c00 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
13c10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13c30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
13c40 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
13c50 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
13c60 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
13c70 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
13c80 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
13c90 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
13ca0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
13cb0 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74 20 73   sleep..*/.int s
13cc0 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28  qlite3UnixSleep(
13cd0 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66  int ms){.#if def
13ce0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
13cf0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
13d00 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30  .  usleep(ms*100
13d10 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  0);.  return ms;
13d20 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28  .#else.  sleep((
13d30 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ms+999)/1000);. 
13d40 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d   return 1000*((m
13d50 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65  s+999)/1000);.#e
13d60 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  ndif.}../*.** St
13d70 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
13d80 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
13d90 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 2e 0a  ynchronization..
13da0 2a 2a 0a 2a 2a 20 69 6e 4d 75 74 65 78 20 20 20  **.** inMutex   
13db0 20 20 20 74 68 65 20 6e 65 73 74 69 6e 67 20 64     the nesting d
13dc0 65 70 74 68 20 6f 66 20 74 68 65 20 72 65 63 75  epth of the recu
13dd0 72 73 69 76 65 20 6d 75 74 65 78 2e 20 20 54 68  rsive mutex.  Th
13de0 65 20 74 68 72 65 61 64 0a 2a 2a 20 20 20 20 20  e thread.**     
13df0 20 20 20 20 20 20 20 20 20 68 6f 6c 64 69 6e 67           holding
13e00 20 6d 75 74 65 78 4d 61 69 6e 20 63 61 6e 20 72   mutexMain can r
13e10 65 61 64 20 74 68 69 73 20 76 61 72 69 61 62 6c  ead this variabl
13e20 65 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a 2a  e at any time..*
13e30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42  *              B
13e40 75 74 20 69 73 20 6d 75 73 74 20 68 6f 6c 64 20  ut is must hold 
13e50 6d 75 74 65 78 41 75 78 20 74 6f 20 63 68 61 6e  mutexAux to chan
13e60 67 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ge this variable
13e70 2e 20 20 4f 74 68 65 72 0a 2a 2a 20 20 20 20 20  .  Other.**     
13e80 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73           threads
13e90 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74 65 78   must hold mutex
13ea0 41 75 78 20 74 6f 20 72 65 61 64 20 74 68 65 20  Aux to read the 
13eb0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 63 61 6e  variable and can
13ec0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13ed0 20 6e 65 76 65 72 20 77 72 69 74 65 2e 0a 2a 2a   never write..**
13ee0 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72 20 20  .** mutexOwner  
13ef0 20 54 68 65 20 74 68 72 65 61 64 20 69 64 20 6f   The thread id o
13f00 66 20 74 68 65 20 74 68 72 65 61 64 20 68 6f 6c  f the thread hol
13f10 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 2e 20  ding mutexMain. 
13f20 20 53 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20   Same.**        
13f30 20 20 20 20 20 20 61 63 63 65 73 73 20 72 75 6c        access rul
13f40 65 73 20 61 73 20 66 6f 72 20 69 6e 4d 75 74 65  es as for inMute
13f50 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77  x..**.** mutexOw
13f60 6e 65 72 56 61 6c 69 64 20 20 20 54 72 75 65 20  nerValid   True 
13f70 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
13f80 6d 75 74 65 78 4f 77 6e 65 72 20 69 73 20 76 61  mutexOwner is va
13f90 6c 69 64 2e 20 20 54 68 65 20 73 61 6d 65 0a 2a  lid.  The same.*
13fa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13fb0 20 20 20 20 61 63 63 65 73 73 20 72 75 6c 65 73      access rules
13fc0 20 61 70 70 6c 79 20 61 73 20 66 6f 72 20 69 6e   apply as for in
13fd0 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74  Mutex..**.** mut
13fe0 65 78 4d 61 69 6e 20 20 20 20 54 68 65 20 6d 61  exMain    The ma
13ff0 69 6e 20 6d 75 74 65 78 2e 20 20 48 6f 6c 64 20  in mutex.  Hold 
14000 74 68 69 73 20 6d 75 74 65 78 20 69 6e 20 6f 72  this mutex in or
14010 64 65 72 20 74 6f 20 67 65 74 20 65 78 63 6c 75  der to get exclu
14020 73 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  sive.**         
14030 20 20 20 20 20 61 63 63 65 73 73 20 74 6f 20 53       access to S
14040 51 4c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  QLite data struc
14050 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74  tures..**.** mut
14060 65 78 41 75 78 20 20 20 20 20 41 6e 20 61 75 78  exAux     An aux
14070 69 6c 69 61 72 79 20 6d 75 74 65 78 20 6e 65 65  iliary mutex nee
14080 64 65 64 20 74 6f 20 61 63 63 65 73 73 20 76 61  ded to access va
14090 72 69 61 62 6c 65 73 20 64 65 66 69 6e 65 64 20  riables defined 
140a0 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 4d 75 74  above..**.** Mut
140b0 65 78 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  exes are always 
140c0 61 63 71 75 69 72 65 64 20 69 6e 20 74 68 69 73  acquired in this
140d0 20 6f 72 64 65 72 3a 20 6d 75 74 65 78 4d 61 69   order: mutexMai
140e0 6e 20 6d 75 74 65 78 41 75 78 2e 20 20 20 49 74  n mutexAux.   It
140f0 0a 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  .** is not neces
14100 73 61 72 79 20 74 6f 20 61 63 71 75 69 72 65 20  sary to acquire 
14110 6d 75 74 65 78 4d 61 69 6e 20 69 6e 20 6f 72 64  mutexMain in ord
14120 65 72 20 74 6f 20 67 65 74 20 6d 75 74 65 78 41  er to get mutexA
14130 75 78 20 2d 20 6a 75 73 74 0a 2a 2a 20 64 6f 20  ux - just.** do 
14140 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 61  not attempt to a
14150 63 71 75 69 72 65 20 74 68 65 6d 20 69 6e 20 74  cquire them in t
14160 68 65 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  he reverse order
14170 3a 20 6d 75 74 65 78 41 75 78 20 6d 75 74 65 78  : mutexAux mutex
14180 4d 61 69 6e 2e 0a 2a 2a 20 45 69 74 68 65 72 20  Main..** Either 
14190 67 65 74 20 74 68 65 20 6d 75 74 65 78 65 73 20  get the mutexes 
141a0 77 69 74 68 20 6d 75 74 65 78 4d 61 69 6e 20 66  with mutexMain f
141b0 69 72 73 74 20 6f 72 20 67 65 74 20 6d 75 74 65  irst or get mute
141c0 78 41 75 78 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  xAux only..**.**
141d0 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
141e0 20 61 20 70 6c 61 74 66 6f 72 6d 20 77 68 65 72   a platform wher
141f0 65 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  e the three vari
14200 61 62 6c 65 73 20 69 6e 4d 75 74 65 78 2c 20 6d  ables inMutex, m
14210 75 74 65 78 4f 77 6e 65 72 2c 0a 2a 2a 20 61 6e  utexOwner,.** an
14220 64 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69  d mutexOwnerVali
14230 64 20 63 61 6e 20 62 65 20 73 65 74 20 61 74 6f  d can be set ato
14240 6d 69 63 61 6c 6c 79 2c 20 74 68 65 20 6d 75 74  mically, the mut
14250 65 78 41 75 78 20 69 73 20 6e 6f 74 20 72 65 71  exAux is not req
14260 75 69 72 65 64 2e 0a 2a 2a 20 4f 6e 20 6d 61 6e  uired..** On man
14270 79 20 73 79 73 74 65 6d 73 2c 20 61 6c 6c 20 74  y systems, all t
14280 68 72 65 65 20 61 72 65 20 33 32 2d 62 69 74 20  hree are 32-bit 
14290 69 6e 74 65 67 65 72 73 20 61 6e 64 20 77 72 69  integers and wri
142a0 74 69 6e 67 20 74 6f 20 61 20 33 32 2d 62 69 74  ting to a 32-bit
142b0 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 61  .** integer is a
142c0 74 6f 6d 69 63 2e 20 20 49 20 74 68 69 6e 6b 2e  tomic.  I think.
142d0 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
142e0 6e 6f 20 67 75 61 72 61 6e 74 65 65 73 2e 20 20  no guarantees.  
142f0 53 6f 20 69 74 20 73 65 65 6d 73 0a 2a 2a 20 73  So it seems.** s
14300 61 66 65 72 20 74 6f 20 70 72 6f 74 65 63 74 20  afer to protect 
14310 74 68 65 6d 20 75 73 69 6e 67 20 6d 75 74 65 78  them using mutex
14320 41 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Aux..*/.static i
14330 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a  nt inMutex = 0;.
14340 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
14350 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
14360 63 20 70 74 68 72 65 61 64 5f 74 20 6d 75 74 65  c pthread_t mute
14370 78 4f 77 6e 65 72 3b 20 20 20 20 20 20 20 20 20  xOwner;         
14380 20 2f 2a 20 54 68 72 65 61 64 20 68 6f 6c 64 69   /* Thread holdi
14390 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 2a 2f 0a  ng mutexMain */.
143a0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 74 65 78  static int mutex
143b0 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30 3b 20  OwnerValid = 0; 
143c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
143d0 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73 20 76   mutexOwner is v
143e0 61 6c 69 64 20 2a 2f 0a 73 74 61 74 69 63 20 70  alid */.static p
143f0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
14400 75 74 65 78 4d 61 69 6e 20 3d 20 50 54 48 52 45  utexMain = PTHRE
14410 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
14420 49 5a 45 52 3b 20 2f 2a 20 54 68 65 20 6d 75 74  IZER; /* The mut
14430 65 78 20 2a 2f 0a 73 74 61 74 69 63 20 70 74 68  ex */.static pth
14440 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74  read_mutex_t mut
14450 65 78 41 75 78 20 3d 20 50 54 48 52 45 41 44 5f  exAux = PTHREAD_
14460 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
14470 52 3b 20 20 2f 2a 20 41 75 78 20 6d 75 74 65 78  R;  /* Aux mutex
14480 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
14490 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
144a0 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20  pair of routine 
144b0 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c  implement mutual
144c0 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a   exclusion for.*
144d0 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  * multi-threaded
144e0 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c   processes.  Onl
144f0 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  y a single threa
14500 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a  d is allowed to.
14510 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f 64 65  ** executed code
14520 20 74 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e   that is surroun
14530 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65  ded by EnterMute
14540 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74  x() and LeaveMut
14550 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ex()..**.** SQLi
14560 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73  te uses only a s
14570 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68  ingle Mutex.  Th
14580 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20  ere is not much 
14590 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65  critical.** code
145a0 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65   and what little
145b0 20 74 68 65 72 65 20 69 73 20 65 78 65 63 75 74   there is execut
145c0 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77  es quickly and w
145d0 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
145e0 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20 76 65 72  .**.** As of ver
145f0 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74 68 69 73  sion 3.3.2, this
14600 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 72   mutex must be r
14610 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ecursive..*/.voi
14620 64 20 73 71 6c 69 74 65 33 55 6e 69 78 45 6e 74  d sqlite3UnixEnt
14630 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65  erMutex(){.#ifde
14640 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
14650 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
14660 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
14670 78 41 75 78 29 3b 0a 20 20 69 66 28 20 21 6d 75  xAux);.  if( !mu
14680 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 7c 7c  texOwnerValid ||
14690 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
146a0 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72  mutexOwner, pthr
146b0 65 61 64 5f 73 65 6c 66 28 29 29 20 29 7b 0a 20  ead_self()) ){. 
146c0 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
146d0 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75  _unlock(&mutexAu
146e0 78 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f  x);.    pthread_
146f0 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
14700 78 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  xMain);.    asse
14710 72 74 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29  rt( inMutex==0 )
14720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
14730 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 29  utexOwnerValid )
14740 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
14750 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41  tex_lock(&mutexA
14760 75 78 29 3b 0a 20 20 20 20 6d 75 74 65 78 4f 77  ux);.    mutexOw
14770 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65  ner = pthread_se
14780 6c 66 28 29 3b 0a 20 20 20 20 6d 75 74 65 78 4f  lf();.    mutexO
14790 77 6e 65 72 56 61 6c 69 64 20 3d 20 31 3b 0a 20  wnerValid = 1;. 
147a0 20 7d 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a   }.  inMutex++;.
147b0 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
147c0 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  unlock(&mutexAux
147d0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74  );.#else.  inMut
147e0 65 78 2b 2b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76  ex++;.#endif.}.v
147f0 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78 4c  oid sqlite3UnixL
14800 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61  eaveMutex(){.  a
14810 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 3e 30  ssert( inMutex>0
14820 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
14830 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
14840 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
14850 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
14860 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 20 20 61    inMutex--;.  a
14870 73 73 65 72 74 28 20 70 74 68 72 65 61 64 5f 65  ssert( pthread_e
14880 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
14890 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
148a0 20 29 3b 0a 20 20 69 66 28 20 69 6e 4d 75 74 65   );.  if( inMute
148b0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  x==0 ){.    asse
148c0 72 74 28 20 6d 75 74 65 78 4f 77 6e 65 72 56 61  rt( mutexOwnerVa
148d0 6c 69 64 20 29 3b 0a 20 20 20 20 6d 75 74 65 78  lid );.    mutex
148e0 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30 3b 0a  OwnerValid = 0;.
148f0 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
14900 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 4d  x_unlock(&mutexM
14910 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 70 74 68 72  ain);.  }.  pthr
14920 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
14930 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23 65 6c  (&mutexAux);.#el
14940 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a  se.  inMutex--;.
14950 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14960 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
14970 68 65 20 6d 75 74 65 78 20 69 73 20 63 75 72 72  he mutex is curr
14980 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  ently held..**.*
14990 2a 20 49 66 20 74 68 65 20 74 68 69 73 54 68 72  * If the thisThr
149a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
149b0 72 75 65 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rue, return true
149c0 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20   only if the.** 
149d0 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 68  calling thread h
149e0 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 20  olds the mutex. 
149f0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
14a00 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65 74 75  r is false, retu
14a10 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 61 6e  rn.** true if an
14a20 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74  y thread holds t
14a30 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74  he mutex..*/.int
14a40 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e 4d 75   sqlite3UnixInMu
14a50 74 65 78 28 69 6e 74 20 74 68 69 73 54 68 72 64  tex(int thisThrd
14a60 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14a70 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
14a80 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
14a90 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
14aa0 74 65 78 41 75 78 29 3b 0a 20 20 72 63 20 3d 20  texAux);.  rc = 
14ab0 69 6e 4d 75 74 65 78 3e 30 20 26 26 20 28 74 68  inMutex>0 && (th
14ac0 69 73 54 68 72 64 3d 3d 30 20 7c 7c 20 70 74 68  isThrd==0 || pth
14ad0 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78  read_equal(mutex
14ae0 4f 77 6e 65 72 2c 70 74 68 72 65 61 64 5f 73 65  Owner,pthread_se
14af0 6c 66 28 29 29 29 3b 0a 20 20 70 74 68 72 65 61  lf()));.  pthrea
14b00 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
14b10 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72 65 74  mutexAux);.  ret
14b20 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20  urn rc;.#else.  
14b30 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30  return inMutex>0
14b40 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14b50 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e  * Remember the n
14b60 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64 2d  umber of thread-
14b70 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 62 6c  specific-data bl
14b80 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  ocks allocated..
14b90 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f 20 76  ** Use this to v
14ba0 65 72 69 66 79 20 74 68 61 74 20 77 65 20 61 72  erify that we ar
14bb0 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20 74 68  e not leaking th
14bc0 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
14bd0 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  ta..** Ticket #1
14be0 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  601.*/.#ifdef SQ
14bf0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
14c00 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
14c10 3d 20 30 3b 0a 23 20 69 66 64 65 66 20 53 51 4c  = 0;.# ifdef SQL
14c20 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
14c30 0a 20 20 20 20 73 74 61 74 69 63 20 70 74 68 72  .    static pthr
14c40 65 61 64 5f 6d 75 74 65 78 5f 74 20 74 73 64 5f  ead_mutex_t tsd_
14c50 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 20 3d 20  counter_mutex = 
14c60 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
14c70 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20 20 20 64  ITIALIZER;.#   d
14c80 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
14c90 52 28 4e 29 20 5c 0a 20 20 20 20 20 20 20 20 20  R(N) \.         
14ca0 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
14cb0 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  x_lock(&tsd_coun
14cc0 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c 0a 20 20  ter_mutex); \.  
14cd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14ce0 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20  e3_tsd_count += 
14cf0 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  N; \.           
14d00 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
14d10 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  unlock(&tsd_coun
14d20 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23 20 65 6c  ter_mutex);.# el
14d30 73 65 0a 23 20 20 20 64 65 66 69 6e 65 20 54 53  se.#   define TS
14d40 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 73 71  D_COUNTER(N)  sq
14d50 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
14d60 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a 23 65 6c  += N.# endif.#el
14d70 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f  se.# define TSD_
14d80 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f 2a 20 6e  COUNTER(N)  /* n
14d90 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  o-op */.#endif..
14da0 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  /*.** If called 
14db0 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
14dc0 67 3e 30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  g>0, then return
14dd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14de0 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63  read.** specific
14df0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75   data for the cu
14e00 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41  rrent thread.  A
14e10 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f  llocate and zero
14e20 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73   the.** thread-s
14e30 70 65 63 69 66 69 63 20 64 61 74 61 20 69 66 20  pecific data if 
14e40 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
14e50 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ady exist..**.**
14e60 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
14e70 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c  allocateFlag==0,
14e80 20 74 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20   then check the 
14e90 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a  current thread.*
14ea0 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61 2e  * specific data.
14eb0 20 20 52 65 74 75 72 6e 20 69 74 20 69 66 20 69    Return it if i
14ec0 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 69 74  t exists.  If it
14ed0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
14ee0 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
14ef0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  NULL..**.** If c
14f00 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63  alled with alloc
14f10 61 74 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b  ateFlag<0, check
14f20 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
14f30 68 72 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a  hread specific.*
14f40 2a 20 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61  * data is alloca
14f50 74 65 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a  ted and is all z
14f60 65 72 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74  ero.  If it is t
14f70 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69  hen deallocate i
14f80 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  t..** Return a p
14f90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68  ointer to the th
14fa0 72 65 61 64 20 73 70 65 63 69 66 69 63 20 64 61  read specific da
14fb0 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74  ta or NULL if it
14fc0 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74   is.** unallocat
14fd0 65 64 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c  ed or gets deall
14fe0 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61  ocated..*/.Threa
14ff0 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33 55 6e  dData *sqlite3Un
15000 69 78 54 68 72 65 61 64 53 70 65 63 69 66 69 63  ixThreadSpecific
15010 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74  Data(int allocat
15020 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63  eFlag){.  static
15030 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
15040 61 20 7a 65 72 6f 44 61 74 61 20 3d 20 7b 30 7d  a zeroData = {0}
15050 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
15060 72 20 74 6f 20 73 69 6c 65 6e 63 65 20 77 61 72  r to silence war
15070 6e 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  nings.          
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b 65 6e 20   ** from broken 
150b0 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a 23 69 66  compilers */.#if
150c0 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
150d0 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
150e0 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74 20 6b   pthread_key_t k
150f0 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ey;.  static int
15100 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20   keyInit = 0;.  
15110 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
15120 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79 49 6e 69  ;..  if( !keyIni
15130 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15140 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
15150 20 20 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74      if( !keyInit
15160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
15170 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 68  ;.      rc = pth
15180 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74 65 28  read_key_create(
15190 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  &key, 0);.      
151a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
151b0 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
151c0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
151d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
151e0 20 7d 0a 20 20 20 20 20 20 6b 65 79 49 6e 69 74   }.      keyInit
151f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
15200 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
15210 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20 20 70 54  tex();.  }..  pT
15220 73 64 20 3d 20 70 74 68 72 65 61 64 5f 67 65 74  sd = pthread_get
15230 73 70 65 63 69 66 69 63 28 6b 65 79 29 3b 0a 20  specific(key);. 
15240 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
15250 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
15260 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
15270 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
15280 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
15290 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
152a0 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 73  qlite3OsMalloc(s
152b0 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 29  izeof(zeroData))
152c0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
152d0 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
152e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
152f0 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  sFail = 0;.#endi
15300 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64  f.      if( pTsd
15310 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73   ){.        *pTs
15320 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20  d = zeroData;.  
15330 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 73 65        pthread_se
15340 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 70  tspecific(key, p
15350 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20 54 53  Tsd);.        TS
15360 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20  D_COUNTER(+1);. 
15370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15380 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30  else if( pTsd!=0
15390 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67   && allocateFlag
153a0 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  <0 .            
153b0 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20  && memcmp(pTsd, 
153c0 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f  &zeroData, sizeo
153d0 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d  f(ThreadData))==
153e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
153f0 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20  OsFree(pTsd);.  
15400 20 20 70 74 68 72 65 61 64 5f 73 65 74 73 70 65    pthread_setspe
15410 63 69 66 69 63 28 6b 65 79 2c 20 30 29 3b 0a 20  cific(key, 0);. 
15420 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d     TSD_COUNTER(-
15430 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30  1);.    pTsd = 0
15440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
15450 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 61  Tsd;.#else.  sta
15460 74 69 63 20 54 68 72 65 61 64 44 61 74 61 20 2a  tic ThreadData *
15470 70 54 73 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pTsd = 0;.  if( 
15480 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29  allocateFlag>0 )
15490 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d  {.    if( pTsd==
154a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
154b0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f  sqlite3TestMallo
154c0 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20  cFail() ){.     
154d0 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65     pTsd = sqlite
154e0 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3OsMalloc( sizeo
154f0 66 28 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a 20  f(zeroData) );. 
15500 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
15510 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
15520 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73 46 61      sqlite3_isFa
15530 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
15540 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29 7b       if( pTsd ){
15550 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d  .        *pTsd =
15560 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20   zeroData;.     
15570 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
15580 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
15590 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
155a0 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
155b0 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20 20 20  eFlag<0.        
155c0 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54      && memcmp(pT
155d0 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73  sd, &zeroData, s
155e0 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61  izeof(ThreadData
155f0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
15600 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29  ite3OsFree(pTsd)
15610 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
15620 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
15630 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
15640 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a 7d  n pTsd;.#endif.}
15650 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
15660 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
15670 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
15680 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
15690 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
156a0 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
156b0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
156c0 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
156d0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
156e0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
156f0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
15700 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15710 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
15720 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
15730 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
15740 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
15750 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
15760 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
15770 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
15780 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
15790 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
157a0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
157b0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
157c0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
157d0 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
157e0 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
157f0 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  e3UnixCurrentTim
15800 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  e(double *prNow)
15810 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54  {.#ifdef NO_GETT
15820 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  OD.  time_t t;. 
15830 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
15840 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20  Now = t/86400.0 
15850 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c  + 2440587.5;.#el
15860 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
15870 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74  val sNow;.  gett
15880 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
15890 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32  0);.  *prNow = 2
158a0 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e  440587.5 + sNow.
158b0 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b  tv_sec/86400.0 +
158c0 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36   sNow.tv_usec/86
158d0 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e  400000000.0;.#en
158e0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
158f0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
15900 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15910 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
15920 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
15930 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
15940 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
15950 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
15960 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  0;.}..#endif /* 
15970 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.