/ Hex Artifact Content
Login

Artifact 13c6f73a7b0c2c6c131c97ea26274db101b594cd:


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 2f 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 0a  D_LOCKING_STYLE.
56f0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
5700: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
5710: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
5720: 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20  ** Given a file 
5730: 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61  descriptor, loca
5740: 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  te lockInfo and 
5750: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
5760: 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  es that.** descr
5770: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
5780: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
5790: 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e  te new ones if n
57a0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
57b0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
57c0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
57d0: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
57e0: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
57f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5800: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
5810: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
5820: 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20  LockInfo(.  int 
5830: 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
5840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5850: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5860: 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20  used in the key 
5870: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  */.  struct lock
5880: 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20  Info **ppLock,  
5890: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
58a0: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
58b0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  re here */.  str
58c0: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70  uct openCnt **pp
58d0: 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74  Open      /* Ret
58e0: 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20  urn the openCnt 
58f0: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
5900: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
5910: 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20   struct lockKey 
5920: 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f  key1;.  struct o
5930: 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73  penKey key2;.  s
5940: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
5950: 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  uf;.  struct loc
5960: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20  kInfo *pLock;.  
5970: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
5980: 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73  pOpen;.  rc = fs
5990: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
59a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
59b0: 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 61 73   return 1;..  as
59c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73 49  sert( sqlite3OsI
59d0: 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20 20 6d  nMutex(1) );.  m
59e0: 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20  emset(&key1, 0, 
59f0: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20  sizeof(key1));. 
5a00: 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74   key1.dev = stat
5a10: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65  buf.st_dev;.  ke
5a20: 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  y1.ino = statbuf
5a30: 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65 66 20  .st_ino;.#ifdef 
5a40: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
5a50: 41 44 53 0a 20 20 69 66 28 20 74 68 72 65 61 64  ADS.  if( thread
5a60: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
5a70: 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20  ersLocks<0 ){.  
5a80: 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b    testThreadLock
5a90: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b  ingBehavior(fd);
5aa0: 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20  .  }.  key1.tid 
5ab0: 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  = threadsOverrid
5ac0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
5ad0: 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73   ? 0 : pthread_s
5ae0: 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  elf();.#endif.  
5af0: 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c  memset(&key2, 0,
5b00: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
5b10: 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61    key2.dev = sta
5b20: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
5b30: 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey2.ino = statbu
5b40: 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63  f.st_ino;.  pLoc
5b50: 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b  k = (struct lock
5b60: 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61 73  Info*)sqlite3Has
5b70: 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c  hFind(&lockHash,
5b80: 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b   &key1, sizeof(k
5b90: 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f  ey1));.  if( pLo
5ba0: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ck==0 ){.    str
5bb0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f  uct lockInfo *pO
5bc0: 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20  ld;.    pLock = 
5bd0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
5be0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5bf0: 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 69  *pLock) );.    i
5c00: 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  f( pLock==0 ){. 
5c10: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
5c20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
5c30: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d  dlockinfo;.    }
5c40: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20  .    pLock->key 
5c50: 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f 63  = key1;.    pLoc
5c60: 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  k->nRef = 1;.   
5c70: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b   pLock->cnt = 0;
5c80: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
5c90: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f  type = 0;.    pO
5ca0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
5cb0: 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68  Insert(&lockHash
5cc0: 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73  , &pLock->key, s
5cd0: 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c 6f  izeof(key1), pLo
5ce0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ck);.    if( pOl
5cf0: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  d!=0 ){.      as
5d00: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f 63  sert( pOld==pLoc
5d10: 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  k );.      sqlit
5d20: 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65  e3ThreadSafeFree
5d30: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  (pLock);.      r
5d40: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
5d50: 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  o exit_findlocki
5d60: 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  nfo;.    }.  }el
5d70: 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  se{.    pLock->n
5d80: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
5d90: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
5da0: 69 66 28 20 70 70 4f 70 65 6e 21 3d 30 20 29 7b  if( ppOpen!=0 ){
5db0: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 28 73 74  .    pOpen = (st
5dc0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73 71  ruct openCnt*)sq
5dd0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6f  lite3HashFind(&o
5de0: 70 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c 20  penHash, &key2, 
5df0: 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20  sizeof(key2));. 
5e00: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
5e10: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5e20: 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a 20  openCnt *pOld;. 
5e30: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c       pOpen = sql
5e40: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61  ite3ThreadSafeMa
5e50: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4f  lloc( sizeof(*pO
5e60: 70 65 6e 29 20 29 3b 0a 20 20 20 20 20 20 69 66  pen) );.      if
5e70: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
5e80: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
5e90: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
5ea0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
5eb0: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5ec0: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 65      }.      pOpe
5ee0: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
5ef0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66       pOpen->nRef
5f00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65   = 1;.      pOpe
5f10: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
5f20: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
5f30: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
5f40: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
5f50: 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c 64 20 3d   0;.      pOld =
5f60: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
5f70: 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70  rt(&openHash, &p
5f80: 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Open->key, sizeo
5f90: 66 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b  f(key2), pOpen);
5fa0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 21  .      if( pOld!
5fb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5fc0: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
5fd0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n );.        sql
5fe0: 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
5ff0: 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20  ee(pOpen);.     
6000: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
6010: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
6020: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
6030: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e     goto exit_fin
6040: 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20  dlockinfo;.     
6050: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6060: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b      pOpen->nRef+
6070: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  +;.    }.    *pp
6080: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20  Open = pOpen;.  
6090: 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  }..exit_findlock
60a0: 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72  info:.  return r
60b0: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
60c0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
60d0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
60e0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74  for printing out
60f0: 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69   trace informati
6100: 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e  on from debuggin
6110: 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54  g.** binaries. T
6120: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
6130: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74 61  string represeta
6140: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
6150: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
6160: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
6170: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6180: 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69 6e  *locktypeName(in
6190: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73  t locktype){.  s
61a0: 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20  witch( locktype 
61b0: 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43  ){.  case NO_LOC
61c0: 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22  K: return "NONE"
61d0: 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45 44 5f  ;.  case SHARED_
61e0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
61f0: 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20 52 45  ARED";.  case RE
6200: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SERVED_LOCK: ret
6210: 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a  urn "RESERVED";.
6220: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
6230: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
6240: 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20 45 58  DING";.  case EX
6250: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
6260: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
6270: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
6280: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
6290: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
62a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  e currently in a
62b0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
62c0: 64 20 74 68 61 6e 20 74 68 65 20 74 68 72 65 61  d than the threa
62d0: 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 75 6e  d that the.** un
62e0: 69 78 46 69 6c 65 20 61 72 67 75 6d 65 6e 74 20  ixFile argument 
62f0: 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74 68 65 6e  belongs to, then
6300: 20 74 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73   transfer owners
6310: 68 69 70 20 6f 66 20 74 68 65 20 75 6e 69 78 46  hip of the unixF
6320: 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 74  ile.** over to t
6330: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
6340: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e 69 78 46  d..**.** A unixF
6350: 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f 77 6e 65  ile is only owne
6360: 64 20 62 79 20 61 20 74 68 72 65 61 64 20 6f 6e  d by a thread on
6370: 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6f   systems where o
6380: 6e 65 20 74 68 72 65 61 64 20 69 73 0a 2a 2a 20  ne thread is.** 
6390: 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65 72 72 69  unable to overri
63a0: 64 65 20 6c 6f 63 6b 73 20 63 72 65 61 74 65 64  de locks created
63b0: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
63c0: 74 68 72 65 61 64 2e 20 20 52 65 64 48 61 74 39  thread.  RedHat9
63d0: 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61 6d 70 6c   is.** an exampl
63e0: 65 20 6f 66 20 73 75 63 68 20 61 20 73 79 73 74  e of such a syst
63f0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e 65 72 73  em..**.** Owners
6400: 68 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20  hip transfer is 
6410: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 69 66 20  only allowed if 
6420: 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73 20  the unixFile is 
6430: 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
6440: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 75 6e  ed..** If the un
6450: 69 78 46 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  ixFile is locked
6460: 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72 73 68 69   and an ownershi
6470: 70 20 69 73 20 77 72 6f 6e 67 2c 20 74 68 65 6e  p is wrong, then
6480: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
6490: 45 5f 4d 49 53 55 53 45 2e 20 20 53 51 4c 49 54  E_MISUSE.  SQLIT
64a0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
64b0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
64c0: 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  orks..*/.#ifdef 
64d0: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
64e0: 41 44 53 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ADS.static int t
64f0: 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70  ransferOwnership
6500: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
6510: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
6520: 74 68 72 65 61 64 5f 74 20 68 53 65 6c 66 3b 0a  thread_t hSelf;.
6530: 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65    if( threadsOve
6540: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
6550: 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  ocks ){.    /* O
6560: 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65  wnership transfe
6570: 72 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e  rs not needed on
6580: 20 74 68 69 73 20 73 79 73 74 65 6d 20 2a 2f 0a   this system */.
6590: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
65a0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68 53 65 6c  E_OK;.  }.  hSel
65b0: 66 20 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66  f = pthread_self
65c0: 28 29 3b 0a 20 20 69 66 28 20 70 74 68 72 65 61  ();.  if( pthrea
65d0: 64 5f 65 71 75 61 6c 28 70 46 69 6c 65 2d 3e 74  d_equal(pFile->t
65e0: 69 64 2c 20 68 53 65 6c 66 29 20 29 7b 0a 20 20  id, hSelf) ){.  
65f0: 20 20 2f 2a 20 57 65 20 61 72 65 20 73 74 69 6c    /* We are stil
6600: 6c 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 68  l in the same th
6610: 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f 53 54 52  read */.    OSTR
6620: 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e 73 66 65  ACE1("No-transfe
6630: 72 2c 20 73 61 6d 65 20 74 68 72 65 61 64 5c 6e  r, same thread\n
6640: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
6650: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
6660: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
6670: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ype!=NO_LOCK ){.
6680: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74      /* We cannot
6690: 20 63 68 61 6e 67 65 20 6f 77 6e 65 72 73 68 69   change ownershi
66a0: 70 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 68  p while we are h
66b0: 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 21 20 2a  olding a lock! *
66c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
66d0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
66e0: 20 20 4f 53 54 52 41 43 45 34 28 22 54 72 61 6e    OSTRACE4("Tran
66f0: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
6700: 66 20 25 64 20 66 72 6f 6d 20 25 64 20 74 6f 20  f %d from %d to 
6710: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
6720: 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
6730: 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b  le->tid, hSelf);
6740: 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20  .  pFile->tid = 
6750: 68 53 65 6c 66 3b 0a 20 20 69 66 20 28 70 46 69  hSelf;.  if (pFi
6760: 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c  le->pLock != NUL
6770: 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  L) {.    release
6780: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
6790: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  pLock);.    rc =
67a0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46   findLockInfo(pF
67b0: 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c 65 2d 3e  ile->h, &pFile->
67c0: 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 4f  pLock, 0);.    O
67d0: 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
67e0: 20 25 64 20 69 73 20 6e 6f 77 20 25 73 28 25 73   %d is now %s(%s
67f0: 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ,%d)\n", pFile->
6800: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
6810: 63 6b 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65  cktypeName(pFile
6820: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20  ->locktype),.   
6830: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
6840: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 4c 6f 63  Name(pFile->pLoc
6850: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 46  k->locktype), pF
6860: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 29  ile->pLock->cnt)
6870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
6880: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
6890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
68a0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20  ;.  }.}.#else.  
68b0: 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d 74 68 72  /* On single-thr
68c0: 65 61 64 65 64 20 62 75 69 6c 64 73 2c 20 6f 77  eaded builds, ow
68d0: 6e 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72  nership transfer
68e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f 0a 23   is a no-op */.#
68f0: 20 64 65 66 69 6e 65 20 74 72 61 6e 73 66 65 72   define transfer
6900: 4f 77 6e 65 72 73 68 69 70 28 58 29 20 53 51 4c  Ownership(X) SQL
6910: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
6920: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
6930: 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e  named file.*/.in
6940: 74 20 73 71 6c 69 74 65 33 55 6e 69 78 44 65 6c  t sqlite3UnixDel
6950: 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ete(const char *
6960: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 53 69  zFilename){.  Si
6970: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
6980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6990: 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 75 6e 6c  R_DELETE);.  unl
69a0: 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
69b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
69d0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
69e0: 6e 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74  named file exist
69f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
6a00: 33 55 6e 69 78 46 69 6c 65 45 78 69 73 74 73 28  3UnixFileExists(
6a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
6a20: 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  ename){.  return
6a30: 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d   access(zFilenam
6a40: 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20  e, 0)==0;.}../* 
6a50: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
6a60: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
6a70: 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  t allocateUnixFi
6a80: 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20  le(.  int h,    
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
6ab0: 6f 72 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  or of the open f
6ac0: 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  ile */.  OsFile 
6ad0: 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20 20  **pId,          
6ae0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
6af0: 72 65 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  real file descri
6b00: 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63  ptor here */.  c
6b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
6b20: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  name,    /* Name
6b30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
6b40: 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
6b50: 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20 20  nt delFlag      
6b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
6b70: 72 75 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  rue, make sure t
6b80: 68 65 20 66 69 6c 65 20 64 65 6c 65 74 65 73 20  he file deletes 
6b90: 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 29 3b 0a 0a  on close */.);..
6ba0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
6bb0: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72   open a file for
6bc0: 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
6bd0: 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74  d writing.  If t
6be0: 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72  hat.** fails, tr
6bf0: 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61  y opening it rea
6c00: 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20  d-only.  If the 
6c10: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
6c20: 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63  ist,.** try to c
6c30: 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  reate it..**.** 
6c40: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61  On success, a ha
6c50: 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65  ndle for the ope
6c60: 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74 65  n file is writte
6c70: 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20  n to *id.** and 
6c80: 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65  *pReadonly is se
6c90: 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66 69  t to 0 if the fi
6ca0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f  le was opened fo
6cb0: 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a  r reading and.**
6cc0: 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66   writing or 1 if
6cd0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
6ce0: 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
6cf0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
6d00: 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
6d10: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
6d20: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
6d30: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
6d40: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
6d50: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64  eaves.** *id and
6d60: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68   *pReadonly unch
6d70: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
6d80: 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 52 65 61  lite3UnixOpenRea
6d90: 64 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20  dWrite(.  const 
6da0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
6db0: 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c  .  OsFile **pId,
6dc0: 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c  .  int *pReadonl
6dd0: 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y.){.  int h;.  
6de0: 0a 20 20 43 52 41 53 48 5f 54 45 53 54 5f 4f 56  .  CRASH_TEST_OV
6df0: 45 52 52 49 44 45 28 73 71 6c 69 74 65 33 43 72  ERRIDE(sqlite3Cr
6e00: 61 73 68 4f 70 65 6e 52 65 61 64 57 72 69 74 65  ashOpenReadWrite
6e10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 49 64  , zFilename, pId
6e20: 2c 20 70 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20  , pReadonly);.  
6e30: 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20  assert( 0==*pId 
6e40: 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46  );.  h = open(zF
6e50: 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c  ilename, O_RDWR|
6e60: 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46  O_CREAT|O_LARGEF
6e70: 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20  ILE|O_BINARY,.  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
6ea0: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
6eb0: 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 68 3c  SIONS);.  if( h<
6ec0: 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53 44  0 ){.#ifdef EISD
6ed0: 49 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  IR.    if( errno
6ee0: 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20 20  ==EISDIR ){.    
6ef0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6f00: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a  CANTOPEN;.    }.
6f10: 23 65 6e 64 69 66 0a 20 20 20 20 68 20 3d 20 6f  #endif.    h = o
6f20: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  pen(zFilename, O
6f30: 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46  _RDONLY|O_LARGEF
6f40: 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20  ILE|O_BINARY);. 
6f50: 20 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20     if( h<0 ){.  
6f60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6f70: 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20  E_CANTOPEN; .   
6f80: 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c   }.    *pReadonl
6f90: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
6fa0: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
6fb0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6fc0: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
6fd0: 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e  e(h, pId, zFilen
6fe0: 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ame, 0);.}.../*.
6ff0: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
7000: 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f  en a new file fo
7010: 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
7020: 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ss by this proce
7030: 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ss..** The file 
7040: 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66  will be opened f
7050: 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
7060: 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f  and writing.  To
7070: 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65   avoid.** a pote
7080: 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 70  ntial security p
7090: 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f  roblem, we do no
70a0: 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  t allow the file
70b0: 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76   to have.** prev
70c0: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
70d0: 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77   Nor do we allow
70e0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
70f0: 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69  a symbolic.** li
7100: 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c  nk..**.** If del
7110: 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
7120: 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d  en make arrangem
7130: 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69  ents to automati
7140: 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20  cally delete.** 
7150: 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74  the file when it
7160: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
7170: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72  * On success, wr
7180: 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e  ite the file han
7190: 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64  dle into *id and
71a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
71b0: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
71c0: 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ure, return SQLI
71d0: 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a  TE_CANTOPEN..*/.
71e0: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f  int sqlite3UnixO
71f0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e  penExclusive(con
7200: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
7210: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  me, OsFile **pId
7220: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
7230: 20 20 69 6e 74 20 68 3b 0a 0a 20 20 43 52 41 53    int h;..  CRAS
7240: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
7250: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
7260: 45 78 63 6c 75 73 69 76 65 2c 20 7a 46 69 6c 65  Exclusive, zFile
7270: 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c 46 6c  name, pId, delFl
7280: 61 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  ag);.  assert( 0
7290: 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68 20 3d 20  ==*pId );.  h = 
72a0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a  open(zFilename,.
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
72d0: 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
72e0: 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42  |O_LARGEFILE|O_B
72f0: 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20 20  INARY,.         
7300: 20 20 20 20 20 20 20 64 65 6c 46 6c 61 67 20 3f         delFlag ?
7310: 20 30 36 30 30 20 3a 20 53 51 4c 49 54 45 5f 44   0600 : SQLITE_D
7320: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
7330: 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
7340: 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  h<0 ){.    retur
7350: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
7360: 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  N;.  }.  return 
7370: 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65  allocateUnixFile
7380: 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61  (h, pId, zFilena
7390: 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b 0a 7d 0a  me, delFlag);.}.
73a0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
73b0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
73c0: 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  e for read-only 
73d0: 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  access..**.** On
73e0: 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20   success, write 
73f0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
7400: 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74  into *id and ret
7410: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
7420: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
7430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7440: 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20  ANTOPEN..*/.int 
7450: 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 52  sqlite3UnixOpenR
7460: 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68  eadOnly(const ch
7470: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
7480: 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20  sFile **pId){.  
7490: 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43 52 41 53  int h;.  .  CRAS
74a0: 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28  H_TEST_OVERRIDE(
74b0: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
74c0: 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69 6c 65 6e  ReadOnly, zFilen
74d0: 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b 0a 20 20  ame, pId, 0);.  
74e0: 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64 20  assert( 0==*pId 
74f0: 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28 7a 46  );.  h = open(zF
7500: 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  ilename, O_RDONL
7510: 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f  Y|O_LARGEFILE|O_
7520: 42 49 4e 41 52 59 29 3b 0a 20 20 69 66 28 20 68  BINARY);.  if( h
7530: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
7540: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
7560: 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28  llocateUnixFile(
7570: 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d  h, pId, zFilenam
7580: 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, 0);.}../*.** 
7590: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
75a0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
75b0: 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74  r for the direct
75c0: 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
75d0: 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54 68  s a.** file.  Th
75e0: 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  is file descript
75f0: 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  or can be used t
7600: 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64 69  o fsync() the di
7610: 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f 72  rectory.** in or
7620: 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  der to make sure
7630: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
7640: 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 61   a new file is a
7650: 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 0a  ctually written.
7660: 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ** to disk..**.*
7670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7680: 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75  s only meaningfu
7690: 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74 20  l for Unix.  It 
76a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65 72  is a no-op under
76b0: 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e 63  .** windows sinc
76c0: 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  e windows does n
76d0: 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64 20  ot support hard 
76e0: 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  links..**.** If 
76f0: 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73 20 65 6e  FULL_FSYNC is en
7700: 61 62 6c 65 64 2c 20 74 68 69 73 20 66 75 6e 63  abled, this func
7710: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c 6f 6e 67  tion is not long
7720: 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a 2a 20 61  er useful, .** a
7730: 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73 79 6e 63   FULL_FSYNC sync
7740: 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20   applies to all 
7750: 70 65 6e 64 69 6e 67 20 64 69 73 6b 20 6f 70 65  pending disk ope
7760: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f  rations..**.** O
7770: 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e  n success, a han
7780: 64 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f  dle for a previo
7790: 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 61  usly open file a
77a0: 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70 64 61  t *id is.** upda
77b0: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 77  ted with the new
77c0: 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
77d0: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 53  descriptor and S
77e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72  QLITE_OK is.** r
77f0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  eturned..**.** O
7800: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66  n failure, the f
7810: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
7820: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
7830: 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69  and leaves.** *i
7840: 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  d unchanged..*/.
7850: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
7860: 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20 20  penDirectory(.  
7870: 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63 6f  OsFile *id,.  co
7880: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61  nst char *zDirna
7890: 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  me.){.  unixFile
78a0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
78b0: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
78c0: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  File==0 ){.    /
78d0: 2a 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68  * Do not open th
78e0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74  e directory if t
78f0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7900: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72   file is not alr
7910: 65 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  eady.    ** open
7920: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
7930: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
7940: 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48 52 45 41  .  }.  SET_THREA
7950: 44 49 44 28 70 46 69 6c 65 29 3b 0a 20 20 61 73  DID(pFile);.  as
7960: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 64 69 72  sert( pFile->dir
7970: 66 64 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d  fd<0 );.  pFile-
7980: 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44  >dirfd = open(zD
7990: 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
79a0: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
79b0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66   if( pFile->dirf
79c0: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
79d0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
79e0: 4e 3b 20 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  N; .  }.  OSTRAC
79f0: 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
7a00: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64   %s\n", pFile->d
7a10: 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b  irfd, zDirname);
7a20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7a30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
7a40: 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
7a50: 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
7a60: 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
7a70: 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a  e big enough to.
7a80: 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  ** hold at least
7a90: 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45   SQLITE_TEMPNAME
7aa0: 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65 72 73  _SIZE characters
7ab0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7ac0: 55 6e 69 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65  UnixTempFileName
7ad0: 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20  (char *zBuf){.  
7ae0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7af0: 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
7b00: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
7b10: 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
7b20: 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
7b30: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c  /tmp",.     ".",
7b40: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
7b50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7b60: 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
7b70: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
7b80: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
7b90: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
7ba0: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
7bb0: 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
7bc0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
7bd0: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
7be0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7bf0: 44 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44  Dir = ".";.  azD
7c00: 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
7c10: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
7c20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
7c30: 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
7c40: 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
7c50: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a  i++){.    if( az
7c60: 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Dirs[i]==0 ) con
7c70: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
7c80: 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26  tat(azDirs[i], &
7c90: 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
7ca0: 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
7cb0: 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
7cc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
7cd0: 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72 73  f( access(azDirs
7ce0: 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  [i], 07) ) conti
7cf0: 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  nue;.    zDir = 
7d00: 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62  azDirs[i];.    b
7d10: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a  reak;.  }.  do{.
7d20: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
7d30: 2c 20 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45  , "%s/"TEMP_FILE
7d40: 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
7d50: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
7d60: 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Buf);.    sqlite
7d70: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  3Randomness(15, 
7d80: 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
7d90: 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
7da0: 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
7db0: 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
7dc0: 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
7dd0: 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
7de0: 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
7df0: 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
7e00: 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d  zBuf[j] = 0;.  }
7e10: 77 68 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42  while( access(zB
7e20: 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
7e30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
7e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
7e50: 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61 74  that a given pat
7e60: 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65 63  hname is a direc
7e70: 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69 74  tory and is writ
7e80: 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  able .**.*/.int 
7e90: 73 71 6c 69 74 65 33 55 6e 69 78 49 73 44 69 72  sqlite3UnixIsDir
7ea0: 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a  Writable(char *z
7eb0: 42 75 66 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  Buf){.#ifndef SQ
7ec0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
7ed0: 50 52 41 47 4d 41 53 0a 20 20 73 74 72 75 63 74  PRAGMAS.  struct
7ee0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 66 28   stat buf;.  if(
7ef0: 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72   zBuf==0 ) retur
7f00: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75 66 5b  n 0;.  if( zBuf[
7f10: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  0]==0 ) return 0
7f20: 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a 42 75  ;.  if( stat(zBu
7f30: 66 2c 20 26 62 75 66 29 20 29 20 72 65 74 75 72  f, &buf) ) retur
7f40: 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f 49 53  n 0;.  if( !S_IS
7f50: 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  DIR(buf.st_mode)
7f60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7f70: 66 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 20  f( access(zBuf, 
7f80: 30 37 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  07) ) return 0;.
7f90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7fa0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
7fb0: 4d 41 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  MAS */.  return 
7fc0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  1;.}../*.** Seek
7fd0: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
7fe0: 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
7ff0: 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
8000: 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
8010: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8020: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
8030: 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
8040: 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a   the offset..*/.
8050: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
8060: 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
8070: 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *id, void *pBuf,
8080: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
8090: 20 67 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f   got;.  i64 newO
80a0: 66 66 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53  ffset;.  TIMER_S
80b0: 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65  TART;.#if define
80c0: 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67  d(USE_PREAD).  g
80d0: 6f 74 20 3d 20 70 72 65 61 64 28 69 64 2d 3e 68  ot = pread(id->h
80e0: 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d  , pBuf, cnt, id-
80f0: 3e 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20  >offset);.#elif 
8100: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
8110: 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  D64).  got = pre
8120: 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
8130: 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65  , cnt, id->offse
8140: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
8150: 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
8160: 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c  ->h, id->offset,
8170: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66   SEEK_SET);.  if
8180: 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 69 64 2d  ( newOffset!=id-
8190: 3e 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72  >offset ){.    r
81a0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
81b0: 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 68  got = read(id->h
81c0: 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
81d0: 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44  ndif.  TIMER_END
81e0: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 52 45  ;.  OSTRACE5("RE
81f0: 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
8200: 37 6c 6c 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e  7lld %d\n", id->
8210: 68 2c 20 67 6f 74 2c 20 69 64 2d 3e 6f 66 66 73  h, got, id->offs
8220: 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
8230: 44 29 3b 0a 20 20 69 66 28 20 67 6f 74 3e 30 20  D);.  if( got>0 
8240: 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66 66 73 65  ){.    id->offse
8250: 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20 20  t += got;.  }.  
8260: 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f  return got;.}../
8270: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
8280: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
8290: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
82a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
82b0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
82c0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
82d0: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
82e0: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
82f0: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
8300: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8310: 78 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64  xRead(OsFile *id
8320: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
8330: 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t amt){.  int go
8340: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
8350: 29 3b 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  );.  got = seekA
8360: 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
8370: 2a 29 69 64 2c 20 70 42 75 66 2c 20 61 6d 74 29  *)id, pBuf, amt)
8380: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
8390: 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
83a0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
83b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
83c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
83d0: 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
83e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
83f0: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65  IOERR_READ;.  }e
8400: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
8410: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
8420: 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
8430: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8440: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
8450: 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
8460: 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
8470: 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
8480: 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
8490: 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
84a0: 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
84b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
84c0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
84d0: 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
84e0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
84f0: 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75  t seekAndWrite(u
8500: 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e  nixFile *id, con
8510: 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  st void *pBuf, i
8520: 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
8530: 6f 74 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  ot;.  i64 newOff
8540: 73 65 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  set;.  TIMER_STA
8550: 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  RT;.#if defined(
8560: 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74  USE_PREAD).  got
8570: 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68 2c   = pwrite(id->h,
8580: 20 70 42 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e   pBuf, cnt, id->
8590: 6f 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64  offset);.#elif d
85a0: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
85b0: 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69  64).  got = pwri
85c0: 74 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  te64(id->h, pBuf
85d0: 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65  , cnt, id->offse
85e0: 74 29 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f  t);.#else.  newO
85f0: 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
8600: 2d 3e 68 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c  ->h, id->offset,
8610: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66   SEEK_SET);.  if
8620: 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 69 64 2d  ( newOffset!=id-
8630: 3e 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 72  >offset ){.    r
8640: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
8650: 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e  got = write(id->
8660: 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
8670: 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
8680: 44 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57  D;.  OSTRACE5("W
8690: 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
86a0: 25 37 6c 6c 64 20 25 64 5c 6e 22 2c 20 69 64 2d  %7lld %d\n", id-
86b0: 3e 68 2c 20 67 6f 74 2c 20 69 64 2d 3e 6f 66 66  >h, got, id->off
86c0: 73 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  set, TIMER_ELAPS
86d0: 45 44 29 3b 0a 20 20 69 66 28 20 67 6f 74 3e 30  ED);.  if( got>0
86e0: 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6f 66 66 73   ){.    id->offs
86f0: 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20  et += got;.  }. 
8700: 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a   return got;.}..
8710: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
8720: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
8730: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
8740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
8750: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
8760: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
8770: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
8780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8790: 75 6e 69 78 57 72 69 74 65 28 4f 73 46 69 6c 65  unixWrite(OsFile
87a0: 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64   *id, const void
87b0: 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29   *pBuf, int amt)
87c0: 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  {.  int wrote = 
87d0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
87e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
87f0: 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
8800: 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d  mt>0 && (wrote =
8810: 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 28 75   seekAndWrite((u
8820: 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 70 42 75  nixFile*)id, pBu
8830: 66 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20  f, amt))>0 ){.  
8840: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
8850: 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
8860: 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
8870: 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
8880: 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
8890: 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
88a0: 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
88b0: 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
88c0: 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69  0, amt=1 ));.  i
88d0: 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
88e0: 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20  if( wrote<0 ){. 
88f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8900: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
8910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
8930: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
8940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8950: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  K;.}../*.** Move
8960: 20 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20   the read/write 
8970: 70 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c  pointer in a fil
8980: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8990: 20 75 6e 69 78 53 65 65 6b 28 4f 73 46 69 6c 65   unixSeek(OsFile
89a0: 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
89b0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  ){.  assert( id 
89c0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
89d0: 5f 54 45 53 54 0a 20 20 69 66 28 20 6f 66 66 73  _TEST.  if( offs
89e0: 65 74 20 29 20 53 69 6d 75 6c 61 74 65 44 69 73  et ) SimulateDis
89f0: 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
8a00: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
8a10: 23 65 6e 64 69 66 0a 20 20 28 28 75 6e 69 78 46  #endif.  ((unixF
8a20: 69 6c 65 2a 29 69 64 29 2d 3e 6f 66 66 73 65 74  ile*)id)->offset
8a30: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
8a40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8a50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8a60: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
8a70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
8a80: 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
8a90: 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
8aa0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
8ab0: 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
8ac0: 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
8ad0: 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
8ae0: 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
8af0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
8b00: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
8b10: 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
8b20: 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
8b30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74  dif../*.** Use t
8b40: 68 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 41  he fdatasync() A
8b50: 50 49 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 48  PI only if the H
8b60: 41 56 45 5f 46 44 41 54 41 53 59 4e 43 20 6d 61  AVE_FDATASYNC ma
8b70: 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  cro is defined..
8b80: 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  ** Otherwise use
8b90: 20 66 73 79 6e 63 28 29 20 69 6e 20 69 74 73 20   fsync() in its 
8ba0: 70 6c 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  place..*/.#ifnde
8bb0: 66 20 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  f HAVE_FDATASYNC
8bc0: 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
8bd0: 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
8be0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
8bf0: 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
8c00: 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
8c10: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
8c20: 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
8c30: 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
8c40: 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
8c50: 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
8c60: 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
8c70: 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
8c80: 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
8c90: 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
8ca0: 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
8cb0: 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
8cc0: 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
8cd0: 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
8ce0: 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
8cf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
8d00: 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
8d10: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
8d20: 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
8d30: 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
8d40: 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
8d50: 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
8d60: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
8d70: 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
8d80: 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
8d90: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
8da0: 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
8db0: 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
8dc0: 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
8dd0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
8de0: 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
8df0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
8e00: 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
8e10: 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
8e20: 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
8e30: 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
8e40: 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
8e50: 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
8e60: 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
8e70: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
8e80: 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
8e90: 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
8ea0: 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
8eb0: 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
8ec0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
8ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75  */.static int fu
8ee0: 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c  ll_fsync(int fd,
8ef0: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69   int fullSync, i
8f00: 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20  nt dataOnly){.  
8f10: 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  int rc;..  /* Re
8f20: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
8f30: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
8f40: 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
8f50: 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
8f60: 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
8f70: 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
8f80: 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
8f90: 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
8fa0: 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
8fb0: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
8fc0: 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
8fd0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
8fe0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
8ff0: 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
9000: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
9010: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
9020: 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
9030: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
9040: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
9050: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
9060: 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
9070: 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
9080: 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
9090: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
90a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
90b0: 23 65 6c 73 65 0a 0a 23 69 66 20 48 41 56 45 5f  #else..#if HAVE_
90c0: 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20  FULLFSYNC.  if( 
90d0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
90e0: 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46  rc = fcntl(fd, F
90f0: 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
9100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
9110: 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
9120: 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
9130: 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
9140: 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
9150: 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20  n fsync()..   * 
9160: 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
9170: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
9180: 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
9190: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20  n the local .   
91a0: 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
91b0: 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
91c0: 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
91d0: 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a  t FULLFSYNC.   *
91e0: 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
91f0: 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
9200: 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
9210: 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 20  pt an fsync .   
9220: 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
9230: 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
9240: 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
9250: 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
9260: 20 20 0a 20 20 20 2a 20 49 74 27 64 20 62 65 20    .   * It'd be 
9270: 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
9280: 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
9290: 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
92a0: 64 20 0a 20 20 20 2a 20 74 68 65 20 66 63 6e 74  d .   * the fcnt
92b0: 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
92c0: 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
92d0: 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  ..   */.  if( rc
92e0: 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
92f0: 29 3b 0a 0a 23 65 6c 73 65 20 0a 20 20 69 66 28  );..#else .  if(
9300: 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20   dataOnly ){.   
9310: 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28   rc = fdatasync(
9320: 66 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fd);.  }else{.  
9330: 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
9340: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
9350: 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a  HAVE_FULLFSYNC *
9360: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
9370: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
9380: 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  NC) */..  return
9390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
93a0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
93b0: 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
93c0: 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
93d0: 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
93e0: 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79  *.** If dataOnly
93f0: 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68  ==0 then both th
9400: 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e  e file itself an
9410: 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28  d its metadata (
9420: 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63  file.** size, ac
9430: 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20  cess time, etc) 
9440: 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20  are synced.  If 
9450: 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e  dataOnly!=0 then
9460: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c   only the.** fil
9470: 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  e data is synced
9480: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
9490: 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
94a0: 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
94b0: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
94c0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
94d0: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
94e0: 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
94f0: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
9500: 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
9510: 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
9520: 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
9530: 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
9540: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
9550: 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
9560: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
9570: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
9580: 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
9590: 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
95a0: 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
95b0: 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
95c0: 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
95d0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
95e0: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
95f0: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
9600: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
9610: 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
9620: 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
9630: 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
9640: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
9650: 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
9660: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
9670: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
9680: 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 4f 73   int unixSync(Os
9690: 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 64 61  File *id, int da
96a0: 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  taOnly){.  int r
96b0: 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
96c0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
96d0: 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
96e0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
96f0: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
9700: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
9710: 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
9720: 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  nc(pFile->h, pFi
9730: 6c 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61  le->fullSync, da
9740: 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
9750: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
9760: 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
9770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9780: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20  E_IOERR_FSYNC;. 
9790: 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
97a0: 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20  dirfd>=0 ){.    
97b0: 4f 53 54 52 41 43 45 34 28 22 44 49 52 53 59 4e  OSTRACE4("DIRSYN
97c0: 43 20 25 2d 33 64 20 28 68 61 76 65 5f 66 75 6c  C %-3d (have_ful
97d0: 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
97e0: 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
97f0: 2d 3e 64 69 72 66 64 2c 0a 20 20 20 20 20 20 20  ->dirfd,.       
9800: 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
9810: 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c  YNC, pFile->full
9820: 53 79 6e 63 29 3b 0a 23 69 66 6e 64 65 66 20 53  Sync);.#ifndef S
9830: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
9840: 52 53 59 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65  RSYNC.    /* The
9850: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
9860: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
9870: 64 20 69 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20  d if full_fsync 
9880: 69 73 0a 20 20 20 20 2a 2a 20 74 75 72 6e 65 64  is.    ** turned
9890: 20 6f 66 66 20 6f 72 20 75 6e 61 76 61 69 6c 61   off or unavaila
98a0: 62 6c 65 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f  ble.  If a full_
98b0: 66 73 79 6e 63 20 6f 63 63 75 72 72 65 64 20 61  fsync occurred a
98c0: 62 6f 76 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  bove,.    ** the
98d0: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
98e0: 73 79 6e 63 20 69 73 20 73 75 70 65 72 66 6c 75  sync is superflu
98f0: 6f 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ous..    */.    
9900: 69 66 28 20 28 21 48 41 56 45 5f 46 55 4c 4c 46  if( (!HAVE_FULLF
9910: 53 59 4e 43 20 7c 7c 20 21 70 46 69 6c 65 2d 3e  SYNC || !pFile->
9920: 66 75 6c 6c 53 79 6e 63 29 20 26 26 20 66 75 6c  fullSync) && ful
9930: 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64  l_fsync(pFile->d
9940: 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20  irfd,0,0) ){.   
9950: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a      /*.       **
9960: 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76 65   We have receive
9970: 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 72  d multiple repor
9980: 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72 65  ts of fsync() re
9990: 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a  turning.       *
99a0: 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61 70  * errors when ap
99b0: 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74 6f  plied to directo
99c0: 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e 20  ries on certain 
99d0: 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20 20  file systems..  
99e0: 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65 64       ** A failed
99f0: 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20   directory sync 
9a00: 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65 61  is not a big dea
9a10: 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73 0a  l.  So it seems.
9a20: 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65 72         ** better
9a30: 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 65   to ignore the e
9a40: 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23 31  rror.  Ticket #1
9a50: 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  657.       */.  
9a60: 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53       /* return S
9a70: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a  QLITE_IOERR; */.
9a80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9a90: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
9aa0: 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e  rfd);  /* Only n
9ab0: 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
9ac0: 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  , so close the d
9ad0: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
9ae0: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
9af0: 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65  1;    /* when we
9b00: 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20   are done. */.  
9b10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9b20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9b30: 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
9b40: 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73  y zDirname. This
9b50: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f   is a no-op on o
9b60: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
9b70: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55   other.** than U
9b80: 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  NIX..**.** This 
9b90: 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
9ba0: 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20  sure the master 
9bb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
9bc0: 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c   truely been del
9bd0: 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d  eted.** before m
9be0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
9bf0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
9c00: 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d  nals on a multi-
9c10: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e  database commit.
9c20: 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53  .** The F_FULLFS
9c30: 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  YNC option is no
9c40: 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a  t needed here..*
9c50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
9c60: 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63  xSyncDirectory(c
9c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
9c80: 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
9c90: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
9ca0: 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  YNC.  return SQL
9cb0: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
9cc0: 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b  int fd;.  int r;
9cd0: 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69  .  fd = open(zDi
9ce0: 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
9cf0: 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
9d00: 4f 53 54 52 41 43 45 33 28 22 44 49 52 53 59 4e  OSTRACE3("DIRSYN
9d10: 43 20 25 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20  C %-3d (%s)\n", 
9d20: 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20  fd, zDirname);. 
9d30: 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
9d40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d50: 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20  ANTOPEN; .  }.  
9d60: 72 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  r = fsync(fd);. 
9d70: 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 53 69   close(fd);.  Si
9d80: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
9d90: 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 20 29 7b  =1 );.  if( r ){
9da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9db0: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
9dc0: 4e 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NC;.  }else{.   
9dd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9de0: 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  K;.  }.#endif.}.
9df0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
9e00: 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
9e10: 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
9e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
9e30: 6e 69 78 54 72 75 6e 63 61 74 65 28 4f 73 46 69  nixTruncate(OsFi
9e40: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
9e50: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
9e60: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
9e70: 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28 28  rc = ftruncate((
9e80: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
9e90: 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d  h, nByte);.  Sim
9ea0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
9eb0: 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =1 );.  if( rc )
9ec0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9ed0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
9ee0: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
9ef0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f00: 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
9f10: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
9f20: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
9f30: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
9f40: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9f50: 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20  FileSize(OsFile 
9f60: 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  *id, i64 *pSize)
9f70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
9f80: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
9f90: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
9fa0: 20 72 63 20 3d 20 66 73 74 61 74 28 28 28 75 6e   rc = fstat(((un
9fb0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
9fc0: 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
9fd0: 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
9fe0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
9ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a000: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
a010: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62    }.  *pSize = b
a020: 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65  uf.st_size;.  re
a030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a040: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
a050: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
a060: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
a070: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
a080: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
a090: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
a0a0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
a0b0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
a0c0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
a0d0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
a0e0: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
a0f0: 20 75 6e 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c   unlocked or hol
a100: 64 73 20 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c  ds only SHARED l
a110: 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  ocks, then.** re
a120: 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
a130: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65  atic int unixChe
a140: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
a150: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
a160: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
a170: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
a180: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  ixFile*)id;..  a
a190: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
a1a0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
a1b0: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
a1c0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  use pFile->pLock
a1d0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
a1e0: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
a1f0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
a200: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
a210: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
a220: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
a230: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
a240: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
a250: 43 4b 20 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b  CK ){.    r = 1;
a260: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
a270: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
a280: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
a290: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  olds it..  */.  
a2a0: 69 66 28 20 21 72 20 29 7b 0a 20 20 20 20 73 74  if( !r ){.    st
a2b0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
a2c0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
a2d0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
a2e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
a2f0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
a300: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
a310: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
a320: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
a330: 20 20 20 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d      fcntl(pFile-
a340: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
a350: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ck);.    if( loc
a360: 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
a370: 4b 20 29 7b 0a 20 20 20 20 20 20 72 20 3d 20 31  K ){.      r = 1
a380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
a390: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
a3a0: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
a3b0: 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E3("TEST WR-LOCK
a3c0: 20 25 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65   %d %d\n", pFile
a3d0: 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75  ->h, r);..  retu
a3e0: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn r;.}../*.** L
a3f0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
a400: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
a410: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
a420: 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
a430: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
a440: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
a450: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
a460: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
a470: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
a480: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
a490: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
a4a0: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
a4b0: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
a4c0: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
a4d0: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
a4e0: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
a4f0: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
a500: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
a510: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
a520: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
a530: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
a540: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
a550: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
a560: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
a570: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
a580: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
a590: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
a5a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
a5b0: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
a5c0: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
a5d0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
a5e0: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
a5f0: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
a600: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
a610: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
a620: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
a630: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a640: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
a650: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
a660: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
a670: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a680: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
a690: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
a6a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
a6b0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
a6c0: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
a6d0: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
a6e0: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
a6f0: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
a700: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
a710: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
a720: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
a730: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20  locktype){.  /* 
a740: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
a750: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
a760: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
a770: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
a780: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
a790: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
a7a0: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
a7b0: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
a7c0: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
a7d0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
a7e0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
a7f0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
a800: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
a810: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
a820: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
a830: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
a840: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
a850: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
a860: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
a870: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
a880: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
a890: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
a8a0: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
a8b0: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
a8c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
a8d0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
a8e0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
a8f0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
a900: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
a910: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
a920: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
a930: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
a940: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
a950: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
a960: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a970: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
a980: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
a990: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
a9a0: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
a9b0: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
a9c0: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
a9d0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
a9e0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
a9f0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
aa00: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
aa10: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
aa20: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
aa30: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
aa40: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
aa50: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
aa60: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
aa70: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
aa80: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
aa90: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
aaa0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
aab0: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
aac0: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
aad0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
aae0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
aaf0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
ab00: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
ab10: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
ab20: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
ab30: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
ab40: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
ab50: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
ab60: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
ab70: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
ab80: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
ab90: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
aba0: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
abb0: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
abc0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
abd0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
abe0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
abf0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
ac00: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
ac10: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
ac20: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
ac30: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
ac40: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
ac50: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
ac60: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
ac70: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
ac80: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
ac90: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aca0: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
acb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
acc0: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
acd0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
ace0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
acf0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
ad00: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
ad10: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
ad20: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
ad30: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
ad40: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
ad50: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
ad60: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
ad70: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
ad80: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
ad90: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
ada0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
adb0: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
adc0: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
add0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
ade0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
adf0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
ae00: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
ae10: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
ae20: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
ae30: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
ae40: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
ae50: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
ae60: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
ae70: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
ae80: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
ae90: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
aea0: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
aeb0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
aec0: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
aed0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
aee0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
aef0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
af00: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
af10: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
af20: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
af30: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
af40: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
af50: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
af60: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
af70: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
af80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
af90: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
afa0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
afb0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
afc0: 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c  fo *pLock = pFil
afd0: 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  e->pLock;.  stru
afe0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
aff0: 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73 65 72   int s;..  asser
b000: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
b010: 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20  TRACE7("LOCK    
b020: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
b030: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
b040: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c  File->h,.      l
b050: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
b060: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
b070: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
b080: 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  ype),.      lock
b090: 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e  typeName(pLock->
b0a0: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b  locktype), pLock
b0b0: 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29  ->cnt , getpid()
b0c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
b0d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
b0e0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
b0f0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
b100: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
b110: 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
b120: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
b130: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
b140: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
b150: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
b160: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
b170: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
b180: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
b190: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
b1a0: 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
b1b0: 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E3("LOCK    %d %
b1c0: 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
b1d0: 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ld)\n", pFile->h
b1e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ,.            lo
b1f0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
b200: 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ype));.    retur
b210: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
b220: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
b230: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
b240: 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
b250: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b260: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
b270: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
b280: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b290: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
b2a0: 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
b2b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b2c0: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
b2d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
b2e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
b2f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
b300: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
b310: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
b320: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
b330: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
b340: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 73 71  hreads.  */.  sq
b350: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
b360: 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  x();..  /* Make 
b370: 73 75 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  sure the current
b380: 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65   thread owns the
b390: 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72   pFile..  */.  r
b3a0: 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  c = transferOwne
b3b0: 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20  rship(pFile);.  
b3c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b3d0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
b3e0: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
b3f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
b400: 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69   }.  pLock = pFi
b410: 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a  le->pLock;..  /*
b420: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
b430: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
b440: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
b450: 64 69 66 66 65 72 65 6e 74 20 4f 73 46 69 6c 65  different OsFile
b460: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
b470: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
b480: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
b490: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
b4a0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
b4b0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b  >locktype!=pLock
b4c0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20  ->locktype && . 
b4d0: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d           (pLock-
b4e0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
b4f0: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NG_LOCK || lockt
b500: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ype>SHARED_LOCK)
b510: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
b520: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b530: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b540: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
b550: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
b560: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
b570: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b580: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
b590: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
b5a0: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
b5b0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
b5c0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
b5d0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
b5e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
b5f0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b600: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b610: 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b  && .      (pLock
b620: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
b630: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
b640: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
b650: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
b660: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
b670: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b680: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b690: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
b6a0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b6b0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
b6c0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
b6d0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b6e0: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  CK;.    pLock->c
b6f0: 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d  nt++;.    pFile-
b700: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b710: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b720: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e  ck;.  }..  lock.
b730: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c  l_len = 1L;..  l
b740: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
b750: 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41  EEK_SET;..  /* A
b760: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
b770: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
b780: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
b790: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
b7a0: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
b7b0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
b7c0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
b7d0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
b7e0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
b7f0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
b800: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
b810: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
b820: 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70       || (locktyp
b830: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
b840: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
b850: 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  type<PENDING_LOC
b860: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
b870: 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74  .l_type = (lockt
b880: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b890: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
b8a0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
b8b0: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
b8c0: 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  TE;.    s = fcnt
b8d0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
b8e0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
b8f0: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a   if( s==(-1) ){.
b900: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
b910: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
b920: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
b930: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67  TE_BUSY;.      g
b940: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
b950: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
b960: 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
b970: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
b980: 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
b990: 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
b9a0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
b9b0: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
b9c0: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
b9d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
b9e0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
b9f0: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
ba00: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20  ( pLock->cnt==0 
ba10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ba20: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
ba30: 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  0 );..    /* Now
ba40: 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
ba50: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
ba60: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ba70: 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  FIRST;.    lock.
ba80: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
ba90: 49 5a 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  IZE;.    s = fcn
baa0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
bab0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20  ETLK, &lock);.. 
bac0: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
bad0: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
bae0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
baf0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
bb00: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
bb10: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
bb20: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
bb30: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
bb40: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
bb50: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
bb60: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )!=0 ){.      rc
bb70: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
bb80: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
bb90: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
bba0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f  ppen */.      go
bbb0: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
bbc0: 20 7d 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d   }.    if( s==(-
bbd0: 31 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  1) ){.      rc =
bbe0: 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29   (errno==EINVAL)
bbf0: 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20   ? SQLITE_NOLFS 
bc00: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
bc10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
bc30: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
bc40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65       pFile->pOpe
bc50: 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
bc60: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31    pLock->cnt = 1
bc70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
bc80: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
bc90: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
bca0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a  pLock->cnt>1 ){.
bcb0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
bcc0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
bcd0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
bce0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
bcf0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
bd00: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
bd10: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
bd20: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
bd30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
bd40: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
bd50: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
bd60: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
bd70: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
bd80: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
bd90: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
bda0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
bdb0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
bdc0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
bdd0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
bde0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bdf0: 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   0!=pFile->lockt
be00: 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ype );.    lock.
be10: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
be20: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6c 6f  ;.    switch( lo
be30: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  cktype ){.      
be40: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
be50: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
be60: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
be70: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
be80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
be90: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
bea0: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
beb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bec0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
bed0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
bee0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
bef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf00: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
bf10: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
bf20: 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  }.    s = fcntl(
bf30: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bf40: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
bf50: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
bf60: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
bf70: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
bf80: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
bf90: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
bfa0: 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
bfb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
bfc0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
bfd0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
bfe0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
bff0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
c000: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
c010: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
c020: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  ){.    pFile->lo
c030: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
c040: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b  _LOCK;.    pLock
c050: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
c060: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
c070: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69  end_lock:.  sqli
c080: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
c090: 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c  );.  OSTRACE4("L
c0a0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 5c  OCK    %d %s %s\
c0b0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
c0c0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
c0d0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
c0e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
c0f0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
c100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c110: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
c120: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
c130: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
c140: 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  pFile to locktyp
c150: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
c160: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
c170: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
c180: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
c190: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
c1a0: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
c1b0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
c1c0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
c1d0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
c1e0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
c1f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c200: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
c210: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
c220: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
c230: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73  t locktype){.  s
c240: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
c250: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
c260: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
c270: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c280: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
c290: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
c2a0: 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
c2b0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c2c0: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c2d0: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c2e0: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
c2f0: 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a  e->h, locktype,.
c300: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
c310: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c  ktype, pFile->pL
c320: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ock->locktype, p
c330: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74  File->pLock->cnt
c340: 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20  , getpid());..  
c350: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
c360: 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
c370: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
c380: 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65  cktype<=locktype
c390: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c3a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
c3b0: 69 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44  if( CHECK_THREAD
c3c0: 49 44 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ID(pFile) ){.   
c3d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c3e0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
c3f0: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
c400: 28 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46  ();.  pLock = pF
c410: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73  ile->pLock;.  as
c420: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
c430: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
c440: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  le->locktype>SHA
c450: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
c460: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c  assert( pLock->l
c470: 6f 63 6b 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e  ocktype==pFile->
c480: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
c490: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
c4a0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c4b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
c4c0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
c4d0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
c4e0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
c4f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
c500: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
c510: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
c520: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
c530: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69     if( fcntl(pFi
c540: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c550: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
c560: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
c570: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c580: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  pen */.        r
c590: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
c5a0: 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  _RDLOCK;.      }
c5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
c5c0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
c5d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
c5e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c5f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c600: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
c610: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
c620: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
c630: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
c640: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
c650: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
c660: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
c670: 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b   &lock)!=(-1) ){
c680: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  .      pLock->lo
c690: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
c6a0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
c6b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c6c0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
c6d0: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
c6e0: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
c6f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c700: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
c710: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
c720: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
c730: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
c740: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
c750: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
c760: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
c770: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
c780: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
c790: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
c7a0: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
c7b0: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
c7c0: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
c7d0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b      */.    pLock
c7e0: 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  ->cnt--;.    if(
c7f0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
c800: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
c810: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c820: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
c830: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
c840: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
c850: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
c860: 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 66   0L;.      if( f
c870: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
c880: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
c890: 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
c8a0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
c8b0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
c8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c8d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
c8e0: 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68  R_UNLOCK;  /* Th
c8f0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
c900: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
c910: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
c920: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
c930: 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
c940: 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
c950: 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
c960: 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
c970: 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
c980: 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
c990: 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
c9a0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
c9b0: 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
c9c0: 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
c9d0: 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
c9e0: 20 20 20 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c      pOpen = pFil
c9f0: 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f  e->pOpen;.    pO
ca00: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  pen->nLock--;.  
ca10: 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e 2d    assert( pOpen-
ca20: 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
ca30: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   if( pOpen->nLoc
ca40: 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e  k==0 && pOpen->n
ca50: 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20  Pending>0 ){.   
ca60: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ca70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e  for(i=0; i<pOpen
ca80: 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29  ->nPending; i++)
ca90: 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  {.        close(
caa0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
cab0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
cac0: 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61     free(pOpen->a
cad0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20  Pending);.      
cae0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20  pOpen->nPending 
caf0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 0;.      pOpen
cb00: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
cb10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
cb20: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
cb30: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  );.  pFile->lock
cb40: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
cb50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cb60: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
cb70: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
cb80: 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46  nt unixClose(OsF
cb90: 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e  ile **pId){.  un
cba0: 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
cbb0: 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20  ixFile*)*pId;.. 
cbc0: 20 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72   if( !id ) retur
cbd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  n SQLITE_OK;.  u
cbe0: 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20  nixUnlock(*pId, 
cbf0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  NO_LOCK);.  if( 
cc00: 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63  id->dirfd>=0 ) c
cc10: 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b  lose(id->dirfd);
cc20: 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d  .  id->dirfd = -
cc30: 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  1;.  sqlite3OsEn
cc40: 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69  terMutex();..  i
cc50: 66 28 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c  f( id->pOpen->nL
cc60: 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
cc70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
cc80: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
cc90: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
cca0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
ccb0: 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
ccc0: 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
ccd0: 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
cce0: 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
ccf0: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
cd00: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
cd10: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
cd20: 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
cd30: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
cd40: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   when.    ** the
cd50: 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
cd60: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
cd70: 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20    int *aNew;.   
cd80: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
cd90: 2a 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70  *pOpen = id->pOp
cda0: 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 72  en;.    aNew = r
cdb0: 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61  ealloc( pOpen->a
cdc0: 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d  Pending, (pOpen-
cdd0: 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a  >nPending+1)*siz
cde0: 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20 20 20  eof(int) );.    
cdf0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
ce00: 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c       /* If a mal
ce10: 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73 74 20  loc fails, just 
ce20: 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65  leak the file de
ce30: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20  scriptor */.    
ce40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70  }else{.      pOp
ce50: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61  en->aPending = a
ce60: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  New;.      pOpen
ce70: 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e  ->aPending[pOpen
ce80: 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64  ->nPending] = id
ce90: 2d 3e 68 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ->h;.      pOpen
cea0: 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20  ->nPending++;.  
ceb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
cec0: 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
ced0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
cee0: 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f  ks so we can clo
cef0: 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65  se the file imme
cf00: 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63  diately */.    c
cf10: 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d  lose(id->h);.  }
cf20: 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  .  releaseLockIn
cf30: 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  fo(id->pLock);. 
cf40: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
cf50: 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73  id->pOpen);..  s
cf60: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
cf70: 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70  ex();.  id->isOp
cf80: 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  en = 0;.  OSTRAC
cf90: 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
cfa0: 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f  \n", id->h);.  O
cfb0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
cfc0: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
cfd0: 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a  afeFree(id);.  *
cfe0: 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pId = 0;.  retur
cff0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d000: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d010: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
d020: 59 4c 45 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  YLE.#pragma mark
d030: 20 41 46 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a   AFP Support../*
d040: 0a 20 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b  . ** The afpLock
d050: 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63  ingContext struc
d060: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  ture contains al
d070: 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69  l afp lock speci
d080: 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79  fic state. */.ty
d090: 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
d0a0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
d0b0: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d0c0: 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
d0d0: 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
d0e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d0f0: 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  g sharedLockByte
d100: 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 50 61  ;.  char *filePa
d110: 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42  th;.};..struct B
d120: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
d130: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
d140: 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
d150: 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
d160: 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
d170: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
d180: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
d190: 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
d1a0: 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
d1b0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
d1c0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
d1d0: 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
d1e0: 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
d1f0: 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
d200: 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
d210: 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
d220: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
d230: 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
d240: 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
d250: 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
d260: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
d270: 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
d280: 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
d290: 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
d2c0: 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
d2d0: 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
d2e0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
d2f0: 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
d300: 46 53 43 54 4c 09 5f 49 4f 57 52 28 27 7a 27 2c  FSCTL._IOWR('z',
d310: 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
d320: 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
d330: 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * return 0 on su
d340: 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c  ccess, 1 on fail
d350: 75 72 65 2e 20 20 54 6f 20 6d 61 74 63 68 20 74  ure.  To match t
d360: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
d370: 68 65 20 0a 20 20 6e 6f 72 6d 61 6c 20 70 6f 73  he .  normal pos
d380: 69 78 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ix file locking 
d390: 28 75 73 65 64 20 69 6e 20 75 6e 69 78 4c 6f 63  (used in unixLoc
d3a0: 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 2c 20  k for example), 
d3b0: 77 65 20 73 68 6f 75 6c 64 20 0a 20 20 70 72 6f  we should .  pro
d3c0: 76 69 64 65 20 27 72 69 63 68 65 72 27 20 72 65  vide 'richer' re
d3d0: 74 75 72 6e 20 63 6f 64 65 73 20 2d 20 73 70 65  turn codes - spe
d3e0: 63 69 66 69 63 61 6c 6c 79 20 74 6f 20 64 69 66  cifically to dif
d3f0: 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
d400: 65 6e 0a 20 20 27 66 69 6c 65 20 62 75 73 79 27  en.  'file busy'
d410: 20 61 6e 64 20 27 66 69 6c 65 20 73 79 73 74 65   and 'file syste
d420: 6d 20 65 72 72 6f 72 27 20 72 65 73 75 6c 74 73  m error' results
d430: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 5f   */.static int _
d440: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
d450: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
d460: 6e 74 20 66 64 2c 20 75 6e 73 69 67 6e 65 64 20  nt fd, unsigned 
d470: 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
d480: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d490: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 69              unsi
d4a0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
d4b0: 65 6e 67 74 68 2c 20 69 6e 74 20 73 65 74 4c 6f  ength, int setLo
d4c0: 63 6b 46 6c 61 67 29 0a 7b 0a 20 20 73 74 72 75  ckFlag).{.  stru
d4d0: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
d4e0: 50 42 32 09 70 62 3b 0a 20 20 69 6e 74 20 20 20  PB2.pb;.  int   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75    err;.  .  pb.u
d510: 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c  nLockFlag = setL
d520: 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b  ockFlag ? 0 : 1;
d530: 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c  .  pb.startEndFl
d540: 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66  ag = 0;.  pb.off
d550: 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  set = offset;.  
d560: 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67  pb.length = leng
d570: 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 66  th; .  pb.fd = f
d580: 64 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 41  d;.  OSTRACE5("A
d590: 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67 20 6c  FPLOCK setting l
d5a0: 6f 63 6b 20 25 73 20 66 6f 72 20 25 64 20 69 6e  ock %s for %d in
d5b0: 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
d5c0: 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
d5d0: 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
d5e0: 22 29 2c 20 66 64 2c 20 6f 66 66 73 65 74 2c 20  "), fd, offset, 
d5f0: 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d  length);.  err =
d600: 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
d610: 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
d620: 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
d630: 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
d640: 20 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28   {.    OSTRACE4(
d650: 22 41 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20  "AFPLOCK failed 
d660: 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
d670: 25 64 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20  %d %s\n", path, 
d680: 65 72 72 6e 6f 2c 20 0a 20 20 20 20 20 20 73 74  errno, .      st
d690: 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a  rerror(errno));.
d6a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2f      return 1; //
d6b0: 20 65 72 72 6f 72 0a 20 20 7d 20 65 6c 73 65 20   error.  } else 
d6c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d6d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68    }.}../*. ** Th
d6e0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
d6f0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
d700: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
d710: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
d720: 69 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79 20  ied. ** file by 
d730: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
d740: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
d750: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
d760: 64 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f  d, return. ** no
d770: 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  n-zero.  If the 
d780: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
d790: 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53   or holds only S
d7a0: 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65  HARED locks, the
d7b0: 6e 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72  n. ** return zer
d7c0: 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  o.. */.static in
d7d0: 74 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65  t afpUnixCheckRe
d7e0: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
d7f0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
d800: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
d810: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
d820: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
d830: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a 20  ert( pFile ); . 
d840: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
d850: 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
d860: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d870: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
d880: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
d890: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
d8a0: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
d8b0: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
d8c0: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
d8d0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
d8e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d8f0: 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20     r = 1;.  }.  
d900: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
d910: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
d920: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
d930: 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28  it..   */.  if (
d940: 20 21 72 20 29 20 7b 0a 20 20 20 20 2f 2f 20 6c   !r ) {.    // l
d950: 6f 63 6b 20 74 68 65 20 62 79 74 65 0a 20 20 20  ock the byte.   
d960: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
d970: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
d980: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
d990: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
d9a0: 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
d9b0: 20 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20      if (failed) 
d9c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
d9d0: 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
d9e0: 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
d9f0: 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
da00: 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
da10: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73  r = 1;.    } els
da20: 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
da30: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
da40: 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
da50: 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
da60: 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
da70: 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
da80: 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
da90: 20 20 20 20 5f 41 46 50 46 53 53 65 74 4c 6f 63      _AFPFSSetLoc
daa0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
dab0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52  ath, pFile->h, R
dac0: 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
dad0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
dae0: 20 4f 53 54 52 41 43 45 33 28 22 54 45 53 54 20   OSTRACE3("TEST 
daf0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22  WR-LOCK %d %d\n"
db00: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a  , pFile->h, r);.
db10: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d    .  return r;.}
db20: 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c 65 20 6c  ../* AFP-style l
db30: 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  ocking following
db40: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
db50: 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65 65 20 74   unixLock, see t
db60: 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a 2a 2a 20  he unixLock .** 
db70: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  function comment
db80: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 66  s for details of
db90: 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d 65 6e 74   lock management
dba0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
dbb0: 61 66 70 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  afpUnixLock(OsFi
dbc0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
dbd0: 74 79 70 65 29 0a 7b 0a 20 20 69 6e 74 20 72 63  type).{.  int rc
dbe0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
dbf0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
dc00: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
dc10: 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
dc20: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
dc30: 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
dc40: 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
dc50: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
dc60: 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
dc70: 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65  k = 0;.  .  asse
dc80: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
dc90: 53 54 52 41 43 45 35 28 22 4c 4f 43 4b 20 20 20  STRACE5("LOCK   
dca0: 20 25 64 20 25 73 20 77 61 73 20 25 73 20 70 69   %d %s was %s pi
dcb0: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
dcc0: 68 2c 0a 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  h,.         lock
dcd0: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
dce0: 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
dcf0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
dd00: 29 2c 20 67 65 74 70 69 64 28 29 29 3b 20 20 0a  ), getpid());  .
dd10: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
dd20: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
dd30: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
dd40: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
dd50: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f   on the.    ** O
dd60: 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
dd70: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
dd80: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
dd90: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 20  xit path, as.   
dda0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
ddb0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
ddc0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
ddd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 70  ..    */.  if( p
dde0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
ddf0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
de00: 4f 53 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20  OSTRACE3("LOCK  
de10: 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
de20: 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46  ady held)\n", pF
de30: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
de40: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
de50: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  locktype));.    
de60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
de70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
de80: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
de90: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
dea0: 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a 20 20 61  rrect.    */.  a
deb0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
dec0: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
ded0: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
dee0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
def0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
df00: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
df10: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
df20: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
df30: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
df40: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
df50: 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
df60: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
df70: 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
df80: 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64  >pLock is shared
df90: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
dfa0: 20 20 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33      */.  sqlite3
dfb0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
dfc0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
dfd0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
dfe0: 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c  ad owns the pFil
dff0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 72 63 20 3d  e..    */.  rc =
e000: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
e010: 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
e020: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
e040: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
e050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e060: 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44      .  /* A PEND
e070: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64  ING lock is need
e080: 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ed before acquir
e090: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
e0a0: 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 20  k and before.   
e0b0: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
e0c0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
e0d0: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
e0e0: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
e0f0: 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  NG will.    ** b
e100: 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
e110: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
e120: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
e130: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
e140: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
e150: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
e160: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
e170: 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  CK).      ){.   
e180: 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41   int failed = _A
e190: 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74  FPFSSetLock(cont
e1a0: 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70  ext->filePath, p
e1b0: 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20  File->h, .      
e1c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
e1d0: 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69   1);.    if (fai
e1e0: 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20  led) {.      rc 
e1f0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e200: 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
e210: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
e220: 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
e230: 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
e240: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
e250: 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
e260: 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20  and make.    ** 
e270: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
e280: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
e290: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
e2a0: 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b     */.  if( lock
e2b0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
e2c0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 2c  K ){.    int lk,
e2d0: 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 69 6e 74   failed;.    int
e2e0: 20 74 72 69 65 73 20 3d 20 30 3b 0a 20 20 20 20   tries = 0;.    
e2f0: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
e300: 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
e310: 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
e320: 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
e330: 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
e340: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
e350: 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
e360: 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
e370: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
e380: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c  redLockByte = (l
e390: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
e3a0: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
e3b0: 29 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  );.    failed = 
e3c0: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e3d0: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e3e0: 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20   pFile->h, .    
e3f0: 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 63    SHARED_FIRST+c
e400: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e410: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  ckByte, 1, 1);. 
e420: 20 20 20 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20     .    /* Drop 
e430: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
e440: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
e450: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
e460: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
e470: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
e480: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
e490: 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 72 63  , 0)) {.      rc
e4a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e4b0: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
e4c0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
e4d0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f  ppen */.      go
e4e0: 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
e4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
e500: 69 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20  if( failed ){.  
e510: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e520: 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
e530: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
e540: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
e550: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
e560: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
e570: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
e580: 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
e590: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
e5a0: 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
e5b0: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
e5c0: 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
e5d0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
e5e0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
e5f0: 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
e600: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
e610: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
e620: 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  0!=pFile->lockty
e630: 70 65 20 29 3b 0a 20 20 20 20 69 66 20 28 6c 6f  pe );.    if (lo
e640: 63 6b 74 79 70 65 20 3e 3d 20 52 45 53 45 52 56  cktype >= RESERV
e650: 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  ED_LOCK && pFile
e660: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 52 45 53  ->locktype < RES
e670: 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
e680: 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
e690: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
e6a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
e6b0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
e6c0: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e6d0: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e6e0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
e6f0: 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ,1);.    }.    i
e700: 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f  f (!failed && lo
e710: 63 6b 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53  cktype == EXCLUS
e720: 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  IVE_LOCK) {.    
e730: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
e740: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a  EXCLUSIVE lock *
e750: 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  /.        .     
e760: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
e770: 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72  hared lock befor
e780: 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e  e trying the ran
e790: 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20  ge.  we'll need 
e7a0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65  to .      ** ree
e7b0: 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
e7c0: 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63  red lock if we c
e7d0: 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66  an't get the  af
e7e0: 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20 20 20 20  pUnixUnlock.    
e7f0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 21    */.      if (!
e800: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
e810: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
e820: 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45   pFile->h, SHARE
e830: 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20  D_FIRST +.      
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72     context->shar
e860: 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
e870: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  )) {.        /* 
e880: 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
e890: 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
e8a0: 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
e8b0: 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
e8c0: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e8d0: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e8e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e8f0: 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
e920: 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
e930: 20 20 20 69 66 20 28 66 61 69 6c 65 64 20 26 26     if (failed &&
e940: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e950: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e960: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  , pFile->h, SHAR
e970: 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
e9a0: 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f  ontext->sharedLo
e9b0: 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b  ckByte, 1, 1)) {
e9c0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
e9d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
e9e0: 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f  OCK; /* this sho
e9f0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
ea00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
ea10: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
ea20: 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 20 20 20       /* */.     
ea30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ea40: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 2f 2a 20  OERR_UNLOCK; /* 
ea50: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  this should neve
ea60: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
ea70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ea80: 28 20 66 61 69 6c 65 64 20 26 26 20 72 63 20 3d  ( failed && rc =
ea90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  = SQLITE_OK){.  
eaa0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
eab0: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
eac0: 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
ead0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
eae0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
eaf0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
eb00: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
eb10: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
eb20: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
eb30: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
eb40: 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
eb50: 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 20 20 73  _end_lock:.    s
eb60: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
eb70: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
eb80: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
eb90: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
eba0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f   locktypeName(lo
ebb0: 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20  cktype), .      
ebc0: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
ebd0: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
ebe0: 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  d");.  return rc
ebf0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  ;.}../*. ** Lowe
ec00: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
ec10: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
ec20: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
ec30: 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
ec40: 79 70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ype. ** must be 
ec50: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
ec60: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
ec70: 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
ec80: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
ec90: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
eca0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
ecb0: 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
ecc0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
ecd0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
ece0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
ecf0: 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
ed00: 6e 74 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b  nt afpUnixUnlock
ed10: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
ed20: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 73   locktype) {.  s
ed30: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
ed40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ed50: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
ed60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
ed70: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
ed80: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
ed90: 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
eda0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
edb0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
edc0: 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73 65 72 74  ntext;..  assert
edd0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
ede0: 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE5("UNLOCK  %
edf0: 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
ee00: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
ee10: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
ee20: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
ee30: 79 70 65 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  ype, getpid());.
ee40: 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63    .  assert( loc
ee50: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
ee60: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
ee70: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63  e->locktype<=loc
ee80: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
ee90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
eea0: 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54   }.  if( CHECK_T
eeb0: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29  HREADID(pFile) )
eec0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
eed0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
eee0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
eef0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 70  Mutex();.  if( p
ef00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  File->locktype>S
ef10: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
ef20: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
ef30: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
ef40: 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20       int failed 
ef50: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 75  = 0;..      /* u
ef60: 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73  nlock the exclus
ef70: 69 76 65 20 72 61 6e 67 65 20 2d 20 74 68 65 6e  ive range - then
ef80: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74 68   re-establish th
ef90: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  e shared lock */
efa0: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
efb0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ->locktype==EXCL
efc0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20  USIVE_LOCK) {.  
efd0: 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 5f        failed = _
efe0: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
eff0: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f000: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f010: 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20  _FIRST, .       
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
f040: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
f050: 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 29 20     if (!failed) 
f060: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {.          /* s
f070: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 6d 6f  uccessfully remo
f080: 76 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ved the exclusiv
f090: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  e lock */.      
f0a0: 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53 65      if (_AFPFSSe
f0b0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
f0c0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
f0d0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b  h, SHARED_FIRST+
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
f100: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
f110: 42 79 74 65 2c 20 31 2c 20 31 29 29 20 7b 0a 20  Byte, 1, 1)) {. 
f120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61             /* fa
f130: 69 6c 65 64 20 74 6f 20 72 65 2d 65 73 74 61 62  iled to re-estab
f140: 6c 69 73 68 20 6f 75 72 20 73 68 61 72 65 64 20  lish our shared 
f150: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
f160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f170: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a  IOERR_RDLOCK; /*
f180: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
f190: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
f1a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f1b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
f1c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
f1d0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
f1e0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 75 6e 6c 6f  - failed to unlo
f1f0: 63 6b 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ck the exclusive
f200: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
f210: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f220: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
f230: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
f240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72  .    }.    if (r
f250: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26  c == SQLITE_OK &
f260: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
f270: 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e>=PENDING_LOCK)
f280: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
f290: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
f2a0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
f2b0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
f2c0: 42 59 54 45 2c 20 31 2c 20 30 29 29 7b 0a 20 20  BYTE, 1, 0)){.  
f2d0: 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20        /* failed 
f2e0: 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
f2f0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
f300: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f310: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f320: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
f330: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
f340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
f350: 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c     if (rc == SQL
f360: 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
f370: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
f380: 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
f390: 20 20 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c    if (_AFPFSSetL
f3a0: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f3b0: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
f3c0: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
f3d0: 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20  1, 0)) {.       
f3e0: 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72 65   /* failed to re
f3f0: 6c 65 61 73 65 20 74 68 65 20 72 65 73 65 72 76  lease the reserv
f400: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
f410: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f420: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a  OERR_UNLOCK;  /*
f430: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
f440: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
f450: 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a     }.    } .  }.
f460: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
f470: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  NO_LOCK ){.    i
f480: 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50  nt failed = _AFP
f490: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
f4a0: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
f4b0: 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20 20 20 20  le->h, .        
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
f4e0: 52 53 54 20 2b 20 63 6f 6e 74 65 78 74 2d 3e 73  RST + context->s
f4f0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
f500: 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 0);.    if (fa
f510: 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
f520: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f530: 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73  UNLOCK;  /* This
f540: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
f550: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ppen */.    }.  
f560: 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51  }.  if (rc == SQ
f570: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 70 46 69  LITE_OK).    pFi
f580: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
f590: 6f 63 6b 74 79 70 65 3b 0a 20 20 73 71 6c 69 74  ocktype;.  sqlit
f5a0: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
f5b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f5c0: 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61  ../*. ** Close a
f5d0: 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
f5e0: 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
f5f0: 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 20 2a  king context . *
f600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
f610: 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  UnixClose(OsFile
f620: 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e 69 78   **pId) {.  unix
f630: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
f640: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20  File*)*pId;.  . 
f650: 20 69 66 28 20 21 69 64 20 29 20 72 65 74 75 72   if( !id ) retur
f660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
f670: 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49  fpUnixUnlock(*pI
f680: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f  d, NO_LOCK);.  /
f690: 2a 20 66 72 65 65 20 74 68 65 20 41 46 50 20 6c  * free the AFP l
f6a0: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
f6b0: 20 2a 2f 0a 20 20 69 66 20 28 69 64 2d 3e 6c 6f   */.  if (id->lo
f6c0: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20  ckingContext != 
f6d0: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20 28  NULL) {.    if (
f6e0: 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
f6f0: 65 78 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e  ext *)id->lockin
f700: 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50  gContext)->fileP
f710: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  ath != NULL).   
f720: 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64     sqlite3Thread
f730: 53 61 66 65 46 72 65 65 28 28 28 61 66 70 4c 6f  SafeFree(((afpLo
f740: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 69 64  ckingContext*)id
f750: 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
f760: 29 2d 3e 66 69 6c 65 50 61 74 68 29 3b 0a 20 20  )->filePath);.  
f770: 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
f780: 61 66 65 46 72 65 65 28 69 64 2d 3e 6c 6f 63 6b  afeFree(id->lock
f790: 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
f7a0: 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  .  .  if( id->di
f7b0: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
f7c0: 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
f7d0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 63  >dirfd = -1;.  c
f7e0: 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 69  lose(id->h);.  i
f7f0: 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  d->isOpen = 0;. 
f800: 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45   OSTRACE2("CLOSE
f810: 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e     %-3d\n", id->
f820: 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  h);.  OpenCounte
f830: 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  r(-1);.  sqlite3
f840: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
f850: 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a  d);.  *pId = 0;.
f860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f870: 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20  OK;.}...#pragma 
f880: 6d 61 72 6b 20 66 6c 6f 63 6b 28 29 20 73 74 79  mark flock() sty
f890: 6c 65 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20  le locking../*. 
f8a0: 2a 2a 20 54 68 65 20 66 6c 6f 63 6b 4c 6f 63 6b  ** The flockLock
f8b0: 69 6e 67 43 6f 6e 74 65 78 74 20 69 73 20 6e 6f  ingContext is no
f8c0: 74 20 75 73 65 64 0a 20 2a 2f 0a 74 79 70 65 64  t used. */.typed
f8d0: 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b 4c 6f 63  ef void flockLoc
f8e0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74  kingContext;..st
f8f0: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
f900: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
f910: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20  ock(OsFile *id) 
f920: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
f930: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
f940: 29 69 64 3b 0a 20 20 0a 20 20 69 66 20 28 70 46  )id;.  .  if (pF
f950: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d  ile->locktype ==
f960: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
f970: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20  {.    return 1; 
f980: 2f 2f 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  // already have 
f990: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 0a  a reserved lock.
f9a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f    } else {.    /
f9b0: 2f 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  / attempt to get
f9c0: 20 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20 69 6e   the lock.    in
f9d0: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
f9e0: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
f9f0: 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69   LOCK_NB);.    i
fa00: 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20 20 20  f (!rc) {.      
fa10: 2f 2f 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  // got the lock,
fa20: 20 75 6e 6c 6f 63 6b 20 69 74 0a 20 20 20 20 20   unlock it.     
fa30: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
fa40: 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
fa50: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2f 20 6e   return 0;  // n
fa60: 6f 20 6f 6e 65 20 68 61 73 20 69 74 20 72 65 73  o one has it res
fa70: 65 72 76 65 64 0a 20 20 20 20 7d 0a 20 20 20 20  erved.    }.    
fa80: 72 65 74 75 72 6e 20 31 3b 20 2f 2f 20 73 6f 6d  return 1; // som
fa90: 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
faa0: 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
fab0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69  .  }.}..static i
fac0: 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b  nt flockUnixLock
fad0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
fae0: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
faf0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
fb00: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
fb10: 20 20 0a 20 20 2f 2f 20 69 66 20 77 65 20 61 6c    .  // if we al
fb20: 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
fb30: 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
fb40: 76 65 2e 20 20 0a 20 20 2f 2f 20 4a 75 73 74 20  ve.  .  // Just 
fb50: 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
fb60: 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
fb70: 65 72 65 2e 0a 20 20 69 66 20 28 70 46 69 6c 65  ere..  if (pFile
fb80: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f  ->locktype > NO_
fb90: 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
fba0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
fbb0: 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75  cktype;.    retu
fbc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fbd0: 7d 0a 20 20 0a 20 20 2f 2f 20 67 72 61 62 20 61  }.  .  // grab a
fbe0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
fbf0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63  .  int rc = floc
fc00: 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
fc10: 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
fc20: 20 20 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20    if (rc) {.    
fc30: 2f 2f 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d  // didn't get, m
fc40: 75 73 74 20 62 65 20 62 75 73 79 0a 20 20 20 20  ust be busy.    
fc50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
fc60: 53 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  SY;.  } else {. 
fc70: 20 20 20 2f 2f 20 67 6f 74 20 69 74 2c 20 73 65     // got it, se
fc80: 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
fc90: 65 74 75 72 6e 20 6f 6b 0a 20 20 20 20 70 46 69  eturn ok.    pFi
fca0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
fcb0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74  ocktype;.    ret
fcc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fcd0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
fce0: 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b   flockUnixUnlock
fcf0: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74  (OsFile *id, int
fd00: 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75   locktype) {.  u
fd10: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
fd20: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
fd30: 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63    .  assert( loc
fd40: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
fd50: 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2f 20 6e 6f  CK );.  .  // no
fd60: 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 0a  -op if possible.
fd70: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
fd80: 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20  ktype==locktype 
fd90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fda0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
fdb0: 20 20 2f 2f 20 73 68 61 72 65 64 20 63 61 6e 20    // shared can 
fdc0: 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
fdd0: 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
fde0: 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  ve an exclusive.
fdf0: 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
fe00: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
fe10: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
fe20: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
fe30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fe40: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f  _OK;.  }.  .  //
fe50: 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
fe60: 6f 63 6b 2e 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock..  int rc = 
fe70: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
fe80: 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28  LOCK_UN);.  if (
fe90: 72 63 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53  rc).    return S
fea0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
feb0: 43 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20  CK;.  else {.   
fec0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fed0: 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
fee0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fef0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  ;.  }.}../*. ** 
ff00: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
ff10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
ff20: 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69  ckUnixClose(OsFi
ff30: 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75 6e  le **pId) {.  un
ff40: 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e  ixFile *id = (un
ff50: 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20  ixFile*)*pId;.  
ff60: 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65 74  .  if( !id ) ret
ff70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ff80: 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b   flockUnixUnlock
ff90: 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  (*pId, NO_LOCK);
ffa0: 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  .  .  if( id->di
ffb0: 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
ffc0: 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
ffd0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73  >dirfd = -1;.  s
ffe0: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
fff0: 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65  ex();.  .  close
10000 28 69 64 2d 3e 68 29 3b 20 20 0a 20 20 73 71 6c  (id->h);  .  sql
10010 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
10020 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
10030 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
10040 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
10050 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
10060 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
10070 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
10080 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  eFree(id);.  *pI
10090 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
100a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70  SQLITE_OK;.}..#p
100b0 72 61 67 6d 61 20 6d 61 72 6b 20 4f 6c 64 2d 53  ragma mark Old-S
100c0 63 68 6f 6f 6c 20 2e 6c 6f 63 6b 20 66 69 6c 65  chool .lock file
100d0 20 62 61 73 65 64 20 6c 6f 63 6b 69 6e 67 0a 0a   based locking..
100e0 2f 2a 0a 20 2a 2a 20 54 68 65 20 64 6f 74 6c 6f  /*. ** The dotlo
100f0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10100 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
10110 69 6e 73 20 61 6c 6c 20 64 6f 74 6c 6f 63 6b 20  ins all dotlock 
10120 28 2e 6c 6f 63 6b 29 20 6c 6f 63 6b 0a 20 2a 2a  (.lock) lock. **
10130 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
10140 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
10150 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  ct dotlockLockin
10160 67 43 6f 6e 74 65 78 74 20 64 6f 74 6c 6f 63 6b  gContext dotlock
10170 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
10180 73 74 72 75 63 74 20 64 6f 74 6c 6f 63 6b 4c 6f  struct dotlockLo
10190 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
101a0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3b   char *lockPath;
101b0 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74  .};...static int
101c0 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
101d0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73  kReservedLock(Os
101e0 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e  File *id) {.  un
101f0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
10200 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
10210 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
10220 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
10230 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c  = .    (dotlockL
10240 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
10250 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
10260 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 69 66 20  ontext;.  .  if 
10270 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
10280 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   == RESERVED_LOC
10290 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K) {.    return 
102a0 31 3b 20 2f 2f 20 61 6c 72 65 61 64 79 20 68 61  1; // already ha
102b0 76 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ve a reserved lo
102c0 63 6b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  ck.  } else {.  
102d0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
102e0 61 74 42 75 66 3b 0a 20 20 20 20 69 66 20 28 6c  atBuf;.    if (l
102f0 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  stat(context->lo
10300 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66 29  ckPath,&statBuf)
10310 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 2f 2f 20   == 0).      // 
10320 66 69 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d  file exists, som
10330 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68  eone else has th
10340 65 20 6c 6f 63 6b 0a 20 20 20 20 20 20 72 65 74  e lock.      ret
10350 75 72 6e 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a  urn 1;.    else.
10360 20 20 20 20 20 20 2f 2f 20 66 69 6c 65 20 64 6f        // file do
10370 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77 65  es not exist, we
10380 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69   could have it i
10390 66 20 77 65 20 77 61 6e 74 20 69 74 0a 20 20 20  f we want it.   
103a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
103b0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
103c0 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f  otlockUnixLock(O
103d0 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
103e0 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
103f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10400 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10410 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10420 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
10430 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f   .    (dotlockLo
10440 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
10450 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10460 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2f 20 69  ntext;.  .  // i
10470 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
10480 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
10490 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2f  exclusive.  .  /
104a0 2f 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  / Just adjust le
104b0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
104c0 6f 75 74 74 61 20 68 65 72 65 2e 0a 20 20 69 66  outta here..  if
104d0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
104e0 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  e > NO_LOCK) {. 
104f0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10500 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10510 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79     .    /* Alway
10520 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
10530 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
10540 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 75 74  d file */.    ut
10550 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  imes(context->lo
10560 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b 0a 20 20  ckPath,NULL);.  
10570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10580 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20  OK;.  }.  .  // 
10590 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
105a0 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
105b0 79 20 65 78 69 73 74 73 0a 20 20 73 74 72 75 63  y exists.  struc
105c0 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a  t stat statBuf;.
105d0 20 20 69 66 20 28 6c 73 74 61 74 28 63 6f 6e 74    if (lstat(cont
105e0 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 26 73  ext->lockPath,&s
105f0 74 61 74 42 75 66 29 20 3d 3d 20 30 29 7b 0a 20  tatBuf) == 0){. 
10600 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10610 5f 42 55 53 59 3b 20 2f 2f 20 69 74 20 64 6f 65  _BUSY; // it doe
10620 73 2c 20 62 75 73 79 0a 20 20 7d 0a 20 20 0a 20  s, busy.  }.  . 
10630 20 2f 2f 20 67 72 61 62 20 61 6e 20 65 78 63 6c   // grab an excl
10640 75 73 69 76 65 20 6c 6f 63 6b 0a 20 20 69 6e 74  usive lock.  int
10650 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f 6e 74 65   fd = open(conte
10660 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52  xt->lockPath,O_R
10670 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
10680 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
10690 20 28 66 64 20 3c 20 30 29 20 7b 0a 20 20 20 20   (fd < 0) {.    
106a0 2f 2f 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  // failed to ope
106b0 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
106c0 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  e, someone else 
106d0 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20  may have stolen 
106e0 74 68 65 20 6c 6f 63 6b 0a 20 20 20 20 72 65 74  the lock.    ret
106f0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10700 20 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64   .  }.  close(fd
10710 29 3b 0a 20 20 0a 20 20 2f 2f 20 67 6f 74 20 69  );.  .  // got i
10720 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
10730 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 0a 20 20  and return ok.  
10740 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
10750 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
10760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10770 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  }..static int do
10780 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28  tlockUnixUnlock(
10790 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
107a0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e  locktype) {.  un
107b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
107c0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
107d0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
107e0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
107f0 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c  = .    (dotlockL
10800 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
10810 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
10820 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
10830 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
10840 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10850 0a 20 20 2f 2f 20 6e 6f 2d 6f 70 20 69 66 20 70  .  // no-op if p
10860 6f 73 73 69 62 6c 65 0a 20 20 69 66 28 20 70 46  ossible.  if( pF
10870 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
10880 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
10890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108a0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20 73 68 61  .  }.  .  // sha
108b0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
108c0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
108d0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
108e0 63 6c 75 73 69 76 65 0a 20 20 69 66 20 28 6c 6f  clusive.  if (lo
108f0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
10900 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
10910 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
10920 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
10930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10940 0a 20 20 0a 20 20 2f 2f 20 6e 6f 2c 20 72 65 61  .  .  // no, rea
10950 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 0a 20 20 75  lly, unlock..  u
10960 6e 6c 69 6e 6b 28 63 6f 6e 74 65 78 74 2d 3e 6c  nlink(context->l
10970 6f 63 6b 50 61 74 68 29 3b 0a 20 20 70 46 69 6c  ockPath);.  pFil
10980 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
10990 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
109a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
109b0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
109c0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
109d0 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f  t dotlockUnixClo
109e0 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
109f0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69   {.  unixFile *i
10a00 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
10a10 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69  pId;.  .  if( !i
10a20 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
10a30 45 5f 4f 4b 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55  E_OK;.  dotlockU
10a40 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20  nixUnlock(*pId, 
10a50 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66  NO_LOCK);.  /* f
10a60 72 65 65 20 74 68 65 20 64 6f 74 6c 6f 63 6b 20  ree the dotlock 
10a70 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
10a80 65 20 2a 2f 0a 20 20 69 66 20 28 69 64 2d 3e 6c  e */.  if (id->l
10a90 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d  ockingContext !=
10aa0 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20   NULL) {.    if 
10ab0 28 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  (((dotlockLockin
10ac0 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d 3e 6c  gContext *)id->l
10ad0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
10ae0 6c 6f 63 6b 50 61 74 68 20 21 3d 20 4e 55 4c 4c  lockPath != NULL
10af0 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ).      sqlite3T
10b00 68 72 65 61 64 53 61 66 65 46 72 65 65 28 20 28  hreadSafeFree( (
10b10 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67   (dotlockLocking
10b20 43 6f 6e 74 65 78 74 20 2a 29 0a 20 20 20 20 20  Context *).     
10b30 20 20 20 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f     id->lockingCo
10b40 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68  ntext)->lockPath
10b50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68  );.    sqlite3Th
10b60 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 2d  readSafeFree(id-
10b70 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
10b80 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 69  ;.  }.  .  if( i
10b90 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  d->dirfd>=0 ) cl
10ba0 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ose(id->dirfd);.
10bb0 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
10bc0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
10bd0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20  erMutex();.  .  
10be0 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20  close(id->h);.  
10bf0 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
10c00 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
10c10 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53  isOpen = 0;.  OS
10c20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
10c30 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b  %-3d\n", id->h);
10c40 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
10c50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  1);.  sqlite3Thr
10c60 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b  eadSafeFree(id);
10c70 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72  .  *pId = 0;.  r
10c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10c90 0a 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  .}...#pragma mar
10ca0 6b 20 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a  k No locking../*
10cb0 0a 20 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c  . ** The nolockL
10cc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
10cd0 20 76 6f 69 64 0a 20 2a 2f 0a 74 79 70 65 64 65   void. */.typede
10ce0 66 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63  f void nolockLoc
10cf0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74  kingContext;..st
10d00 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10d10 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
10d20 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
10d30 20 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   {.  return 0;.}
10d40 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  ..static int nol
10d50 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69  ockUnixLock(OsFi
10d60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
10d70 74 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e  type) {.  return
10d80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
10d90 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
10da0 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  UnixUnlock(OsFil
10db0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10dc0 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  ype) {.  return 
10dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10de0 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  . ** Close a fil
10df0 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e.. */.static in
10e00 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73  t nolockUnixClos
10e10 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20  e(OsFile **pId) 
10e20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64  {.  unixFile *id
10e30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70   = (unixFile*)*p
10e40 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64  Id;.  .  if( !id
10e50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10e60 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64  _OK;.  if( id->d
10e70 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28  irfd>=0 ) close(
10e80 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64  id->dirfd);.  id
10e90 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
10ea0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
10eb0 74 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73  tex();.  .  clos
10ec0 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 73  e(id->h);.  .  s
10ed0 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
10ee0 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70  ex();.  id->isOp
10ef0 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43  en = 0;.  OSTRAC
10f00 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E2("CLOSE   %-3d
10f10 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f  \n", id->h);.  O
10f20 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
10f30 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
10f40 61 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a  afeFree(id);.  *
10f50 70 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pId = 0;.  retur
10f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10f70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10f80 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
10f90 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STYLE */../*.** 
10fa0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
10fb0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
10fc0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
10fd0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
10fe0 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20  .** to the full 
10ff0 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20  pathname stored 
11000 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  in space obtaine
11010 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
11020 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61  loc()..** The ca
11030 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  lling function i
11040 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
11050 72 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73  r freeing this s
11060 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20  pace once it.** 
11070 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65  is no longer nee
11080 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ded..*/.char *sq
11090 6c 69 74 65 33 55 6e 69 78 46 75 6c 6c 50 61 74  lite3UnixFullPat
110a0 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  hname(const char
110b0 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20 20   *zRelative){.  
110c0 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b  char *zFull = 0;
110d0 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65  .  if( zRelative
110e0 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]=='/' ){.    
110f0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
11100 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69  (&zFull, zRelati
11110 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ve, (char*)0);. 
11120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
11130 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 4d   *zBuf = sqliteM
11140 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20 20 20  alloc(5000);.   
11150 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a   if( zBuf==0 ){.
11160 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
11170 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 30      }.    zBuf[0
11180 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
11190 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75  e3SetString(&zFu
111a0 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  ll, getcwd(zBuf,
111b0 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a 52 65   5000), "/", zRe
111c0 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20 20  lative,.        
111d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
111e0 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)0);.    sqlit
111f0 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d  eFree(zBuf);.  }
11200 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a  ..#if 0.  /*.  *
11210 2a 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70  * Remove "/./" p
11220 61 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64  ath elements and
11230 20 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22   convert "/A/./"
11240 20 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20   path elements. 
11250 20 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e   ** to just "/".
11260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
11270 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  l ){.    int i, 
11280 6a 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30  j;.    for(i=j=0
11290 3b 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29  ; zFull[i]; i++)
112a0 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  {.      if( zFul
112b0 6c 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  l[i]=='/' ){.   
112c0 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69       if( zFull[i
112d0 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69  +1]=='/' ) conti
112e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
112f0 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27   zFull[i+1]=='.'
11300 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d   && zFull[i+2]==
11310 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
11320 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
11330 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
11340 20 20 20 20 20 7d 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 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d  .' && zFull[i+2]
11370 3d 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69  =='.' && zFull[i
11380 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
11390 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
113a0 20 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d   && zFull[j-1]!=
113b0 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
113c0 20 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a          i += 3;.
113d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
113e0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
113f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c      }.      zFul
11400 6c 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69  l[j++] = zFull[i
11410 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75  ];.    }.    zFu
11420 6c 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23  ll[j] = 0;.  }.#
11430 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
11440 7a 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zFull;.}../*.** 
11450 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
11460 20 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e 63   of the fullsync
11470 20 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69 76   flag in the giv
11480 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
11490 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
114a0 69 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79  id unixSetFullSy
114b0 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  nc(OsFile *id, i
114c0 6e 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78 46  nt v){.  ((unixF
114d0 69 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53 79  ile*)id)->fullSy
114e0 6e 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nc = v;.}../*.**
114f0 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65   Return the unde
11500 72 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64  rlying file hand
11510 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65  le for an OsFile
11520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
11530 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73  nixFileHandle(Os
11540 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74  File *id){.  ret
11550 75 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  urn ((unixFile*)
11560 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  id)->h;.}../*.**
11570 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
11580 65 72 20 74 68 61 74 20 69 6e 64 69 63 65 73 20  er that indices 
11590 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b  the type of lock
115a0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a   currently held.
115b0 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c  ** by this handl
115c0 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74 65  e.  (Used for te
115d0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
115e0 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61  is only.).*/.sta
115f0 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
11600 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  State(OsFile *id
11610 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e  ){.  return ((un
11620 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
11630 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ktype;.}../*.** 
11640 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
11650 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
11660 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
11670 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
11680 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
11690 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
116a0 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
116b0 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
116c0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
116d0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
116e0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
116f0 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
11700 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
11710 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
11720 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
11730 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
11740 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
11750 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
11760 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
11770 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
11780 64 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66  d it's journal f
11790 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
117a0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
117b0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
117c0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
117d0 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
117e0 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  Size(OsFile *id)
117f0 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
11800 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
11810 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
11820 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
11830 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
11840 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
11850 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c  rate on an OsFil
11860 65 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a  e.** for unix..*
11870 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49  /.static const I
11880 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 55  oMethod sqlite3U
11890 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
118a0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75    unixClose,.  u
118b0 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  nixOpenDirectory
118c0 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20  ,.  unixRead,.  
118d0 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69  unixWrite,.  uni
118e0 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75  xSeek,.  unixTru
118f0 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e  ncate,.  unixSyn
11900 63 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c  c,.  unixSetFull
11910 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65  Sync,.  unixFile
11920 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69  Handle,.  unixFi
11930 6c 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f  leSize,.  unixLo
11940 63 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  ck,.  unixUnlock
11950 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74  ,.  unixLockStat
11960 65 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  e,.  unixCheckRe
11970 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e  servedLock,.  un
11980 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b  ixSectorSize,.};
11990 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
119a0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
119b0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73  TYLE./*. ** This
119c0 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
119d0 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
119e0 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
119f0 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a   on an OsFile. *
11a00 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20  * for unix with 
11a10 41 46 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c  AFP style file l
11a20 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74  ocking.. */.stat
11a30 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f  ic const IoMetho
11a40 64 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b  d sqlite3AFPLock
11a50 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
11a60 3d 20 7b 0a 20 20 20 20 61 66 70 55 6e 69 78 43  = {.    afpUnixC
11a70 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70  lose,.    unixOp
11a80 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20  enDirectory,.   
11a90 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75   unixRead,.    u
11aa0 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e  nixWrite,.    un
11ab0 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78  ixSeek,.    unix
11ac0 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e  Truncate,.    un
11ad0 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  ixSync,.    unix
11ae0 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20  SetFullSync,.   
11af0 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c   unixFileHandle,
11b00 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  .    unixFileSiz
11b10 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 4c 6f  e,.    afpUnixLo
11b20 63 6b 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 55  ck,.    afpUnixU
11b30 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c  nlock,.    unixL
11b40 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 61 66  ockState,.    af
11b50 70 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  pUnixCheckReserv
11b60 65 64 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78  edLock,.    unix
11b70 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a  SectorSize,.};..
11b80 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74  /*. ** This vect
11b90 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
11ba0 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
11bb0 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
11bc0 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72  n OsFile. ** for
11bd0 20 75 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b   unix with flock
11be0 28 29 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  () style file lo
11bf0 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69  cking.. */.stati
11c00 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
11c10 20 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63   sqlite3FlockLoc
11c20 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
11c30 20 3d 20 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e   = {.    flockUn
11c40 69 78 43 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69  ixClose,.    uni
11c50 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  xOpenDirectory,.
11c60 20 20 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20      unixRead,.  
11c70 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 20    unixWrite,.   
11c80 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20 20 20 75   unixSeek,.    u
11c90 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 20  nixTruncate,.   
11ca0 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 20 20 75   unixSync,.    u
11cb0 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a  nixSetFullSync,.
11cc0 20 20 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64      unixFileHand
11cd0 6c 65 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  le,.    unixFile
11ce0 53 69 7a 65 2c 0a 20 20 20 20 66 6c 6f 63 6b 55  Size,.    flockU
11cf0 6e 69 78 4c 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f  nixLock,.    flo
11d00 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20  ckUnixUnlock,.  
11d10 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
11d20 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68  .    flockUnixCh
11d30 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
11d40 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  .    unixSectorS
11d50 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20  ize,.};../*. ** 
11d60 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
11d70 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
11d80 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
11d90 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c  rate on an OsFil
11da0 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77  e. ** for unix w
11db0 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c  ith dotlock styl
11dc0 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  e file locking..
11dd0 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
11de0 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65   IoMethod sqlite
11df0 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  3DotlockLockingU
11e00 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
11e10 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43      dotlockUnixC
11e20 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70  lose,.    unixOp
11e30 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20  enDirectory,.   
11e40 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75   unixRead,.    u
11e50 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e  nixWrite,.    un
11e60 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78  ixSeek,.    unix
11e70 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e  Truncate,.    un
11e80 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  ixSync,.    unix
11e90 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20  SetFullSync,.   
11ea0 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c   unixFileHandle,
11eb0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  .    unixFileSiz
11ec0 65 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  e,.    dotlockUn
11ed0 69 78 4c 6f 63 6b 2c 0a 20 20 20 20 64 6f 74 6c  ixLock,.    dotl
11ee0 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20  ockUnixUnlock,. 
11ef0 20 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65     unixLockState
11f00 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ,.    dotlockUni
11f10 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
11f20 63 6b 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74  ck,.    unixSect
11f30 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20  orSize,.};../*. 
11f40 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
11f50 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
11f60 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
11f70 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73  operate on an Os
11f80 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69  File. ** for uni
11f90 78 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73  x with dotlock s
11fa0 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
11fb0 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  g.. */.static co
11fc0 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
11fd0 69 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e  ite3NolockLockin
11fe0 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20  gUnixIoMethod = 
11ff0 7b 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c  {.  nolockUnixCl
12000 6f 73 65 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44  ose,.  unixOpenD
12010 69 72 65 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78  irectory,.  unix
12020 52 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74  Read,.  unixWrit
12030 65 2c 0a 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20  e,.  unixSeek,. 
12040 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20   unixTruncate,. 
12050 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69   unixSync,.  uni
12060 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20  xSetFullSync,.  
12070 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a  unixFileHandle,.
12080 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a    unixFileSize,.
12090 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b    nolockUnixLock
120a0 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e  ,.  nolockUnixUn
120b0 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b  lock,.  unixLock
120c0 53 74 61 74 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55  State,.  nolockU
120d0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
120e0 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63 74  Lock,.  unixSect
120f0 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 23 65 6e 64  orSize,.};..#end
12100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
12110 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12120 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
12130 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
12140 61 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61  a new unixFile a
12150 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
12160 61 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  at unixFile..** 
12170 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
12180 74 6f 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46  to the new unixF
12190 69 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a  ile into *pId..*
121a0 2a 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20  * If we run out 
121b0 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65  of memory, close
121c0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
121d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  turn an error..*
121e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
121f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12200 54 59 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57 68 65  TYLE./* . ** Whe
12210 6e 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73  n locking extens
12220 69 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64  ions are enabled
12230 2c 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61  , the filepath a
12240 6e 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  nd locking style
12250 20 0a 20 2a 2a 20 61 72 65 20 6e 65 65 64 65 64   . ** are needed
12260 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12270 65 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68  e unixFile pMeth
12280 6f 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f  od to use for lo
12290 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
122a0 2e 0a 20 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e  .. ** The lockin
122b0 67 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g-style specific
122c0 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
122d0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69  data structure i
122e0 73 20 63 72 65 61 74 65 64 20 0a 20 2a 2a 20 61  s created . ** a
122f0 6e 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65  nd assigned here
12300 20 61 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69   also.. */.stati
12310 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e  c int allocateUn
12320 69 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c  ixFile(.  int h,
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
12350 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
12360 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
12370 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  /.  OsFile **pId
12380 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
12390 72 69 74 65 20 63 6f 6d 70 6c 65 74 65 64 20 69  rite completed i
123a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 65  nitialization he
123b0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
123c0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
123d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
123e0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
123f0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61   */.  int delFla
12400 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
12410 20 44 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d 62 65   Delete-on-or-be
12420 66 6f 72 65 2d 63 6c 6f 73 65 20 66 6c 61 67 20  fore-close flag 
12430 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c  */.){.  sqlite3L
12440 6f 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b  ockingStyle lock
12450 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
12460 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e  File *pNew;.  un
12470 69 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20  ixFile f;.  int 
12480 72 63 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66  rc;..  memset(&f
12490 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
124a0 0a 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  .  lockingStyle 
124b0 3d 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c  = sqlite3DetectL
124c0 6f 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c  ockingStyle(zFil
124d0 65 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69 66 20  ename, h);.  if 
124e0 28 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ( lockingStyle =
124f0 3d 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74  = posixLockingSt
12500 79 6c 65 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  yle ) {.    sqli
12510 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
12520 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
12530 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66 2e 70  LockInfo(h, &f.p
12540 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b  Lock, &f.pOpen);
12550 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
12560 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
12570 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
12580 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20  close(h);.      
12590 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
125a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
125b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
125c0 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
125d0 20 20 20 2f 2f 20 20 70 4c 6f 63 6b 20 61 6e 64     //  pLock and
125e0 20 70 4f 70 65 6e 20 61 72 65 20 6f 6e 6c 79 20   pOpen are only 
125f0 75 73 65 64 20 66 6f 72 20 70 6f 73 69 78 20 61  used for posix a
12600 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20  dvisory locking 
12610 0a 20 20 20 20 66 2e 70 4c 6f 63 6b 20 3d 20 4e  .    f.pLock = N
12620 55 4c 4c 3b 0a 20 20 20 20 66 2e 70 4f 70 65 6e  ULL;.    f.pOpen
12630 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69   = NULL;.  }.  i
12640 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
12650 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
12660 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 2e 64 69 72  me);.  }.  f.dir
12670 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e 68 20 3d  fd = -1;.  f.h =
12680 20 68 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44   h;.  SET_THREAD
12690 49 44 28 26 66 29 3b 0a 20 20 70 4e 65 77 20 3d  ID(&f);.  pNew =
126a0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
126b0 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  feMalloc( sizeof
126c0 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20 20  (unixFile) );.  
126d0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
126e0 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20     close(h);.   
126f0 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
12700 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
12710 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 66 2e 70 4c  aseLockInfo(f.pL
12720 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
12730 65 4f 70 65 6e 43 6e 74 28 66 2e 70 4f 70 65 6e  eOpenCnt(f.pOpen
12740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
12750 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
12760 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20 20    *pId = 0;.    
12770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12780 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
12790 20 20 2a 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20    *pNew = f;.   
127a0 20 73 77 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53   switch(lockingS
127b0 74 79 6c 65 29 20 7b 0a 20 20 20 20 20 20 63 61  tyle) {.      ca
127c0 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79  se afpLockingSty
127d0 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 61  le:.        /* a
127e0 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  fp locking uses 
127f0 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
12800 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
12810 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20  included in.    
12820 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
12830 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a  ckingContext */.
12840 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d          pNew->pM
12850 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33  ethod = &sqlite3
12860 41 46 50 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  AFPLockingUnixIo
12870 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20 20  Method;.        
12880 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
12890 74 65 78 74 20 3d 20 0a 20 20 20 20 20 20 20 20  text = .        
128a0 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
128b0 61 66 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  afeMalloc(sizeof
128c0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
128d0 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 28 28  xt));.        ((
128e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
128f0 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  t *)pNew->lockin
12900 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50  gContext)->fileP
12910 61 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ath = .         
12920 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
12930 66 65 4d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e 28  feMalloc(strlen(
12940 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 29 3b  zFilename) + 1);
12950 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
12960 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
12970 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b  ext *)pNew->lock
12980 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c  ingContext)->fil
12990 65 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20  ePath, .        
129a0 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
129b0 29 3b 0a 20 20 20 20 20 20 20 20 73 72 61 6e 64  );.        srand
129c0 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 20  omdev();.       
129d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
129e0 73 65 20 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53  se flockLockingS
129f0 74 79 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a  tyle:.        /*
12a00 20 66 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67 20 64   flock locking d
12a10 6f 65 73 6e 27 74 20 6e 65 65 64 20 61 64 64 69  oesn't need addi
12a20 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f  tional lockingCo
12a30 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntext informatio
12a40 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  n */.        pNe
12a50 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
12a60 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e  lite3FlockLockin
12a70 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
12a80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12a90 20 20 20 20 63 61 73 65 20 64 6f 74 6c 6f 63 6b      case dotlock
12aa0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
12ab0 20 20 20 20 20 20 2f 2a 20 64 6f 74 6c 6f 63 6b        /* dotlock
12ac0 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
12ad0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
12ae0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
12af0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20 20  cluded in.      
12b00 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
12b10 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
12b20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
12b30 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
12b40 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  te3DotlockLockin
12b50 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20  gUnixIoMethod;. 
12b60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63         pNew->loc
12b70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 73 71  kingContext = sq
12b80 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
12b90 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
12ba0 20 73 69 7a 65 6f 66 28 64 6f 74 6c 6f 63 6b 4c   sizeof(dotlockL
12bb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b  ockingContext));
12bc0 0a 20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f  .        ((dotlo
12bd0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
12be0 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67   *)pNew->locking
12bf0 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61  Context)->lockPa
12c00 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  th = .          
12c10 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
12c20 61 66 65 4d 61 6c 6c 6f 63 28 73 74 72 6c 65 6e  afeMalloc(strlen
12c30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 73 74  (zFilename) + st
12c40 72 6c 65 6e 28 22 2e 6c 6f 63 6b 22 29 20 2b 20  rlen(".lock") + 
12c50 31 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69  1);.        spri
12c60 6e 74 66 28 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63  ntf(((dotlockLoc
12c70 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e  kingContext *)pN
12c80 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
12c90 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 2c 20 0a  xt)->lockPath, .
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46 69 6c 65  "%s.lock", zFile
12cc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 62  name);.        b
12cd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
12ce0 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
12cf0 6c 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 70  le:.        /* p
12d00 6f 73 69 78 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  osix locking doe
12d10 73 6e 27 74 20 6e 65 65 64 20 61 64 64 69 74 69  sn't need additi
12d20 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74  onal lockingCont
12d30 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ext information 
12d40 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
12d50 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69  >pMethod = &sqli
12d60 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b  te3UnixIoMethod;
12d70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
12d80 20 20 20 20 20 20 63 61 73 65 20 6e 6f 4c 6f 63        case noLoc
12d90 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20  kingStyle:.     
12da0 20 63 61 73 65 20 75 6e 73 75 70 70 6f 72 74 65   case unsupporte
12db0 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20  dLockingStyle:. 
12dc0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20       default: . 
12dd0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65         pNew->pMe
12de0 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 4e  thod = &sqlite3N
12df0 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  olockLockingUnix
12e00 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 7d 0a  IoMethod;.    }.
12e10 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69      *pId = (OsFi
12e20 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70  le*)pNew;.    Op
12e30 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
12e40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12e50 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
12e60 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
12e70 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
12e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
12e90 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 0a  locateUnixFile(.
12ea0 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
12eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
12ec0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12ed0 20 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   on file being o
12ee0 70 65 6e 65 64 20 2a 2f 0a 20 20 4f 73 46 69 6c  pened */.  OsFil
12ef0 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20  e **pId,        
12f00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
12f10 65 73 75 6c 20 75 6e 69 78 46 69 6c 65 20 73 74  esul unixFile st
12f20 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
12f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12f40 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65  ilename, /* Name
12f50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
12f60 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
12f70 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20 20  nt delFlag      
12f80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
12f90 2c 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  , delete the fil
12fa0 65 20 6f 6e 20 6f 72 20 62 65 66 6f 72 65 20 63  e on or before c
12fb0 6c 6f 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75  losing */.){.  u
12fc0 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
12fd0 20 75 6e 69 78 46 69 6c 65 20 66 3b 0a 20 20 69   unixFile f;.  i
12fe0 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73 65 74  nt rc;..  memset
12ff0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
13000 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45  ));.  sqlite3OsE
13010 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
13020 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
13030 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66  (h, &f.pLock, &f
13040 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74  .pOpen);.  sqlit
13050 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
13060 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20  ;.  if( delFlag 
13070 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
13080 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
13090 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
130a0 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65 74 75  ose(h);.    retu
130b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
130c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
130d0 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
130e0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
130f0 65 29 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d 20  e);.  f.dirfd = 
13100 2d 31 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20  -1;.  f.h = h;. 
13110 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66   SET_THREADID(&f
13120 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
13130 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
13140 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78  loc( sizeof(unix
13150 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  File) );.  if( p
13160 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c  New==0 ){.    cl
13170 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  ose(h);.    sqli
13180 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
13190 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
131a0 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b  ckInfo(f.pLock);
131b0 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
131c0 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20  Cnt(f.pOpen);.  
131d0 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
131e0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49  Mutex();.    *pI
131f0 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  d = 0;.    retur
13200 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e    }else{.    *pN
13220 65 77 20 3d 20 66 3b 0a 20 20 20 20 70 4e 65 77  ew = f;.    pNew
13230 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
13240 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
13250 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73  ;.    *pId = (Os
13260 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20  File*)pNew;.    
13270 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
13280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13290 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TE_OK;.  }.}.#en
132a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
132b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
132c0 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
132d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
132e0 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
132f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13330 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
13340 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
13350 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
13360 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
13370 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
13380 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
13390 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
133a0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
133b0 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
133c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
133d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
13410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13420 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
13430 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
13440 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
13450 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
13460 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
13470 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
13480 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
13490 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
134a0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
134b0 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
134c0 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 76 6f 69 64  e <dlfcn.h>.void
134d0 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 6f   *sqlite3UnixDlo
134e0 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
134f0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
13500 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
13510 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
13520 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
13530 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 55  }.void *sqlite3U
13540 6e 69 78 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70  nixDlsym(void *p
13550 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
13560 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20  ar *zSymbol){.  
13570 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61  return dlsym(pHa
13580 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
13590 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  }.int sqlite3Uni
135a0 78 44 6c 63 6c 6f 73 65 28 76 6f 69 64 20 2a 70  xDlclose(void *p
135b0 48 61 6e 64 6c 65 29 7b 0a 20 20 72 65 74 75 72  Handle){.  retur
135c0 6e 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c  n dlclose(pHandl
135d0 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
135e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
135f0 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f  _EXTENSION */../
13600 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61  *.** Get informa
13610 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65  tion to seed the
13620 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
13630 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73  enerator.  The s
13640 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  eed.** is writte
13650 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  n into the buffe
13660 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68  r zBuf[256].  Th
13670 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
13680 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c  on must.** suppl
13690 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79  y a sufficiently
136a0 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a   large buffer..*
136b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
136c0 78 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  xRandomSeed(char
136d0 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
136e0 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
136f0 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
13700 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
13710 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
13720 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
13730 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
13740 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
13750 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
13760 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
13770 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
13780 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
13790 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
137a0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
137b0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
137c0 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
137d0 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
137e0 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
137f0 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
13800 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
13810 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
13820 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
13830 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
13840 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
13850 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
13860 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
13870 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
13880 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
13890 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
138a0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
138b0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
138c0 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
138d0 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
138e0 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
138f0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
13900 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
13910 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
13920 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
13930 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
13940 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
13950 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
13960 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
13970 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
13980 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
13990 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
139a0 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
139b0 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
139c0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
139d0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
139e0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
139f0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
13a00 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
13a10 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
13a20 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
13a30 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69  (&zBuf[sizeof(ti
13a40 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  me_t)], &pid, si
13a50 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
13a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61  }else{.      rea
13a70 64 28 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29  d(fd, zBuf, 256)
13a80 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
13a90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13aa0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
13ab0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13ac0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
13ad0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
13ae0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
13af0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
13b00 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
13b10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
13b20 6c 6c 69 73 65 63 6f 6e 64 73 20 77 65 20 77 61  lliseconds we wa
13b30 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a  nt to sleep..*/.
13b40 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53  int sqlite3UnixS
13b50 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69  leep(int ms){.#i
13b60 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
13b70 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
13b80 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
13b90 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  s*1000);.  retur
13ba0 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c  n ms;.#else.  sl
13bb0 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30  eep((ms+999)/100
13bc0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30  0);.  return 100
13bd0 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30  0*((ms+999)/1000
13be0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
13bf0 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61 62  ** Static variab
13c00 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68 72  les used for thr
13c10 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74  ead synchronizat
13c20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74  ion..**.** inMut
13c30 65 78 20 20 20 20 20 20 74 68 65 20 6e 65 73 74  ex      the nest
13c40 69 6e 67 20 64 65 70 74 68 20 6f 66 20 74 68 65  ing depth of the
13c50 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
13c60 2e 20 20 54 68 65 20 74 68 72 65 61 64 0a 2a 2a  .  The thread.**
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f                ho
13c80 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20  lding mutexMain 
13c90 63 61 6e 20 72 65 61 64 20 74 68 69 73 20 76 61  can read this va
13ca0 72 69 61 62 6c 65 20 61 74 20 61 6e 79 20 74 69  riable at any ti
13cb0 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  me..**          
13cc0 20 20 20 20 42 75 74 20 69 73 20 6d 75 73 74 20      But is must 
13cd0 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f  hold mutexAux to
13ce0 20 63 68 61 6e 67 65 20 74 68 69 73 20 76 61 72   change this var
13cf0 69 61 62 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a  iable.  Other.**
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
13d10 72 65 61 64 73 20 6d 75 73 74 20 68 6f 6c 64 20  reads must hold 
13d20 6d 75 74 65 78 41 75 78 20 74 6f 20 72 65 61 64  mutexAux to read
13d30 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e   the variable an
13d40 64 20 63 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  d can.**        
13d50 20 20 20 20 20 20 6e 65 76 65 72 20 77 72 69 74        never writ
13d60 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77  e..**.** mutexOw
13d70 6e 65 72 20 20 20 54 68 65 20 74 68 72 65 61 64  ner   The thread
13d80 20 69 64 20 6f 66 20 74 68 65 20 74 68 72 65 61   id of the threa
13d90 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d  d holding mutexM
13da0 61 69 6e 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20  ain.  Same.**   
13db0 20 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73             acces
13dc0 73 20 72 75 6c 65 73 20 61 73 20 66 6f 72 20 69  s rules as for i
13dd0 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75  nMutex..**.** mu
13de0 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 20 20  texOwnerValid   
13df0 54 72 75 65 20 69 66 20 74 68 65 20 76 61 6c 75  True if the valu
13e00 65 20 69 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20  e in mutexOwner 
13e10 69 73 20 76 61 6c 69 64 2e 20 20 54 68 65 20 73  is valid.  The s
13e20 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ame.**          
13e30 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20           access 
13e40 72 75 6c 65 73 20 61 70 70 6c 79 20 61 73 20 66  rules apply as f
13e50 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a  or inMutex..**.*
13e60 2a 20 6d 75 74 65 78 4d 61 69 6e 20 20 20 20 54  * mutexMain    T
13e70 68 65 20 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20  he main mutex.  
13e80 48 6f 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20  Hold this mutex 
13e90 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
13ea0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20  exclusive.**    
13eb0 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73            access
13ec0 20 74 6f 20 53 51 4c 69 74 65 20 64 61 74 61 20   to SQLite data 
13ed0 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
13ee0 2a 20 6d 75 74 65 78 41 75 78 20 20 20 20 20 41  * mutexAux     A
13ef0 6e 20 61 75 78 69 6c 69 61 72 79 20 6d 75 74 65  n auxiliary mute
13f00 78 20 6e 65 65 64 65 64 20 74 6f 20 61 63 63 65  x needed to acce
13f10 73 73 20 76 61 72 69 61 62 6c 65 73 20 64 65 66  ss variables def
13f20 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
13f30 2a 20 4d 75 74 65 78 65 73 20 61 72 65 20 61 6c  * Mutexes are al
13f40 77 61 79 73 20 61 63 71 75 69 72 65 64 20 69 6e  ways acquired in
13f50 20 74 68 69 73 20 6f 72 64 65 72 3a 20 6d 75 74   this order: mut
13f60 65 78 4d 61 69 6e 20 6d 75 74 65 78 41 75 78 2e  exMain mutexAux.
13f70 20 20 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20     It.** is not 
13f80 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 63 71  necessary to acq
13f90 75 69 72 65 20 6d 75 74 65 78 4d 61 69 6e 20 69  uire mutexMain i
13fa0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 6d  n order to get m
13fb0 75 74 65 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a  utexAux - just.*
13fc0 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
13fd0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 6d   to acquire them
13fe0 20 69 6e 20 74 68 65 20 72 65 76 65 72 73 65 20   in the reverse 
13ff0 6f 72 64 65 72 3a 20 6d 75 74 65 78 41 75 78 20  order: mutexAux 
14000 6d 75 74 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69  mutexMain..** Ei
14010 74 68 65 72 20 67 65 74 20 74 68 65 20 6d 75 74  ther get the mut
14020 65 78 65 73 20 77 69 74 68 20 6d 75 74 65 78 4d  exes with mutexM
14030 61 69 6e 20 66 69 72 73 74 20 6f 72 20 67 65 74  ain first or get
14040 20 6d 75 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a   mutexAux only..
14050 2a 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69  **.** When runni
14060 6e 67 20 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d  ng on a platform
14070 20 77 68 65 72 65 20 74 68 65 20 74 68 72 65 65   where the three
14080 20 76 61 72 69 61 62 6c 65 73 20 69 6e 4d 75 74   variables inMut
14090 65 78 2c 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a  ex, mutexOwner,.
140a0 2a 2a 20 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65  ** and mutexOwne
140b0 72 56 61 6c 69 64 20 63 61 6e 20 62 65 20 73 65  rValid can be se
140c0 74 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68  t atomically, th
140d0 65 20 6d 75 74 65 78 41 75 78 20 69 73 20 6e 6f  e mutexAux is no
140e0 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f  t required..** O
140f0 6e 20 6d 61 6e 79 20 73 79 73 74 65 6d 73 2c 20  n many systems, 
14100 61 6c 6c 20 74 68 72 65 65 20 61 72 65 20 33 32  all three are 32
14110 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 61 6e  -bit integers an
14120 64 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 33  d writing to a 3
14130 32 2d 62 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72  2-bit.** integer
14140 20 69 73 20 61 74 6f 6d 69 63 2e 20 20 49 20 74   is atomic.  I t
14150 68 69 6e 6b 2e 20 20 42 75 74 20 74 68 65 72 65  hink.  But there
14160 20 61 72 65 20 6e 6f 20 67 75 61 72 61 6e 74 65   are no guarante
14170 65 73 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  es.  So it seems
14180 0a 2a 2a 20 73 61 66 65 72 20 74 6f 20 70 72 6f  .** safer to pro
14190 74 65 63 74 20 74 68 65 6d 20 75 73 69 6e 67 20  tect them using 
141a0 6d 75 74 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61  mutexAux..*/.sta
141b0 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20  tic int inMutex 
141c0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
141d0 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
141e0 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 74  static pthread_t
141f0 20 6d 75 74 65 78 4f 77 6e 65 72 3b 20 20 20 20   mutexOwner;    
14200 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20        /* Thread 
14210 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69  holding mutexMai
14220 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
14230 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
14240 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
14250 75 65 20 69 66 20 6d 75 74 65 78 4f 77 6e 65 72  ue if mutexOwner
14260 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61   is valid */.sta
14270 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
14280 78 5f 74 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20  x_t mutexMain = 
14290 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
142a0 49 54 49 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68  ITIALIZER; /* Th
142b0 65 20 6d 75 74 65 78 20 2a 2f 0a 73 74 61 74 69  e mutex */.stati
142c0 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
142d0 74 20 6d 75 74 65 78 41 75 78 20 3d 20 50 54 48  t mutexAux = PTH
142e0 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
142f0 41 4c 49 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20  ALIZER;  /* Aux 
14300 6d 75 74 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a  mutex */.#endif.
14310 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
14320 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75  wing pair of rou
14330 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  tine implement m
14340 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20  utual exclusion 
14350 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72  for.** multi-thr
14360 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e  eaded processes.
14370 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
14380 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65  thread is allowe
14390 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64  d to.** executed
143a0 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75   code that is su
143b0 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65  rrounded by Ente
143c0 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61  rMutex() and Lea
143d0 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a  veMutex()..**.**
143e0 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c   SQLite uses onl
143f0 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78  y a single Mutex
14400 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20  .  There is not 
14410 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a  much critical.**
14420 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c   code and what l
14430 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65  ittle there is e
14440 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20  xecutes quickly 
14450 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63  and without bloc
14460 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f  king..**.** As o
14470 66 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c  f version 3.3.2,
14480 20 74 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74   this mutex must
14490 20 62 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a   be recursive..*
144a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
144b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a  ixEnterMutex(){.
144c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
144d0 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
144e0 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
144f0 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 69 66  &mutexAux);.  if
14500 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  ( !mutexOwnerVal
14510 69 64 20 7c 7c 20 21 70 74 68 72 65 61 64 5f 65  id || !pthread_e
14520 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
14530 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
14540 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
14550 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
14560 74 65 78 41 75 78 29 3b 0a 20 20 20 20 70 74 68  texAux);.    pth
14570 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
14580 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20  &mutexMain);.   
14590 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
145a0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
145b0 74 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61  t( !mutexOwnerVa
145c0 6c 69 64 20 29 3b 0a 20 20 20 20 70 74 68 72 65  lid );.    pthre
145d0 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
145e0 75 74 65 78 41 75 78 29 3b 0a 20 20 20 20 6d 75  utexAux);.    mu
145f0 74 65 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65  texOwner = pthre
14600 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d  ad_self();.    m
14610 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d  utexOwnerValid =
14620 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65   1;.  }.  inMute
14630 78 2b 2b 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d  x++;.  pthread_m
14640 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
14650 65 78 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20  exAux);.#else.  
14660 69 6e 4d 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69  inMutex++;.#endi
14670 66 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  f.}.void sqlite3
14680 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  UnixLeaveMutex()
14690 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
146a0 74 65 78 3e 30 20 29 3b 0a 23 69 66 64 65 66 20  tex>0 );.#ifdef 
146b0 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
146c0 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  ADS.  pthread_mu
146d0 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41  tex_lock(&mutexA
146e0 75 78 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d  ux);.  inMutex--
146f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 74 68 72  ;.  assert( pthr
14700 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
14710 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
14720 6c 66 28 29 29 20 29 3b 0a 20 20 69 66 28 20 69  lf()) );.  if( i
14730 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  nMutex==0 ){.   
14740 20 61 73 73 65 72 74 28 20 6d 75 74 65 78 4f 77   assert( mutexOw
14750 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  nerValid );.    
14760 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
14770 3d 20 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64  = 0;.    pthread
14780 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d  _mutex_unlock(&m
14790 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  utexMain);.  }. 
147a0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
147b0 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  nlock(&mutexAux)
147c0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65  ;.#else.  inMute
147d0 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  x--;.#endif.}../
147e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
147f0 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73   if the mutex is
14800 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e   currently held.
14810 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  .**.** If the th
14820 69 73 54 68 72 64 20 70 61 72 61 6d 65 74 65 72  isThrd parameter
14830 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e   is true, return
14840 20 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 74 68   true only if th
14850 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72  e.** calling thr
14860 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  ead holds the mu
14870 74 65 78 2e 20 20 49 66 20 74 68 65 20 70 61 72  tex.  If the par
14880 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c  ameter is false,
14890 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   return.** true 
148a0 69 66 20 61 6e 79 20 74 68 72 65 61 64 20 68 6f  if any thread ho
148b0 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a  lds the mutex..*
148c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
148d0 78 49 6e 4d 75 74 65 78 28 69 6e 74 20 74 68 69  xInMutex(int thi
148e0 73 54 68 72 64 29 7b 0a 23 69 66 64 65 66 20 53  sThrd){.#ifdef S
148f0 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
14900 44 53 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  DS.  int rc;.  p
14910 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
14920 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
14930 72 63 20 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26  rc = inMutex>0 &
14940 26 20 28 74 68 69 73 54 68 72 64 3d 3d 30 20 7c  & (thisThrd==0 |
14950 7c 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  | pthread_equal(
14960 6d 75 74 65 78 4f 77 6e 65 72 2c 70 74 68 72 65  mutexOwner,pthre
14970 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a 20 20 70  ad_self()));.  p
14980 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
14990 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
149a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c    return rc;.#el
149b0 73 65 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75  se.  return inMu
149c0 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  tex>0;.#endif.}.
149d0 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
149e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
149f0 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
14a00 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61  ta blocks alloca
14a10 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73  ted..** Use this
14a20 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
14a30 77 65 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69  we are not leaki
14a40 6e 67 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ng thread-specif
14a50 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b  ic-data..** Tick
14a60 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64  et #1601.*/.#ifd
14a70 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
14a80 6e 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  nt sqlite3_tsd_c
14a90 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 69 66 64 65  ount = 0;.# ifde
14aa0 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
14ab0 52 45 41 44 53 0a 20 20 20 20 73 74 61 74 69 63  READS.    static
14ac0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
14ad0 20 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74   tsd_counter_mut
14ae0 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54  ex = PTHREAD_MUT
14af0 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a  EX_INITIALIZER;.
14b00 23 20 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43  #   define TSD_C
14b10 4f 55 4e 54 45 52 28 4e 29 20 5c 0a 20 20 20 20  OUNTER(N) \.    
14b20 20 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64           pthread
14b30 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64  _mutex_lock(&tsd
14b40 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
14b50 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
14b60 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
14b70 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20  t += N; \.      
14b80 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14b90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64  utex_unlock(&tsd
14ba0 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
14bb0 0a 23 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69  .# else.#   defi
14bc0 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e  ne TSD_COUNTER(N
14bd0 29 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  )  sqlite3_tsd_c
14be0 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69  ount += N.# endi
14bf0 66 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  f.#else.# define
14c00 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
14c10 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e   /* no-op */.#en
14c20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61  dif../*.** If ca
14c30 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61  lled with alloca
14c40 74 65 46 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72  teFlag>0, then r
14c50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14c60 74 6f 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65  to thread.** spe
14c70 63 69 66 69 63 20 64 61 74 61 20 66 6f 72 20 74  cific data for t
14c80 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14c90 64 2e 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  d.  Allocate and
14ca0 20 7a 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72   zero the.** thr
14cb0 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
14cc0 61 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  a if it does not
14cd0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
14ce0 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  **.** If called 
14cf0 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
14d00 67 3d 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b  g==0, then check
14d10 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14d20 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  ead.** specific 
14d30 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74  data.  Return it
14d40 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
14d50 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
14d60 78 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  xist,.** then re
14d70 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
14d80 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
14d90 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20  allocateFlag<0, 
14da0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14db0 74 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69  the thread speci
14dc0 66 69 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61  fic.** data is a
14dd0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20  llocated and is 
14de0 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74  all zero.  If it
14df0 20 69 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63   is then dealloc
14e00 61 74 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72  ate it..** Retur
14e10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14e20 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66  he thread specif
14e30 69 63 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20  ic data or NULL 
14e40 69 66 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c  if it is.** unal
14e50 6c 6f 63 61 74 65 64 20 6f 72 20 67 65 74 73 20  located or gets 
14e60 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  deallocated..*/.
14e70 54 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69  ThreadData *sqli
14e80 74 65 33 55 6e 69 78 54 68 72 65 61 64 53 70 65  te3UnixThreadSpe
14e90 63 69 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c  cificData(int al
14ea0 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73  locateFlag){.  s
14eb0 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65  tatic const Thre
14ec0 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20  adData zeroData 
14ed0 3d 20 7b 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69  = {0};  /* Initi
14ee0 61 6c 69 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63  alizer to silenc
14ef0 65 20 77 61 72 6e 69 6e 67 73 0a 20 20 20 20 20  e warnings.     
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72        ** from br
14f30 6f 6b 65 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a  oken compilers *
14f40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14f50 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73  UNIX_THREADS.  s
14f60 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65  tatic pthread_ke
14f70 79 5f 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69  y_t key;.  stati
14f80 63 20 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20  c int keyInit = 
14f90 30 3b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  0;.  ThreadData 
14fa0 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b  *pTsd;..  if( !k
14fb0 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  eyInit ){.    sq
14fc0 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
14fd0 78 28 29 3b 0a 20 20 20 20 69 66 28 20 21 6b 65  x();.    if( !ke
14fe0 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69  yInit ){.      i
14ff0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  nt rc;.      rc 
15000 3d 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 63 72  = pthread_key_cr
15010 65 61 74 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20  eate(&key, 0);. 
15020 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
15030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15040 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15050 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65        }.      ke
15070 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  yInit = 1;.    }
15080 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
15090 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
150a0 0a 20 20 70 54 73 64 20 3d 20 70 74 68 72 65 61  .  pTsd = pthrea
150b0 64 5f 67 65 74 73 70 65 63 69 66 69 63 28 6b 65  d_getspecific(ke
150c0 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61  y);.  if( alloca
150d0 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20  teFlag>0 ){.    
150e0 69 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20  if( pTsd==0 ){. 
150f0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
15100 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28  3TestMallocFail(
15110 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73  ) ){.        pTs
15120 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  d = sqlite3OsMal
15130 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44  loc(sizeof(zeroD
15140 61 74 61 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ata));.      }.#
15150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
15160 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
15170 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a  te3_isFail = 0;.
15180 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
15190 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
151a0 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
151b0 61 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  a;.        pthre
151c0 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b  ad_setspecific(k
151d0 65 79 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20  ey, pTsd);.     
151e0 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
151f0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
15200 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
15210 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
15220 65 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20  eFlag<0 .       
15230 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
15240 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20  Tsd, &zeroData, 
15250 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74  sizeof(ThreadDat
15260 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  a))==0 ){.    sq
15270 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64  lite3OsFree(pTsd
15280 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73  );.    pthread_s
15290 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20  etspecific(key, 
152a0 30 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e  0);.    TSD_COUN
152b0 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73  TER(-1);.    pTs
152c0 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
152d0 75 72 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a  urn pTsd;.#else.
152e0 20 20 73 74 61 74 69 63 20 54 68 72 65 61 64 44    static ThreadD
152f0 61 74 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20  ata *pTsd = 0;. 
15300 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
15310 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
15320 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
15330 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
15340 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
15350 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
15360 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20  qlite3OsMalloc( 
15370 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29  sizeof(zeroData)
15380 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
15390 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
153a0 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
153b0 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  _isFail = 0;.#en
153c0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 54  dif.      if( pT
153d0 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sd ){.        *p
153e0 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a  Tsd = zeroData;.
153f0 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e          TSD_COUN
15400 54 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d  TER(+1);.      }
15410 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
15420 66 28 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c  f( pTsd!=0 && al
15430 6c 6f 63 61 74 65 46 6c 61 67 3c 30 0a 20 20 20  locateFlag<0.   
15440 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
15450 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61  mp(pTsd, &zeroDa
15460 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61  ta, sizeof(Threa
15470 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20  dData))==0 ){.  
15480 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28    sqlite3OsFree(
15490 70 54 73 64 29 3b 0a 20 20 20 20 54 53 44 5f 43  pTsd);.    TSD_C
154a0 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20  OUNTER(-1);.    
154b0 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
154c0 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e  return pTsd;.#en
154d0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
154e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
154f0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
15500 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
15510 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
15520 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
15530 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
15540 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
15550 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
15560 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
15570 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
15580 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
15590 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
155a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
155b0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
155c0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
155d0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
155e0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
155f0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
15600 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
15610 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
15620 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
15630 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
15640 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
15650 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
15660 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
15670 73 71 6c 69 74 65 33 55 6e 69 78 43 75 72 72 65  sqlite3UnixCurre
15680 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70  ntTime(double *p
15690 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f  rNow){.#ifdef NO
156a0 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74  _GETTOD.  time_t
156b0 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
156c0 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34    *prNow = t/864
156d0 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
156e0 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
156f0 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
15700 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
15710 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f  Now, 0);.  *prNo
15720 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
15730 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
15740 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
15750 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
15760 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15770 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
15780 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
15790 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
157a0 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  rNow = sqlite3_c
157b0 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30  urrent_time/8640
157c0 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
157d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
157e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69  turn 0;.}..#endi
157f0 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a  f /* OS_UNIX */.