/ Hex Artifact Content
Login

Artifact 9d2a421acc607262e63ccf31e3fe86e5f2520af6:


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 20 20 20 20 20 20 20 20 70 6f 73  um {.        pos
3a10: 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d  ixLockingStyle =
3a20: 20 30 2c 20 20 20 20 20 20 20 2f 2a 20 73 74 61   0,       /* sta
3a30: 6e 64 61 72 64 20 70 6f 73 69 78 2d 61 64 76 69  ndard posix-advi
3a40: 73 6f 72 79 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  sory locks */.  
3a50: 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
3a60: 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Style,          
3a70: 20 20 20 2f 2a 20 75 73 65 20 61 66 70 20 6c 6f     /* use afp lo
3a80: 63 6b 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  cks */.        f
3a90: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
3aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75  ,           /* u
3ab0: 73 65 20 66 6c 6f 63 6b 28 29 20 2a 2f 0a 20 20  se flock() */.  
3ac0: 20 20 20 20 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63        dotlockLoc
3ad0: 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20  kingStyle,      
3ae0: 20 20 20 2f 2a 20 75 73 65 20 3c 66 69 6c 65 3e     /* use <file>
3af0: 2e 6c 6f 63 6b 20 66 69 6c 65 73 20 2a 2f 0a 20  .lock files */. 
3b00: 20 20 20 20 20 20 20 6e 6f 4c 6f 63 6b 69 6e 67         noLocking
3b10: 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Style,          
3b20: 20 20 20 20 2f 2a 20 75 73 65 66 75 6c 20 66 6f      /* useful fo
3b30: 72 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  r read-only file
3b40: 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 20   system */.     
3b50: 20 20 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f     unsupportedLo
3b60: 63 6b 69 6e 67 53 74 79 6c 65 20 20 20 20 20 20  ckingStyle      
3b70: 2f 2a 20 69 6e 64 69 63 61 74 65 73 20 75 6e 73  /* indicates uns
3b80: 75 70 70 6f 72 74 65 64 20 66 69 6c 65 20 73 79  upported file sy
3b90: 73 74 65 6d 20 2a 2f 0a 7d 20 73 71 6c 69 74 65  stem */.} sqlite
3ba0: 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 23  3LockingStyle;.#
3bb0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3bc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3bd0: 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TYLE */..#ifdef 
3be0: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
3bf0: 41 44 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  ADS./*.** This v
3c00: 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20  ariable records 
3c10: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3c20: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
3c30: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a  ide each others.
3c40: 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ** locks..**.** 
3c50: 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65     0:  No.  Thre
3c60: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
3c70: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
3c80: 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20  locks..**    1: 
3c90: 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63   Yes.  Threads c
3ca0: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
3cb0: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
3cc0: 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27  *   -1:  We don'
3cd0: 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a  t know yet..**.*
3ce0: 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  * On some system
3cf0: 73 2c 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f  s, we know at co
3d00: 6d 70 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68  mpile-time if th
3d10: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
3d20: 64 65 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72  de each.** other
3d30: 73 20 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f  s locks.  On tho
3d40: 73 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20  se systems, the 
3d50: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56  SQLITE_THREAD_OV
3d60: 45 52 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72  ERRIDE_LOCK macr
3d70: 6f 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74  o.** will be set
3d80: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20   appropriately. 
3d90: 20 4f 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d   On other system
3da0: 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 63 68  s, we have to ch
3db0: 65 63 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d  eck at.** runtim
3dc0: 65 2e 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74  e.  On these lat
3dd0: 74 65 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c  ter systems, SQL
3de0: 54 49 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  TIE_THREAD_OVERR
3df0: 49 44 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75  IDE_LOCK is.** u
3e00: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  ndefined..**.** 
3e10: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f  This variable no
3e20: 72 6d 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20  rmally has file 
3e30: 73 63 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74  scope only.  But
3e40: 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c   during testing,
3e50: 20 77 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61   we make.** it a
3e60: 20 67 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20   global so that 
3e70: 74 68 65 20 74 65 73 74 20 63 6f 64 65 20 63 61  the test code ca
3e80: 6e 20 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c  n change its val
3e90: 75 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76  ue in order to v
3ea0: 65 72 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68  erify.** that th
3eb0: 65 20 72 69 67 68 74 20 73 74 75 66 66 20 68 61  e right stuff ha
3ec0: 70 70 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20  ppens in either 
3ed0: 63 61 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  case..*/.#ifndef
3ee0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f   SQLITE_THREAD_O
3ef0: 56 45 52 52 49 44 45 5f 4c 4f 43 4b 0a 23 20 64  VERRIDE_LOCK.# d
3f00: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52  efine SQLITE_THR
3f10: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3f20: 4b 20 2d 31 0a 23 65 6e 64 69 66 0a 23 69 66 64  K -1.#endif.#ifd
3f30: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
3f40: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
3f50: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
3f60: 73 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41  s = SQLITE_THREA
3f70: 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b  D_OVERRIDE_LOCK;
3f80: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
3f90: 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  t threadsOverrid
3fa0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3fb0: 20 3d 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44   = SQLITE_THREAD
3fc0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 3b 0a  _OVERRIDE_LOCK;.
3fd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3fe0: 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  is structure hol
3ff0: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ds information p
4000: 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76  assed into indiv
4010: 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68  idual test.** th
4020: 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65 73  reads by the tes
4030: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
4040: 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65  havior() routine
4050: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65  ..*/.struct thre
4060: 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69  adTestData {.  i
4070: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
4080: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
4090: 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
40a0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
40b0: 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  k;     /* The lo
40c0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
40d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b  */.  int result;
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
40f0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63  esult of the loc
4100: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a  king operation *
4110: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  /.};..#ifdef SQL
4120: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f  ITE_LOCK_TRACE./
4130: 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69  *.** Print out i
4140: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4150: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   all locking ope
4160: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
4170: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
4180: 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73  sed for troubles
4190: 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e  hooting locks on
41a0: 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a   multithreaded.*
41b0: 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e  * platforms.  En
41c0: 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e  able by compilin
41d0: 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c  g with the -DSQL
41e0: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a  ITE_LOCK_TRACE.*
41f0: 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  * command-line o
4200: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d  ption on the com
4210: 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64  piler.  This cod
4220: 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  e is normally.**
4230: 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a   turned off..*/.
4240: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54  static int lockT
4250: 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74  race(int fd, int
4260: 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63   op, struct floc
4270: 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  k *p){.  char *z
4280: 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a  OpName, *zType;.
4290: 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73    int s;.  int s
42a0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28  avedErrno;.  if(
42b0: 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a   op==F_GETLK ){.
42c0: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47      zOpName = "G
42d0: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  ETLK";.  }else i
42e0: 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29  f( op==F_SETLK )
42f0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
4300: 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "SETLK";.  }else
4310: 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  {.    s = fcntl(
4320: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
4330: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4340: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
4350: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
4360: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
4370: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
4380: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
4390: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
43a0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
43b0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
43c0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
43d0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
43e0: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
43f0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
4400: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
4410: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
4420: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
4430: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
4440: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
4450: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
4460: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
4470: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
4480: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
4490: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
44a0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
44b0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
44c0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
44d0: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
44e0: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
44f0: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
4500: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
4510: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
4520: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
4530: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
4540: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
4550: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
4560: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
4570: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
4580: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
4590: 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45    fcntl(fd, F_GE
45a0: 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69  TLK, &l2);.    i
45b0: 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f  f( l2.l_type==F_
45c0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a  RDLCK ){.      z
45d0: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
45e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32      }else if( l2
45f0: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
4600: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
4610: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "WRLCK";.    }
4620: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
4630: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
4640: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e       zType = "UN
4650: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LCK";.    }else{
4660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
4670: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4680: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4690: 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d  ("fcntl-failure-
46a0: 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64  reason: %s %d %d
46b0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a   %d\n",.       z
46c0: 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  Type, (int)l2.l_
46d0: 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c  start, (int)l2.l
46e0: 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  _len, (int)l2.l_
46f0: 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e  pid);.  }.  errn
4700: 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  o = savedErrno;.
4710: 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64    return s;.}.#d
4720: 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b  efine fcntl lock
4730: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
4740: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
4750: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E */../*.** The 
4760: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
4770: 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74  gBehavior() rout
4780: 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f  ine launches two
4790: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72   separate.** thr
47a0: 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75  eads on this rou
47b0: 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74  tine.  This rout
47c0: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
47d0: 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64  lock a file.** d
47e0: 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72  escriptor then r
47f0: 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63  eturns.  The suc
4800: 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20  cess or failure 
4810: 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  of that attempt.
4820: 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65  ** allows the te
4830: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
4840: 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64  ehavior() proced
4850: 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ure to determine
4860: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
4870: 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  ot threads can o
4880: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
4890: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ers locks..*/.st
48a0: 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61  atic void *threa
48b0: 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69  dLockingTest(voi
48c0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75  d *pArg){.  stru
48d0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
48e0: 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75  a *pData = (stru
48f0: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4900: 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61  a*)pArg;.  pData
4910: 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c  ->result = fcntl
4920: 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45  (pData->fd, F_SE
4930: 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63  TLK, &pData->loc
4940: 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  k);.  return pAr
4950: 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
4960: 20 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d   procedure attem
4970: 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
4980: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4990: 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f  threads.** can o
49a0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
49b0: 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73  ers locks then s
49c0: 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65  ets the .** thre
49d0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
49e0: 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61  thersLocks varia
49f0: 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c  ble appropriatel
4a00: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
4a10: 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  d testThreadLock
4a20: 69 6e 67 42 65 68 61 76 69 6f 72 28 69 6e 74 20  ingBehavior(int 
4a30: 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20  fd_orig){.  int 
4a40: 66 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72  fd;.  struct thr
4a50: 65 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d  eadTestData d[2]
4a60: 3b 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b  ;.  pthread_t t[
4a70: 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28  2];..  fd = dup(
4a80: 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20  fd_orig);.  if( 
4a90: 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  fd<0 ) return;. 
4aa0: 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69   memset(d, 0, si
4ab0: 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d  zeof(d));.  d[0]
4ac0: 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d  .fd = fd;.  d[0]
4ad0: 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46  .lock.l_type = F
4ae0: 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c  _RDLCK;.  d[0].l
4af0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  ock.l_len = 1;. 
4b00: 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61   d[0].lock.l_sta
4b10: 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c  rt = 0;.  d[0].l
4b20: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
4b30: 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20  EEK_SET;.  d[1] 
4b40: 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c  = d[0];.  d[1].l
4b50: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
4b60: 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f  RLCK;.  pthread_
4b70: 63 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c  create(&t[0], 0,
4b80: 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65   threadLockingTe
4b90: 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74  st, &d[0]);.  pt
4ba0: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
4bb0: 31 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  1], 0, threadLoc
4bc0: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29  kingTest, &d[1])
4bd0: 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e  ;.  pthread_join
4be0: 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68  (t[0], 0);.  pth
4bf0: 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20  read_join(t[1], 
4c00: 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  0);.  close(fd);
4c10: 0a 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  .  threadsOverri
4c20: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
4c30: 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74  s =  d[0].result
4c40: 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75  ==0 && d[1].resu
4c50: 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  lt==0;.}.#endif 
4c60: 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  /* SQLITE_UNIX_T
4c70: 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  HREADS */../*.**
4c80: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49   Release a lockI
4c90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72  nfo structure pr
4ca0: 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74  eviously allocat
4cb0: 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e  ed by findLockIn
4cc0: 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fo()..*/.static 
4cd0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b  void releaseLock
4ce0: 49 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b  Info(struct lock
4cf0: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  Info *pLock){.  
4d00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4d10: 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20  sInMutex(1) );. 
4d20: 20 69 66 20 28 70 4c 6f 63 6b 20 3d 3d 20 4e 55   if (pLock == NU
4d30: 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  LL).    return;.
4d40: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b    pLock->nRef--;
4d50: 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52  .  if( pLock->nR
4d60: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ef==0 ){.    sql
4d70: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4d80: 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b  lockHash, &pLock
4d90: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c  ->key, sizeof(pL
4da0: 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20  ock->key), 0);. 
4db0: 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64     sqlite3Thread
4dc0: 53 61 66 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b  SafeFree(pLock);
4dd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4de0: 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20  lease a openCnt 
4df0: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
4e00: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
4e10: 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29  y findLockInfo()
4e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4e30: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
4e40: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
4e50: 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73 65 72 74  pOpen){.  assert
4e60: 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
4e70: 65 78 28 31 29 20 29 3b 0a 20 20 69 66 20 28 70  ex(1) );.  if (p
4e80: 4f 70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20  Open == NULL).  
4e90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 65    return;.  pOpe
4ea0: 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  n->nRef--;.  if(
4eb0: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
4ec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
4ed0: 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61  shInsert(&openHa
4ee0: 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c  sh, &pOpen->key,
4ef0: 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b   sizeof(pOpen->k
4f00: 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  ey), 0);.    fre
4f10: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
4f20: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  g);.    sqlite3T
4f30: 68 72 65 61 64 53 61 66 65 46 72 65 65 28 70 4f  hreadSafeFree(pO
4f40: 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  pen);.  }.}..#if
4f50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4f60: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
4f70: 2f 2a 0a 2a 2a 20 54 65 73 74 73 20 61 20 62 79  /*.** Tests a by
4f80: 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 69 6e 67  te-range locking
4f90: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   query to see if
4fa0: 20 62 79 74 65 20 72 61 6e 67 65 20 6c 6f 63 6b   byte range lock
4fb0: 73 20 61 72 65 20 0a 2a 2a 20 73 75 70 70 6f 72  s are .** suppor
4fc0: 74 65 64 2c 20 69 66 20 6e 6f 74 20 77 65 20 66  ted, if not we f
4fd0: 61 6c 6c 20 62 61 63 6b 20 74 6f 20 64 6f 74 6c  all back to dotl
4fe0: 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2e  ockLockingStyle.
4ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
5000: 65 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73  e3LockingStyle s
5010: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5020: 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63 68 61  gStyle(const cha
5030: 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20 20  r *filePath, .  
5040: 69 6e 74 20 66 64 29 20 7b 0a 20 20 2f 2a 20 74  int fd) {.  /* t
5050: 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
5060: 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 20  ock using fcntl 
5070: 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
5080: 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 20 20 0a 20  k lockInfo;.  . 
5090: 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
50a0: 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
50b0: 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
50c0: 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
50d0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
50e0: 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
50f0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 0a 20 20 69   F_RDLCK;.  .  i
5100: 66 20 28 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47  f (fcntl(fd, F_G
5110: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
5120: 20 21 3d 20 2d 31 29 20 7b 0a 20 20 20 20 72 65   != -1) {.    re
5130: 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63 6b 69 6e  turn posixLockin
5140: 67 53 74 79 6c 65 3b 0a 20 20 7d 20 0a 20 20 0a  gStyle;.  } .  .
5150: 20 20 2f 2a 20 74 65 73 74 69 6e 67 20 66 6f 72    /* testing for
5160: 20 66 6c 6f 63 6b 20 63 61 6e 20 67 69 76 65 20   flock can give 
5170: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 73 2e  false positives.
5180: 20 20 53 6f 20 69 66 20 69 66 20 74 68 65 20 61    So if if the a
5190: 62 6f 76 65 20 74 65 73 74 0a 20 20 2a 2a 20 66  bove test.  ** f
51a0: 61 69 6c 73 2c 20 74 68 65 6e 20 77 65 20 66 61  ails, then we fa
51b0: 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  ll back to using
51c0: 20 64 6f 74 2d 6c 6f 63 6b 20 73 74 79 6c 65 20   dot-lock style 
51d0: 6c 6f 63 6b 69 6e 67 2e 0a 20 20 2a 2f 20 20 0a  locking..  */  .
51e0: 20 20 72 65 74 75 72 6e 20 64 6f 74 6c 6f 63 6b    return dotlock
51f0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 7d 0a  LockingStyle;.}.
5200: 0a 2f 2a 20 0a 2a 2a 20 45 78 61 6d 69 6e 65 73  ./* .** Examines
5210: 20 74 68 65 20 66 5f 66 73 74 79 70 65 6e 61 6d   the f_fstypenam
5220: 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  e entry in the s
5230: 74 61 74 66 73 20 73 74 72 75 63 74 75 72 65 20  tatfs structure 
5240: 61 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 0a  as returned by .
5250: 2a 2a 20 73 74 61 74 28 29 20 66 6f 72 20 74 68  ** stat() for th
5260: 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 6f  e file system ho
5270: 73 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  sting the databa
5280: 73 65 20 66 69 6c 65 2c 20 61 73 73 69 67 6e 73  se file, assigns
5290: 20 74 68 65 20 0a 2a 2a 20 61 70 70 72 6f 70 72   the .** appropr
52a0: 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  iate locking sty
52b0: 6c 65 20 62 61 73 65 64 20 6f 6e 20 69 74 27 73  le based on it's
52c0: 20 76 61 6c 75 65 2e 20 20 54 68 65 73 65 20 76   value.  These v
52d0: 61 6c 75 65 73 20 61 6e 64 20 0a 2a 2a 20 61 73  alues and .** as
52e0: 73 69 67 6e 6d 65 6e 74 73 20 61 72 65 20 62 61  signments are ba
52f0: 73 65 64 20 6f 6e 20 44 61 72 77 69 6e 2f 4f 53  sed on Darwin/OS
5300: 58 20 62 65 68 61 76 69 6f 72 20 61 6e 64 20 68  X behavior and h
5310: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 74 65 73  ave not been tes
5320: 74 65 64 20 6f 6e 20 0a 2a 2a 20 6f 74 68 65 72  ted on .** other
5330: 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 73 74 61   systems..*/.sta
5340: 74 69 63 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69  tic sqlite3Locki
5350: 6e 67 53 74 79 6c 65 20 73 71 6c 69 74 65 33 44  ngStyle sqlite3D
5360: 65 74 65 63 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  etectLockingStyl
5370: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69  e(const char *fi
5380: 6c 65 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66  lePath, .  int f
5390: 64 29 20 7b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d) {..#ifdef SQL
53a0: 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e  ITE_FIXED_LOCKIN
53b0: 47 5f 53 54 59 4c 45 0a 20 20 72 65 74 75 72 6e  G_STYLE.  return
53c0: 20 28 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67   (sqlite3Locking
53d0: 53 74 79 6c 65 29 53 51 4c 49 54 45 5f 46 49 58  Style)SQLITE_FIX
53e0: 45 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  ED_LOCKING_STYLE
53f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
5400: 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
5410: 0a 20 20 69 66 20 28 73 74 61 74 66 73 28 66 69  .  if (statfs(fi
5420: 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
5430: 20 3d 3d 20 2d 31 29 0a 20 20 20 20 72 65 74 75   == -1).    retu
5440: 72 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f  rn sqlite3TestLo
5450: 63 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50  ckingStyle(fileP
5460: 61 74 68 2c 20 66 64 29 3b 0a 20 20 0a 20 20 69  ath, fd);.  .  i
5470: 66 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f (fsInfo.f_flag
5480: 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 29 0a  s & MNT_RDONLY).
5490: 20 20 20 20 72 65 74 75 72 6e 20 6e 6f 4c 6f 63      return noLoc
54a0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20  kingStyle;.  .  
54b0: 69 66 28 20 28 21 73 74 72 63 6d 70 28 66 73 49  if( (!strcmp(fsI
54c0: 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
54d0: 2c 20 22 68 66 73 22 29 29 20 7c 7c 0a 20 20 20  , "hfs")) ||.   
54e0: 20 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f   (!strcmp(fsInfo
54f0: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
5500: 75 66 73 22 29 29 20 29 0a 20 20 20 20 20 20 20  ufs")) ).       
5510: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5520: 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
5530: 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63  e;.  .  if(!strc
5540: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
5550: 70 65 6e 61 6d 65 2c 20 22 61 66 70 66 73 22 29  pename, "afpfs")
5560: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 61 66 70  ).    return afp
5570: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5580: 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73  .  if(!strcmp(fs
5590: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
55a0: 65 2c 20 22 6e 66 73 22 29 29 20 0a 20 20 20 20  e, "nfs")) .    
55b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 54 65  return sqlite3Te
55c0: 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 66  stLockingStyle(f
55d0: 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a 20 20  ilePath, fd);.  
55e0: 0a 20 20 69 66 28 21 73 74 72 63 6d 70 28 66 73  .  if(!strcmp(fs
55f0: 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
5600: 65 2c 20 22 73 6d 62 66 73 22 29 29 0a 20 20 20  e, "smbfs")).   
5610: 20 72 65 74 75 72 6e 20 66 6c 6f 63 6b 4c 6f 63   return flockLoc
5620: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20  kingStyle;.  .  
5630: 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  if(!strcmp(fsInf
5640: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5650: 22 6d 73 64 6f 73 22 29 29 0a 20 20 20 20 72 65  "msdos")).    re
5660: 74 75 72 6e 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  turn dotlockLock
5670: 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20 69  ingStyle;.  .  i
5680: 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f(!strcmp(fsInfo
5690: 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
56a0: 77 65 62 64 61 76 22 29 29 0a 20 20 20 20 72 65  webdav")).    re
56b0: 74 75 72 6e 20 75 6e 73 75 70 70 6f 72 74 65 64  turn unsupported
56c0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
56d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
56e0: 33 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c  3TestLockingStyl
56f0: 65 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b  e(filePath, fd);
5700: 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c    .#endif /* SQL
5710: 49 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e  ITE_FIXED_LOCKIN
5720: 47 5f 53 54 59 4c 45 20 2a 2f 0a 7d 0a 0a 23 65  G_STYLE */.}..#e
5730: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
5740: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5750: 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  YLE */../*.** Gi
5760: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
5770: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f  iptor, locate lo
5780: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
5790: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68  nt structures th
57a0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
57b0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
57c0: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 6e 65  ptor.  Create ne
57d0: 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73  w ones if necess
57e0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
57f0: 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74  urn values might
5800: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
5810: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
5820: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  curs..**.** Retu
5830: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5840: 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74   errors..*/.stat
5850: 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49  ic int findLockI
5860: 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  nfo(.  int fd,  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
5890: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
58a0: 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20  in the key */.  
58b0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
58c0: 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  **ppLock,    /* 
58d0: 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49  Return the lockI
58e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 65  nfo structure he
58f0: 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f  re */.  struct o
5900: 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20  penCnt **ppOpen 
5910: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
5920: 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  he openCnt struc
5930: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ture here */.){.
5940: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
5950: 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b  ct lockKey key1;
5960: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
5970: 79 20 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74  y key2;.  struct
5980: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
5990: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
59a0: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
59b0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
59c0: 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28 66  ;.  rc = fstat(f
59d0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
59e0: 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
59f0: 72 6e 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  rn 1;..  assert(
5a00: 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
5a10: 78 28 31 29 20 29 3b 0a 20 20 6d 65 6d 73 65 74  x(1) );.  memset
5a20: 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65 6f  (&key1, 0, sizeo
5a30: 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79 31  f(key1));.  key1
5a40: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
5a50: 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69 6e  t_dev;.  key1.in
5a60: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
5a70: 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  no;.#ifdef SQLIT
5a80: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
5a90: 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65 72   if( threadsOver
5aa0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5ab0: 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65 73  cks<0 ){.    tes
5ac0: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
5ad0: 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d 0a  havior(fd);.  }.
5ae0: 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68 72    key1.tid = thr
5af0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
5b00: 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20  OthersLocks ? 0 
5b10: 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  : pthread_self()
5b20: 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65  ;.#endif.  memse
5b30: 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a 65  t(&key2, 0, size
5b40: 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65 79  of(key2));.  key
5b50: 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  2.dev = statbuf.
5b60: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e 69  st_dev;.  key2.i
5b70: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
5b80: 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 28  ino;.  pLock = (
5b90: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a  struct lockInfo*
5ba0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
5bb0: 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65 79  (&lockHash, &key
5bc0: 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  1, sizeof(key1))
5bd0: 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30  ;.  if( pLock==0
5be0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c   ){.    struct l
5bf0: 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20  ockInfo *pOld;. 
5c00: 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74     pLock = sqlit
5c10: 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c 6c  e3ThreadSafeMall
5c20: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63  oc( sizeof(*pLoc
5c30: 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  k) );.    if( pL
5c40: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
5c50: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
5c60: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
5c70: 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  info;.    }.    
5c80: 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79  pLock->key = key
5c90: 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  1;.    pLock->nR
5ca0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63  ef = 1;.    pLoc
5cb0: 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  k->cnt = 0;.    
5cc0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
5cd0: 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  = 0;.    pOld = 
5ce0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5cf0: 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c  t(&lockHash, &pL
5d00: 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  ock->key, sizeof
5d10: 28 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a  (key1), pLock);.
5d20: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20      if( pOld!=0 
5d30: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5d40: 20 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a   pOld==pLock );.
5d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68 72        sqlite3Thr
5d60: 65 61 64 53 61 66 65 46 72 65 65 28 70 4c 6f 63  eadSafeFree(pLoc
5d70: 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  k);.      rc = 1
5d80: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
5d90: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
5da0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5db0: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
5dc0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20  ;.  }.  *ppLock 
5dd0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70  = pLock;.  if( p
5de0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
5df0: 70 4f 70 65 6e 20 3d 20 28 73 74 72 75 63 74 20  pOpen = (struct 
5e00: 6f 70 65 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33  openCnt*)sqlite3
5e10: 48 61 73 68 46 69 6e 64 28 26 6f 70 65 6e 48 61  HashFind(&openHa
5e20: 73 68 2c 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f  sh, &key2, sizeo
5e30: 66 28 6b 65 79 32 29 29 3b 0a 20 20 20 20 69 66  f(key2));.    if
5e40: 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  ( pOpen==0 ){.  
5e50: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
5e60: 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 20 20  nt *pOld;.      
5e70: 70 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 54  pOpen = sqlite3T
5e80: 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
5e90: 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20   sizeof(*pOpen) 
5ea0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  );.      if( pOp
5eb0: 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
5ec0: 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
5ed0: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20  (pLock);.       
5ee0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
5ef0: 20 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c   goto exit_findl
5f00: 6f 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d  ockinfo;.      }
5f10: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65  .      pOpen->ke
5f20: 79 20 3d 20 6b 65 79 32 3b 0a 20 20 20 20 20 20  y = key2;.      
5f30: 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b  pOpen->nRef = 1;
5f40: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  .      pOpen->nL
5f50: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ock = 0;.      p
5f60: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d  Open->nPending =
5f70: 20 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d   0;.      pOpen-
5f80: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >aPending = 0;. 
5f90: 20 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69       pOld = sqli
5fa0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f  te3HashInsert(&o
5fb0: 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d  penHash, &pOpen-
5fc0: 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79  >key, sizeof(key
5fd0: 32 29 2c 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20  2), pOpen);.    
5fe0: 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b    if( pOld!=0 ){
5ff0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6000: 20 70 4f 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a   pOld==pOpen );.
6010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
6020: 68 72 65 61 64 53 61 66 65 46 72 65 65 28 70 4f  hreadSafeFree(pO
6030: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pen);.        re
6040: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
6050: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ock);.        rc
6060: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
6070: 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b  to exit_findlock
6080: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  info;.      }.  
6090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
60a0: 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Open->nRef++;.  
60b0: 20 20 7d 0a 20 20 20 20 2a 70 70 4f 70 65 6e 20    }.    *ppOpen 
60c0: 3d 20 70 4f 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78  = pOpen;.  }..ex
60d0: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a  it_findlockinfo:
60e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
60f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6100: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  EBUG./*.** Helpe
6110: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
6120: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
6130: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
6140: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
6150: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
6160: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
6170: 67 20 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20  g represetation 
6180: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
6190: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
61a0: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
61b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
61c0: 74 79 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63  typeName(int loc
61d0: 6b 74 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68  ktype){.  switch
61e0: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
61f0: 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65  case NO_LOCK: re
6200: 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63  turn "NONE";.  c
6210: 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a  ase SHARED_LOCK:
6220: 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22   return "SHARED"
6230: 3b 0a 20 20 63 61 73 65 20 52 45 53 45 52 56 45  ;.  case RESERVE
6240: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
6250: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73  RESERVED";.  cas
6260: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20  e PENDING_LOCK: 
6270: 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22  return "PENDING"
6280: 3b 0a 20 20 63 61 73 65 20 45 58 43 4c 55 53 49  ;.  case EXCLUSI
6290: 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  VE_LOCK: return 
62a0: 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d  "EXCLUSIVE";.  }
62b0: 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52  .  return "ERROR
62c0: 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ";.}.#endif../*.
62d0: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
62e0: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
62f0: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
6300: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
6310: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
6320: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
6330: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
6340: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
6350: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
6360: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
6370: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
6380: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
6390: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
63a0: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
63b0: 65 6d 73 20 77 68 65 72 65 20 6f 6e 65 20 74 68  ems where one th
63c0: 72 65 61 64 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  read is.** unabl
63d0: 65 20 74 6f 20 6f 76 65 72 72 69 64 65 20 6c 6f  e to override lo
63e0: 63 6b 73 20 63 72 65 61 74 65 64 20 62 79 20 61  cks created by a
63f0: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
6400: 64 2e 20 20 52 65 64 48 61 74 39 20 69 73 0a 2a  d.  RedHat9 is.*
6410: 2a 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20  * an example of 
6420: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 0a 2a  such a system..*
6430: 2a 0a 2a 2a 20 4f 77 6e 65 72 73 68 69 70 20 74  *.** Ownership t
6440: 72 61 6e 73 66 65 72 20 69 73 20 6f 6e 6c 79 20  ransfer is only 
6450: 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 75  allowed if the u
6460: 6e 69 78 46 69 6c 65 20 69 73 20 63 75 72 72 65  nixFile is curre
6470: 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  ntly unlocked..*
6480: 2a 20 49 66 20 74 68 65 20 75 6e 69 78 46 69 6c  * If the unixFil
6490: 65 20 69 73 20 6c 6f 63 6b 65 64 20 61 6e 64 20  e is locked and 
64a0: 61 6e 20 6f 77 6e 65 72 73 68 69 70 20 69 73 20  an ownership is 
64b0: 77 72 6f 6e 67 2c 20 74 68 65 6e 20 72 65 74 75  wrong, then retu
64c0: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  rn.** SQLITE_MIS
64d0: 55 53 45 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20  USE.  SQLITE_OK 
64e0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
64f0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2e  verything works.
6500: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
6510: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73  E_UNIX_THREADS.s
6520: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 66  tatic int transf
6530: 65 72 4f 77 6e 65 72 73 68 69 70 28 75 6e 69 78  erOwnership(unix
6540: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
6550: 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
6560: 64 5f 74 20 68 53 65 6c 66 3b 0a 20 20 69 66 28  d_t hSelf;.  if(
6570: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
6580: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
6590: 29 7b 0a 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73  ){.    /* Owners
65a0: 68 69 70 20 74 72 61 6e 73 66 65 72 73 20 6e 6f  hip transfers no
65b0: 74 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 69 73  t needed on this
65c0: 20 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72   system */.    r
65d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
65e0: 0a 20 20 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70  .  }.  hSelf = p
65f0: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20  thread_self();. 
6600: 20 69 66 28 20 70 74 68 72 65 61 64 5f 65 71 75   if( pthread_equ
6610: 61 6c 28 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68  al(pFile->tid, h
6620: 53 65 6c 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Self) ){.    /* 
6630: 57 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  We are still in 
6640: 74 68 65 20 73 61 6d 65 20 74 68 72 65 61 64 20  the same thread 
6650: 2a 2f 0a 20 20 20 20 4f 53 54 52 41 43 45 31 28  */.    OSTRACE1(
6660: 22 4e 6f 2d 74 72 61 6e 73 66 65 72 2c 20 73 61  "No-transfer, sa
6670: 6d 65 20 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20  me thread\n");. 
6680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
66a0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
66b0: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f  NO_LOCK ){.    /
66c0: 2a 20 57 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e  * We cannot chan
66d0: 67 65 20 6f 77 6e 65 72 73 68 69 70 20 77 68 69  ge ownership whi
66e0: 6c 65 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  le we are holdin
66f0: 67 20 61 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20  g a lock! */.   
6700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
6710: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 4f 53 54  ISUSE;.  }.  OST
6720: 52 41 43 45 34 28 22 54 72 61 6e 73 66 65 72 20  RACE4("Transfer 
6730: 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25 64 20  ownership of %d 
6740: 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22  from %d to %d\n"
6750: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ,.            pF
6760: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 74  ile->h, pFile->t
6770: 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20 70 46  id, hSelf);.  pF
6780: 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65 6c 66  ile->tid = hSelf
6790: 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 70  ;.  if (pFile->p
67a0: 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Lock != NULL) {.
67b0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
67c0: 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  nfo(pFile->pLock
67d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64  );.    rc = find
67e0: 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e  LockInfo(pFile->
67f0: 68 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  h, &pFile->pLock
6800: 2c 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  , 0);.    OSTRAC
6810: 45 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69  E5("LOCK    %d i
6820: 73 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c  s now %s(%s,%d)\
6830: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
6840: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
6850: 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  eName(pFile->loc
6860: 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20  ktype),.        
6870: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
6880: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f  pFile->pLock->lo
6890: 63 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e  cktype), pFile->
68a0: 70 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20  pLock->cnt);.   
68b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
68c0: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
68d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
68e0: 0a 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4f 6e  .}.#else.  /* On
68f0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
6900: 20 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68   builds, ownersh
6910: 69 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61  ip transfer is a
6920: 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69   no-op */.# defi
6930: 6e 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72  ne transferOwner
6940: 73 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f  ship(X) SQLITE_O
6950: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
6960: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
6970: 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   file.*/.int sql
6980: 69 74 65 33 55 6e 69 78 44 65 6c 65 74 65 28 63  ite3UnixDelete(c
6990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
69a0: 6e 61 6d 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74  name){.  Simulat
69b0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
69c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
69d0: 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a  ETE);.  unlink(z
69e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
69f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
6a10: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
6a20: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
6a30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6a40: 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74  FileExists(const
6a50: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
6a60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  ){.  return acce
6a70: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
6a80: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ==0;.}../* Forwa
6a90: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
6aa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
6ab0: 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  ocateUnixFile(. 
6ac0: 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
6ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6ae0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
6af0: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
6b00: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64  /.  OsFile **pId
6b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
6b20: 20 57 72 69 74 65 20 74 68 65 20 72 65 61 6c 20   Write the real 
6b30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6b40: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6b50: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
6b60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
6b70: 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
6b80: 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ened */.  int de
6b90: 6c 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  lFlag           
6ba0: 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
6bb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 69  make sure the fi
6bc0: 6c 65 20 64 65 6c 65 74 65 73 20 6f 6e 20 63 6c  le deletes on cl
6bd0: 6f 73 65 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  ose */.);../*.**
6be0: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
6bf0: 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68   a file for both
6c00: 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
6c10: 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a  ting.  If that.*
6c20: 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65  * fails, try ope
6c30: 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c  ning it read-onl
6c40: 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  y.  If the file 
6c50: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a  does not exist,.
6c60: 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ** try to create
6c70: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75   it..**.** On su
6c80: 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20  ccess, a handle 
6c90: 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c  for the open fil
6ca0: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
6cb0: 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61  *id.** and *pRea
6cc0: 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20  donly is set to 
6cd0: 30 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  0 if the file wa
6ce0: 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  s opened for rea
6cf0: 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74  ding and.** writ
6d00: 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65 20  ing or 1 if the 
6d10: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
6d20: 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20  read-only.  The 
6d30: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
6d40: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
6d50: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
6d60: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
6d70: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
6d80: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
6d90: 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65  .** *id and *pRe
6da0: 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64  adonly unchanged
6db0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6dc0: 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72 69 74  UnixOpenReadWrit
6dd0: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
6de0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73  *zFilename,.  Os
6df0: 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20 20 69 6e  File **pId,.  in
6e00: 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a  t *pReadonly.){.
6e10: 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43 52    int h;.  .  CR
6e20: 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44  ASH_TEST_OVERRID
6e30: 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70  E(sqlite3CrashOp
6e40: 65 6e 52 65 61 64 57 72 69 74 65 2c 20 7a 46 69  enReadWrite, zFi
6e50: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 70 52 65  lename, pId, pRe
6e60: 61 64 6f 6e 6c 79 29 3b 0a 20 20 61 73 73 65 72  adonly);.  asser
6e70: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
6e80: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
6e90: 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
6ea0: 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  AT|O_LARGEFILE|O
6eb0: 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20  _BINARY,.       
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
6ee0: 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
6ef0: 29 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a  );.  if( h<0 ){.
6f00: 23 69 66 64 65 66 20 45 49 53 44 49 52 0a 20 20  #ifdef EISDIR.  
6f10: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 53    if( errno==EIS
6f20: 44 49 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74  DIR ){.      ret
6f30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6f40: 50 45 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  PEN;.    }.#endi
6f50: 66 0a 20 20 20 20 68 20 3d 20 6f 70 65 6e 28 7a  f.    h = open(z
6f60: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  Filename, O_RDON
6f70: 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  LY|O_LARGEFILE|O
6f80: 5f 42 49 4e 41 52 59 29 3b 0a 20 20 20 20 69 66  _BINARY);.    if
6f90: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  ( h<0 ){.      r
6fa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
6fb0: 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20 20  TOPEN; .    }.  
6fc0: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31    *pReadonly = 1
6fd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6fe0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  pReadonly = 0;. 
6ff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f   }.  return allo
7000: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 68 2c 20  cateUnixFile(h, 
7010: 70 49 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  pId, zFilename, 
7020: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74  0);.}.../*.** At
7030: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
7040: 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 65 78 63  new file for exc
7050: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 62 79  lusive access by
7060: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
7070: 2a 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  * The file will 
7080: 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f  be opened for bo
7090: 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
70a0: 72 69 74 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69  riting.  To avoi
70b0: 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c  d.** a potential
70c0: 20 73 65 63 75 72 69 74 79 20 70 72 6f 62 6c 65   security proble
70d0: 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c  m, we do not all
70e0: 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  ow the file to h
70f0: 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  ave.** previousl
7100: 79 20 65 78 69 73 74 65 64 2e 20 20 4e 6f 72 20  y existed.  Nor 
7110: 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68 65 20  do we allow the 
7120: 66 69 6c 65 20 74 6f 20 62 65 20 61 20 73 79 6d  file to be a sym
7130: 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a  bolic.** link..*
7140: 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61 67 20  *.** If delFlag 
7150: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6d 61  is true, then ma
7160: 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74 73 20  ke arrangements 
7170: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
7180: 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66   delete.** the f
7190: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
71a0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  losed..**.** On 
71b0: 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74  success, write t
71c0: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69  he file handle i
71d0: 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75  nto *id and retu
71e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
71f0: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
7200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
7210: 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  NTOPEN..*/.int s
7220: 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e 45 78  qlite3UnixOpenEx
7230: 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63 68  clusive(const ch
7240: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
7250: 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69 6e 74  sFile **pId, int
7260: 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 69 6e 74   delFlag){.  int
7270: 20 68 3b 0a 0a 20 20 43 52 41 53 48 5f 54 45 53   h;..  CRASH_TES
7280: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
7290: 65 33 43 72 61 73 68 4f 70 65 6e 45 78 63 6c 75  e3CrashOpenExclu
72a0: 73 69 76 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  sive, zFilename,
72b0: 20 70 49 64 2c 20 64 65 6c 46 6c 61 67 29 3b 0a   pId, delFlag);.
72c0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49    assert( 0==*pI
72d0: 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e 28  d );.  h = open(
72e0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
72f0: 20 20 20 20 20 20 20 20 20 20 20 4f 5f 52 44 57             O_RDW
7300: 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  R|O_CREAT|O_EXCL
7310: 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41  |O_NOFOLLOW|O_LA
7320: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
7330: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7340: 20 20 64 65 6c 46 6c 61 67 20 3f 20 30 36 30 30    delFlag ? 0600
7350: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
7360: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
7370: 4e 53 29 3b 0a 20 20 69 66 28 20 68 3c 30 20 29  NS);.  if( h<0 )
7380: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7390: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
73a0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63  }.  return alloc
73b0: 61 74 65 55 6e 69 78 46 69 6c 65 28 68 2c 20 70  ateUnixFile(h, p
73c0: 49 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 64  Id, zFilename, d
73d0: 65 6c 46 6c 61 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  elFlag);.}../*.*
73e0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
73f0: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72  n a new file for
7400: 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73   read-only acces
7410: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  s..**.** On succ
7420: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
7430: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
7440: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
7450: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
7460: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
7470: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
7480: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EN..*/.int sqlit
7490: 65 33 55 6e 69 78 4f 70 65 6e 52 65 61 64 4f 6e  e3UnixOpenReadOn
74a0: 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ly(const char *z
74b0: 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65  Filename, OsFile
74c0: 20 2a 2a 70 49 64 29 7b 0a 20 20 69 6e 74 20 68   **pId){.  int h
74d0: 3b 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53  ;.  .  CRASH_TES
74e0: 54 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74  T_OVERRIDE(sqlit
74f0: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f  e3CrashOpenReadO
7500: 6e 6c 79 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  nly, zFilename, 
7510: 70 49 64 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  pId, 0);.  asser
7520: 74 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20  t( 0==*pId );.  
7530: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
7540: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
7550: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
7560: 59 29 3b 0a 20 20 69 66 28 20 68 3c 30 20 29 7b  Y);.  if( h<0 ){
7570: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7580: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
7590: 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61  .  return alloca
75a0: 74 65 55 6e 69 78 46 69 6c 65 28 68 2c 20 70 49  teUnixFile(h, pI
75b0: 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  d, zFilename, 0)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
75d0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
75e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
75f0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
7600: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
7610: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
7620: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
7630: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
7640: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
7650: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
7660: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
7670: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
7680: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
7690: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
76a0: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
76b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
76c0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
76d0: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
76e0: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
76f0: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
7700: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
7710: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
7720: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 46 55 4c 4c 5f  ..**.** If FULL_
7730: 46 53 59 4e 43 20 69 73 20 65 6e 61 62 6c 65 64  FSYNC is enabled
7740: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
7750: 69 73 20 6e 6f 74 20 6c 6f 6e 67 65 72 20 75 73  is not longer us
7760: 65 66 75 6c 2c 20 0a 2a 2a 20 61 20 46 55 4c 4c  eful, .** a FULL
7770: 5f 46 53 59 4e 43 20 73 79 6e 63 20 61 70 70 6c  _FSYNC sync appl
7780: 69 65 73 20 74 6f 20 61 6c 6c 20 70 65 6e 64 69  ies to all pendi
7790: 6e 67 20 64 69 73 6b 20 6f 70 65 72 61 74 69 6f  ng disk operatio
77a0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ns..**.** On suc
77b0: 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66  cess, a handle f
77c0: 6f 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20  or a previously 
77d0: 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 2a 69 64  open file at *id
77e0: 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77   is.** updated w
77f0: 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72 65  ith the new dire
7800: 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
7810: 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45  iptor and SQLITE
7820: 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  _OK is.** return
7830: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  ed..**.** On fai
7840: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
7850: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
7860: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
7870: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63  eaves.** *id unc
7880: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
7890: 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 44 69  c int unixOpenDi
78a0: 72 65 63 74 6f 72 79 28 0a 20 20 4f 73 46 69 6c  rectory(.  OsFil
78b0: 65 20 2a 69 64 2c 0a 20 20 63 6f 6e 73 74 20 63  e *id,.  const c
78c0: 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 0a 29 7b  har *zDirname.){
78d0: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 75 6e 69 78  .  int h;.  unix
78e0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
78f0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
7900: 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
7910: 29 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  );.  SET_THREADI
7920: 44 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73 65  D(pFile);.  asse
7930: 72 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64  rt( pFile->dirfd
7940: 3c 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64  <0 );.  pFile->d
7950: 69 72 66 64 20 3d 20 68 20 3d 20 6f 70 65 6e 28  irfd = h = open(
7960: 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
7970: 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
7980: 0a 20 20 69 66 28 20 68 3c 30 20 29 7b 0a 20 20  .  if( h<0 ){.  
7990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
79a0: 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 23  CANTOPEN; .  }.#
79b0: 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43  ifdef FD_CLOEXEC
79c0: 0a 20 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  .  fcntl(h, F_SE
79d0: 54 46 44 2c 20 66 63 6e 74 6c 28 68 2c 20 46 5f  TFD, fcntl(h, F_
79e0: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
79f0: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
7a00: 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e    OSTRACE3("OPEN
7a10: 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  DIR %-3d %s\n", 
7a20: 68 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  h, zDirname);.  
7a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
7a50: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
7a60: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
7a70: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
7a80: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
7a90: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
7aa0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
7ab0: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
7ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
7ad0: 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68  xTempFileName(ch
7ae0: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
7af0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7b00: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
7b10: 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
7b20: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
7b30: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
7b40: 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
7b50: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
7b60: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7b70: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
7b80: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
7b90: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
7ba0: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
7bb0: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
7bc0: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
7bd0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
7be0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
7bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
7c00: 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72 73   = ".";.  azDirs
7c10: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
7c20: 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
7c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
7c40: 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
7c50: 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b  (azDirs[0]); i++
7c60: 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72  ){.    if( azDir
7c70: 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
7c80: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  ue;.    if( stat
7c90: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66  (azDirs[i], &buf
7ca0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
7cb0: 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
7cc0: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
7cd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7ce0: 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d  access(azDirs[i]
7cf0: 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
7d00: 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
7d10: 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61  irs[i];.    brea
7d20: 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20  k;.  }.  do{.   
7d30: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7d40: 66 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  f(SQLITE_TEMPNAM
7d50: 45 5f 53 49 5a 45 2c 20 7a 42 75 66 2c 20 22 25  E_SIZE, zBuf, "%
7d60: 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  s/"TEMP_FILE_PRE
7d70: 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
7d80: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
7d90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  ;.    sqlite3Ran
7da0: 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
7db0: 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
7dc0: 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
7dd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
7de0: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
7df0: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
7e00: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
7e10: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
7e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
7e30: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
7e40: 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
7e50: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
7e60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
7e70: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
7e80: 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d   a given pathnam
7e90: 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  e is a directory
7ea0: 20 61 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65   and is writable
7eb0: 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   .**.*/.int sqli
7ec0: 74 65 33 55 6e 69 78 49 73 44 69 72 57 72 69 74  te3UnixIsDirWrit
7ed0: 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75 66 29  able(char *zBuf)
7ee0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
7ef0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
7f00: 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  MAS.  struct sta
7f10: 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a 42 75  t buf;.  if( zBu
7f20: 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  f==0 ) return 0;
7f30: 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d 3d 3d  .  if( zBuf[0]==
7f40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f50: 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c 20 26  if( stat(zBuf, &
7f60: 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  buf) ) return 0;
7f70: 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28  .  if( !S_ISDIR(
7f80: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72  buf.st_mode) ) r
7f90: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61  eturn 0;.  if( a
7fa0: 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37 29 20  ccess(zBuf, 07) 
7fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
7fc0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7fd0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
7fe0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
8000: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
8010: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
8020: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
8030: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
8040: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8050: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
8060: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
8070: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
8080: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
8090: 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
80a0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
80b0: 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
80c0: 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
80d0: 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
80e0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
80f0: 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
8100: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
8110: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8120: 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
8130: 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
8140: 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
8150: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
8160: 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
8170: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
8180: 2c 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 20  , id->offset);. 
8190: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
81a0: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
81b0: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
81c0: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69  = lseek(id->h, i
81d0: 64 2d 3e 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  d->offset, SEEK_
81e0: 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
81f0: 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
8200: 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
8210: 77 4f 66 66 73 65 74 21 3d 69 64 2d 3e 6f 66 66  wOffset!=id->off
8220: 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  set ){.    retur
8230: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
8240: 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
8250: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
8260: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
8270: 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20  OSTRACE5("READ  
8280: 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
8290: 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67   %d\n", id->h, g
82a0: 6f 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c 20  ot, id->offset, 
82b0: 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
82c0: 20 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20    if( got>0 ){. 
82d0: 20 20 20 69 64 2d 3e 6f 66 66 73 65 74 20 2b 3d     id->offset +=
82e0: 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75   got;.  }.  retu
82f0: 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn got;.}../*.**
8300: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
8310: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
8320: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
8330: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
8340: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
8350: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
8360: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
8370: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8380: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
8390: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61  atic int unixRea
83a0: 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f  d(OsFile *id, vo
83b0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
83c0: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
83d0: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
83e0: 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
83f0: 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ad((unixFile*)id
8400: 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
8410: 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
8420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8430: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
8440: 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72  ( got<0 ){.    r
8450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8460: 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
8470: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
8480: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
8490: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
84a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
84b0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
84c0: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
84d0: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
84e0: 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
84f0: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
8500: 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
8510: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
8520: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
8530: 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
8540: 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
8550: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8560: 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
8570: 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20  File *id, const 
8580: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
8590: 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
85a0: 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
85b0: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
85c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
85d0: 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20  _PREAD).  got = 
85e0: 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
85f0: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8600: 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
8610: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
8620: 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
8630: 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
8640: 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b  nt, id->offset);
8650: 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
8660: 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
8670: 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c 20 53 45  , id->offset, SE
8680: 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e  EK_SET);.  if( n
8690: 65 77 4f 66 66 73 65 74 21 3d 69 64 2d 3e 6f 66  ewOffset!=id->of
86a0: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
86b0: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
86c0: 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
86d0: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
86e0: 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
86f0: 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54    OSTRACE5("WRIT
8700: 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
8710: 6c 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c  ld %d\n", id->h,
8720: 20 67 6f 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74   got, id->offset
8730: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
8740: 3b 0a 20 20 69 66 28 20 67 6f 74 3e 30 20 29 7b  ;.  if( got>0 ){
8750: 0a 20 20 20 20 69 64 2d 3e 6f 66 66 73 65 74 20  .    id->offset 
8760: 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72 65  += got;.  }.  re
8770: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
8780: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
8790: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
87a0: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
87b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
87c0: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
87d0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
87e0: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
87f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8800: 78 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69  xWrite(OsFile *i
8810: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
8820: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
8830: 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
8840: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
8850: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
8860: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  );.  while( amt>
8870: 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65  0 && (wrote = se
8880: 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69 78  ekAndWrite((unix
8890: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
88a0: 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
88b0: 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
88c0: 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
88d0: 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
88e0: 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
88f0: 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
8900: 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
8910: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
8920: 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
8930: 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20  amt=1 ));.  if( 
8940: 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  amt>0 ){.    if(
8950: 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20   wrote<0 ){.    
8960: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8970: 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
8980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
8990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
89a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
89b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
89c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
89d0: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
89e0: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
89f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
8a00: 69 78 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69  ixSeek(OsFile *i
8a10: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a  d, i64 offset){.
8a20: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
8a30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8a40: 53 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74 20  ST.  if( offset 
8a50: 29 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75  ) SimulateDiskfu
8a60: 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
8a70: 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 23 65 6e  QLITE_FULL);.#en
8a80: 64 69 66 0a 20 20 28 28 75 6e 69 78 46 69 6c 65  dif.  ((unixFile
8a90: 2a 29 69 64 29 2d 3e 6f 66 66 73 65 74 20 3d 20  *)id)->offset = 
8aa0: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
8ab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
8ac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8ad0: 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
8ae0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
8af0: 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
8b00: 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
8b10: 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
8b20: 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
8b30: 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
8b40: 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
8b50: 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
8b60: 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
8b70: 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
8b80: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
8b90: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
8ba0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ../*.** Use the 
8bb0: 66 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20  fdatasync() API 
8bc0: 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45  only if the HAVE
8bd0: 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f  _FDATASYNC macro
8be0: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20   is defined..** 
8bf0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73  Otherwise use fs
8c00: 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61  ync() in its pla
8c10: 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48  ce..*/.#ifndef H
8c20: 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
8c30: 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
8c40: 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
8c50: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
8c60: 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
8c70: 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
8c80: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
8c90: 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
8ca0: 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
8cb0: 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
8cc0: 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
8cd0: 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
8ce0: 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
8cf0: 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
8d00: 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
8d10: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
8d20: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
8d30: 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
8d40: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
8d50: 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
8d60: 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
8d70: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
8d80: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
8d90: 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
8da0: 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
8db0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
8dc0: 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
8dd0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
8de0: 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
8df0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
8e00: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
8e10: 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
8e20: 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
8e30: 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
8e40: 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
8e50: 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
8e60: 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
8e70: 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
8e80: 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
8e90: 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
8ea0: 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
8eb0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
8ec0: 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
8ed0: 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
8ee0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
8ef0: 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
8f00: 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
8f10: 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
8f20: 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
8f30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
8f40: 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
8f50: 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
8f60: 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
8f70: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
8f80: 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72   rc;..  /* Recor
8f90: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
8fa0: 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
8fb0: 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
8fc0: 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
8fd0: 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
8fe0: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
8ff0: 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
9000: 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
9010: 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
9020: 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
9030: 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
9040: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9050: 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
9060: 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
9070: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
9080: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
9090: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
90a0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
90b0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
90c0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
90d0: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
90e0: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
90f0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
9100: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
9110: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
9120: 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c  se..#if HAVE_FUL
9130: 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
9140: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
9150: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
9160: 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
9170: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
9180: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
9190: 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
91a0: 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
91b0: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
91c0: 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49 74 20  sync()..   * It 
91d0: 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
91e0: 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
91f0: 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
9200: 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66  he local .   * f
9210: 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
9220: 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
9230: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
9240: 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20 69 73  ULLFSYNC.   * is
9250: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
9260: 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
9270: 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
9280: 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a 20 61  an fsync .   * a
9290: 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
92a0: 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
92b0: 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
92c0: 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
92d0: 20 20 20 2a 20 49 74 27 64 20 62 65 20 62 65 74     * It'd be bet
92e0: 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
92f0: 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
9300: 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
9310: 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c 20 63     * the fcntl c
9320: 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
9330: 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
9340: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
9350: 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
9360: 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20 64 61  .#else .  if( da
9370: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
9380: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
9390: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
93a0: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
93b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56   }.#endif /* HAV
93c0: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 23  E_FULLFSYNC */.#
93d0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
93e0: 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
93f0: 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   */..  return rc
9400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
9410: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
9420: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
9430: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
9440: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
9450: 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
9460: 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
9470: 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
9480: 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
9490: 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
94a0: 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
94b0: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
94c0: 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
94d0: 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
94e0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
94f0: 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
9500: 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
9510: 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
9520: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
9530: 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
9540: 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
9550: 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
9560: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
9570: 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
9580: 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
9590: 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
95a0: 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
95b0: 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
95c0: 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
95d0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
95e0: 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
95f0: 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
9600: 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
9610: 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
9620: 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
9630: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
9640: 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
9650: 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
9660: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
9670: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
9680: 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
9690: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
96a0: 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
96b0: 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
96c0: 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
96d0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
96e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
96f0: 74 20 75 6e 69 78 53 79 6e 63 28 4f 73 46 69 6c  t unixSync(OsFil
9700: 65 20 2a 69 64 2c 20 69 6e 74 20 64 61 74 61 4f  e *id, int dataO
9710: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
9720: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
9730: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
9740: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
9750: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  le );.  OSTRACE2
9760: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
9770: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
9780: 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
9790: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
97a0: 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61 74 61 4f  >fullSync, dataO
97b0: 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
97c0: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
97d0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
97e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
97f0: 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
9800: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
9810: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
9820: 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
9830: 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
9840: 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
9850: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
9860: 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
9870: 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
9880: 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e  , pFile->fullSyn
9890: 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c);.#ifndef SQLI
98a0: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
98b0: 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  NC.    /* The di
98c0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
98d0: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
98e0: 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a  f full_fsync is.
98f0: 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66      ** turned of
9900: 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65  f or unavailable
9910: 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79  .  If a full_fsy
9920: 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  nc occurred abov
9930: 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  e,.    ** then t
9940: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
9950: 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  c is superfluous
9960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
9970: 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e   (!HAVE_FULLFSYN
9980: 43 20 7c 7c 20 21 70 46 69 6c 65 2d 3e 66 75 6c  C || !pFile->ful
9990: 6c 53 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lSync) && full_f
99a0: 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
99b0: 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
99c0: 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
99d0: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
99e0: 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
99f0: 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
9a00: 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
9a10: 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
9a20: 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
9a30: 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
9a40: 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
9a50: 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
9a60: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
9a70: 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
9a80: 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
9a90: 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
9aa0: 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
9ab0: 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
9ac0: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
9ad0: 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    /* return SQLI
9ae0: 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20  TE_IOERR; */.   
9af0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c   }.#endif.    cl
9b00: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
9b10: 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  );  /* Only need
9b20: 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
9b30: 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65  o close the dire
9b40: 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69  ctory */.    pFi
9b50: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20  le->dirfd = -1; 
9b60: 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72     /* when we ar
9b70: 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20  e done. */.  }. 
9b80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9b90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
9ba0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a   the directory z
9bb0: 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  Dirname. This is
9bc0: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72   a no-op on oper
9bd0: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74  ating systems ot
9be0: 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58  her.** than UNIX
9bf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9c00: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
9c10: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9c20: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72  rnal file has tr
9c30: 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65  uely been delete
9c40: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69  d.** before maki
9c50: 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e  ng changes to in
9c60: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
9c70: 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74  s on a multi-dat
9c80: 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a  abase commit..**
9c90: 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   The F_FULLFSYNC
9ca0: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e   option is not n
9cb0: 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69  eeded here..*/.i
9cc0: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79  nt sqlite3UnixSy
9cd0: 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  ncDirectory(cons
9ce0: 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  t char *zDirname
9cf0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
9d00: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
9d10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9d20: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
9d30: 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20   fd;.  int r;.  
9d40: 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
9d50: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
9d60: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 4f 53 54  INARY, 0);.  OST
9d70: 52 41 43 45 33 28 22 44 49 52 53 59 4e 43 20 25  RACE3("DIRSYNC %
9d80: 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c  -3d (%s)\n", fd,
9d90: 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66   zDirname);.  if
9da0: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
9db0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
9dc0: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d  OPEN; .  }.  r =
9dd0: 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c   fsync(fd);.  cl
9de0: 6f 73 65 28 66 64 29 3b 0a 20 20 53 69 6d 75 6c  ose(fd);.  Simul
9df0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 3d 31 20  ateIOError( r=1 
9e00: 29 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a 20 20  );.  if( r ){.  
9e10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e20: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b  IOERR_DIR_FSYNC;
9e30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9e40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9e50: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
9e60: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
9e70: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
9e80: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
9e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9ea0: 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20  Truncate(OsFile 
9eb0: 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
9ec0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
9ed0: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
9ee0: 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e  = ftruncate(((un
9ef0: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
9f00: 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
9f10: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
9f20: 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
9f30: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
9f40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
9f50: 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  UNCATE;.  }else{
9f60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9f70: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
9f80: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
9f90: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
9fa0: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
9fb0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
9fc0: 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 4f 73 46  unixFileSize(OsF
9fd0: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53  ile *id, i64 *pS
9fe0: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
9ff0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
a000: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  f;.  assert( id 
a010: 29 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  );.  rc = fstat(
a020: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
a030: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
a040: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
a050: 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
a060: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a070: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
a080: 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
a090: 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
a0a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a0b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
a0c0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a0d0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
a0e0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
a0f0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
a100: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
a110: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
a120: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
a130: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
a140: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
a150: 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ero.  If the fil
a160: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72  e is unlocked or
a170: 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52   holds only SHAR
a180: 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a  ED locks, then.*
a190: 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  * return zero..*
a1a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
a1b0: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
a1c0: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  ck(OsFile *id){.
a1d0: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75    int r = 0;.  u
a1e0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
a1f0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
a200: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
a210: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45   );.  sqlite3OsE
a220: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
a230: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
a240: 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61  Lock is shared a
a250: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
a260: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
a270: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
a280: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
a290: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
a2a0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  if( pFile->pLock
a2b0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45  ->locktype>SHARE
a2c0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 20  D_LOCK ){.    r 
a2d0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
a2e0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
a2f0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
a300: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
a310: 2f 0a 20 20 69 66 28 20 21 72 20 29 7b 0a 20 20  /.  if( !r ){.  
a320: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
a330: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
a340: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
a350: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
a360: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
a370: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
a380: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
a390: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
a3a0: 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28 70 46  CK;.    fcntl(pF
a3b0: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
a3c0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
a3d0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
a3e0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
a3f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
a400: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65    .  sqlite3OsLe
a410: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
a420: 54 52 41 43 45 33 28 22 54 45 53 54 20 57 52 2d  TRACE3("TEST WR-
a430: 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 70  LOCK %d %d\n", p
a440: 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a 20 20  File->h, r);..  
a450: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a  return r;.}../*.
a460: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
a470: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
a480: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
a490: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
a4a0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
a4b0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
a4c0: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
a4d0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
a4e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
a4f0: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
a500: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
a510: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
a520: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
a530: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
a540: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
a550: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
a560: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
a570: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
a580: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
a590: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
a5a0: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
a5b0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
a5c0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
a5d0: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
a5e0: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
a5f0: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
a600: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
a610: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
a620: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
a630: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
a640: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
a650: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
a660: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
a670: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
a680: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
a690: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
a6a0: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
a6b0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
a6c0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
a6d0: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
a6e0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a6f0: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
a700: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
a710: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a720: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
a730: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
a740: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
a750: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
a760: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
a770: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
a780: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
a790: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
a7a0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
a7b0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a7c0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
a7d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a7e0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
a7f0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
a800: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
a810: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
a820: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
a830: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
a840: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
a850: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
a860: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
a870: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
a880: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
a890: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
a8a0: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
a8b0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
a8c0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
a8d0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
a8e0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
a8f0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
a900: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
a910: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
a920: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
a930: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
a940: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
a950: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
a960: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
a970: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
a980: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
a990: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a9a0: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
a9b0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
a9c0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
a9d0: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
a9e0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
a9f0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
aa00: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
aa10: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
aa20: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
aa30: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
aa40: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
aa50: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
aa60: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
aa70: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
aa80: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
aa90: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
aaa0: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
aab0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
aac0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
aad0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
aae0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
aaf0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
ab00: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
ab10: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
ab20: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
ab30: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
ab40: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
ab50: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
ab60: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
ab70: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
ab80: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
ab90: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
aba0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
abb0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
abc0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
abd0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
abe0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
abf0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
ac00: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
ac10: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
ac20: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
ac30: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
ac40: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
ac50: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
ac60: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
ac70: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
ac80: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
ac90: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
aca0: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
acb0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
acc0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
acd0: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
ace0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
acf0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
ad00: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
ad10: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
ad20: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
ad30: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
ad40: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
ad50: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
ad60: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
ad70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
ad80: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
ad90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
ada0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
adb0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
adc0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
add0: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
ade0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
adf0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
ae00: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
ae10: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
ae20: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
ae30: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
ae40: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
ae50: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
ae60: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
ae70: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
ae80: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
ae90: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
aea0: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
aeb0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
aec0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
aed0: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
aee0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
aef0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
af00: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
af10: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
af20: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
af30: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
af40: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
af50: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
af60: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
af70: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
af80: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
af90: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
afa0: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
afb0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
afc0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
afd0: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
afe0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
aff0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b000: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
b010: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
b020: 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  )id;.  struct lo
b030: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20  ckInfo *pLock = 
b040: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  pFile->pLock;.  
b050: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
b060: 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61  k;.  int s;..  a
b070: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
b080: 20 20 4f 53 54 52 41 43 45 37 28 22 4c 4f 43 4b    OSTRACE7("LOCK
b090: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
b0a0: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e  (%s,%d) pid=%d\n
b0b0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
b0c0: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
b0d0: 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
b0e0: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
b0f0: 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20  ocktype),.      
b100: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f  locktypeName(pLo
b110: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70  ck->locktype), p
b120: 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74 70  Lock->cnt , getp
b130: 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  id());..  /* If 
b140: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
b150: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
b160: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
b170: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
b180: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
b190: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
b1a0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
b1b0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
b1c0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
b1d0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
b1e0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
b1f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
b200: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
b210: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
b220: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
b230: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
b240: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c  y held)\n", pFil
b250: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
b260: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
b270: 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72  ocktype));.    r
b280: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
b2a0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
b2b0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
b2c0: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
b2d0: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
b2e0: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
b2f0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
b300: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b310: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
b320: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
b330: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
b340: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
b350: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
b360: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
b370: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74  ;..  /* This mut
b380: 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
b390: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ause pFile->pLoc
b3a0: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
b3b0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
b3c0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
b3d0: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d  Mutex();..  /* M
b3e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
b3f0: 72 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73  rent thread owns
b400: 20 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f   the pFile..  */
b410: 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
b420: 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
b430: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b440: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
b450: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
b460: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
b470: 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
b480: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
b490: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
b4a0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
b4b0: 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
b4c0: 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 4f 73  a a different Os
b4d0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
b4e0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
b4f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
b500: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
b510: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
b520: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70  ile->locktype!=p
b530: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26  Lock->locktype &
b540: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  & .          (pL
b550: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50  ock->locktype>=P
b560: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c  ENDING_LOCK || l
b570: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
b580: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
b590: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
b5a0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b5b0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
b5c0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
b5d0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
b5e0: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
b5f0: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
b600: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
b610: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
b620: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
b630: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
b640: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
b650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b660: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  K..  */.  if( lo
b670: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b680: 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70  OCK && .      (p
b690: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b6a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
b6b0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
b6c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
b6d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f  {.    assert( lo
b6e0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
b6f0: 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
b700: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
b710: 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pe==0 );.    ass
b720: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  ert( pLock->cnt>
b730: 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
b740: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
b750: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63  D_LOCK;.    pLoc
b760: 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 70 46  k->cnt++;.    pF
b770: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
b780: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
b790: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c  d_lock;.  }..  l
b7a0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
b7b0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
b7c0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20   = SEEK_SET;..  
b7d0: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
b7e0: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
b7f0: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
b800: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
b810: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
b820: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
b830: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
b840: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
b850: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
b860: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
b870: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
b880: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
b890: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
b8a0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
b8b0: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
b8c0: 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47  locktype<PENDING
b8d0: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
b8e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c  lock.l_type = (l
b8f0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b900: 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57  LOCK?F_RDLCK:F_W
b910: 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RLCK);.    lock.
b920: 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e  l_start = PENDIN
b930: 47 5f 42 59 54 45 3b 0a 20 20 20 20 73 20 3d 20  G_BYTE;.    s = 
b940: 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  fcntl(pFile->h, 
b950: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
b960: 0a 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  .    if( s==(-1)
b970: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28   ){.      rc = (
b980: 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f  errno==EINVAL) ?
b990: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20   SQLITE_NOLFS : 
b9a0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b9b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
b9c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
b9d0: 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
b9e0: 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
b9f0: 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
ba00: 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
ba10: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
ba20: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
ba30: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
ba40: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
ba50: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ba60: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
ba70: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74  sert( pLock->cnt
ba80: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ba90: 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  t( pLock->lockty
baa0: 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  pe==0 );..    /*
bab0: 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
bac0: 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
bad0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
bae0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
baf0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
bb00: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20 3d  ED_SIZE;.    s =
bb10: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
bb20: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
bb30: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ;..    /* Drop t
bb40: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
bb50: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
bb60: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
bb80: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
bb90: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
bba0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
bbb0: 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c    if( fcntl(pFil
bbc0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
bbd0: 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  lock)!=0 ){.    
bbe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
bbf0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20  ERR_UNLOCK;  /* 
bc00: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65  This should neve
bc10: 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  r happen */.    
bc20: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
bc30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
bc40: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
bc50: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
bc60: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
bc70: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
bc80: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
bc90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
bca0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
bcb0: 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
bcc0: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
bcd0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
bce0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
bcf0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
bd00: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
bd10: 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
bd20: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
bd30: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
bd40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
bd50: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
bd60: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
bd70: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
bd80: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
bd90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
bda0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
bdb0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
bdc0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
bdd0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
bde0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
bdf0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
be00: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
be10: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
be20: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
be30: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
be40: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
be50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
be60: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c  ert( 0!=pFile->l
be70: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c  ocktype );.    l
be80: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
be90: 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68  RLCK;.    switch
bea0: 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ( locktype ){.  
beb0: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
bec0: 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  D_LOCK:.        
bed0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
bee0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
bef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf00: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
bf10: 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  E_LOCK:.        
bf20: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
bf30: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
bf40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
bf50: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
bf60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf70: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
bf80: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
bf90: 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63      }.    s = fc
bfa0: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
bfb0: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  SETLK, &lock);. 
bfc0: 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 29     if( s==(-1) )
bfd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72  {.      rc = (er
bfe0: 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53  rno==EINVAL) ? S
bff0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51  QLITE_NOLFS : SQ
c000: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
c010: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
c020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c030: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
c040: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
c050: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
c060: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
c070: 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74   }else if( lockt
c080: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
c090: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
c0a0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ->locktype = PEN
c0b0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
c0c0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
c0d0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
c0e0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
c0f0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
c100: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
c110: 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  4("LOCK    %d %s
c120: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
c130: 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
c140: 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
c150: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
c160: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
c170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c180: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
c190: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
c1a0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
c1b0: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63  tor pFile to loc
c1c0: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
c1d0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
c1e0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
c1f0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
c200: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
c210: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
c220: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
c230: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
c240: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
c250: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
c260: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
c270: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
c280: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
c290: 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
c2a0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
c2b0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
c2c0: 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72  fo *pLock;.  str
c2d0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
c2e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c2f0: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
c300: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
c310: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
c320: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
c330: 53 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20  STRACE7("UNLOCK 
c340: 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
c350: 2c 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20  ,%d) pid=%d\n", 
c360: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
c370: 70 65 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  pe,.      pFile-
c380: 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
c390: 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70  ->pLock->locktyp
c3a0: 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  e, pFile->pLock-
c3b0: 3e 63 6e 74 2c 20 67 65 74 70 69 64 28 29 29 3b  >cnt, getpid());
c3c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ..  assert( lock
c3d0: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
c3e0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
c3f0: 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b  ->locktype<=lock
c400: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
c410: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c420: 7d 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54 48  }.  if( CHECK_TH
c430: 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29 7b  READID(pFile) ){
c440: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c450: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
c460: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
c470: 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63 6b 20  utex();.  pLock 
c480: 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a  = pFile->pLock;.
c490: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
c4a0: 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  >cnt!=0 );.  if(
c4b0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
c4c0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
c4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
c4e0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70 46 69  k->locktype==pFi
c4f0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
c500: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
c510: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
c520: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  .      lock.l_ty
c530: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
c540: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
c550: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
c560: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
c570: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
c580: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
c590: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
c5a0: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
c5b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
c5c0: 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  LK, &lock)==(-1)
c5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
c5e0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
c5f0: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
c600: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
c610: 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20  OERR_RDLOCK;.   
c620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
c630: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
c640: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
c650: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
c660: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
c670: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
c680: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
c690: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
c6a0: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
c6b0: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
c6c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74   );.    if( fcnt
c6d0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c6e0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
c6f0: 29 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  ) ){.      pLock
c700: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
c710: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
c720: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
c730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
c740: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
c750: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
c760: 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n */.    }.  }. 
c770: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
c780: 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74  O_LOCK ){.    st
c790: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
c7a0: 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63  pen;..    /* Dec
c7b0: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
c7c0: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
c7d0: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
c7e0: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
c7f0: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
c800: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
c810: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
c820: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
c830: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
c840: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
c850: 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20  Lock->cnt--;.   
c860: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d   if( pLock->cnt=
c870: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
c880: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
c890: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
c8a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c8b0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c8c0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
c8d0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
c8e0: 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e  f( fcntl(pFile->
c8f0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
c900: 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)!=(-1) ){.    
c910: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
c920: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
c930: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c940: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c950: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
c960: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
c970: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
c980: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c990: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
c9a0: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
c9b0: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
c9c0: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
c9d0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
c9e0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
c9f0: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
ca00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
ca10: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
ca20: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
ca30: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
ca40: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
ca50: 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   */.    pOpen = 
ca60: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
ca70: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
ca80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
ca90: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
caa0: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
cab0: 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65  nLock==0 && pOpe
cac0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b  n->nPending>0 ){
cad0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
cae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
caf0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20  Open->nPending; 
cb00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  i++){.        cl
cb10: 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ose(pOpen->aPend
cb20: 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ing[i]);.      }
cb30: 0a 20 20 20 20 20 20 66 72 65 65 28 70 4f 70 65  .      free(pOpe
cb40: 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20  n->aPending);.  
cb50: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
cb60: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ing = 0;.      p
cb70: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
cb80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
cb90: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
cba0: 74 65 78 28 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  tex();.  pFile->
cbb0: 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
cbc0: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
cbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
cbe0: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
cbf0: 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
cc00: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a  (OsFile **pId){.
cc10: 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d    unixFile *id =
cc20: 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64   (unixFile*)*pId
cc30: 3b 0a 0a 20 20 69 66 28 20 21 69 64 20 29 20 72  ;..  if( !id ) r
cc40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc50: 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70  .  unixUnlock(*p
cc60: 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  Id, NO_LOCK);.  
cc70: 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
cc80: 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72   ) close(id->dir
cc90: 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  fd);.  id->dirfd
cca0: 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33   = -1;.  sqlite3
ccb0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
ccc0: 0a 20 20 69 66 28 20 69 64 2d 3e 70 4f 70 65 6e  .  if( id->pOpen
ccd0: 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
cce0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
ccf0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
cd00: 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
cd10: 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
cd20: 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
cd30: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
cd40: 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
cd50: 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
cd60: 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
cd70: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
cd80: 74 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  to pOpen->aPendi
cd90: 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
cda0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
cdb0: 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  osed when.    **
cdc0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
cdd0: 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
cde0: 2f 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b  /.    int *aNew;
cdf0: 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e  .    struct open
ce00: 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 69 64 2d  Cnt *pOpen = id-
ce10: 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77  >pOpen;.    aNew
ce20: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 4f 70 65   = realloc( pOpe
ce30: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f  n->aPending, (pO
ce40: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29  pen->nPending+1)
ce50: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
ce60: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
ce70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
ce80: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
ce90: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
cea0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
ceb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cec0: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
ced0: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
cee0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
cef0: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20  Open->nPending] 
cf00: 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20 20 20 70  = id->h;.      p
cf10: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
cf20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
cf30: 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
cf40: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
cf50: 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e   locks so we can
cf60: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
cf70: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20  immediately */. 
cf80: 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b     close(id->h);
cf90: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f  .  }.  releaseLo
cfa0: 63 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b  ckInfo(id->pLock
cfb0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  );.  releaseOpen
cfc0: 43 6e 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a  Cnt(id->pOpen);.
cfd0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
cfe0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
cff0: 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53  isOpen = 0;.  OS
d000: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20  TRACE2("CLOSE   
d010: 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b  %-3d\n", id->h);
d020: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
d030: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72  1);.  sqlite3Thr
d040: 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b  eadSafeFree(id);
d050: 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72  .  *pId = 0;.  r
d060: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d070: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
d080: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
d090: 47 5f 53 54 59 4c 45 0a 23 70 72 61 67 6d 61 20  G_STYLE.#pragma 
d0a0: 6d 61 72 6b 20 41 46 50 20 53 75 70 70 6f 72 74  mark AFP Support
d0b0: 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 61 66 70  ../*. ** The afp
d0c0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
d0d0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
d0e0: 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
d0f0: 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 20 2a  pecific state. *
d100: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
d110: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
d120: 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
d130: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
d140: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
d150: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
d160: 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b   long sharedLock
d170: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 66 69  Byte;.  char *fi
d180: 6c 65 50 61 74 68 3b 0a 7d 3b 0a 0a 73 74 72 75  lePath;.};..stru
d190: 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
d1a0: 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  PB2.{.  unsigned
d1b0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
d1c0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  t;        /* off
d1d0: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
d1e0: 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  e to lock */.  u
d1f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
d200: 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  g length;       
d210: 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73   /* nbr of bytes
d220: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e   to lock */.  un
d230: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
d240: 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20   retRangeStart; 
d250: 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79  /* nbr of 1st by
d260: 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63  te locked if suc
d270: 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73  cessful */.  uns
d280: 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63  igned char unLoc
d290: 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f  kFlag;         /
d2a0: 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20  * 1 = unlock, 0 
d2b0: 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  = lock */.  unsi
d2c0: 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74 45  gned char startE
d2d0: 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  ndFlag;       /*
d2e0: 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66   1=rel to end of
d2f0: 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20   fork, 0=rel to 
d300: 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66  start */.  int f
d310: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d330: 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73  file desc to ass
d340: 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74  oc this lock wit
d350: 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  h */.};..#define
d360: 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
d370: 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20  ock2FSCTL       
d380: 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
d390: 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
d3a0: 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 72 65 74  LockPB2)../* ret
d3b0: 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73  urn 0 on success
d3c0: 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  , 1 on failure. 
d3d0: 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20 62 65   To match the be
d3e0: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 0a 20  havior of the . 
d3f0: 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20 66 69   normal posix fi
d400: 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73 65 64  le locking (used
d410: 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66 6f 72   in unixLock for
d420: 20 65 78 61 6d 70 6c 65 29 2c 20 77 65 20 73 68   example), we sh
d430: 6f 75 6c 64 20 0a 20 20 70 72 6f 76 69 64 65 20  ould .  provide 
d440: 27 72 69 63 68 65 72 27 20 72 65 74 75 72 6e 20  'richer' return 
d450: 63 6f 64 65 73 20 2d 20 73 70 65 63 69 66 69 63  codes - specific
d460: 61 6c 6c 79 20 74 6f 20 64 69 66 66 65 72 65 6e  ally to differen
d470: 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
d480: 27 66 69 6c 65 20 62 75 73 79 27 20 61 6e 64 20  'file busy' and 
d490: 27 66 69 6c 65 20 73 79 73 74 65 6d 20 65 72 72  'file system err
d4a0: 6f 72 27 20 72 65 73 75 6c 74 73 20 2a 2f 0a 73  or' results */.s
d4b0: 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50 46 53  tatic int _AFPFS
d4c0: 53 65 74 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68  SetLock(const ch
d4d0: 61 72 20 2a 70 61 74 68 2c 20 69 6e 74 20 66 64  ar *path, int fd
d4e0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
d4f0: 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a 20 20  long offset, .  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
d520: 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
d530: 2c 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61  , int setLockFla
d540: 67 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 42 79  g).{.  struct By
d550: 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 20  teRangeLockPB2  
d560: 20 20 20 20 20 70 62 3b 0a 20 20 69 6e 74 20 20       pb;.  int  
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e     err;.  .  pb.
d590: 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
d5a0: 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
d5b0: 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
d5c0: 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
d5d0: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
d5e0: 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
d5f0: 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
d600: 66 64 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22  fd;.  OSTRACE5("
d610: 41 46 50 4c 4f 43 4b 20 73 65 74 74 69 6e 67 20  AFPLOCK setting 
d620: 6c 6f 63 6b 20 25 73 20 66 6f 72 20 25 64 20 69  lock %s for %d i
d630: 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
d640: 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
d650: 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
d660: 46 22 29 2c 20 66 64 2c 20 6f 66 66 73 65 74 2c  F"), fd, offset,
d670: 20 6c 65 6e 67 74 68 29 3b 0a 20 20 65 72 72 20   length);.  err 
d680: 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
d690: 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
d6a0: 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
d6b0: 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
d6c0: 29 20 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 34  ) {.    OSTRACE4
d6d0: 28 22 41 46 50 4c 4f 43 4b 20 66 61 69 6c 65 64  ("AFPLOCK failed
d6e0: 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
d6f0: 20 25 64 20 25 73 5c 6e 22 2c 20 70 61 74 68 2c   %d %s\n", path,
d700: 20 65 72 72 6e 6f 2c 20 0a 20 20 20 20 20 20 73   errno, .      s
d710: 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
d720: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f  .    return 1; /
d730: 2a 20 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 20 65  * error */.  } e
d740: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
d750: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a   0;.  }.}../*. *
d760: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
d770: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
d780: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
d790: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
d7a0: 65 63 69 66 69 65 64 0a 20 2a 2a 20 66 69 6c 65  ecified. ** file
d7b0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
d7c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
d7d0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
d7e0: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 20 2a   held, return. *
d7f0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  * non-zero.  If 
d800: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
d810: 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e  cked or holds on
d820: 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c  ly SHARED locks,
d830: 20 74 68 65 6e 0a 20 2a 2a 20 72 65 74 75 72 6e   then. ** return
d840: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69   zero.. */.stati
d850: 63 20 69 6e 74 20 61 66 70 55 6e 69 78 43 68 65  c int afpUnixChe
d860: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f  ckReservedLock(O
d870: 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  sFile *id){.  in
d880: 74 20 72 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  t r = 0;.  unixF
d890: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d8a0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
d8b0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
d8c0: 3b 20 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  ; .  afpLockingC
d8d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
d8e0: 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
d8f0: 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
d900: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d910: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
d920: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
d930: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
d940: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
d950: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
d960: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
d970: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
d980: 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
d990: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
d9a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
d9b0: 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
d9c0: 69 66 20 28 20 21 72 20 29 20 7b 0a 20 20 20 20  if ( !r ) {.    
d9d0: 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 62 79 74 65  /* lock the byte
d9e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   */.    int fail
d9f0: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
da00: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
da10: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
da20: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
da30: 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 20 28 66  ,1);  .    if (f
da40: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 2f  ailed) {.      /
da50: 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
da60: 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
da70: 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
da80: 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
da90: 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  .      r = 1;.  
daa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
dab0: 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
dac0: 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
dad0: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
dae0: 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
daf0: 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
db00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
db10: 65 20 2a 2f 0a 20 20 20 20 20 20 5f 41 46 50 46  e */.      _AFPF
db20: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
db30: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
db40: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
db50: 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
db60: 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33  }.  }.  OSTRACE3
db70: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
db80: 64 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %d\n", pFile->
db90: 68 2c 20 72 29 3b 0a 20 20 0a 20 20 72 65 74 75  h, r);.  .  retu
dba0: 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d  rn r;.}../* AFP-
dbb0: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 20 66 6f  style locking fo
dbc0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 65 68 61  llowing the beha
dbd0: 76 69 6f 72 20 6f 66 20 75 6e 69 78 4c 6f 63 6b  vior of unixLock
dbe0: 2c 20 73 65 65 20 74 68 65 20 75 6e 69 78 4c 6f  , see the unixLo
dbf0: 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ck .** function 
dc00: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 64 65 74  comments for det
dc10: 61 69 6c 73 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e  ails of lock man
dc20: 61 67 65 6d 65 6e 74 2e 20 2a 2f 0a 73 74 61 74  agement. */.stat
dc30: 69 63 20 69 6e 74 20 61 66 70 55 6e 69 78 4c 6f  ic int afpUnixLo
dc40: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
dc50: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 0a 7b 0a 20  nt locktype).{. 
dc60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dc70: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
dc80: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
dc90: 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
dca0: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
dcb0: 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
dcc0: 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
dcd0: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
dce0: 78 74 3b 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e  xt;.  int gotPen
dcf0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
dd00: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
dd10: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22   );.  OSTRACE5("
dd20: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
dd30: 73 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  s %s pid=%d\n", 
dd40: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
dd50: 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28     locktypeName(
dd60: 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74  locktype), lockt
dd70: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c  ypeName(pFile->l
dd80: 6f 63 6b 74 79 70 65 29 2c 20 67 65 74 70 69 64  ocktype), getpid
dd90: 28 29 29 3b 20 20 0a 20 20 2f 2a 20 49 66 20 74  ());  .  /* If t
dda0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
ddb0: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
ddc0: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
ddd0: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
dde0: 20 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f     ** OsFile, do
ddf0: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
de00: 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f  use the afp_end_
de10: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
de20: 20 61 73 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   as.    ** sqlit
de30: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
de40: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
de50: 6c 65 64 20 79 65 74 2e 0a 20 20 20 20 2a 2f 0a  led yet..    */.
de60: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
de70: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
de80: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
de90: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
dea0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
deb0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
dec0: 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
ded0: 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29  peName(locktype)
dee0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
def0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
df00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
df10: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
df20: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 20  e is correct.   
df30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
df40: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
df50: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
df60: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
df70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
df80: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
df90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
dfa0: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
dfb0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
dfc0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
dfd0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
dfe0: 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
dff0: 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
e000: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
e010: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
e020: 68 72 65 61 64 73 0a 20 20 20 20 2a 2f 0a 20 20  hreads.    */.  
e030: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
e040: 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  tex();..  /* Mak
e050: 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72 65  e sure the curre
e060: 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20 74  nt thread owns t
e070: 68 65 20 70 46 69 6c 65 2e 0a 20 20 20 20 2a 2f  he pFile..    */
e080: 0a 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72  .  rc = transfer
e090: 4f 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29  Ownership(pFile)
e0a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e0b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
e0c0: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
e0d0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
e0e0: 63 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  c;.  }.    .  /*
e0f0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
e100: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
e110: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
e120: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
e130: 6f 72 65 0a 20 20 20 20 2a 2a 20 61 63 71 75 69  ore.    ** acqui
e140: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
e150: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
e160: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
e170: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
e180: 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65     ** be release
e190: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20  d..    */.  if( 
e1a0: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
e1b0: 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20  _LOCK .      || 
e1c0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
e1d0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
e1e0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e  le->locktype<PEN
e1f0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  DING_LOCK).     
e200: 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
e210: 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f  ed = _AFPFSSetLo
e220: 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65  ck(context->file
e230: 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  Path, pFile->h, 
e240: 0a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  .      PENDING_B
e250: 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
e260: 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
e270: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e280: 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
e290: 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
e2a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a     }.  }.  .  /*
e2b0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
e2c0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
e2d0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
e2e0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
e2f0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
e300: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
e310: 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
e320: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 69  lock..    */.  i
e330: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
e340: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e350: 69 6e 74 20 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a  int lk, failed;.
e360: 20 20 20 20 69 6e 74 20 74 72 69 65 73 20 3d 20      int tries = 
e370: 30 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4e  0;.    .    /* N
e380: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
e390: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e  lock */.    /* n
e3a0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61  ote that the qua
e3b0: 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64  lity of the rand
e3c0: 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d  omness doesn't m
e3d0: 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20  atter that much 
e3e0: 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64  */.    lk = rand
e3f0: 6f 6d 28 29 3b 20 0a 20 20 20 20 63 6f 6e 74 65  om(); .    conte
e400: 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  xt->sharedLockBy
e410: 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37 66 66  te = (lk & 0x7ff
e420: 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
e430: 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 66 61  IZE - 1);.    fa
e440: 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74  iled = _AFPFSSet
e450: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e460: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e470: 2c 20 0a 20 20 20 20 20 20 53 48 41 52 45 44 5f  , .      SHARED_
e480: 46 49 52 53 54 2b 63 6f 6e 74 65 78 74 2d 3e 73  FIRST+context->s
e490: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
e4a0: 2c 20 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 2f  , 1);.    .    /
e4b0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
e4c0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
e4d0: 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 5f 41 46  k */.    if (_AF
e4e0: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
e4f0: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
e500: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
e510: 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20  BYTE, 1, 0)) {. 
e520: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e530: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
e540: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
e550: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
e560: 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
e570: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
e580: 20 20 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65    .    if( faile
e590: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
e5a0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
e5b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e5c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
e5d0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
e5e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e5f0: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
e600: 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
e610: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
e620: 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
e630: 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
e640: 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
e650: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
e660: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
e670: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
e680: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
e690: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
e6a0: 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
e6b0: 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20  >locktype );.   
e6c0: 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 20 3e 3d   if (locktype >=
e6d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
e6e0: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
e6f0: 65 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e < RESERVED_LOC
e700: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K) {.        /* 
e710: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
e720: 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ED lock */.     
e730: 20 20 20 66 61 69 6c 65 64 20 3d 20 5f 41 46 50     failed = _AFP
e740: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  FSSetLock(contex
e750: 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69  t->filePath, pFi
e760: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
e770: 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
e780: 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
e790: 64 20 26 26 20 6c 6f 63 6b 74 79 70 65 20 3d 3d  d && locktype ==
e7a0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
e7b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
e7c0: 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
e7d0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
e7e0: 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
e7f0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
e800: 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
e810: 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
e820: 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
e830: 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
e840: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
e850: 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
e860: 74 68 65 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f  the  afpUnixUnlo
e870: 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ck.      */.    
e880: 20 20 69 66 20 28 21 5f 41 46 50 46 53 53 65 74    if (!_AFPFSSet
e890: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
e8a0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
e8b0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e8d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
e8e0: 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  t->sharedLockByt
e8f0: 65 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  e, 1, 0)) {.    
e900: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d      /* now attem
e910: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 65  mpt to get the e
e920: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72 61  xclusive lock ra
e930: 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  nge */.        f
e940: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e950: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e960: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
e970: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
e980: 20 0a 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 20                  
e9a0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
e9b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 66 61  ;.        if (fa
e9c0: 69 6c 65 64 20 26 26 20 5f 41 46 50 46 53 53 65  iled && _AFPFSSe
e9d0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e9e0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
e9f0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  h, SHARED_FIRST 
ea00: 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
ea30: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
ea40: 2c 20 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 1)) {.        
ea50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ea60: 45 52 52 5f 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74  ERR_RDLOCK; /* t
ea70: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
ea80: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
ea90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73     }.      } els
eaa0: 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 2a  e {.        /* *
eab0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
eac0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
ead0: 43 4b 3b 20 2f 2a 20 74 68 69 73 20 73 68 6f 75  CK; /* this shou
eae0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
eaf0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
eb00: 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
eb10: 26 26 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f  && rc == SQLITE_
eb20: 4f 4b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  OK){.      rc = 
eb30: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
eb40: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
eb50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eb60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
eb70: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
eb80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
eb90: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
eba0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
ebb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50  le->locktype = P
ebc0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
ebd0: 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
ebe0: 3a 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  :.    sqlite3OsL
ebf0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
ec00: 53 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20  STRACE4("LOCK   
ec10: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 70 46   %d %s %s\n", pF
ec20: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
ec30: 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
ec40: 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  .         rc==SQ
ec50: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
ec60: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
ec70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20  turn rc;.}../*. 
ec80: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
ec90: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
eca0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
ecb0: 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e  ile to locktype.
ecc0: 20 20 6c 6f 63 6b 74 79 70 65 0a 20 2a 2a 20 6d    locktype. ** m
ecd0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
ece0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
ecf0: 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66  LOCK.. **. ** If
ed00: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
ed10: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
ed20: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
ed30: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
ed40: 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  . ** the request
ed50: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
ed60: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
ed70: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73  s a no-op.. */.s
ed80: 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 69  tatic int afpUni
ed90: 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  xUnlock(OsFile *
eda0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
edb0: 29 20 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ) {.  struct flo
edc0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
edd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ede0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
edf0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
ee00: 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
ee10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
ee20: 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
ee30: 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
ee40: 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20  ckingContext;.. 
ee50: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
ee60: 3b 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e  ;.  OSTRACE5("UN
ee70: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
ee80: 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46  %d pid=%d\n", pF
ee90: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
eea0: 2c 0a 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  ,.         pFile
eeb0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70  ->locktype, getp
eec0: 69 64 28 29 29 3b 0a 20 20 0a 20 20 61 73 73 65  id());.  .  asse
eed0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
eee0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
eef0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
ef00: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
ef10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ef20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ef30: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 70  CHECK_THREADID(p
ef40: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
ef50: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ef60: 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  E;.  }.  sqlite3
ef70: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
ef80: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
ef90: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
efa0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
efb0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
efc0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
efd0: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 20 20 20  failed = 0;..   
efe0: 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 74 68 65     /* unlock the
eff0: 20 65 78 63 6c 75 73 69 76 65 20 72 61 6e 67 65   exclusive range
f000: 20 2d 20 74 68 65 6e 20 72 65 2d 65 73 74 61 62   - then re-estab
f010: 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
f020: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 69 66  lock */.      if
f030: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
f040: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
f050: 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 66 61 69  K) {.        fai
f060: 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c  led = _AFPFSSetL
f070: 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c  ock(context->fil
f080: 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c  ePath, pFile->h,
f090: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a   SHARED_FIRST, .
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
f0d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 21 66  ;.        if (!f
f0e0: 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ailed) {.       
f0f0: 20 20 20 2f 2a 20 73 75 63 63 65 73 73 66 75 6c     /* successful
f100: 6c 79 20 72 65 6d 6f 76 65 64 20 74 68 65 20 65  ly removed the e
f110: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
f120: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 5f  .          if (_
f130: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
f140: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f150: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
f160: 5f 46 49 52 53 54 2b 0a 20 20 20 20 20 20 20 20  _FIRST+.        
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61      context->sha
f190: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
f1a0: 31 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1)) {.          
f1b0: 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 72    /* failed to r
f1c0: 65 2d 65 73 74 61 62 6c 69 73 68 20 6f 75 72 20  e-establish our 
f1d0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  shared lock */. 
f1e0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
f1f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
f200: 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f  OCK; /* This sho
f210: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f220: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
f230: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
f240: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
f250: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
f260: 68 61 70 70 65 6e 20 2d 20 66 61 69 6c 65 64 20  happen - failed 
f270: 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78  to unlock the ex
f280: 63 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2a 2f  clusive range */
f290: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
f2a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f2b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  OCK;.        } .
f2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f2d0: 20 20 69 66 20 28 72 63 20 3d 3d 20 53 51 4c 49    if (rc == SQLI
f2e0: 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
f2f0: 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e  locktype>=PENDIN
f300: 47 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  G_LOCK) {.      
f310: 69 66 20 28 5f 41 46 50 46 53 53 65 74 4c 6f 63  if (_AFPFSSetLoc
f320: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
f330: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 50  ath, pFile->h, P
f340: 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
f350: 30 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0)){.        /* 
f360: 66 61 69 6c 65 64 20 74 6f 20 72 65 6c 65 61 73  failed to releas
f370: 65 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  e the pending lo
f380: 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ck */.        rc
f390: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f3a0: 55 4e 4c 4f 43 4b 3b 20 2f 2a 20 54 68 69 73 20  UNLOCK; /* This 
f3b0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
f3c0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
f3d0: 20 20 20 7d 20 0a 20 20 20 20 69 66 20 28 72 63     } .    if (rc
f3e0: 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 26 26   == SQLITE_OK &&
f3f0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
f400: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  >=RESERVED_LOCK)
f410: 20 7b 0a 20 20 20 20 20 20 69 66 20 28 5f 41 46   {.      if (_AF
f420: 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  PFSSetLock(conte
f430: 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46  xt->filePath, pF
f440: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
f450: 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 20 7b 0a  _BYTE, 1, 0)) {.
f460: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c 65          /* faile
f470: 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  d to release the
f480: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
f490: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
f4a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f4b0: 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f  CK;  /* This sho
f4c0: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
f4d0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
f4e0: 7d 20 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  } .  }.  if( loc
f4f0: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
f500: 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64  {.    int failed
f510: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
f520: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
f530: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, pFile->h, . 
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
f560: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 63 6f 6e  ARED_FIRST + con
f570: 74 65 78 74 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  text->sharedLock
f580: 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Byte, 1, 0);.   
f590: 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
f5a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f5b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20  _IOERR_UNLOCK;  
f5c0: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
f5d0: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
f5e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72     }.  }.  if (r
f5f0: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 0a  c == SQLITE_OK).
f600: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
f610: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
f620: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
f630: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
f640: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
f650: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
f660: 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
f670: 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
f680: 65 78 74 20 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ext . */.static 
f690: 69 6e 74 20 61 66 70 55 6e 69 78 43 6c 6f 73 65  int afpUnixClose
f6a0: 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
f6b0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
f6c0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
f6d0: 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
f6e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f6f0: 4f 4b 3b 0a 20 20 61 66 70 55 6e 69 78 55 6e 6c  OK;.  afpUnixUnl
f700: 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43  ock(*pId, NO_LOC
f710: 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74 68  K);.  /* free th
f720: 65 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 73 74  e AFP locking st
f730: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 66 20  ructure */.  if 
f740: 28 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  (id->lockingCont
f750: 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20  ext != NULL) {. 
f760: 20 20 20 69 66 20 28 28 28 61 66 70 4c 6f 63 6b     if (((afpLock
f770: 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d  ingContext *)id-
f780: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
f790: 2d 3e 66 69 6c 65 50 61 74 68 20 21 3d 20 4e 55  ->filePath != NU
f7a0: 4c 4c 29 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL).      sqlite
f7b0: 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28  3ThreadSafeFree(
f7c0: 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ((afpLockingCont
f7d0: 65 78 74 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67  ext*)id->locking
f7e0: 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
f7f0: 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
f800: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 69  ThreadSafeFree(i
f810: 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d->lockingContex
f820: 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  t);.  }.  .  if(
f830: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
f840: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
f850: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
f860: 2d 31 3b 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  -1;.  close(id->
f870: 68 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  h);.  id->isOpen
f880: 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32   = 0;.  OSTRACE2
f890: 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
f8a0: 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65  ", id->h);.  Ope
f8b0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
f8c0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
f8d0: 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49  eFree(id);.  *pI
f8e0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
f8f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
f900: 70 72 61 67 6d 61 20 6d 61 72 6b 20 66 6c 6f 63  pragma mark floc
f910: 6b 28 29 20 73 74 79 6c 65 20 6c 6f 63 6b 69 6e  k() style lockin
f920: 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 65 20 66 6c  g../*. ** The fl
f930: 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
f940: 74 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 2a  t is not used. *
f950: 2f 0a 74 79 70 65 64 65 66 20 76 6f 69 64 20 66  /.typedef void f
f960: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
f970: 78 74 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  xt;..static int 
f980: 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  flockUnixCheckRe
f990: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
f9a0: 65 20 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46  e *id) {.  unixF
f9b0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f9c0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
f9d0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
f9e0: 74 79 70 65 20 3d 3d 20 52 45 53 45 52 56 45 44  type == RESERVED
f9f0: 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 72 65 74  _LOCK) {.    ret
fa00: 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72 65 61 64  urn 1; /* alread
fa10: 79 20 68 61 76 65 20 61 20 72 65 73 65 72 76 65  y have a reserve
fa20: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c  d lock */.  } el
fa30: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  se {.    /* atte
fa40: 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
fa50: 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ock */.    int r
fa60: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
fa70: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
fa80: 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 20 28  CK_NB);.    if (
fa90: 21 72 63 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20  !rc) {.      /* 
faa0: 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e  got the lock, un
fab0: 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20  lock it */.     
fac0: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
fad0: 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
fae0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 6e   return 0;  /* n
faf0: 6f 20 6f 6e 65 20 68 61 73 20 69 74 20 72 65 73  o one has it res
fb00: 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 7d 0a 20  erved */.    }. 
fb10: 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20     return 1; /* 
fb20: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
fb30: 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
fb40: 76 65 64 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 73 74  ved */.  }.}..st
fb50: 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
fb60: 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  ixLock(OsFile *i
fb70: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
fb80: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
fb90: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
fba0: 2a 29 69 64 3b 0a 20 20 0a 20 20 2f 2a 20 69 66  *)id;.  .  /* if
fbb0: 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
fbc0: 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65   a lock, it is e
fbd0: 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a  xclusive.  .  **
fbe0: 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76   Just adjust lev
fbf0: 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f  el and punt on o
fc00: 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20  utta here. */.  
fc10: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if (pFile->lockt
fc20: 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ype > NO_LOCK) {
fc30: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
fc40: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
fc50: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fc60: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
fc70: 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
fc80: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  sive lock */.  i
fc90: 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46  nt rc = flock(pF
fca0: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20  ile->h, LOCK_EX 
fcb0: 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 69 66  | LOCK_NB);.  if
fcc0: 20 28 72 63 29 20 7b 0a 20 20 20 20 2f 2a 20 64   (rc) {.    /* d
fcd0: 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
fce0: 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
fcf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
fd00: 59 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  Y;.  } else {.  
fd10: 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
fd20: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
fd30: 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
fd40: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fd50: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72   locktype;.    r
fd60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fd70: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69  .  }.}..static i
fd80: 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f  nt flockUnixUnlo
fd90: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
fda0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
fdb0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
fdc0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
fdd0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 6c  ;.  .  assert( l
fde0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
fdf0: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
fe00: 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
fe10: 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
fe20: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
fe30: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
fe40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fe50: 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
fe60: 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
fe70: 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
fe80: 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
fe90: 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
fea0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
feb0: 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
fec0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
fed0: 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
fee0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fef0: 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
ff00: 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
ff10: 20 20 69 6e 74 20 72 63 20 3d 20 66 6c 6f 63 6b    int rc = flock
ff20: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
ff30: 55 4e 29 3b 0a 20 20 69 66 20 28 72 63 29 0a 20  UN);.  if (rc). 
ff40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ff50: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
ff60: 20 65 6c 73 65 20 7b 0a 20 20 20 20 70 46 69 6c   else {.    pFil
ff70: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f  e->locktype = NO
ff80: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
ff90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
ffa0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65  .}../*. ** Close
ffb0: 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61   a file.. */.sta
ffc0: 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69  tic int flockUni
ffd0: 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a  xClose(OsFile **
ffe0: 70 49 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  pId) {.  unixFil
fff0: 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46 69 6c  e *id = (unixFil
10000 65 2a 29 2a 70 49 64 3b 0a 20 20 0a 20 20 69 66  e*)*pId;.  .  if
10010 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
10020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63  QLITE_OK;.  floc
10030 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64  kUnixUnlock(*pId
10040 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20  , NO_LOCK);.  . 
10050 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d   if( id->dirfd>=
10060 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69  0 ) close(id->di
10070 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  rfd);.  id->dirf
10080 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  d = -1;.  sqlite
10090 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
100a0 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d 3e  .  .  close(id->
100b0 68 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 4f  h);  .  sqlite3O
100c0 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
100d0 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b   id->isOpen = 0;
100e0 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f  .  OSTRACE2("CLO
100f0 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SE   %-3d\n", id
10100 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
10110 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
10120 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65 65  e3ThreadSafeFree
10130 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30  (id);.  *pId = 0
10140 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10150 45 5f 4f 4b 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61  E_OK;.}..#pragma
10160 20 6d 61 72 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c   mark Old-School
10170 20 2e 6c 6f 63 6b 20 66 69 6c 65 20 62 61 73 65   .lock file base
10180 64 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a  d locking../*. *
10190 2a 20 54 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * The dotlockLoc
101a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
101b0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
101c0 6c 6c 20 64 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63  ll dotlock (.loc
101d0 6b 29 20 6c 6f 63 6b 0a 20 2a 2a 20 73 70 65 63  k) lock. ** spec
101e0 69 66 69 63 20 73 74 61 74 65 0a 20 2a 2f 0a 74  ific state. */.t
101f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 64 6f  ypedef struct do
10200 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10210 65 78 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ext dotlockLocki
10220 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
10230 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  t dotlockLocking
10240 43 6f 6e 74 65 78 74 20 7b 0a 20 20 63 68 61 72  Context {.  char
10250 20 2a 6c 6f 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a   *lockPath;.};..
10260 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
10270 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65  ockUnixCheckRese
10280 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  rvedLock(OsFile 
10290 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  *id) {.  unixFil
102a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
102b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 64 6f 74 6c  File*)id;.  dotl
102c0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
102d0 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 0a 20 20  t *context = .  
102e0 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e    (dotlockLockin
102f0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
10300 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
10310 74 3b 0a 20 20 0a 20 20 69 66 20 28 70 46 69 6c  t;.  .  if (pFil
10320 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 52  e->locktype == R
10330 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
10340 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a      return 1; /*
10350 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
10360 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
10370 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10380 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
10390 42 75 66 3b 0a 20 20 20 20 69 66 20 28 6c 73 74  Buf;.    if (lst
103a0 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b  at(context->lock
103b0 50 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d  Path,&statBuf) =
103c0 3d 20 30 29 0a 20 20 20 20 20 20 2f 2a 20 66 69  = 0).      /* fi
103d0 6c 65 20 65 78 69 73 74 73 2c 20 73 6f 6d 65 6f  le exists, someo
103e0 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
103f0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 65  lock */.      re
10400 74 75 72 6e 20 31 3b 0a 20 20 20 20 65 6c 73 65  turn 1;.    else
10410 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64  .      /* file d
10420 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77  oes not exist, w
10430 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20  e could have it 
10440 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f  if we want it */
10450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10460 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69  .  }.}..static i
10470 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f  nt dotlockUnixLo
10480 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
10490 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
104a0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
104b0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
104c0 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  ;.  dotlockLocki
104d0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
104e0 78 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f  xt = .    (dotlo
104f0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
10500 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
10510 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
10520 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79  /* if we already
10530 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74   have a lock, it
10540 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20   is exclusive.  
10550 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73  .  ** Just adjus
10560 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74  t level and punt
10570 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20   on outta here. 
10580 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
10590 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
105a0 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
105b0 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
105c0 74 79 70 65 3b 0a 20 20 20 20 0a 20 20 20 20 2f  type;.    .    /
105d0 2a 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20  * Always update 
105e0 74 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e  the timestamp on
105f0 20 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f   the old file */
10600 0a 20 20 20 20 75 74 69 6d 65 73 28 63 6f 6e 74  .    utimes(cont
10610 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55  ext->lockPath,NU
10620 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LL);.    return 
10630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10640 20 0a 20 20 2f 2a 20 63 68 65 63 6b 20 74 6f 20   .  /* check to 
10650 73 65 65 20 69 66 20 6c 6f 63 6b 20 66 69 6c 65  see if lock file
10660 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
10670 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
10680 20 73 74 61 74 42 75 66 3b 0a 20 20 69 66 20 28   statBuf;.  if (
10690 6c 73 74 61 74 28 63 6f 6e 74 65 78 74 2d 3e 6c  lstat(context->l
106a0 6f 63 6b 50 61 74 68 2c 26 73 74 61 74 42 75 66  ockPath,&statBuf
106b0 29 20 3d 3d 20 30 29 7b 0a 20 20 20 20 72 65 74  ) == 0){.    ret
106c0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
106d0 20 2f 2a 20 69 74 20 64 6f 65 73 2c 20 62 75 73   /* it does, bus
106e0 79 20 2a 2f 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  y */.  }.  .  /*
106f0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
10700 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ve lock */.  int
10710 20 66 64 20 3d 20 6f 70 65 6e 28 63 6f 6e 74 65   fd = open(conte
10720 78 74 2d 3e 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52  xt->lockPath,O_R
10730 44 4f 4e 4c 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f  DONLY|O_CREAT|O_
10740 45 58 43 4c 2c 30 36 30 30 29 3b 0a 20 20 69 66  EXCL,0600);.  if
10750 20 28 66 64 20 3c 20 30 29 20 7b 0a 20 20 20 20   (fd < 0) {.    
10760 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
10770 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
10780 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  e, someone else 
10790 6d 61 79 20 68 61 76 65 20 73 74 6f 6c 65 6e 20  may have stolen 
107a0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  the lock */.    
107b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
107c0 53 59 3b 20 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  SY; .  }.  close
107d0 28 66 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f  (fd);.  .  /* go
107e0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
107f0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
10800 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63   */.  pFile->loc
10810 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10820 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10830 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
10840 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55  int dotlockUnixU
10850 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
10860 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10870 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
10880 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
10890 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  )id;.  dotlockLo
108a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
108b0 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64 6f  ntext = .    (do
108c0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
108d0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
108e0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
108f0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
10900 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
10910 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
10920 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
10930 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
10940 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
10950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10970 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
10980 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
10990 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
109a0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
109b0 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79   */.  if (lockty
109c0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
109d0 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
109e0 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
109f0 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
10a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
10a10 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
10a20 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e   unlock. */.  un
10a30 6c 69 6e 6b 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f  link(context->lo
10a40 63 6b 50 61 74 68 29 3b 0a 20 20 70 46 69 6c 65  ckPath);.  pFile
10a50 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
10a60 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53  LOCK;.  return S
10a70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10a80 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
10a90 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
10aa0 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73   dotlockUnixClos
10ab0 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20  e(OsFile **pId) 
10ac0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64  {.  unixFile *id
10ad0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70   = (unixFile*)*p
10ae0 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64  Id;.  .  if( !id
10af0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10b00 5f 4f 4b 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  _OK;.  dotlockUn
10b10 69 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e  ixUnlock(*pId, N
10b20 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 2f 2a 20 66 72  O_LOCK);.  /* fr
10b30 65 65 20 74 68 65 20 64 6f 74 6c 6f 63 6b 20 6c  ee the dotlock l
10b40 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
10b50 20 2a 2f 0a 20 20 69 66 20 28 69 64 2d 3e 6c 6f   */.  if (id->lo
10b60 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 21 3d 20  ckingContext != 
10b70 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69 66 20 28  NULL) {.    if (
10b80 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  ((dotlockLocking
10b90 43 6f 6e 74 65 78 74 20 2a 29 69 64 2d 3e 6c 6f  Context *)id->lo
10ba0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c  ckingContext)->l
10bb0 6f 63 6b 50 61 74 68 20 21 3d 20 4e 55 4c 4c 29  ockPath != NULL)
10bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68  .      sqlite3Th
10bd0 72 65 61 64 53 61 66 65 46 72 65 65 28 20 28 20  readSafeFree( ( 
10be0 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  (dotlockLockingC
10bf0 6f 6e 74 65 78 74 20 2a 29 0a 20 20 20 20 20 20  ontext *).      
10c00 20 20 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e    id->lockingCon
10c10 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 29  text)->lockPath)
10c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72  ;.    sqlite3Thr
10c30 65 61 64 53 61 66 65 46 72 65 65 28 69 64 2d 3e  eadSafeFree(id->
10c40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
10c50 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 69 64  .  }.  .  if( id
10c60 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
10c70 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
10c80 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
10c90 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
10ca0 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 63  rMutex();.  .  c
10cb0 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 0a  lose(id->h);.  .
10cc0 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
10cd0 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69  Mutex();.  id->i
10ce0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 53 54  sOpen = 0;.  OST
10cf0 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25  RACE2("CLOSE   %
10d00 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a  -3d\n", id->h);.
10d10 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
10d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68 72 65  );.  sqlite3Thre
10d30 61 64 53 61 66 65 46 72 65 65 28 69 64 29 3b 0a  adSafeFree(id);.
10d40 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 72 65    *pId = 0;.  re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10d60 7d 0a 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b  }...#pragma mark
10d70 20 4e 6f 20 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a   No locking../*.
10d80 20 2a 2a 20 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f   ** The nolockLo
10d90 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73 20  ckingContext is 
10da0 76 6f 69 64 0a 20 2a 2f 0a 74 79 70 65 64 65 66  void. */.typedef
10db0 20 76 6f 69 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b   void nolockLock
10dc0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 73 74 61  ingContext;..sta
10dd0 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10de0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
10df0 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 20  ock(OsFile *id) 
10e00 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
10e10 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10e20 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f 73 46 69 6c  ckUnixLock(OsFil
10e30 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
10e40 79 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  ype) {.  return 
10e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
10e60 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55  atic int nolockU
10e70 6e 69 78 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65  nixUnlock(OsFile
10e80 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
10e90 70 65 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 53  pe) {.  return S
10ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10eb0 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65   ** Close a file
10ec0 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
10ed0 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65   nolockUnixClose
10ee0 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b  (OsFile **pId) {
10ef0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69 64 20  .  unixFile *id 
10f00 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49  = (unixFile*)*pI
10f10 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69 64 20  d;.  .  if( !id 
10f20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10f30 4f 4b 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  OK;.  if( id->di
10f40 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
10f50 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
10f60 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73  >dirfd = -1;.  s
10f70 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
10f80 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65  ex();.  .  close
10f90 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 73 71  (id->h);.  .  sq
10fa0 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
10fb0 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  x();.  id->isOpe
10fc0 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  n = 0;.  OSTRACE
10fd0 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
10fe0 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
10ff0 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
11000 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
11010 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  feFree(id);.  *p
11020 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
11030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
11040 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11050 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
11060 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TYLE */../*.** T
11070 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
11080 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
11090 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ull pathname.  R
110a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
110b0 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70  ** to the full p
110c0 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69  athname stored i
110d0 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  n space obtained
110e0 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
110f0 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  oc()..** The cal
11100 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ling function is
11110 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
11120 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73 70   freeing this sp
11130 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69  ace once it.** i
11140 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64  s no longer need
11150 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  ed..*/.char *sql
11160 69 74 65 33 55 6e 69 78 46 75 6c 6c 50 61 74 68  ite3UnixFullPath
11170 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
11180 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20 20 63  *zRelative){.  c
11190 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a  har *zFull = 0;.
111a0 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
111b0 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73  0]=='/' ){.    s
111c0 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
111d0 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76  &zFull, zRelativ
111e0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
111f0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
11200 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 4d 61  *zBuf = sqliteMa
11210 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20 20 20 20  lloc(5000);.    
11220 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  if( zBuf==0 ){. 
11230 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11240 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 30 5d     }.    zBuf[0]
11250 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
11260 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  3SetString(&zFul
11270 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20  l, getcwd(zBuf, 
11280 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a 52 65 6c  5000), "/", zRel
11290 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20 20 20  ative,.         
112a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
112b0 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
112c0 46 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  Free(zBuf);.  }.
112d0 0a 23 69 66 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a  .#if 0.  /*.  **
112e0 20 52 65 6d 6f 76 65 20 22 2f 2e 2f 22 20 70 61   Remove "/./" pa
112f0 74 68 20 65 6c 65 6d 65 6e 74 73 20 61 6e 64 20  th elements and 
11300 63 6f 6e 76 65 72 74 20 22 2f 41 2f 2e 2f 22 20  convert "/A/./" 
11310 70 61 74 68 20 65 6c 65 6d 65 6e 74 73 0a 20 20  path elements.  
11320 2a 2a 20 74 6f 20 6a 75 73 74 20 22 2f 22 2e 0a  ** to just "/"..
11330 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
11340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
11350 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ;.    for(i=j=0;
11360 20 7a 46 75 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   zFull[i]; i++){
11370 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
11380 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
11390 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 2b      if( zFull[i+
113a0 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
113b0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
113c0 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20  zFull[i+1]=='.' 
113d0 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27  && zFull[i+2]=='
113e0 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
113f0 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
11400 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
11410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
11420 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e  ( zFull[i+1]=='.
11430 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d  ' && zFull[i+2]=
11440 3d 27 2e 27 20 26 26 20 7a 46 75 6c 6c 5b 69 2b  ='.' && zFull[i+
11450 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  3]=='/' ){.     
11460 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
11470 26 26 20 7a 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27  && zFull[j-1]!='
11480 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
11490 20 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20         i += 3;. 
114a0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
114b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
114c0 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 75 6c 6c     }.      zFull
114d0 5b 6a 2b 2b 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d  [j++] = zFull[i]
114e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 75 6c  ;.    }.    zFul
114f0 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  l[j] = 0;.  }.#e
11500 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 7a  ndif..  return z
11510 46 75 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Full;.}../*.** C
11520 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
11530 6f 66 20 74 68 65 20 66 75 6c 6c 73 79 6e 63 20  of the fullsync 
11540 66 6c 61 67 20 69 6e 20 74 68 65 20 67 69 76 65  flag in the give
11550 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
11560 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
11570 64 20 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e  d unixSetFullSyn
11580 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  c(OsFile *id, in
11590 74 20 76 29 7b 0a 20 20 28 28 75 6e 69 78 46 69  t v){.  ((unixFi
115a0 6c 65 2a 29 69 64 29 2d 3e 66 75 6c 6c 53 79 6e  le*)id)->fullSyn
115b0 63 20 3d 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = v;.}../*.** 
115c0 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72  Return the under
115d0 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c  lying file handl
115e0 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a  e for an OsFile.
115f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
11600 69 78 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46  ixFileHandle(OsF
11610 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
11620 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rn ((unixFile*)i
11630 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d)->h;.}../*.** 
11640 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
11650 72 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 74  r that indices t
11660 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
11670 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 0a 2a  currently held.*
11680 2a 20 62 79 20 74 68 69 73 20 68 61 6e 64 6c 65  * by this handle
11690 2e 20 20 28 55 73 65 64 20 66 6f 72 20 74 65 73  .  (Used for tes
116a0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
116b0 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74  s only.).*/.stat
116c0 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53  ic int unixLockS
116d0 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  tate(OsFile *id)
116e0 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
116f0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b  xFile*)id)->lock
11700 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
11710 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
11720 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
11730 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
11740 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
11750 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
11760 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
11770 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
11780 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
11790 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
117a0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
117b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
117c0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
117d0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
117e0 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
117f0 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
11800 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
11810 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
11820 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
11830 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
11840 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
11850 20 69 74 27 73 20 6a 6f 75 72 6e 61 6c 20 66 69   it's journal fi
11860 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
11870 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
11880 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
11890 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
118a0 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
118b0 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  ize(OsFile *id){
118c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
118d0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
118e0 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
118f0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
11900 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
11910 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
11920 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
11930 0a 2a 2a 20 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f  .** for unix..*/
11940 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f  .static const Io
11950 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 55 6e  Method sqlite3Un
11960 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11970 20 75 6e 69 78 43 6c 6f 73 65 2c 0a 20 20 75 6e   unixClose,.  un
11980 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c  ixOpenDirectory,
11990 0a 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 75  .  unixRead,.  u
119a0 6e 69 78 57 72 69 74 65 2c 0a 20 20 75 6e 69 78  nixWrite,.  unix
119b0 53 65 65 6b 2c 0a 20 20 75 6e 69 78 54 72 75 6e  Seek,.  unixTrun
119c0 63 61 74 65 2c 0a 20 20 75 6e 69 78 53 79 6e 63  cate,.  unixSync
119d0 2c 0a 20 20 75 6e 69 78 53 65 74 46 75 6c 6c 53  ,.  unixSetFullS
119e0 79 6e 63 2c 0a 20 20 75 6e 69 78 46 69 6c 65 48  ync,.  unixFileH
119f0 61 6e 64 6c 65 2c 0a 20 20 75 6e 69 78 46 69 6c  andle,.  unixFil
11a00 65 53 69 7a 65 2c 0a 20 20 75 6e 69 78 4c 6f 63  eSize,.  unixLoc
11a10 6b 2c 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  k,.  unixUnlock,
11a20 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65  .  unixLockState
11a30 2c 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  ,.  unixCheckRes
11a40 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69  ervedLock,.  uni
11a50 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a  xSectorSize,.};.
11a60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11a70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11a80 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20  YLE./*. ** This 
11a90 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
11aa0 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
11ab0 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
11ac0 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a  on an OsFile. **
11ad0 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 41   for unix with A
11ae0 46 50 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f  FP style file lo
11af0 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69  cking.. */.stati
11b00 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64  c const IoMethod
11b10 20 73 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69   sqlite3AFPLocki
11b20 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d  ngUnixIoMethod =
11b30 20 7b 0a 20 20 20 20 61 66 70 55 6e 69 78 43 6c   {.    afpUnixCl
11b40 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65  ose,.    unixOpe
11b50 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20  nDirectory,.    
11b60 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e  unixRead,.    un
11b70 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69  ixWrite,.    uni
11b80 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54  xSeek,.    unixT
11b90 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69  runcate,.    uni
11ba0 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53  xSync,.    unixS
11bb0 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20  etFullSync,.    
11bc0 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a  unixFileHandle,.
11bd0 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65      unixFileSize
11be0 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 4c 6f 63  ,.    afpUnixLoc
11bf0 6b 2c 0a 20 20 20 20 61 66 70 55 6e 69 78 55 6e  k,.    afpUnixUn
11c00 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 4c 6f  lock,.    unixLo
11c10 63 6b 53 74 61 74 65 2c 0a 20 20 20 20 61 66 70  ckState,.    afp
11c20 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  UnixCheckReserve
11c30 64 4c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69 78 53  dLock,.    unixS
11c40 65 63 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f  ectorSize,.};../
11c50 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  *. ** This vecto
11c60 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
11c70 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
11c80 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
11c90 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72 20   OsFile. ** for 
11ca0 75 6e 69 78 20 77 69 74 68 20 66 6c 6f 63 6b 28  unix with flock(
11cb0 29 20 73 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63  ) style file loc
11cc0 6b 69 6e 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  king.. */.static
11cd0 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20   const IoMethod 
11ce0 73 71 6c 69 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b  sqlite3FlockLock
11cf0 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20  ingUnixIoMethod 
11d00 3d 20 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69  = {.    flockUni
11d10 78 43 6c 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78  xClose,.    unix
11d20 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20  OpenDirectory,. 
11d30 20 20 20 75 6e 69 78 52 65 61 64 2c 0a 20 20 20     unixRead,.   
11d40 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20 20 20   unixWrite,.    
11d50 75 6e 69 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e  unixSeek,.    un
11d60 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20 20 20  ixTruncate,.    
11d70 75 6e 69 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e  unixSync,.    un
11d80 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20  ixSetFullSync,. 
11d90 20 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c     unixFileHandl
11da0 65 2c 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 53  e,.    unixFileS
11db0 69 7a 65 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e  ize,.    flockUn
11dc0 69 78 4c 6f 63 6b 2c 0a 20 20 20 20 66 6c 6f 63  ixLock,.    floc
11dd0 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20  kUnixUnlock,.   
11de0 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a   unixLockState,.
11df0 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 68 65      flockUnixChe
11e00 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
11e10 20 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69      unixSectorSi
11e20 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54  ze,.};../*. ** T
11e30 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
11e40 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
11e50 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
11e60 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65  ate on an OsFile
11e70 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69  . ** for unix wi
11e80 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65  th dotlock style
11e90 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20   file locking.. 
11ea0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
11eb0 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
11ec0 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e  DotlockLockingUn
11ed0 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11ee0 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c     dotlockUnixCl
11ef0 6f 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65  ose,.    unixOpe
11f00 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20  nDirectory,.    
11f10 75 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e  unixRead,.    un
11f20 69 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69  ixWrite,.    uni
11f30 78 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54  xSeek,.    unixT
11f40 72 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69  runcate,.    uni
11f50 78 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53  xSync,.    unixS
11f60 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20  etFullSync,.    
11f70 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a  unixFileHandle,.
11f80 20 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65      unixFileSize
11f90 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69  ,.    dotlockUni
11fa0 78 4c 6f 63 6b 2c 0a 20 20 20 20 64 6f 74 6c 6f  xLock,.    dotlo
11fb0 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20  ckUnixUnlock,.  
11fc0 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c    unixLockState,
11fd0 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78  .    dotlockUnix
11fe0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11ff0 6b 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f  k,.    unixSecto
12000 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  rSize,.};../*. *
12010 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
12020 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
12030 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
12040 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
12050 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78  ile. ** for unix
12060 20 77 69 74 68 20 64 6f 74 6c 6f 63 6b 20 73 74   with dotlock st
12070 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
12080 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  .. */.static con
12090 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69  st IoMethod sqli
120a0 74 65 33 4e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  te3NolockLocking
120b0 55 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b  UnixIoMethod = {
120c0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f  .  nolockUnixClo
120d0 73 65 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44 69  se,.  unixOpenDi
120e0 72 65 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78 52  rectory,.  unixR
120f0 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65  ead,.  unixWrite
12100 2c 0a 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20  ,.  unixSeek,.  
12110 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20  unixTruncate,.  
12120 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78  unixSync,.  unix
12130 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 75  SetFullSync,.  u
12140 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  nixFileHandle,. 
12150 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20   unixFileSize,. 
12160 20 6e 6f 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c   nolockUnixLock,
12170 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c  .  nolockUnixUnl
12180 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 53  ock,.  unixLockS
12190 74 61 74 65 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  tate,.  nolockUn
121a0 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
121b0 6f 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63 74 6f  ock,.  unixSecto
121c0 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 23 65 6e 64 69  rSize,.};..#endi
121d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
121e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
121f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
12200 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
12210 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 61 6e   new unixFile an
12220 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 61  d initialize tha
12230 74 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 57  t unixFile..** W
12240 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
12250 6f 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69  o the new unixFi
12260 6c 65 20 69 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a  le into *pId..**
12270 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   If we run out o
12280 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73 65 20  f memory, close 
12290 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74  the file and ret
122a0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  urn an error..*/
122b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
122c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
122d0 59 4c 45 0a 2f 2a 20 0a 20 2a 2a 20 57 68 65 6e  YLE./* . ** When
122e0 20 6c 6f 63 6b 69 6e 67 20 65 78 74 65 6e 73 69   locking extensi
122f0 6f 6e 73 20 61 72 65 20 65 6e 61 62 6c 65 64 2c  ons are enabled,
12300 20 74 68 65 20 66 69 6c 65 70 61 74 68 20 61 6e   the filepath an
12310 64 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20  d locking style 
12320 0a 20 2a 2a 20 61 72 65 20 6e 65 65 64 65 64 20  . ** are needed 
12330 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
12340 20 75 6e 69 78 46 69 6c 65 20 70 4d 65 74 68 6f   unixFile pMetho
12350 64 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 63  d to use for loc
12360 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
12370 0a 20 2a 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67  . ** The locking
12380 2d 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20  -style specific 
12390 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 64  lockingContext d
123a0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
123b0 20 63 72 65 61 74 65 64 20 0a 20 2a 2a 20 61 6e   created . ** an
123c0 64 20 61 73 73 69 67 6e 65 64 20 68 65 72 65 20  d assigned here 
123d0 61 6c 73 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  also.. */.static
123e0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69   int allocateUni
123f0 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12410 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
12420 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
12430 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
12440 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c  .  OsFile **pId,
12450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12460 69 74 65 20 63 6f 6d 70 6c 65 74 65 64 20 69 6e  ite completed in
12470 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 65 72  itialization her
12480 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12490 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
124a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
124b0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
124c0 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 46 6c 61 67  */.  int delFlag
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
124e0 44 65 6c 65 74 65 2d 6f 6e 2d 6f 72 2d 62 65 66  Delete-on-or-bef
124f0 6f 72 65 2d 63 6c 6f 73 65 20 66 6c 61 67 20 2a  ore-close flag *
12500 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 4c 6f  /.){.  sqlite3Lo
12510 63 6b 69 6e 67 53 74 79 6c 65 20 6c 6f 63 6b 69  ckingStyle locki
12520 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
12530 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69  ile *pNew;.  uni
12540 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72  xFile f;.  int r
12550 63 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c  c;..  memset(&f,
12560 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a   0, sizeof(f));.
12570 20 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d    lockingStyle =
12580 20 73 71 6c 69 74 65 33 44 65 74 65 63 74 4c 6f   sqlite3DetectLo
12590 63 6b 69 6e 67 53 74 79 6c 65 28 7a 46 69 6c 65  ckingStyle(zFile
125a0 6e 61 6d 65 2c 20 68 29 3b 0a 20 20 69 66 20 28  name, h);.  if (
125b0 20 6c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d   lockingStyle ==
125c0 20 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79   posixLockingSty
125d0 6c 65 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74  le ) {.    sqlit
125e0 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
125f0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
12600 6f 63 6b 49 6e 66 6f 28 68 2c 20 26 66 2e 70 4c  ockInfo(h, &f.pL
12610 6f 63 6b 2c 20 26 66 2e 70 4f 70 65 6e 29 3b 0a  ock, &f.pOpen);.
12620 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
12630 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  veMutex();.    i
12640 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  f( rc ){.      c
12650 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 20 20 75  lose(h);.      u
12660 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
12670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12690 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
126a0 20 20 2f 2a 20 20 70 4c 6f 63 6b 20 61 6e 64 20    /*  pLock and 
126b0 70 4f 70 65 6e 20 61 72 65 20 6f 6e 6c 79 20 75  pOpen are only u
126c0 73 65 64 20 66 6f 72 20 70 6f 73 69 78 20 61 64  sed for posix ad
126d0 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 2a  visory locking *
126e0 2f 0a 20 20 20 20 66 2e 70 4c 6f 63 6b 20 3d 20  /.    f.pLock = 
126f0 4e 55 4c 4c 3b 0a 20 20 20 20 66 2e 70 4f 70 65  NULL;.    f.pOpe
12700 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  n = NULL;.  }.  
12710 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20  if( delFlag ){. 
12720 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
12730 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 2e 64 69  ame);.  }.  f.di
12740 72 66 64 20 3d 20 2d 31 3b 0a 20 20 66 2e 68 20  rfd = -1;.  f.h 
12750 3d 20 68 3b 0a 20 20 53 45 54 5f 54 48 52 45 41  = h;.  SET_THREA
12760 44 49 44 28 26 66 29 3b 0a 20 20 70 4e 65 77 20  DID(&f);.  pNew 
12770 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53  = sqlite3ThreadS
12780 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  afeMalloc( sizeo
12790 66 28 75 6e 69 78 46 69 6c 65 29 20 29 3b 0a 20  f(unixFile) );. 
127a0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
127b0 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20      close(h);.  
127c0 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
127d0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
127e0 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 66 2e 70  easeLockInfo(f.p
127f0 4c 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61  Lock);.    relea
12800 73 65 4f 70 65 6e 43 6e 74 28 66 2e 70 4f 70 65  seOpenCnt(f.pOpe
12810 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  n);.    sqlite3O
12820 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
12830 20 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20     *pId = 0;.   
12840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12850 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
12860 20 20 20 2a 70 4e 65 77 20 3d 20 66 3b 0a 20 20     *pNew = f;.  
12870 20 20 73 77 69 74 63 68 28 6c 6f 63 6b 69 6e 67    switch(locking
12880 53 74 79 6c 65 29 20 7b 0a 20 20 20 20 20 20 63  Style) {.      c
12890 61 73 65 20 61 66 70 4c 6f 63 6b 69 6e 67 53 74  ase afpLockingSt
128a0 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f  yle: {.        /
128b0 2a 20 61 66 70 20 6c 6f 63 6b 69 6e 67 20 75 73  * afp locking us
128c0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
128d0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
128e0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
128f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 61 66         ** the af
12900 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
12910 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
12920 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
12930 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12940 3d 20 26 73 71 6c 69 74 65 33 41 46 50 4c 6f 63  = &sqlite3AFPLoc
12950 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
12960 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
12970 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
12980 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
12990 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
129a0 6c 6f 63 28 73 69 7a 65 6f 66 28 61 66 70 4c 6f  loc(sizeof(afpLo
129b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a  ckingContext));.
129c0 20 20 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d          nFilenam
129d0 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
129e0 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  name)+1;.       
129f0 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
12a00 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63  text *)pNew->loc
12a10 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69  kingContext)->fi
12a20 6c 65 50 61 74 68 20 3d 20 0a 20 20 20 20 20 20  lePath = .      
12a30 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61      sqlite3Threa
12a40 64 53 61 66 65 4d 61 6c 6c 6f 63 28 6e 46 69 6c  dSafeMalloc(nFil
12a50 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
12a60 6d 65 6d 63 70 79 28 28 28 61 66 70 4c 6f 63 6b  memcpy(((afpLock
12a70 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
12a80 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12a90 74 29 2d 3e 66 69 6c 65 50 61 74 68 2c 20 0a 20  t)->filePath, . 
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
12ab0 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61  ilename, nFilena
12ac0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 72 61  me);.        sra
12ad0 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
12ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12af0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 66 6c 6f  }.      case flo
12b00 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a  ckLockingStyle:.
12b10 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 6f 63 6b          /* flock
12b20 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74   locking doesn't
12b30 20 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c   need additional
12b40 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20   lockingContext 
12b50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
12b60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65         pNew->pMe
12b70 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 46  thod = &sqlite3F
12b80 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
12b90 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 20 20 20  oMethod;.       
12ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
12bb0 73 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  se dotlockLockin
12bc0 67 53 74 79 6c 65 3a 20 7b 0a 20 20 20 20 20 20  gStyle: {.      
12bd0 20 20 2f 2a 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63    /* dotlock loc
12be0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
12bf0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
12c00 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
12c10 65 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 2a  ed in.         *
12c20 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63  * the dotlockLoc
12c30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
12c40 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65         int nFile
12c50 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  name;.        pN
12c60 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
12c70 71 6c 69 74 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63  qlite3DotlockLoc
12c80 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74 68 6f 64  kingUnixIoMethod
12c90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
12ca0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
12cb0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
12cc0 66 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  feMalloc(.      
12cd0 20 20 20 20 73 69 7a 65 6f 66 28 64 6f 74 6c 6f      sizeof(dotlo
12ce0 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
12cf0 29 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 69 6c  ));.        nFil
12d00 65 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  ename = strlen(z
12d10 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20  Filename) + 6;. 
12d20 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b         ((dotlock
12d30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
12d40 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  )pNew->lockingCo
12d50 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68  ntext)->lockPath
12d60 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
12d70 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
12d80 65 4d 61 6c 6c 6f 63 28 20 6e 46 69 6c 65 6e 61  eMalloc( nFilena
12d90 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  me );.        sq
12da0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
12db0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
12dc0 20 20 20 20 20 20 20 20 20 20 20 28 28 64 6f 74             ((dot
12dd0 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
12de0 78 74 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69  xt *)pNew->locki
12df0 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b  ngContext)->lock
12e00 50 61 74 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Path, .         
12e10 20 20 20 20 20 20 20 22 25 73 2e 6c 6f 63 6b 22         "%s.lock"
12e20 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
12e30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12e40 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
12e50 70 6f 73 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c  posixLockingStyl
12e60 65 3a 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 6f  e:.        /* po
12e70 73 69 78 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  six locking does
12e80 6e 27 74 20 6e 65 65 64 20 61 64 64 69 74 69 6f  n't need additio
12e90 6e 61 6c 20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  nal lockingConte
12ea0 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  xt information *
12eb0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
12ec0 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
12ed0 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a  e3UnixIoMethod;.
12ee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12ef0 20 20 20 20 20 63 61 73 65 20 6e 6f 4c 6f 63 6b       case noLock
12f00 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
12f10 63 61 73 65 20 75 6e 73 75 70 70 6f 72 74 65 64  case unsupported
12f20 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20  LockingStyle:.  
12f30 20 20 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20      default: .  
12f40 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74        pNew->pMet
12f50 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 4e 6f  hod = &sqlite3No
12f60 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49  lockLockingUnixI
12f70 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 7d 0a 20  oMethod;.    }. 
12f80 20 20 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c     *pId = (OsFil
12f90 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65  e*)pNew;.    Ope
12fa0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
12fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12fc0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 20  OK;.  }.}.#else 
12fd0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
12fe0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
12ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
13000 6f 63 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20  ocateUnixFile(. 
13010 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
13020 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
13030 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13040 6f 6e 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  on file being op
13050 65 6e 65 64 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  ened */.  OsFile
13060 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20 20 20   **pId,         
13070 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
13080 73 75 6c 20 75 6e 69 78 46 69 6c 65 20 73 74 72  sul unixFile str
13090 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
130a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
130b0 6c 65 6e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20  lename, /* Name 
130c0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
130d0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
130e0 74 20 64 65 6c 46 6c 61 67 20 20 20 20 20 20 20  t delFlag       
130f0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
13100 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
13110 20 6f 6e 20 6f 72 20 62 65 66 6f 72 65 20 63 6c   on or before cl
13120 6f 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e  osing */.){.  un
13130 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
13140 75 6e 69 78 46 69 6c 65 20 66 3b 0a 20 20 69 6e  unixFile f;.  in
13150 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 46 44  t rc;..#ifdef FD
13160 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
13170 28 68 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e  (h, F_SETFD, fcn
13180 74 6c 28 68 2c 20 46 5f 47 45 54 46 44 2c 20 30  tl(h, F_GETFD, 0
13190 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
131a0 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74  .#endif.  memset
131b0 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
131c0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45  ));.  sqlite3OsE
131d0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
131e0 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
131f0 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66  (h, &f.pLock, &f
13200 2e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74  .pOpen);.  sqlit
13210 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
13220 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20  ;.  if( delFlag 
13230 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  ){.    unlink(zF
13240 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
13250 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
13260 6f 73 65 28 68 29 3b 0a 20 20 20 20 72 65 74 75  ose(h);.    retu
13270 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13280 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
13290 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
132a0 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
132b0 65 29 3b 0a 20 20 66 2e 64 69 72 66 64 20 3d 20  e);.  f.dirfd = 
132c0 2d 31 3b 0a 20 20 66 2e 68 20 3d 20 68 3b 0a 20  -1;.  f.h = h;. 
132d0 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 26 66   SET_THREADID(&f
132e0 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
132f0 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
13300 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69 78  loc( sizeof(unix
13310 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  File) );.  if( p
13320 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c  New==0 ){.    cl
13330 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  ose(h);.    sqli
13340 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
13350 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f  );.    releaseLo
13360 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b 29 3b  ckInfo(f.pLock);
13370 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  .    releaseOpen
13380 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a 20 20  Cnt(f.pOpen);.  
13390 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
133a0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a 70 49  Mutex();.    *pI
133b0 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  d = 0;.    retur
133c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
133d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e    }else{.    *pN
133e0 65 77 20 3d 20 66 3b 0a 20 20 20 20 70 4e 65 77  ew = f;.    pNew
133f0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c  ->pMethod = &sql
13400 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f 64  ite3UnixIoMethod
13410 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f 73  ;.    *pId = (Os
13420 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20 20  File*)pNew;.    
13430 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
13440 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13450 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TE_OK;.  }.}.#en
13460 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
13470 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
13480 4c 45 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  LE */..#endif /*
13490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
134a0 4b 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  KIO */./********
134b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134f0 2a 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e  ***.** Everythin
13500 67 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69  g above deals wi
13510 74 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76  th file I/O.  Ev
13520 65 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f  erything that fo
13530 6c 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77  llows deals.** w
13540 69 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c  ith other miscel
13550 6c 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f  lanous aspects o
13560 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
13570 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
13580 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
135d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
135e0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
135f0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
13600 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
13610 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
13620 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
13630 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
13640 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
13650 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
13660 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
13670 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
13680 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 76 6f 69 64  e <dlfcn.h>.void
13690 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 6f   *sqlite3UnixDlo
136a0 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
136b0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
136c0 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c  turn dlopen(zFil
136d0 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20  ename, RTLD_NOW 
136e0 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a  | RTLD_GLOBAL);.
136f0 7d 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 55  }.void *sqlite3U
13700 6e 69 78 44 6c 73 79 6d 28 76 6f 69 64 20 2a 70  nixDlsym(void *p
13710 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68  Handle, const ch
13720 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b 0a 20 20  ar *zSymbol){.  
13730 72 65 74 75 72 6e 20 64 6c 73 79 6d 28 70 48 61  return dlsym(pHa
13740 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
13750 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  }.int sqlite3Uni
13760 78 44 6c 63 6c 6f 73 65 28 76 6f 69 64 20 2a 70  xDlclose(void *p
13770 48 61 6e 64 6c 65 29 7b 0a 20 20 72 65 74 75 72  Handle){.  retur
13780 6e 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c  n dlclose(pHandl
13790 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  e);.}.#endif /* 
137a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
137b0 5f 45 58 54 45 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f  _EXTENSION */../
137c0 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61  *.** Get informa
137d0 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65  tion to seed the
137e0 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
137f0 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73  enerator.  The s
13800 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  eed.** is writte
13810 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  n into the buffe
13820 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68  r zBuf[256].  Th
13830 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
13840 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c  on must.** suppl
13850 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79  y a sufficiently
13860 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a   large buffer..*
13870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
13880 78 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  xRandomSeed(char
13890 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
138a0 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
138b0 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
138c0 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
138d0 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
138e0 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
138f0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
13900 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
13910 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
13920 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
13930 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
13940 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
13950 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
13960 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
13970 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
13980 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
13990 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
139a0 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
139b0 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
139c0 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
139d0 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
139e0 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
139f0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
13a00 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
13a10 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
13a20 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
13a30 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
13a40 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
13a50 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
13a60 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
13a70 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
13a80 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
13a90 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
13aa0 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
13ab0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
13ac0 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
13ad0 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
13ae0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
13af0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
13b00 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
13b10 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
13b20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
13b30 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b  SQLITE_TEST).  {
13b40 0a 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64  .    int pid, fd
13b50 3b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28  ;.    fd = open(
13b60 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20  "/dev/urandom", 
13b70 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69  O_RDONLY);.    i
13b80 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
13b90 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
13ba0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
13bb0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
13bc0 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
13bd0 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
13be0 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
13bf0 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69  (&zBuf[sizeof(ti
13c00 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  me_t)], &pid, si
13c10 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
13c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61  }else{.      rea
13c30 64 28 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29  d(fd, zBuf, 256)
13c40 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
13c50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13c60 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
13c70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13c80 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
13c90 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
13ca0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
13cb0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20   time slept..** 
13cc0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
13cd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
13ce0 6c 6c 69 73 65 63 6f 6e 64 73 20 77 65 20 77 61  lliseconds we wa
13cf0 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2f 0a  nt to sleep..*/.
13d00 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53  int sqlite3UnixS
13d10 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69  leep(int ms){.#i
13d20 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
13d30 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
13d40 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
13d50 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  s*1000);.  retur
13d60 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c  n ms;.#else.  sl
13d70 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30  eep((ms+999)/100
13d80 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30  0);.  return 100
13d90 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30  0*((ms+999)/1000
13da0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
13db0 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61 62  ** Static variab
13dc0 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68 72  les used for thr
13dd0 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74  ead synchronizat
13de0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4d 75 74  ion..**.** inMut
13df0 65 78 20 20 20 20 20 20 74 68 65 20 6e 65 73 74  ex      the nest
13e00 69 6e 67 20 64 65 70 74 68 20 6f 66 20 74 68 65  ing depth of the
13e10 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
13e20 2e 20 20 54 68 65 20 74 68 72 65 61 64 0a 2a 2a  .  The thread.**
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f                ho
13e40 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20  lding mutexMain 
13e50 63 61 6e 20 72 65 61 64 20 74 68 69 73 20 76 61  can read this va
13e60 72 69 61 62 6c 65 20 61 74 20 61 6e 79 20 74 69  riable at any ti
13e70 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  me..**          
13e80 20 20 20 20 42 75 74 20 69 73 20 6d 75 73 74 20      But is must 
13e90 68 6f 6c 64 20 6d 75 74 65 78 41 75 78 20 74 6f  hold mutexAux to
13ea0 20 63 68 61 6e 67 65 20 74 68 69 73 20 76 61 72   change this var
13eb0 69 61 62 6c 65 2e 20 20 4f 74 68 65 72 0a 2a 2a  iable.  Other.**
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
13ed0 72 65 61 64 73 20 6d 75 73 74 20 68 6f 6c 64 20  reads must hold 
13ee0 6d 75 74 65 78 41 75 78 20 74 6f 20 72 65 61 64  mutexAux to read
13ef0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 61 6e   the variable an
13f00 64 20 63 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20  d can.**        
13f10 20 20 20 20 20 20 6e 65 76 65 72 20 77 72 69 74        never writ
13f20 65 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77  e..**.** mutexOw
13f30 6e 65 72 20 20 20 54 68 65 20 74 68 72 65 61 64  ner   The thread
13f40 20 69 64 20 6f 66 20 74 68 65 20 74 68 72 65 61   id of the threa
13f50 64 20 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d  d holding mutexM
13f60 61 69 6e 2e 20 20 53 61 6d 65 0a 2a 2a 20 20 20  ain.  Same.**   
13f70 20 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73             acces
13f80 73 20 72 75 6c 65 73 20 61 73 20 66 6f 72 20 69  s rules as for i
13f90 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75  nMutex..**.** mu
13fa0 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 20 20  texOwnerValid   
13fb0 54 72 75 65 20 69 66 20 74 68 65 20 76 61 6c 75  True if the valu
13fc0 65 20 69 6e 20 6d 75 74 65 78 4f 77 6e 65 72 20  e in mutexOwner 
13fd0 69 73 20 76 61 6c 69 64 2e 20 20 54 68 65 20 73  is valid.  The s
13fe0 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ame.**          
13ff0 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73 20           access 
14000 72 75 6c 65 73 20 61 70 70 6c 79 20 61 73 20 66  rules apply as f
14010 6f 72 20 69 6e 4d 75 74 65 78 2e 0a 2a 2a 0a 2a  or inMutex..**.*
14020 2a 20 6d 75 74 65 78 4d 61 69 6e 20 20 20 20 54  * mutexMain    T
14030 68 65 20 6d 61 69 6e 20 6d 75 74 65 78 2e 20 20  he main mutex.  
14040 48 6f 6c 64 20 74 68 69 73 20 6d 75 74 65 78 20  Hold this mutex 
14050 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
14060 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 20 20 20  exclusive.**    
14070 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73 73            access
14080 20 74 6f 20 53 51 4c 69 74 65 20 64 61 74 61 20   to SQLite data 
14090 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a  structures..**.*
140a0 2a 20 6d 75 74 65 78 41 75 78 20 20 20 20 20 41  * mutexAux     A
140b0 6e 20 61 75 78 69 6c 69 61 72 79 20 6d 75 74 65  n auxiliary mute
140c0 78 20 6e 65 65 64 65 64 20 74 6f 20 61 63 63 65  x needed to acce
140d0 73 73 20 76 61 72 69 61 62 6c 65 73 20 64 65 66  ss variables def
140e0 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  ined above..**.*
140f0 2a 20 4d 75 74 65 78 65 73 20 61 72 65 20 61 6c  * Mutexes are al
14100 77 61 79 73 20 61 63 71 75 69 72 65 64 20 69 6e  ways acquired in
14110 20 74 68 69 73 20 6f 72 64 65 72 3a 20 6d 75 74   this order: mut
14120 65 78 4d 61 69 6e 20 6d 75 74 65 78 41 75 78 2e  exMain mutexAux.
14130 20 20 20 49 74 0a 2a 2a 20 69 73 20 6e 6f 74 20     It.** is not 
14140 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 63 71  necessary to acq
14150 75 69 72 65 20 6d 75 74 65 78 4d 61 69 6e 20 69  uire mutexMain i
14160 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 6d  n order to get m
14170 75 74 65 78 41 75 78 20 2d 20 6a 75 73 74 0a 2a  utexAux - just.*
14180 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
14190 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 6d   to acquire them
141a0 20 69 6e 20 74 68 65 20 72 65 76 65 72 73 65 20   in the reverse 
141b0 6f 72 64 65 72 3a 20 6d 75 74 65 78 41 75 78 20  order: mutexAux 
141c0 6d 75 74 65 78 4d 61 69 6e 2e 0a 2a 2a 20 45 69  mutexMain..** Ei
141d0 74 68 65 72 20 67 65 74 20 74 68 65 20 6d 75 74  ther get the mut
141e0 65 78 65 73 20 77 69 74 68 20 6d 75 74 65 78 4d  exes with mutexM
141f0 61 69 6e 20 66 69 72 73 74 20 6f 72 20 67 65 74  ain first or get
14200 20 6d 75 74 65 78 41 75 78 20 6f 6e 6c 79 2e 0a   mutexAux only..
14210 2a 2a 0a 2a 2a 20 57 68 65 6e 20 72 75 6e 6e 69  **.** When runni
14220 6e 67 20 6f 6e 20 61 20 70 6c 61 74 66 6f 72 6d  ng on a platform
14230 20 77 68 65 72 65 20 74 68 65 20 74 68 72 65 65   where the three
14240 20 76 61 72 69 61 62 6c 65 73 20 69 6e 4d 75 74   variables inMut
14250 65 78 2c 20 6d 75 74 65 78 4f 77 6e 65 72 2c 0a  ex, mutexOwner,.
14260 2a 2a 20 61 6e 64 20 6d 75 74 65 78 4f 77 6e 65  ** and mutexOwne
14270 72 56 61 6c 69 64 20 63 61 6e 20 62 65 20 73 65  rValid can be se
14280 74 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 74 68  t atomically, th
14290 65 20 6d 75 74 65 78 41 75 78 20 69 73 20 6e 6f  e mutexAux is no
142a0 74 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 4f  t required..** O
142b0 6e 20 6d 61 6e 79 20 73 79 73 74 65 6d 73 2c 20  n many systems, 
142c0 61 6c 6c 20 74 68 72 65 65 20 61 72 65 20 33 32  all three are 32
142d0 2d 62 69 74 20 69 6e 74 65 67 65 72 73 20 61 6e  -bit integers an
142e0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 33  d writing to a 3
142f0 32 2d 62 69 74 0a 2a 2a 20 69 6e 74 65 67 65 72  2-bit.** integer
14300 20 69 73 20 61 74 6f 6d 69 63 2e 20 20 49 20 74   is atomic.  I t
14310 68 69 6e 6b 2e 20 20 42 75 74 20 74 68 65 72 65  hink.  But there
14320 20 61 72 65 20 6e 6f 20 67 75 61 72 61 6e 74 65   are no guarante
14330 65 73 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  es.  So it seems
14340 0a 2a 2a 20 73 61 66 65 72 20 74 6f 20 70 72 6f  .** safer to pro
14350 74 65 63 74 20 74 68 65 6d 20 75 73 69 6e 67 20  tect them using 
14360 6d 75 74 65 78 41 75 78 2e 0a 2a 2f 0a 73 74 61  mutexAux..*/.sta
14370 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20  tic int inMutex 
14380 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
14390 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
143a0 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 74  static pthread_t
143b0 20 6d 75 74 65 78 4f 77 6e 65 72 3b 20 20 20 20   mutexOwner;    
143c0 20 20 20 20 20 20 2f 2a 20 54 68 72 65 61 64 20        /* Thread 
143d0 68 6f 6c 64 69 6e 67 20 6d 75 74 65 78 4d 61 69  holding mutexMai
143e0 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
143f0 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
14400 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
14410 75 65 20 69 66 20 6d 75 74 65 78 4f 77 6e 65 72  ue if mutexOwner
14420 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 73 74 61   is valid */.sta
14430 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
14440 78 5f 74 20 6d 75 74 65 78 4d 61 69 6e 20 3d 20  x_t mutexMain = 
14450 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
14460 49 54 49 41 4c 49 5a 45 52 3b 20 2f 2a 20 54 68  ITIALIZER; /* Th
14470 65 20 6d 75 74 65 78 20 2a 2f 0a 73 74 61 74 69  e mutex */.stati
14480 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  c pthread_mutex_
14490 74 20 6d 75 74 65 78 41 75 78 20 3d 20 50 54 48  t mutexAux = PTH
144a0 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
144b0 41 4c 49 5a 45 52 3b 20 20 2f 2a 20 41 75 78 20  ALIZER;  /* Aux 
144c0 6d 75 74 65 78 20 2a 2f 0a 23 65 6e 64 69 66 0a  mutex */.#endif.
144d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
144e0 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75  wing pair of rou
144f0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  tine implement m
14500 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20  utual exclusion 
14510 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72  for.** multi-thr
14520 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e  eaded processes.
14530 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
14540 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65  thread is allowe
14550 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64  d to.** executed
14560 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75   code that is su
14570 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65  rrounded by Ente
14580 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61  rMutex() and Lea
14590 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a  veMutex()..**.**
145a0 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c   SQLite uses onl
145b0 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78  y a single Mutex
145c0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20  .  There is not 
145d0 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a  much critical.**
145e0 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c   code and what l
145f0 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65  ittle there is e
14600 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20  xecutes quickly 
14610 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63  and without bloc
14620 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6f  king..**.** As o
14630 66 20 76 65 72 73 69 6f 6e 20 33 2e 33 2e 32 2c  f version 3.3.2,
14640 20 74 68 69 73 20 6d 75 74 65 78 20 6d 75 73 74   this mutex must
14650 20 62 65 20 72 65 63 75 72 73 69 76 65 2e 0a 2a   be recursive..*
14660 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
14670 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a  ixEnterMutex(){.
14680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
14690 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68  IX_THREADS.  pth
146a0 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
146b0 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 69 66  &mutexAux);.  if
146c0 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c  ( !mutexOwnerVal
146d0 69 64 20 7c 7c 20 21 70 74 68 72 65 61 64 5f 65  id || !pthread_e
146e0 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
146f0 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
14700 20 29 7b 0a 20 20 20 20 70 74 68 72 65 61 64 5f   ){.    pthread_
14710 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
14720 74 65 78 41 75 78 29 3b 0a 20 20 20 20 70 74 68  texAux);.    pth
14730 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
14740 26 6d 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 20  &mutexMain);.   
14750 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
14760 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
14770 74 28 20 21 6d 75 74 65 78 4f 77 6e 65 72 56 61  t( !mutexOwnerVa
14780 6c 69 64 20 29 3b 0a 20 20 20 20 70 74 68 72 65  lid );.    pthre
14790 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
147a0 75 74 65 78 41 75 78 29 3b 0a 20 20 20 20 6d 75  utexAux);.    mu
147b0 74 65 78 4f 77 6e 65 72 20 3d 20 70 74 68 72 65  texOwner = pthre
147c0 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 20 20 6d  ad_self();.    m
147d0 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 3d  utexOwnerValid =
147e0 20 31 3b 0a 20 20 7d 0a 20 20 69 6e 4d 75 74 65   1;.  }.  inMute
147f0 78 2b 2b 3b 0a 20 20 70 74 68 72 65 61 64 5f 6d  x++;.  pthread_m
14800 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74  utex_unlock(&mut
14810 65 78 41 75 78 29 3b 0a 23 65 6c 73 65 0a 20 20  exAux);.#else.  
14820 69 6e 4d 75 74 65 78 2b 2b 3b 0a 23 65 6e 64 69  inMutex++;.#endi
14830 66 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  f.}.void sqlite3
14840 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  UnixLeaveMutex()
14850 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
14860 74 65 78 3e 30 20 29 3b 0a 23 69 66 64 65 66 20  tex>0 );.#ifdef 
14870 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
14880 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  ADS.  pthread_mu
14890 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41  tex_lock(&mutexA
148a0 75 78 29 3b 0a 20 20 69 6e 4d 75 74 65 78 2d 2d  ux);.  inMutex--
148b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 74 68 72  ;.  assert( pthr
148c0 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78 4f  ead_equal(mutexO
148d0 77 6e 65 72 2c 20 70 74 68 72 65 61 64 5f 73 65  wner, pthread_se
148e0 6c 66 28 29 29 20 29 3b 0a 20 20 69 66 28 20 69  lf()) );.  if( i
148f0 6e 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  nMutex==0 ){.   
14900 20 61 73 73 65 72 74 28 20 6d 75 74 65 78 4f 77   assert( mutexOw
14910 6e 65 72 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  nerValid );.    
14920 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20  mutexOwnerValid 
14930 3d 20 30 3b 0a 20 20 20 20 70 74 68 72 65 61 64  = 0;.    pthread
14940 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d  _mutex_unlock(&m
14950 75 74 65 78 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  utexMain);.  }. 
14960 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
14970 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29  nlock(&mutexAux)
14980 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74 65  ;.#else.  inMute
14990 78 2d 2d 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  x--;.#endif.}../
149a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
149b0 20 69 66 20 74 68 65 20 6d 75 74 65 78 20 69 73   if the mutex is
149c0 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e   currently held.
149d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  .**.** If the th
149e0 69 73 54 68 72 64 20 70 61 72 61 6d 65 74 65 72  isThrd parameter
149f0 20 69 73 20 74 72 75 65 2c 20 72 65 74 75 72 6e   is true, return
14a00 20 74 72 75 65 20 6f 6e 6c 79 20 69 66 20 74 68   true only if th
14a10 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 72  e.** calling thr
14a20 65 61 64 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  ead holds the mu
14a30 74 65 78 2e 20 20 49 66 20 74 68 65 20 70 61 72  tex.  If the par
14a40 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 2c  ameter is false,
14a50 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   return.** true 
14a60 69 66 20 61 6e 79 20 74 68 72 65 61 64 20 68 6f  if any thread ho
14a70 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 0a 2a  lds the mutex..*
14a80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
14a90 78 49 6e 4d 75 74 65 78 28 69 6e 74 20 74 68 69  xInMutex(int thi
14aa0 73 54 68 72 64 29 7b 0a 23 69 66 64 65 66 20 53  sThrd){.#ifdef S
14ab0 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
14ac0 44 53 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  DS.  int rc;.  p
14ad0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
14ae0 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 20 20  k(&mutexAux);.  
14af0 72 63 20 3d 20 69 6e 4d 75 74 65 78 3e 30 20 26  rc = inMutex>0 &
14b00 26 20 28 74 68 69 73 54 68 72 64 3d 3d 30 20 7c  & (thisThrd==0 |
14b10 7c 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  | pthread_equal(
14b20 6d 75 74 65 78 4f 77 6e 65 72 2c 70 74 68 72 65  mutexOwner,pthre
14b30 61 64 5f 73 65 6c 66 28 29 29 29 3b 0a 20 20 70  ad_self()));.  p
14b40 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
14b50 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
14b60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6c    return rc;.#el
14b70 73 65 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75  se.  return inMu
14b80 74 65 78 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  tex>0;.#endif.}.
14b90 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
14ba0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
14bb0 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
14bc0 74 61 20 62 6c 6f 63 6b 73 20 61 6c 6c 6f 63 61  ta blocks alloca
14bd0 74 65 64 2e 0a 2a 2a 20 55 73 65 20 74 68 69 73  ted..** Use this
14be0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
14bf0 77 65 20 61 72 65 20 6e 6f 74 20 6c 65 61 6b 69  we are not leaki
14c00 6e 67 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ng thread-specif
14c10 69 63 2d 64 61 74 61 2e 0a 2a 2a 20 54 69 63 6b  ic-data..** Tick
14c20 65 74 20 23 31 36 30 31 0a 2a 2f 0a 23 69 66 64  et #1601.*/.#ifd
14c30 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
14c40 6e 74 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  nt sqlite3_tsd_c
14c50 6f 75 6e 74 20 3d 20 30 3b 0a 23 20 69 66 64 65  ount = 0;.# ifde
14c60 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
14c70 52 45 41 44 53 0a 20 20 20 20 73 74 61 74 69 63  READS.    static
14c80 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74   pthread_mutex_t
14c90 20 74 73 64 5f 63 6f 75 6e 74 65 72 5f 6d 75 74   tsd_counter_mut
14ca0 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54  ex = PTHREAD_MUT
14cb0 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a  EX_INITIALIZER;.
14cc0 23 20 20 20 64 65 66 69 6e 65 20 54 53 44 5f 43  #   define TSD_C
14cd0 4f 55 4e 54 45 52 28 4e 29 20 5c 0a 20 20 20 20  OUNTER(N) \.    
14ce0 20 20 20 20 20 20 20 20 20 70 74 68 72 65 61 64           pthread
14cf0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 74 73 64  _mutex_lock(&tsd
14d00 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
14d10 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
14d20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e  sqlite3_tsd_coun
14d30 74 20 2b 3d 20 4e 3b 20 5c 0a 20 20 20 20 20 20  t += N; \.      
14d40 20 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 6d         pthread_m
14d50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 74 73 64  utex_unlock(&tsd
14d60 5f 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 29 3b  _counter_mutex);
14d70 0a 23 20 65 6c 73 65 0a 23 20 20 20 64 65 66 69  .# else.#   defi
14d80 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e  ne TSD_COUNTER(N
14d90 29 20 20 73 71 6c 69 74 65 33 5f 74 73 64 5f 63  )  sqlite3_tsd_c
14da0 6f 75 6e 74 20 2b 3d 20 4e 0a 23 20 65 6e 64 69  ount += N.# endi
14db0 66 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  f.#else.# define
14dc0 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20   TSD_COUNTER(N) 
14dd0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e   /* no-op */.#en
14de0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61  dif../*.** If ca
14df0 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61  lled with alloca
14e00 74 65 46 6c 61 67 3e 30 2c 20 74 68 65 6e 20 72  teFlag>0, then r
14e10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14e20 74 6f 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65  to thread.** spe
14e30 63 69 66 69 63 20 64 61 74 61 20 66 6f 72 20 74  cific data for t
14e40 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14e50 64 2e 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  d.  Allocate and
14e60 20 7a 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72   zero the.** thr
14e70 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
14e80 61 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  a if it does not
14e90 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
14ea0 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  **.** If called 
14eb0 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
14ec0 67 3d 3d 30 2c 20 74 68 65 6e 20 63 68 65 63 6b  g==0, then check
14ed0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14ee0 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  ead.** specific 
14ef0 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 69 74  data.  Return it
14f00 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
14f10 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  If it does not e
14f20 78 69 73 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  xist,.** then re
14f30 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
14f40 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
14f50 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3c 30 2c 20  allocateFlag<0, 
14f60 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14f70 74 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69  the thread speci
14f80 66 69 63 0a 2a 2a 20 64 61 74 61 20 69 73 20 61  fic.** data is a
14f90 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 73 20  llocated and is 
14fa0 61 6c 6c 20 7a 65 72 6f 2e 20 20 49 66 20 69 74  all zero.  If it
14fb0 20 69 73 20 74 68 65 6e 20 64 65 61 6c 6c 6f 63   is then dealloc
14fc0 61 74 65 20 69 74 2e 0a 2a 2a 20 52 65 74 75 72  ate it..** Retur
14fd0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14fe0 68 65 20 74 68 72 65 61 64 20 73 70 65 63 69 66  he thread specif
14ff0 69 63 20 64 61 74 61 20 6f 72 20 4e 55 4c 4c 20  ic data or NULL 
15000 69 66 20 69 74 20 69 73 0a 2a 2a 20 75 6e 61 6c  if it is.** unal
15010 6c 6f 63 61 74 65 64 20 6f 72 20 67 65 74 73 20  located or gets 
15020 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  deallocated..*/.
15030 54 68 72 65 61 64 44 61 74 61 20 2a 73 71 6c 69  ThreadData *sqli
15040 74 65 33 55 6e 69 78 54 68 72 65 61 64 53 70 65  te3UnixThreadSpe
15050 63 69 66 69 63 44 61 74 61 28 69 6e 74 20 61 6c  cificData(int al
15060 6c 6f 63 61 74 65 46 6c 61 67 29 7b 0a 20 20 73  locateFlag){.  s
15070 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65  tatic const Thre
15080 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20  adData zeroData 
15090 3d 20 7b 30 7d 3b 20 20 2f 2a 20 49 6e 69 74 69  = {0};  /* Initi
150a0 61 6c 69 7a 65 72 20 74 6f 20 73 69 6c 65 6e 63  alizer to silenc
150b0 65 20 77 61 72 6e 69 6e 67 73 0a 20 20 20 20 20  e warnings.     
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 62 72        ** from br
150f0 6f 6b 65 6e 20 63 6f 6d 70 69 6c 65 72 73 20 2a  oken compilers *
15100 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15110 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73  UNIX_THREADS.  s
15120 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6b 65  tatic pthread_ke
15130 79 5f 74 20 6b 65 79 3b 0a 20 20 73 74 61 74 69  y_t key;.  stati
15140 63 20 69 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20  c int keyInit = 
15150 30 3b 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  0;.  ThreadData 
15160 2a 70 54 73 64 3b 0a 0a 20 20 69 66 28 20 21 6b  *pTsd;..  if( !k
15170 65 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  eyInit ){.    sq
15180 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
15190 78 28 29 3b 0a 20 20 20 20 69 66 28 20 21 6b 65  x();.    if( !ke
151a0 79 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 69  yInit ){.      i
151b0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  nt rc;.      rc 
151c0 3d 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 63 72  = pthread_key_cr
151d0 65 61 74 65 28 26 6b 65 79 2c 20 30 29 3b 0a 20  eate(&key, 0);. 
151e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
151f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15200 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
15210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
15220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65        }.      ke
15230 79 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  yInit = 1;.    }
15240 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65  .    sqlite3OsLe
15250 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
15260 0a 20 20 70 54 73 64 20 3d 20 70 74 68 72 65 61  .  pTsd = pthrea
15270 64 5f 67 65 74 73 70 65 63 69 66 69 63 28 6b 65  d_getspecific(ke
15280 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61  y);.  if( alloca
15290 74 65 46 6c 61 67 3e 30 20 29 7b 0a 20 20 20 20  teFlag>0 ){.    
152a0 69 66 28 20 70 54 73 64 3d 3d 30 20 29 7b 0a 20  if( pTsd==0 ){. 
152b0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
152c0 33 54 65 73 74 4d 61 6c 6c 6f 63 46 61 69 6c 28  3TestMallocFail(
152d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 73  ) ){.        pTs
152e0 64 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c  d = sqlite3OsMal
152f0 6c 6f 63 28 73 69 7a 65 6f 66 28 7a 65 72 6f 44  loc(sizeof(zeroD
15300 61 74 61 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ata));.      }.#
15310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d  ifdef SQLITE_MEM
15320 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69  DEBUG.      sqli
15330 74 65 33 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a  te3_isFail = 0;.
15340 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
15350 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
15360 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
15370 61 3b 0a 20 20 20 20 20 20 20 20 70 74 68 72 65  a;.        pthre
15380 61 64 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b  ad_setspecific(k
15390 65 79 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 20  ey, pTsd);.     
153a0 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
153b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
153c0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
153d0 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
153e0 65 46 6c 61 67 3c 30 20 0a 20 20 20 20 20 20 20  eFlag<0 .       
153f0 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
15400 54 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20  Tsd, &zeroData, 
15410 73 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74  sizeof(ThreadDat
15420 61 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  a))==0 ){.    sq
15430 6c 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64  lite3OsFree(pTsd
15440 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 73  );.    pthread_s
15450 65 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20  etspecific(key, 
15460 30 29 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e  0);.    TSD_COUN
15470 54 45 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73  TER(-1);.    pTs
15480 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
15490 75 72 6e 20 70 54 73 64 3b 0a 23 65 6c 73 65 0a  urn pTsd;.#else.
154a0 20 20 73 74 61 74 69 63 20 54 68 72 65 61 64 44    static ThreadD
154b0 61 74 61 20 2a 70 54 73 64 20 3d 20 30 3b 0a 20  ata *pTsd = 0;. 
154c0 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
154d0 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
154e0 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
154f0 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
15500 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
15510 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
15520 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 20  qlite3OsMalloc( 
15530 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29  sizeof(zeroData)
15540 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
15550 65 66 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42  ef SQLITE_MEMDEB
15560 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
15570 5f 69 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e  _isFail = 0;.#en
15580 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 54  dif.      if( pT
15590 73 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sd ){.        *p
155a0 54 73 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a  Tsd = zeroData;.
155b0 20 20 20 20 20 20 20 20 54 53 44 5f 43 4f 55 4e          TSD_COUN
155c0 54 45 52 28 2b 31 29 3b 0a 20 20 20 20 20 20 7d  TER(+1);.      }
155d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
155e0 66 28 20 70 54 73 64 21 3d 30 20 26 26 20 61 6c  f( pTsd!=0 && al
155f0 6c 6f 63 61 74 65 46 6c 61 67 3c 30 0a 20 20 20  locateFlag<0.   
15600 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63           && memc
15610 6d 70 28 70 54 73 64 2c 20 26 7a 65 72 6f 44 61  mp(pTsd, &zeroDa
15620 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61  ta, sizeof(Threa
15630 64 44 61 74 61 29 29 3d 3d 30 20 29 7b 0a 20 20  dData))==0 ){.  
15640 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28    sqlite3OsFree(
15650 70 54 73 64 29 3b 0a 20 20 20 20 54 53 44 5f 43  pTsd);.    TSD_C
15660 4f 55 4e 54 45 52 28 2d 31 29 3b 0a 20 20 20 20  OUNTER(-1);.    
15670 70 54 73 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pTsd = 0;.  }.  
15680 72 65 74 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e  return pTsd;.#en
15690 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
156a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
156b0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
156c0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
156d0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 73   becomes the res
156e0 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  ult.** returned 
156f0 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 43 75  from sqlite3OsCu
15700 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54 68  rrentTime().  Th
15710 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
15720 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
15730 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
15740 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
15750 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
15760 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
15770 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
15780 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
15790 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
157a0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
157b0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
157c0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
157d0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
157e0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
157f0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
15800 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
15810 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
15820 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
15830 73 71 6c 69 74 65 33 55 6e 69 78 43 75 72 72 65  sqlite3UnixCurre
15840 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70  ntTime(double *p
15850 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f  rNow){.#ifdef NO
15860 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74  _GETTOD.  time_t
15870 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
15880 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34    *prNow = t/864
15890 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
158a0 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
158b0 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20   timeval sNow;. 
158c0 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73   gettimeofday(&s
158d0 4e 6f 77 2c 20 30 29 3b 0a 20 20 2a 70 72 4e 6f  Now, 0);.  *prNo
158e0 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20 2b 20  w = 2440587.5 + 
158f0 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36 34 30  sNow.tv_sec/8640
15900 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  0.0 + sNow.tv_us
15910 65 63 2f 38 36 34 30 30 30 30 30 30 30 30 2e 30  ec/86400000000.0
15920 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15930 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
15940 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
15950 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
15960 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  rNow = sqlite3_c
15970 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30  urrent_time/8640
15980 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b  0.0 + 2440587.5;
15990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
159a0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69  turn 0;.}..#endi
159b0 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a  f /* OS_UNIX */.