/ Hex Artifact Content
Login

Artifact f2ccf2e9a925fc679faf7a8fe85700e0f13cf0e1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 20 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  * #define SQLITE
0230: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0240: 53 54 59 4c 45 20 30 20 2a 2f 0a 0a 2f 2a 0a 2a  STYLE 0 */../*.*
0250: 2a 20 54 68 65 73 65 20 23 64 65 66 69 6e 65 73  * These #defines
0260: 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c 65 20 3e   should enable >
0270: 32 47 42 20 66 69 6c 65 20 73 75 70 70 6f 72 74  2GB file support
0280: 20 6f 6e 20 50 6f 73 69 78 20 69 66 20 74 68 65   on Posix if the
0290: 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  .** underlying o
02a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
02b0: 73 75 70 70 6f 72 74 73 20 69 74 2e 20 20 49 66  supports it.  If
02c0: 20 74 68 65 20 4f 53 20 6c 61 63 6b 73 0a 2a 2a   the OS lacks.**
02d0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
02e0: 6f 72 74 2c 20 74 68 65 73 65 20 73 68 6f 75 6c  ort, these shoul
02f0: 64 20 62 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a  d be no-ops..**.
0300: 2a 2a 20 4c 61 72 67 65 20 66 69 6c 65 20 73 75  ** Large file su
0310: 70 70 6f 72 74 20 63 61 6e 20 62 65 20 64 69 73  pport can be dis
0320: 61 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20  abled using the 
0330: 2d 44 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  -DSQLITE_DISABLE
0340: 5f 4c 46 53 20 73 77 69 74 63 68 0a 2a 2a 20 6f  _LFS switch.** o
0350: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  n the compiler c
0360: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 20 54 68  ommand line.  Th
0370: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
0380: 69 66 20 79 6f 75 20 61 72 65 20 63 6f 6d 70 69  if you are compi
0390: 6c 69 6e 67 0a 2a 2a 20 6f 6e 20 61 20 72 65 63  ling.** on a rec
03a0: 65 6e 74 20 6d 61 63 68 69 6e 65 20 28 65 78 3a  ent machine (ex:
03b0: 20 52 65 64 48 61 74 20 37 2e 32 29 20 62 75 74   RedHat 7.2) but
03c0: 20 79 6f 75 20 77 61 6e 74 20 79 6f 75 72 20 63   you want your c
03d0: 6f 64 65 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f  ode to work.** o
03e0: 6e 20 61 6e 20 6f 6c 64 65 72 20 6d 61 63 68 69  n an older machi
03f0: 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20 36  ne (ex: RedHat 6
0400: 2e 30 29 2e 20 20 49 66 20 79 6f 75 20 63 6f 6d  .0).  If you com
0410: 70 69 6c 65 20 6f 6e 20 52 65 64 48 61 74 20 37  pile on RedHat 7
0420: 2e 32 0a 2a 2a 20 77 69 74 68 6f 75 74 20 74 68  .2.** without th
0430: 69 73 20 6f 70 74 69 6f 6e 2c 20 4c 46 53 20 69  is option, LFS i
0440: 73 20 65 6e 61 62 6c 65 2e 20 20 42 75 74 20 4c  s enable.  But L
0450: 46 53 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  FS does not exis
0460: 74 20 69 6e 20 74 68 65 20 6b 65 72 6e 65 6c 0a  t in the kernel.
0470: 2a 2a 20 69 6e 20 52 65 64 48 61 74 20 36 2e 30  ** in RedHat 6.0
0480: 2c 20 73 6f 20 74 68 65 20 63 6f 64 65 20 77 6f  , so the code wo
0490: 6e 27 74 20 77 6f 72 6b 2e 20 20 48 65 6e 63 65  n't work.  Hence
04a0: 2c 20 66 6f 72 20 6d 61 78 69 6d 75 6d 20 62 69  , for maximum bi
04b0: 6e 61 72 79 0a 2a 2a 20 70 6f 72 74 61 62 69 6c  nary.** portabil
04c0: 69 74 79 20 79 6f 75 20 73 68 6f 75 6c 64 20 6f  ity you should o
04d0: 6d 69 74 20 4c 46 53 2e 0a 2a 2f 0a 23 69 66 6e  mit LFS..*/.#ifn
04e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
04f0: 4c 45 5f 4c 46 53 0a 23 20 64 65 66 69 6e 65 20  LE_LFS.# define 
0500: 5f 4c 41 52 47 45 5f 46 49 4c 45 20 20 20 20 20  _LARGE_FILE     
0510: 20 20 31 0a 23 20 69 66 6e 64 65 66 20 5f 46 49    1.# ifndef _FI
0520: 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 0a 23  LE_OFFSET_BITS.#
0530: 20 20 20 64 65 66 69 6e 65 20 5f 46 49 4c 45 5f     define _FILE_
0540: 4f 46 46 53 45 54 5f 42 49 54 53 20 36 34 0a 23  OFFSET_BITS 64.#
0550: 20 65 6e 64 69 66 0a 23 20 64 65 66 69 6e 65 20   endif.# define 
0560: 5f 4c 41 52 47 45 46 49 4c 45 5f 53 4f 55 52 43  _LARGEFILE_SOURC
0570: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E 1.#endif../*.*
0580: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 63 6c 75  * standard inclu
0590: 64 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 6e  de files..*/.#in
05a0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
05b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
05c0: 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75  s/stat.h>.#inclu
05d0: 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 6e  de <fcntl.h>.#in
05e0: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
05f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0600: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0610: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
0620: 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 64  e <errno.h>.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0640: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0660: 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  tl.h>.#include <
0670: 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69 6e  sys/param.h>.#in
0680: 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e 74  clude <sys/mount
0690: 2e 68 3e 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .h>.#endif /* SQ
06a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
06b0: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a  ING_STYLE */../*
06c0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 74 6f  .** If we are to
06d0: 20 62 65 20 74 68 72 65 61 64 2d 73 61 66 65 2c   be thread-safe,
06e0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 74 68   include the pth
06f0: 72 65 61 64 73 20 68 65 61 64 65 72 20 61 6e 64  reads header and
0700: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53   define.** the S
0710: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
0720: 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  DS macro..*/.#if
0730: 6e 64 65 66 20 54 48 52 45 41 44 53 41 46 45 0a  ndef THREADSAFE.
0740: 23 20 64 65 66 69 6e 65 20 54 48 52 45 41 44 53  # define THREADS
0750: 41 46 45 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  AFE 1.#endif.#if
0760: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
0770: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
0780: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
0790: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
07a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
07b0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
07c0: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
07d0: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
07e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
07f0: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
0800: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
0810: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
0820: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
0830: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  0644.#endif..../
0840: 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c  *.** The unixFil
0850: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  e structure is s
0860: 75 62 63 6c 61 73 73 20 6f 66 20 4f 73 46 69 6c  ubclass of OsFil
0870: 65 20 73 70 65 63 69 66 69 63 20 66 6f 72 20 74  e specific for t
0880: 68 65 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61  he unix.** prota
0890: 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f  bility layer..*/
08a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
08b0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
08c0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
08d0: 6c 65 20 7b 0a 20 20 49 6f 4d 65 74 68 6f 64 20  le {.  IoMethod 
08e0: 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20  const *pMethod; 
08f0: 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66   /* Always the f
0900: 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  irst entry */.  
0910: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
0920: 70 4f 70 65 6e 3b 20 20 20 20 2f 2a 20 49 6e 66  pOpen;    /* Inf
0930: 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e  o about all open
0940: 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e   fd's on this in
0950: 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
0960: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
0970: 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74     /* Info about
0980: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69   locks on this i
0990: 6e 6f 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  node */.#ifdef S
09a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
09b0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 76 6f 69  KING_STYLE.  voi
09c0: 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  d *lockingContex
09d0: 74 3b 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e  t;     /* Lockin
09e0: 67 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63  g style specific
09f0: 20 73 74 61 74 65 20 2a 2f 0a 23 65 6e 64 69 66   state */.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
0a10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0a20: 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0a40: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
0a50: 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  iptor */.  unsig
0a60: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
0a70: 65 3b 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65  e;   /* The type
0a80: 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   of lock held on
0a90: 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e   this fd */.  un
0aa0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 73 4f 70  signed char isOp
0ab0: 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  en;     /* True 
0ac0: 69 66 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  if needs to be c
0ad0: 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  losed */.  unsig
0ae0: 6e 65 64 20 63 68 61 72 20 66 75 6c 6c 53 79 6e  ned char fullSyn
0af0: 63 3b 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55  c;   /* Use F_FU
0b00: 4c 4c 53 59 4e 43 20 69 66 20 61 76 61 69 6c 61  LLSYNC if availa
0b10: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72  ble */.  int dir
0b20: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
0b30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
0b40: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69  iptor for the di
0b50: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 69 36 34  rectory */.  i64
0b60: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
0b70: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 6b 20 6f         /* Seek o
0b80: 66 66 73 65 74 20 2a 2f 0a 23 69 66 64 65 66 20  ffset */.#ifdef 
0b90: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0ba0: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 74 20  ADS.  pthread_t 
0bb0: 74 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  tid;            
0bc0: 2f 2a 20 54 68 65 20 74 68 72 65 61 64 20 74 68  /* The thread th
0bd0: 61 74 20 22 6f 77 6e 73 22 20 74 68 69 73 20 4f  at "owns" this O
0be0: 73 46 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  sFile */.#endif.
0bf0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  };../*.** Provid
0c00: 65 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f  e the ability to
0c10: 20 6f 76 65 72 72 69 64 65 20 73 6f 6d 65 20 4f   override some O
0c20: 53 2d 6c 61 79 65 72 20 66 75 6e 63 74 69 6f 6e  S-layer function
0c30: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74  s during.** test
0c40: 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 75 73  ing.  This is us
0c50: 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 4f  ed to simulate O
0c60: 53 20 63 72 61 73 68 65 73 20 74 6f 20 76 65 72  S crashes to ver
0c70: 69 66 79 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6d  ify that .** com
0c80: 6d 69 74 73 20 61 72 65 20 61 74 6f 6d 69 63 20  mits are atomic 
0c90: 65 76 65 6e 20 69 6e 20 74 68 65 20 65 76 65 6e  even in the even
0ca0: 74 20 6f 66 20 61 6e 20 4f 53 20 63 72 61 73 68  t of an OS crash
0cb0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0cc0: 54 45 5f 43 52 41 53 48 5f 54 45 53 54 0a 20 20  TE_CRASH_TEST.  
0cd0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0ce0: 65 33 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c  e3CrashTestEnabl
0cf0: 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
0d00: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0d10: 52 65 61 64 57 72 69 74 65 28 63 6f 6e 73 74 20  ReadWrite(const 
0d20: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0d30: 20 69 6e 74 2a 29 3b 0a 20 20 65 78 74 65 72 6e   int*);.  extern
0d40: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73   int sqlite3Cras
0d50: 68 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  hOpenExclusive(c
0d60: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69  onst char*, OsFi
0d70: 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 20 20 65 78  le**, int);.  ex
0d80: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
0d90: 43 72 61 73 68 4f 70 65 6e 52 65 61 64 4f 6e 6c  CrashOpenReadOnl
0da0: 79 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 4f  y(const char*, O
0db0: 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 29 3b 0a 23  sFile**, int);.#
0dc0: 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54 45   define CRASH_TE
0dd0: 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41 2c  ST_OVERRIDE(X,A,
0de0: 42 2c 43 29 20 5c 0a 20 20 20 20 69 66 28 73 71  B,C) \.    if(sq
0df0: 6c 69 74 65 33 43 72 61 73 68 54 65 73 74 45 6e  lite3CrashTestEn
0e00: 61 62 6c 65 29 7b 20 72 65 74 75 72 6e 20 58 28  able){ return X(
0e10: 41 2c 42 2c 43 29 3b 20 7d 0a 23 65 6c 73 65 0a  A,B,C); }.#else.
0e20: 23 20 64 65 66 69 6e 65 20 43 52 41 53 48 5f 54  # define CRASH_T
0e30: 45 53 54 5f 4f 56 45 52 52 49 44 45 28 58 2c 41  EST_OVERRIDE(X,A
0e40: 2c 42 2c 43 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ,B,C)  /* no-op 
0e50: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  */.#endif.../*.*
0e60: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0e70: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0e80: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0e90: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0ea0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0eb0: 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ** Do not includ
0ec0: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c  e any of the Fil
0ed0: 65 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20  e I/O interface 
0ee0: 70 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68  procedures if th
0ef0: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  e.** SQLITE_OMIT
0f00: 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73  _DISKIO macro is
0f10: 20 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61   defined (indica
0f20: 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 64 61  ting that the da
0f30: 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62  tabase.** will b
0f40: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  e in-memory only
0f50: 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ).*/.#ifndef SQL
0f60: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0f70: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76  ../*.** Define v
0f80: 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68  arious macros th
0f90: 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66  at are missing f
0fa0: 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73  rom some systems
0fb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c  ..*/.#ifndef O_L
0fc0: 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e  ARGEFILE.# defin
0fd0: 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a  e O_LARGEFILE 0.
0fe0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .# undef O_LARGE
1010: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
1020: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
1030: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46  if.#ifndef O_NOF
1040: 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f  OLLOW.# define O
1050: 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64  _NOFOLLOW 0.#end
1060: 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e  if.#ifndef O_BIN
1070: 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42  ARY.# define O_B
1080: 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a  INARY 0.#endif..
1090: 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20  /*.** The DJGPP 
10a0: 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e  compiler environ
10b0: 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c  ment looks mostl
10c0: 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74  y like Unix, but
10d0: 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65   it.** lacks the
10e0: 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20   fcntl() system 
10f0: 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69  call.  So redefi
1100: 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65  ne fcntl() to be
1110: 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68   something.** th
1120: 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  at always succee
1130: 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ds.  This means 
1140: 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65  that locking doe
1150: 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65  s not occur unde
1160: 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74  r.** DJGPP.  But
1170: 20 69 74 27 73 20 44 4f 53 20 2d 20 77 68 61 74   it's DOS - what
1180: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
1190: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
11a0: 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63  PP__.# define fc
11b0: 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e  ntl(A,B,C) 0.#en
11c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  dif../*.** The t
11d0: 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65  hreadid macro re
11e0: 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68  solves to the th
11f0: 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e  read-id or to 0.
1200: 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65    Used for.** te
1210: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
1220: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
1230: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
1240: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
1250: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
1260: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
1270: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
1280: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1290: 65 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20  et or check the 
12a0: 4f 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64  OsFile.tid field
12b0: 2e 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73  .  This field is
12c0: 20 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46   set when an OsF
12d0: 69 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20  ile.** is first 
12e0: 6f 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62  opened.  All sub
12f0: 73 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20  sequent uses of 
1300: 74 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66  the OsFile verif
1310: 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61  y that the.** sa
1320: 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65  me thread is ope
1330: 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73  rating on the Os
1340: 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72  File.  Some oper
1350: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f  ating systems do
1360: 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f  .** not allow lo
1370: 63 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69  cks to be overri
1380: 64 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68  dden by other th
1390: 72 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72  reads and that r
13a0: 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65  estriction.** me
13b0: 61 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33  ans that sqlite3
13c0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
13d0: 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76  es cannot be mov
13e0: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
13f0: 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72  ad.** to another
1400: 2e 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61  .  This logic ma
1410: 6b 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20  kes sure a user 
1420: 64 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20  does not try to 
1430: 64 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69  do that.** by mi
1440: 73 74 61 6b 65 2e 0a 2a 2a 0a 2a 2a 20 56 65 72  stake..**.** Ver
1450: 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32 30 30 36  sion 3.3.1 (2006
1460: 2d 30 31 2d 31 35 29 3a 20 20 4f 73 46 69 6c 65  -01-15):  OsFile
1470: 73 20 63 61 6e 20 62 65 20 6d 6f 76 65 64 20 66  s can be moved f
1480: 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 20 74  rom one thread t
1490: 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 61 73 20  o.** another as 
14a0: 6c 6f 6e 67 20 61 73 20 77 65 20 61 72 65 20 72  long as we are r
14b0: 75 6e 6e 69 6e 67 20 6f 6e 20 61 20 73 79 73 74  unning on a syst
14c0: 65 6d 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  em that supports
14d0: 20 74 68 72 65 61 64 73 0a 2a 2a 20 6f 76 65 72   threads.** over
14e0: 72 69 64 69 6e 67 20 65 61 63 68 20 6f 74 68 65  riding each othe
14f0: 72 73 20 6c 6f 63 6b 73 20 28 77 68 69 63 68 20  rs locks (which 
1500: 6e 6f 77 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  now the most com
1510: 6d 6f 6e 20 62 65 68 61 76 69 6f 72 29 0a 2a 2a  mon behavior).**
1520: 20 6f 72 20 69 66 20 6e 6f 20 6c 6f 63 6b 73 20   or if no locks 
1530: 61 72 65 20 68 65 6c 64 2e 20 20 42 75 74 20 74  are held.  But t
1540: 68 65 20 4f 73 46 69 6c 65 2e 70 4c 6f 63 6b 20  he OsFile.pLock 
1550: 66 69 65 6c 64 20 6e 65 65 64 73 20 74 6f 20 62  field needs to b
1560: 65 0a 2a 2a 20 72 65 63 6f 6d 70 75 74 65 64 20  e.** recomputed 
1570: 62 65 63 61 75 73 65 20 69 74 73 20 6b 65 79 20  because its key 
1580: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 74 68 72  includes the thr
1590: 65 61 64 2d 69 64 2e 20 20 53 65 65 20 74 68 65  ead-id.  See the
15a0: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 4f 77 6e   .** transferOwn
15b0: 65 72 73 68 69 70 28 29 20 66 75 6e 63 74 69 6f  ership() functio
15c0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  n below for addi
15d0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
15e0: 6f 6e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  on.*/.#if define
15f0: 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  d(SQLITE_UNIX_TH
1600: 52 45 41 44 53 29 0a 23 20 64 65 66 69 6e 65 20  READS).# define 
1610: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20  SET_THREADID(X) 
1620: 20 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68    (X)->tid = pth
1630: 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65  read_self().# de
1640: 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41  fine CHECK_THREA
1650: 44 49 44 28 58 29 20 28 74 68 72 65 61 64 73 4f  DID(X) (threadsO
1660: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
1670: 73 4c 6f 63 6b 73 3d 3d 30 20 26 26 20 5c 0a 20  sLocks==0 && \. 
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 21 70 74 68 72             !pthr
16a0: 65 61 64 5f 65 71 75 61 6c 28 28 58 29 2d 3e 74  ead_equal((X)->t
16b0: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
16c0: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
16d0: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
16e0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
16f0: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
1700: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
1710: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
1720: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
1730: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
1740: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
1750: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
1760: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
1770: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
1780: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
1790: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
17a0: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
17b0: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
17c0: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
17d0: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
17e0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
17f0: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
1800: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
1810: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
1820: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
1830: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
1840: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
1850: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
1860: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
1870: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
1880: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
1890: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
18a0: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
18b0: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
18c0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
18d0: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
18e0: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
18f0: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
1900: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
1910: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
1920: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
1930: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
1940: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
1950: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
1960: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
1970: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
1980: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
1990: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
19a0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
19b0: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
19c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
19d0: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
19e0: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
19f0: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
1a00: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
1a10: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
1a20: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
1a30: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
1a40: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
1a50: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
1a60: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
1a70: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
1a80: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
1a90: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
1aa0: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
1ab0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
1ac0: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
1ad0: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
1ae0: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
1af0: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
1b00: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
1b10: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
1b20: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
1b30: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
1b40: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
1b50: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
1b60: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
1b70: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
1b80: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
1b90: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
1ba0: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
1bb0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
1bc0: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
1bd0: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
1be0: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
1bf0: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
1c00: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
1c10: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
1c20: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
1c30: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
1c40: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
1c50: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
1c60: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
1c70: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
1c80: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
1c90: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
1ca0: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
1cb0: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
1cc0: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
1cd0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
1ce0: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
1cf0: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
1d00: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
1d10: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
1d20: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
1d30: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
1d40: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
1d50: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
1d60: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
1d70: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
1d80: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
1d90: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1da0: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1db0: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1dc0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1dd0: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1de0: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1df0: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1e00: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1e10: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1e20: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1e30: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
1e40: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
1e50: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1e60: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
1e70: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
1e80: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
1e90: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1ea0: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1eb0: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1ec0: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1ed0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1ee0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1ef0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1f00: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1f10: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1f20: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1f30: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
1f40: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
1f50: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
1f60: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
1f70: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
1f80: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
1f90: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1fa0: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1fb0: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1fc0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1fd0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1fe0: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1ff0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2000: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
2010: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
2020: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
2030: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
2040: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
2050: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
2060: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
2070: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
2080: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
2090: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
20a0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
20b0: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
20c0: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
20d0: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
20e0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
20f0: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
2100: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
2110: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
2120: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
2130: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
2140: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
2150: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
2160: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
2170: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
2180: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
2190: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
21a0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
21b0: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
21c0: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
21d0: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
21e0: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
21f0: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
2200: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
2210: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
2220: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
2230: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
2240: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
2250: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
2260: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
2270: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
2280: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
2290: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
22a0: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
22b0: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
22c0: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
22d0: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
22e0: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
22f0: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
2300: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
2310: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
2320: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
2330: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
2340: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
2350: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
2370: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
2380: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
2390: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
23a0: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
23b0: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
23c0: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
23d0: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
23e0: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
23f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
2400: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2410: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
2420: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
2430: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
2440: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
2450: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
2460: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
2470: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
2480: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
2490: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
24a0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
24b0: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
24c0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
24d0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
24e0: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
24f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2500: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
2510: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
2520: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
2530: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
2540: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
2550: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
2560: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
2570: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
2580: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
2590: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
25a0: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
25b0: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
25c0: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
25d0: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
25e0: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
25f0: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
2600: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
2610: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
2620: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
2630: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
2640: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
2650: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
2660: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
2670: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
2680: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
2690: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
26a0: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
26b0: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
26c0: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
26d0: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
26e0: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
26f0: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
2700: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
2710: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
2720: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
2730: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
2740: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
2750: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
2760: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
2770: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
2780: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
2790: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
27a0: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
27b0: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
27c0: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
27d0: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
27e0: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
27f0: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
2800: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
2810: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
2820: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
2830: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
2840: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
2850: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
2860: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
2870: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
2880: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
2890: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
28a0: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
28b0: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
28c0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
28d0: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
28e0: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
28f0: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
2900: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
2910: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
2920: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
2930: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
2940: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
2950: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
2960: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
2970: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
2980: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
2990: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
29a0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
29b0: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
29c0: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
29d0: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
29e0: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
29f0: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
2a00: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
2a10: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
2a20: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
2a30: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
2a40: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
2a50: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
2a60: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
2a70: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
2a80: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
2a90: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
2aa0: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
2ab0: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
2ac0: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
2ad0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
2ae0: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
2af0: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
2b00: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
2b10: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
2b20: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
2b30: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
2b40: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
2b50: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
2b60: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
2b70: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
2b80: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
2b90: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
2ba0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
2bb0: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
2bc0: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
2bd0: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
2be0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
2bf0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
2c00: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
2c10: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
2c20: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
2c30: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
2c40: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
2c50: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
2c60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2c70: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2c80: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
2c90: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
2ca0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
2cb0: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
2cc0: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
2cd0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
2ce0: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
2cf0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2d00: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
2d10: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
2d20: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
2d30: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
2d40: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
2d50: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
2d60: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
2d70: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
2d80: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
2d90: 20 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 0a   tid is omitted.
2da0: 2a 2a 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65  ** if we compile
2db0: 20 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69   without threadi
2dc0: 6e 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73  ng support..*/.s
2dd0: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a  truct lockKey {.
2de0: 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20    dev_t dev;    
2df0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2e00: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2e10: 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f  no;       /* Ino
2e20: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66  de number */.#if
2e30: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
2e40: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
2e50: 64 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68  d_t tid;   /* Th
2e60: 72 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20  read ID or zero 
2e70: 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f  if threads can o
2e80: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
2e90: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
2ea0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2eb0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2ec0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
2ed0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
2ee0: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
2ef0: 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64  e on each thread
2f00: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
2f10: 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28  t process ID.  (
2f20: 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20  Threads have.** 
2f30: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2f40: 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20  s IDs on linux, 
2f50: 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20  but not on most 
2f60: 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a  other unixes.).*
2f70: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
2f80: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
2f90: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
2fa0: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
2fb0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
2fc0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
2fd0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
2fe0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
2ff0: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
3000: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
3010: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
3020: 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70  ber of OsFiles p
3030: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
3040: 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  /.struct lockInf
3050: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  o {.  struct loc
3060: 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  kKey key;  /* Th
3070: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
3080: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
3090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30a0: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
30b0: 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6c   held */.  int l
30c0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 20  ocktype;        
30d0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
30e0: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
30f0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 69  LOCK etc. */.  i
3100: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3120: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
3130: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d  s structure */.}
3140: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
3150: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
3160: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3170: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
3180: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
3190: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
31a0: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
31b0: 72 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f  re given its ino
31c0: 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  de.  This.** is 
31d0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
31e0: 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74  lockKey except t
31f0: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 49  hat the thread I
3200: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
3210: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
3220: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
3230: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
3240: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
3250: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
3260: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
3270: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
3280: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3290: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
32a0: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
32b0: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
32c0: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
32d0: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
32e0: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
32f0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
3300: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
3310: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
3320: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
3330: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
3340: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
3350: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
3360: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
3370: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
3380: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
3390: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
33a0: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
33b0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
33c0: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
33d0: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
33e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
33f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3410: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
3420: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
3430: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
3440: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
3450: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
3460: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
3470: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
3480: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
3490: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
34a0: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
34b0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
34c0: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
34d0: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
34e0: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
34f0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
3500: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
3510: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ese hash tables 
3520: 6d 61 70 20 69 6e 6f 64 65 73 20 61 6e 64 20 66  map inodes and f
3530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3540: 28 72 65 61 6c 6c 79 2c 20 6c 6f 63 6b 4b 65 79  (really, lockKey
3550: 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 4b 65 79 20   and.** openKey 
3560: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
3570: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
3580: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
3590: 2e 20 20 41 63 63 65 73 73 20 74 6f 20 0a 2a 2a  .  Access to .**
35a0: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
35b0: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
35c0: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
35d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
35e0: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 53 51 4c 49  lockHash = {SQLI
35f0: 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20  TE_HASH_BINARY, 
3600: 30 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 73 71  0, 0, 0, .    sq
3610: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
3620: 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54 68  alloc, sqlite3Th
3630: 72 65 61 64 53 61 66 65 46 72 65 65 2c 20 30 2c  readSafeFree, 0,
3640: 20 30 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68   0};.static Hash
3650: 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b 53 51 4c   openHash = {SQL
3660: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
3670: 20 30 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 73   0, 0, 0, .    s
3680: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
3690: 4d 61 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 54  Malloc, sqlite3T
36a0: 68 72 65 61 64 53 61 66 65 46 72 65 65 2c 20 30  hreadSafeFree, 0
36b0: 2c 20 30 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  , 0};..#ifdef SQ
36c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
36d0: 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
36e0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  The locking styl
36f0: 65 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65  es are associate
3700: 64 20 77 69 74 68 20 74 68 65 20 64 69 66 66 65  d with the diffe
3710: 72 65 6e 74 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  rent file lockin
3720: 67 0a 2a 2a 20 63 61 70 61 62 69 6c 69 74 69 65  g.** capabilitie
3730: 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 64  s supported by d
3740: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 73 79  ifferent file sy
3750: 73 74 65 6d 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 50  stems.  .**.** P
3760: 4f 53 49 58 20 6c 6f 63 6b 69 6e 67 20 73 74 79  OSIX locking sty
3770: 6c 65 20 66 75 6c 6c 79 20 73 75 70 70 6f 72 74  le fully support
3780: 73 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  s shared and exc
3790: 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
37a0: 65 20 6c 6f 63 6b 73 20 0a 2a 2a 20 41 44 50 20  e locks .** ADP 
37b0: 6c 6f 63 6b 69 6e 67 20 6f 6e 6c 79 20 73 75 70  locking only sup
37c0: 70 6f 72 74 73 20 65 78 63 6c 75 73 69 76 65 20  ports exclusive 
37d0: 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
37e0: 0a 2a 2a 20 46 4c 4f 43 4b 20 6f 6e 6c 79 20 73  .** FLOCK only s
37f0: 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65  upports a single
3800: 20 66 69 6c 65 2d 67 6c 6f 62 61 6c 20 65 78 63   file-global exc
3810: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 44  lusive lock.** D
3820: 4f 54 4c 4f 43 4b 20 69 73 6e 27 74 20 61 20 74  OTLOCK isn't a t
3830: 72 75 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  rue locking styl
3840: 65 2c 20 69 74 20 72 65 66 65 72 73 20 74 6f 20  e, it refers to 
3850: 74 68 65 20 75 73 65 20 6f 66 20 61 20 73 70 65  the use of a spe
3860: 63 69 61 6c 0a 2a 2a 20 20 20 66 69 6c 65 20 6e  cial.**   file n
3870: 61 6d 65 64 20 74 68 65 20 73 61 6d 65 20 61 73  amed the same as
3880: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3890: 6c 65 20 77 69 74 68 20 61 20 27 2e 6c 6f 63 6b  le with a '.lock
38a0: 27 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69  ' extension, thi
38b0: 73 0a 2a 2a 20 20 20 63 61 6e 20 62 65 20 75 73  s.**   can be us
38c0: 65 64 20 6f 6e 20 66 69 6c 65 20 73 79 73 74 65  ed on file syste
38d0: 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 6f  ms that do not o
38e0: 66 66 65 72 20 61 6e 79 20 72 65 6c 69 61 62 6c  ffer any reliabl
38f0: 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
3900: 2a 20 4e 4f 20 6c 6f 63 6b 69 6e 67 20 6d 65 61  * NO locking mea
3910: 6e 73 20 74 68 61 74 20 6e 6f 20 6c 6f 63 6b 69  ns that no locki
3920: 6e 67 20 77 69 6c 6c 20 62 65 20 61 74 74 65 6d  ng will be attem
3930: 70 74 65 64 2c 20 74 68 69 73 20 69 73 20 6f 6e  pted, this is on
3940: 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ly used for.**  
3950: 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
3960: 73 79 73 74 65 6d 73 20 63 75 72 72 65 6e 74 6c  systems currentl
3970: 79 0a 2a 2a 20 55 4e 53 55 50 50 4f 52 54 45 44  y.** UNSUPPORTED
3980: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 6c   means that no l
3990: 6f 63 6b 69 6e 67 20 77 69 6c 6c 20 62 65 20 61  ocking will be a
39a0: 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 69  ttempted, this i
39b0: 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
39c0: 2a 2a 20 20 20 66 69 6c 65 20 73 79 73 74 65 6d  **   file system
39d0: 73 20 74 68 61 74 20 61 72 65 20 6b 6e 6f 77 6e  s that are known
39e0: 20 74 6f 20 62 65 20 75 6e 73 75 70 70 6f 72 74   to be unsupport
39f0: 65 64 0a 2a 2f 0a 74 79 70 65 64 65 66 20 65 6e  ed.*/.typedef en
3a00: 75 6d 20 7b 0a 09 70 6f 73 69 78 4c 6f 63 6b 69  um {..posixLocki
3a10: 6e 67 53 74 79 6c 65 20 3d 20 30 2c 20 20 20 20  ngStyle = 0,    
3a20: 20 20 20 2f 2a 20 73 74 61 6e 64 61 72 64 20 70     /* standard p
3a30: 6f 73 69 78 2d 61 64 76 69 73 6f 72 79 20 6c 6f  osix-advisory lo
3a40: 63 6b 73 20 2a 2f 0a 09 61 66 70 4c 6f 63 6b 69  cks */..afpLocki
3a50: 6e 67 53 74 79 6c 65 2c 20 20 20 20 20 20 20 20  ngStyle,        
3a60: 20 20 20 20 20 2f 2a 20 75 73 65 20 61 66 70 20       /* use afp 
3a70: 6c 6f 63 6b 73 20 2a 2f 0a 09 66 6c 6f 63 6b 4c  locks */..flockL
3a80: 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20 20 20  ockingStyle,    
3a90: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 66 6c         /* use fl
3aa0: 6f 63 6b 28 29 20 2a 2f 0a 09 64 6f 74 6c 6f 63  ock() */..dotloc
3ab0: 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 2c 20 20  kLockingStyle,  
3ac0: 20 20 20 20 20 20 20 2f 2a 20 75 73 65 20 3c 66         /* use <f
3ad0: 69 6c 65 3e 2e 6c 6f 63 6b 20 66 69 6c 65 73 20  ile>.lock files 
3ae0: 2a 2f 0a 09 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79  */..noLockingSty
3af0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
3b00: 20 2f 2a 20 75 73 65 66 75 6c 20 66 6f 72 20 72   /* useful for r
3b10: 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 73 79  ead-only file sy
3b20: 73 74 65 6d 20 2a 2f 0a 09 75 6e 73 75 70 70 6f  stem */..unsuppo
3b30: 72 74 65 64 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  rtedLockingStyle
3b40: 20 20 20 20 20 20 2f 2a 20 69 6e 64 69 63 61 74        /* indicat
3b50: 65 73 20 75 6e 73 75 70 70 6f 72 74 65 64 20 66  es unsupported f
3b60: 69 6c 65 20 73 79 73 74 65 6d 20 2a 2f 0a 7d 20  ile system */.} 
3b70: 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53 74  sqlite3LockingSt
3b80: 79 6c 65 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  yle;.#endif /* S
3b90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3ba0: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
3bb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
3bc0: 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a 2a 2a 20  X_THREADS./*.** 
3bd0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 72 65  This variable re
3be0: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 6f 72  cords whether or
3bf0: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
3c00: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3c10: 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b 73 2e 0a  thers.** locks..
3c20: 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 4e 6f 2e  **.**    0:  No.
3c30: 20 20 54 68 72 65 61 64 73 20 63 61 6e 6e 6f 74    Threads cannot
3c40: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3c50: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
3c60: 20 20 20 31 3a 20 20 59 65 73 2e 20 20 54 68 72     1:  Yes.  Thr
3c70: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
3c80: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
3c90: 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a 20 20 57  cks..**   -1:  W
3ca0: 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 79 65 74  e don't know yet
3cb0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20  ..**.** On some 
3cc0: 73 79 73 74 65 6d 73 2c 20 77 65 20 6b 6e 6f 77  systems, we know
3cd0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
3ce0: 20 69 66 20 74 68 72 65 61 64 73 20 63 61 6e 20   if threads can 
3cf0: 6f 76 65 72 72 69 64 65 20 65 61 63 68 0a 2a 2a  override each.**
3d00: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20   others locks.  
3d10: 4f 6e 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73  On those systems
3d20: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  , the SQLITE_THR
3d30: 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43  EAD_OVERRIDE_LOC
3d40: 4b 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6c 6c 20  K macro.** will 
3d50: 62 65 20 73 65 74 20 61 70 70 72 6f 70 72 69 61  be set appropria
3d60: 74 65 6c 79 2e 20 20 4f 6e 20 6f 74 68 65 72 20  tely.  On other 
3d70: 73 79 73 74 65 6d 73 2c 20 77 65 20 68 61 76 65  systems, we have
3d80: 20 74 6f 20 63 68 65 63 6b 20 61 74 0a 2a 2a 20   to check at.** 
3d90: 72 75 6e 74 69 6d 65 2e 20 20 4f 6e 20 74 68 65  runtime.  On the
3da0: 73 65 20 6c 61 74 74 65 72 20 73 79 73 74 65 6d  se latter system
3db0: 73 2c 20 53 51 4c 54 49 45 5f 54 48 52 45 41 44  s, SQLTIE_THREAD
3dc0: 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b 20 69  _OVERRIDE_LOCK i
3dd0: 73 0a 2a 2a 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s.** undefined..
3de0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  **.** This varia
3df0: 62 6c 65 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 73  ble normally has
3e00: 20 66 69 6c 65 20 73 63 6f 70 65 20 6f 6e 6c 79   file scope only
3e10: 2e 20 20 42 75 74 20 64 75 72 69 6e 67 20 74 65  .  But during te
3e20: 73 74 69 6e 67 2c 20 77 65 20 6d 61 6b 65 0a 2a  sting, we make.*
3e30: 2a 20 69 74 20 61 20 67 6c 6f 62 61 6c 20 73 6f  * it a global so
3e40: 20 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63   that the test c
3e50: 6f 64 65 20 63 61 6e 20 63 68 61 6e 67 65 20 69  ode can change i
3e60: 74 73 20 76 61 6c 75 65 20 69 6e 20 6f 72 64 65  ts value in orde
3e70: 72 20 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74  r to verify.** t
3e80: 68 61 74 20 74 68 65 20 72 69 67 68 74 20 73 74  hat the right st
3e90: 75 66 66 20 68 61 70 70 65 6e 73 20 69 6e 20 65  uff happens in e
3ea0: 69 74 68 65 72 20 63 61 73 65 2e 0a 2a 2f 0a 23  ither case..*/.#
3eb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 48  ifndef SQLITE_TH
3ec0: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
3ed0: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
3ee0: 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49  TE_THREAD_OVERRI
3ef0: 44 45 5f 4c 4f 43 4b 20 2d 31 0a 23 65 6e 64 69  DE_LOCK -1.#endi
3f00: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
3f10: 54 45 53 54 0a 69 6e 74 20 74 68 72 65 61 64 73  TEST.int threads
3f20: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
3f30: 72 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45  rsLocks = SQLITE
3f40: 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45  _THREAD_OVERRIDE
3f50: 5f 4c 4f 43 4b 3b 0a 23 65 6c 73 65 0a 73 74 61  _LOCK;.#else.sta
3f60: 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f  tic int threadsO
3f70: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
3f80: 73 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f  sLocks = SQLITE_
3f90: 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f  THREAD_OVERRIDE_
3fa0: 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK;.#endif../*
3fb0: 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75  .** This structu
3fc0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
3fd0: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f  tion passed into
3fe0: 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74   individual test
3ff0: 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20 74  .** threads by t
4000: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
4010: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
4020: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63  outine..*/.struc
4030: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
4040: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4060: 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
4070: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   */.  struct flo
4080: 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20  ck lock;     /* 
4090: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  The locking oper
40a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
40b0: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
40c0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74    /* Result of t
40d0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  he locking opera
40e0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64  tion */.};..#ifd
40f0: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
4100: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
4110: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
4120: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
4130: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
4140: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4150: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
4160: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
4170: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
4180: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
4190: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
41a0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
41b0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
41c0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
41d0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
41e0: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
41f0: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
4200: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
4210: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
4220: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
4230: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
4240: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
4250: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
4260: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
4270: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
4280: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
4290: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
42a0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
42b0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
42c0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
42d0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
42e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
42f0: 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  fcntl(fd, op, p)
4300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
4310: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
4320: 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64  unknown %d %d %d
4330: 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b  \n", fd, op, s);
4340: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20  .    return s;. 
4350: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79   }.  if( p->l_ty
4360: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
4370: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
4380: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
4390: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
43a0: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
43b0: 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "WRLCK";.  }el
43c0: 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  se if( p->l_type
43d0: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
43e0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
43f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4400: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a  ssert( 0 );.  }.
4410: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77    assert( p->l_w
4420: 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20  hence==SEEK_SET 
4430: 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66  );.  s = fcntl(f
4440: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
4450: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
4460: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4470: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
4480: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
4490: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
44a0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
44b0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
44c0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
44d0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
44e0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
44f0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
4500: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
4510: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
4520: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
4530: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
4540: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
4550: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
4560: 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28 66 64  *p;.    fcntl(fd
4570: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b  , F_GETLK, &l2);
4580: 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79  .    if( l2.l_ty
4590: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
45a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44       zType = "RD
45b0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
45c0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
45d0: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _WRLCK ){.      
45e0: 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b  zType = "WRLCK";
45f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
4600: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  2.l_type==F_UNLC
4610: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
4620: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20   = "UNLCK";.    
4630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
4640: 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a  ert( 0 );.    }.
4650: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4660: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61  Printf("fcntl-fa
4670: 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73  ilure-reason: %s
4680: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
4690: 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74       zType, (int
46a0: 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )l2.l_start, (in
46b0: 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74  t)l2.l_len, (int
46c0: 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a  )l2.l_pid);.  }.
46d0: 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45    errno = savedE
46e0: 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73  rrno;.  return s
46f0: 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63 6e 74  ;.}.#define fcnt
4700: 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64  l lockTrace.#end
4710: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  if /* SQLITE_LOC
4720: 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  K_TRACE */../*.*
4730: 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61 64  * The testThread
4740: 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28  LockingBehavior(
4750: 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68  ) routine launch
4760: 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 0a  es two separate.
4770: 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74 68  ** threads on th
4780: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69  is routine.  Thi
4790: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
47a0: 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c  ts to lock a fil
47b0: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
47c0: 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20 54  then returns.  T
47d0: 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66 61  he success or fa
47e0: 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61 74  ilure of that at
47f0: 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20  tempt.** allows 
4800: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
4810: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
4820: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65 74  procedure to det
4830: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
4840: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73  r or not threads
4850: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4860: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
4870: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4880: 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65  *threadLockingTe
4890: 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  st(void *pArg){.
48a0: 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54    struct threadT
48b0: 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d  estData *pData =
48c0: 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64 54   (struct threadT
48d0: 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a 20  estData*)pArg;. 
48e0: 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d   pData->result =
48f0: 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64   fcntl(pData->fd
4900: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74  , F_SETLK, &pDat
4910: 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75  a->lock);.  retu
4920: 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pArg;.}../*.*
4930: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
4940: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
4950: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
4960: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a  r not threads.**
4970: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
4980: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
4990: 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a 2a  then sets the .*
49a0: 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  * threadsOverrid
49b0: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
49c0: 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f 70   variable approp
49d0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
49e0: 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72 65  ic void testThre
49f0: 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f  adLockingBehavio
4a00: 72 28 69 6e 74 20 66 64 5f 6f 72 69 67 29 7b 0a  r(int fd_orig){.
4a10: 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74 72 75    int fd;.  stru
4a20: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
4a30: 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61  a d[2];.  pthrea
4a40: 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20  d_t t[2];..  fd 
4a50: 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a  = dup(fd_orig);.
4a60: 20 20 69 66 28 20 66 64 3c 30 20 29 20 72 65 74    if( fd<0 ) ret
4a70: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c  urn;.  memset(d,
4a80: 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a   0, sizeof(d));.
4a90: 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a    d[0].fd = fd;.
4aa0: 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79    d[0].lock.l_ty
4ab0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
4ac0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  d[0].lock.l_len 
4ad0: 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b  = 1;.  d[0].lock
4ae0: 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
4af0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  d[0].lock.l_when
4b00: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
4b10: 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20   d[1] = d[0];.  
4b20: 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65  d[1].lock.l_type
4b30: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74   = F_WRLCK;.  pt
4b40: 68 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b  hread_create(&t[
4b50: 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63  0], 0, threadLoc
4b60: 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30 5d 29  kingTest, &d[0])
4b70: 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61  ;.  pthread_crea
4b80: 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72  te(&t[1], 0, thr
4b90: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20  eadLockingTest, 
4ba0: 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72 65 61  &d[1]);.  pthrea
4bb0: 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b  d_join(t[0], 0);
4bc0: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
4bd0: 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73  t[1], 0);.  clos
4be0: 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61 64 73  e(fd);.  threads
4bf0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
4c00: 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e  rsLocks =  d[0].
4c10: 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31  result==0 && d[1
4c20: 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23  ].result==0;.}.#
4c30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4c40: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a  UNIX_THREADS */.
4c50: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4c60: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
4c70: 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  ure previously a
4c80: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64  llocated by find
4c90: 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73  LockInfo()..*/.s
4ca0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
4cb0: 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63  seLockInfo(struc
4cc0: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
4cd0: 6b 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  k){.  assert( sq
4ce0: 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 31  lite3OsInMutex(1
4cf0: 29 20 29 3b 0a 20 20 69 66 20 28 70 4c 6f 63 6b  ) );.  if (pLock
4d00: 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 72 65   == NULL).    re
4d10: 74 75 72 6e 3b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e  turn;.  pLock->n
4d20: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f  Ref--;.  if( pLo
4d30: 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ck->nRef==0 ){. 
4d40: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4d50: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
4d60: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
4d70: 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c  eof(pLock->key),
4d80: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4d90: 54 68 72 65 61 64 53 61 66 65 46 72 65 65 28 70  ThreadSafeFree(p
4da0: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Lock);.  }.}../*
4db0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70  .** Release a op
4dc0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
4dd0: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
4de0: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b  ated by findLock
4df0: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
4e00: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70  c void releaseOp
4e10: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65  enCnt(struct ope
4e20: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20  nCnt *pOpen){.  
4e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4e40: 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a 20  sInMutex(1) );. 
4e50: 20 69 66 20 28 70 4f 70 65 6e 20 3d 3d 20 4e 55   if (pOpen == NU
4e60: 4c 4c 29 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  LL).    return;.
4e70: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b    pOpen->nRef--;
4e80: 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52  .  if( pOpen->nR
4e90: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ef==0 ){.    sql
4ea0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4eb0: 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e  openHash, &pOpen
4ec0: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f  ->key, sizeof(pO
4ed0: 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20  pen->key), 0);. 
4ee0: 20 20 20 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61     free(pOpen->a
4ef0: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71  Pending);.    sq
4f00: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
4f10: 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a  ree(pOpen);.  }.
4f20: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
4f30: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
4f40: 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 65 73 74  STYLE./*.** Test
4f50: 73 20 61 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  s a byte-range l
4f60: 6f 63 6b 69 6e 67 20 71 75 65 72 79 20 74 6f 20  ocking query to 
4f70: 73 65 65 20 69 66 20 62 79 74 65 20 72 61 6e 67  see if byte rang
4f80: 65 20 6c 6f 63 6b 73 20 61 72 65 20 0a 2a 2a 20  e locks are .** 
4f90: 73 75 70 70 6f 72 74 65 64 2c 20 69 66 20 6e 6f  supported, if no
4fa0: 74 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  t we fall back t
4fb0: 6f 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  o dotlockLocking
4fc0: 53 74 79 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Style..*/.static
4fd0: 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e 67 53   sqlite3LockingS
4fe0: 74 79 6c 65 20 73 71 6c 69 74 65 33 54 65 73 74  tyle sqlite3Test
4ff0: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 28 63 6f 6e  LockingStyle(con
5000: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
5010: 68 2c 20 0a 20 20 69 6e 74 20 66 64 29 20 7b 0a  h, .  int fd) {.
5020: 20 20 2f 2a 20 74 65 73 74 20 62 79 74 65 2d 72    /* test byte-r
5030: 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
5040: 66 63 6e 74 6c 20 2a 2f 0a 20 20 73 74 72 75 63  fcntl */.  struc
5050: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
5060: 3b 0a 20 20 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  ;.  .  lockInfo.
5070: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
5080: 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
5090: 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
50a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
50b0: 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
50c0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
50d0: 20 20 0a 20 20 69 66 20 28 66 63 6e 74 6c 28 66    .  if (fcntl(f
50e0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  d, F_GETLK, &loc
50f0: 6b 49 6e 66 6f 29 20 21 3d 20 2d 31 29 20 7b 0a  kInfo) != -1) {.
5100: 20 20 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78      return posix
5110: 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
5120: 7d 20 0a 20 20 0a 20 20 2f 2a 20 74 65 73 74 69  } .  .  /* testi
5130: 6e 67 20 66 6f 72 20 66 6c 6f 63 6b 20 63 61 6e  ng for flock can
5140: 20 67 69 76 65 20 66 61 6c 73 65 20 70 6f 73 69   give false posi
5150: 74 69 76 65 73 2e 20 20 53 6f 20 69 66 20 69 66  tives.  So if if
5160: 20 74 68 65 20 61 62 6f 76 65 20 74 65 73 74 0a   the above test.
5170: 20 20 2a 2a 20 66 61 69 6c 73 2c 20 74 68 65 6e    ** fails, then
5180: 20 77 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f   we fall back to
5190: 20 75 73 69 6e 67 20 64 6f 74 2d 6c 6f 63 6b 20   using dot-lock 
51a0: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20  style locking.. 
51b0: 20 2a 2f 20 20 0a 20 20 72 65 74 75 72 6e 20 64   */  .  return d
51c0: 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
51d0: 6c 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 45 78  le;.}../* .** Ex
51e0: 61 6d 69 6e 65 73 20 74 68 65 20 66 5f 66 73 74  amines the f_fst
51f0: 79 70 65 6e 61 6d 65 20 65 6e 74 72 79 20 69 6e  ypename entry in
5200: 20 74 68 65 20 73 74 61 74 66 73 20 73 74 72 75   the statfs stru
5210: 63 74 75 72 65 20 61 73 20 72 65 74 75 72 6e 65  cture as returne
5220: 64 20 62 79 20 0a 2a 2a 20 73 74 61 74 28 29 20  d by .** stat() 
5230: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 73 79 73  for the file sys
5240: 74 65 6d 20 68 6f 73 74 69 6e 67 20 74 68 65 20  tem hosting the 
5250: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
5260: 73 73 69 67 6e 73 20 74 68 65 20 0a 2a 2a 20 61  ssigns the .** a
5270: 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
5280: 6e 67 20 73 74 79 6c 65 20 62 61 73 65 64 20 6f  ng style based o
5290: 6e 20 69 74 27 73 20 76 61 6c 75 65 2e 20 20 54  n it's value.  T
52a0: 68 65 73 65 20 76 61 6c 75 65 73 20 61 6e 64 20  hese values and 
52b0: 0a 2a 2a 20 61 73 73 69 67 6e 6d 65 6e 74 73 20  .** assignments 
52c0: 61 72 65 20 62 61 73 65 64 20 6f 6e 20 44 61 72  are based on Dar
52d0: 77 69 6e 2f 4f 53 58 20 62 65 68 61 76 69 6f 72  win/OSX behavior
52e0: 20 61 6e 64 20 68 61 76 65 20 6e 6f 74 20 62 65   and have not be
52f0: 65 6e 20 74 65 73 74 65 64 20 6f 6e 20 0a 2a 2a  en tested on .**
5300: 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
5310: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
5320: 33 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 73 71  3LockingStyle sq
5330: 6c 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69  lite3DetectLocki
5340: 6e 67 53 74 79 6c 65 28 63 6f 6e 73 74 20 63 68  ngStyle(const ch
5350: 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 0a 20  ar *filePath, . 
5360: 20 69 6e 74 20 66 64 29 20 7b 0a 0a 23 69 66 64   int fd) {..#ifd
5370: 65 66 20 53 51 4c 49 54 45 5f 46 49 58 45 44 5f  ef SQLITE_FIXED_
5380: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
5390: 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 4c  return (sqlite3L
53a0: 6f 63 6b 69 6e 67 53 74 79 6c 65 29 53 51 4c 49  ockingStyle)SQLI
53b0: 54 45 5f 46 49 58 45 44 5f 4c 4f 43 4b 49 4e 47  TE_FIXED_LOCKING
53c0: 5f 53 54 59 4c 45 3b 0a 23 65 6c 73 65 0a 20 20  _STYLE;.#else.  
53d0: 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
53e0: 49 6e 66 6f 3b 0a 0a 20 20 69 66 20 28 73 74 61  Info;..  if (sta
53f0: 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
5400: 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 29 0a 20 20  sInfo) == -1).  
5410: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5420: 54 65 73 74 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  TestLockingStyle
5430: 28 66 69 6c 65 50 61 74 68 2c 20 66 64 29 3b 0a  (filePath, fd);.
5440: 20 20 0a 20 20 69 66 20 28 66 73 49 6e 66 6f 2e    .  if (fsInfo.
5450: 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
5460: 4f 4e 4c 59 29 0a 20 20 20 20 72 65 74 75 72 6e  ONLY).    return
5470: 20 6e 6f 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   noLockingStyle;
5480: 0a 20 20 0a 20 20 69 66 28 20 28 21 73 74 72 63  .  .  if( (!strc
5490: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
54a0: 70 65 6e 61 6d 65 2c 20 22 68 66 73 22 29 29 20  pename, "hfs")) 
54b0: 7c 7c 0a 20 20 20 20 28 21 73 74 72 63 6d 70 28  ||.    (!strcmp(
54c0: 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
54d0: 61 6d 65 2c 20 22 75 66 73 22 29 29 20 29 0a 09  ame, "ufs")) )..
54e0: 09 72 65 74 75 72 6e 20 70 6f 73 69 78 4c 6f 63  .return posixLoc
54f0: 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 0a 20 20  kingStyle;.  .  
5500: 69 66 28 21 73 74 72 63 6d 70 28 66 73 49 6e 66  if(!strcmp(fsInf
5510: 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
5520: 22 61 66 70 66 73 22 29 29 0a 20 20 20 20 72 65  "afpfs")).    re
5530: 74 75 72 6e 20 61 66 70 4c 6f 63 6b 69 6e 67 53  turn afpLockingS
5540: 74 79 6c 65 3b 0a 20 20 0a 20 20 69 66 28 21 73  tyle;.  .  if(!s
5550: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
5560: 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
5570: 29 29 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73  )) .    return s
5580: 71 6c 69 74 65 33 54 65 73 74 4c 6f 63 6b 69 6e  qlite3TestLockin
5590: 67 53 74 79 6c 65 28 66 69 6c 65 50 61 74 68 2c  gStyle(filePath,
55a0: 20 66 64 29 3b 0a 20 20 0a 20 20 69 66 28 21 73   fd);.  .  if(!s
55b0: 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
55c0: 73 74 79 70 65 6e 61 6d 65 2c 20 22 73 6d 62 66  stypename, "smbf
55d0: 73 22 29 29 0a 20 20 20 20 72 65 74 75 72 6e 20  s")).    return 
55e0: 66 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c  flockLockingStyl
55f0: 65 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63  e;.  .  if(!strc
5600: 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
5610: 70 65 6e 61 6d 65 2c 20 22 6d 73 64 6f 73 22 29  pename, "msdos")
5620: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 64 6f 74  ).    return dot
5630: 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  lockLockingStyle
5640: 3b 0a 20 20 0a 20 20 69 66 28 21 73 74 72 63 6d  ;.  .  if(!strcm
5650: 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
5660: 65 6e 61 6d 65 2c 20 22 77 65 62 64 61 76 22 29  ename, "webdav")
5670: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 73  ).    return uns
5680: 75 70 70 6f 72 74 65 64 4c 6f 63 6b 69 6e 67 53  upportedLockingS
5690: 74 79 6c 65 3b 0a 20 20 0a 20 20 72 65 74 75 72  tyle;.  .  retur
56a0: 6e 20 73 71 6c 69 74 65 33 54 65 73 74 4c 6f 63  n sqlite3TestLoc
56b0: 6b 69 6e 67 53 74 79 6c 65 28 66 69 6c 65 50 61  kingStyle(filePa
56c0: 74 68 2c 20 66 64 29 3b 20 20 0a 23 65 6e 64 69  th, fd);  .#endi
56d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 46 49 58 45  f /* SQLITE_FIXE
56e0: 44 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  D_LOCKING_STYLE 
56f0: 2a 2f 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  */.}..#endif /* 
5700: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
5710: 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
5720: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
5730: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
5740: 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20 61  ocate lockInfo a
5750: 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  nd openCnt struc
5760: 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64 65  tures that.** de
5770: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
5780: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
5790: 72 65 61 74 65 20 6e 65 77 20 6f 6e 65 73 20 69  reate new ones i
57a0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
57b0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
57c0: 65 73 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  es might be unin
57d0: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
57e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
57f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5800: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
5810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
5820: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69  indLockInfo(.  i
5830: 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
5840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5850: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
5860: 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  or used in the k
5870: 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  ey */.  struct l
5880: 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b  ockInfo **ppLock
5890: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
58a0: 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  he lockInfo stru
58b0: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
58c0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
58d0: 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20  *ppOpen      /* 
58e0: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43  Return the openC
58f0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72  nt structure her
5900: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
5910: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b  ;.  struct lockK
5920: 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63  ey key1;.  struc
5930: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a  t openKey key2;.
5940: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
5950: 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20  atbuf;.  struct 
5960: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  lockInfo *pLock;
5970: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  .  struct openCn
5980: 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d  t *pOpen;.  rc =
5990: 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61 74   fstat(fd, &stat
59a0: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
59b0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20  0 ) return 1;.. 
59c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
59d0: 4f 73 49 6e 4d 75 74 65 78 28 31 29 20 29 3b 0a  OsInMutex(1) );.
59e0: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20    memset(&key1, 
59f0: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  0, sizeof(key1))
5a00: 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73  ;.  key1.dev = s
5a10: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
5a20: 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74   key1.ino = stat
5a30: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64  buf.st_ino;.#ifd
5a40: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
5a50: 48 52 45 41 44 53 0a 20 20 69 66 28 20 74 68 72  HREADS.  if( thr
5a60: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
5a70: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
5a80: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
5a90: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
5aa0: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
5ab0: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
5ac0: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
5ad0: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
5ae0: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
5af0: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
5b00: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
5b10: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
5b20: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
5b30: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
5b40: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
5b50: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
5b60: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
5b70: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
5b80: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
5b90: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
5ba0: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
5bb0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
5bc0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
5bd0: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
5be0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
5bf0: 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20 20  of(*pLock) );.  
5c00: 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29    if( pLock==0 )
5c10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
5c20: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
5c30: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
5c40: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b    }.    pLock->k
5c50: 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70  ey = key1;.    p
5c60: 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Lock->nRef = 1;.
5c70: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d      pLock->cnt =
5c80: 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c   0;.    pLock->l
5c90: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ocktype = 0;.   
5ca0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
5cb0: 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48  ashInsert(&lockH
5cc0: 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79  ash, &pLock->key
5cd0: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20  , sizeof(key1), 
5ce0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  pLock);.    if( 
5cf0: 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20  pOld!=0 ){.     
5d00: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5d10: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71  Lock );.      sq
5d20: 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46  lite3ThreadSafeF
5d30: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
5d40: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
5d50: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
5d60: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20  ckinfo;.    }.  
5d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
5d80: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
5d90: 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  *ppLock = pLock;
5da0: 0a 20 20 69 66 28 20 70 70 4f 70 65 6e 21 3d 30  .  if( ppOpen!=0
5db0: 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   ){.    pOpen = 
5dc0: 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 2a  (struct openCnt*
5dd0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
5de0: 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b 65 79  (&openHash, &key
5df0: 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29  2, sizeof(key2))
5e00: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  ;.    if( pOpen=
5e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
5e20: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64  ct openCnt *pOld
5e30: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 20 3d 20  ;.      pOpen = 
5e40: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
5e50: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5e60: 2a 70 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 20  *pOpen) );.     
5e70: 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b   if( pOpen==0 ){
5e80: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
5e90: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
5ea0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
5eb0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
5ec0: 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b  it_findlockinfo;
5ed0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
5ee0: 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32  Open->key = key2
5ef0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
5f00: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
5f10: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b  Open->nLock = 0;
5f20: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
5f30: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
5f40: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
5f50: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 6c  g = 0;.      pOl
5f60: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
5f70: 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c  nsert(&openHash,
5f80: 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69   &pOpen->key, si
5f90: 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70 65  zeof(key2), pOpe
5fa0: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  n);.      if( pO
5fb0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld!=0 ){.       
5fc0: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
5fd0: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
5fe0: 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
5ff0: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
6000: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
6010: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
6020: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
6030: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
6040: 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a 20 20  findlockinfo;.  
6050: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6060: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  .      pOpen->nR
6070: 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef++;.    }.    
6080: 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b  *ppOpen = pOpen;
6090: 0a 20 20 7d 0a 0a 65 78 69 74 5f 66 69 6e 64 6c  .  }..exit_findl
60a0: 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72 65 74 75 72  ockinfo:.  retur
60b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
60c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
60d0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
60e0: 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  on for printing 
60f0: 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d  out trace inform
6100: 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67  ation from debug
6110: 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73  ging.** binaries
6120: 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  . This returns t
6130: 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
6140: 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  etation of the s
6150: 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67  upplied.** integ
6160: 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f  er lock-type..*/
6170: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
6180: 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  ar *locktypeName
6190: 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a  (int locktype){.
61a0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
61b0: 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f  pe ){.  case NO_
61c0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
61d0: 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52  NE";.  case SHAR
61e0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
61f0: 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65  "SHARED";.  case
6200: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
6210: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
6220: 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e  ";.  case PENDIN
6230: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
6240: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65  PENDING";.  case
6250: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
6260: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
6270: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
6280: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
6290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  dif../*.** If we
62a0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
62b0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68  n a different th
62c0: 72 65 61 64 20 74 68 61 6e 20 74 68 65 20 74 68  read than the th
62d0: 72 65 61 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  read that the.**
62e0: 20 75 6e 69 78 46 69 6c 65 20 61 72 67 75 6d 65   unixFile argume
62f0: 6e 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2c 20 74  nt belongs to, t
6300: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 6f 77 6e  hen transfer own
6310: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 75 6e  ership of the un
6320: 69 78 46 69 6c 65 0a 2a 2a 20 6f 76 65 72 20 74  ixFile.** over t
6330: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  o the current th
6340: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 75 6e  read..**.** A un
6350: 69 78 46 69 6c 65 20 69 73 20 6f 6e 6c 79 20 6f  ixFile is only o
6360: 77 6e 65 64 20 62 79 20 61 20 74 68 72 65 61 64  wned by a thread
6370: 20 6f 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72   on systems wher
6380: 65 20 6f 6e 65 20 74 68 72 65 61 64 20 69 73 0a  e one thread is.
6390: 2a 2a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 76 65  ** unable to ove
63a0: 72 72 69 64 65 20 6c 6f 63 6b 73 20 63 72 65 61  rride locks crea
63b0: 74 65 64 20 62 79 20 61 20 64 69 66 66 65 72 65  ted by a differe
63c0: 6e 74 20 74 68 72 65 61 64 2e 20 20 52 65 64 48  nt thread.  RedH
63d0: 61 74 39 20 69 73 0a 2a 2a 20 61 6e 20 65 78 61  at9 is.** an exa
63e0: 6d 70 6c 65 20 6f 66 20 73 75 63 68 20 61 20 73  mple of such a s
63f0: 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 4f 77 6e  ystem..**.** Own
6400: 65 72 73 68 69 70 20 74 72 61 6e 73 66 65 72 20  ership transfer 
6410: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
6420: 69 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  if the unixFile 
6430: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
6440: 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ocked..** If the
6450: 20 75 6e 69 78 46 69 6c 65 20 69 73 20 6c 6f 63   unixFile is loc
6460: 6b 65 64 20 61 6e 64 20 61 6e 20 6f 77 6e 65 72  ked and an owner
6470: 73 68 69 70 20 69 73 20 77 72 6f 6e 67 2c 20 74  ship is wrong, t
6480: 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  hen return.** SQ
6490: 4c 49 54 45 5f 4d 49 53 55 53 45 2e 20 20 53 51  LITE_MISUSE.  SQ
64a0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
64b0: 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
64c0: 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a 23 69 66 64  g works..*/.#ifd
64d0: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
64e0: 48 52 45 41 44 53 0a 73 74 61 74 69 63 20 69 6e  HREADS.static in
64f0: 74 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  t transferOwners
6500: 68 69 70 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  hip(unixFile *pF
6510: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
6520: 20 20 70 74 68 72 65 61 64 5f 74 20 68 53 65 6c    pthread_t hSel
6530: 66 3b 0a 20 20 69 66 28 20 74 68 72 65 61 64 73  f;.  if( threads
6540: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
6550: 72 73 4c 6f 63 6b 73 20 29 7b 0a 20 20 20 20 2f  rsLocks ){.    /
6560: 2a 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e  * Ownership tran
6570: 73 66 65 72 73 20 6e 6f 74 20 6e 65 65 64 65 64  sfers not needed
6580: 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 20   on this system 
6590: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
65a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 68  LITE_OK;.  }.  h
65b0: 53 65 6c 66 20 3d 20 70 74 68 72 65 61 64 5f 73  Self = pthread_s
65c0: 65 6c 66 28 29 3b 0a 20 20 69 66 28 20 70 74 68  elf();.  if( pth
65d0: 72 65 61 64 5f 65 71 75 61 6c 28 70 46 69 6c 65  read_equal(pFile
65e0: 2d 3e 74 69 64 2c 20 68 53 65 6c 66 29 20 29 7b  ->tid, hSelf) ){
65f0: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 73  .    /* We are s
6600: 74 69 6c 6c 20 69 6e 20 74 68 65 20 73 61 6d 65  till in the same
6610: 20 74 68 72 65 61 64 20 2a 2f 0a 20 20 20 20 4f   thread */.    O
6620: 53 54 52 41 43 45 31 28 22 4e 6f 2d 74 72 61 6e  STRACE1("No-tran
6630: 73 66 65 72 2c 20 73 61 6d 65 20 74 68 72 65 61  sfer, same threa
6640: 64 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  d\n");.    retur
6650: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6660: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
6670: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
6680: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 63 61 6e  ){.    /* We can
6690: 6e 6f 74 20 63 68 61 6e 67 65 20 6f 77 6e 65 72  not change owner
66a0: 73 68 69 70 20 77 68 69 6c 65 20 77 65 20 61 72  ship while we ar
66b0: 65 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b  e holding a lock
66c0: 21 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ! */.    return 
66d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
66e0: 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28 22 54   }.  OSTRACE4("T
66f0: 72 61 6e 73 66 65 72 20 6f 77 6e 65 72 73 68 69  ransfer ownershi
6700: 70 20 6f 66 20 25 64 20 66 72 6f 6d 20 25 64 20  p of %d from %d 
6710: 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  to %d\n",.      
6720: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
6730: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
6740: 66 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 74 69 64  f);.  pFile->tid
6750: 20 3d 20 68 53 65 6c 66 3b 0a 20 20 69 66 20 28   = hSelf;.  if (
6760: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 21 3d 20  pFile->pLock != 
6770: 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 72 65 6c 65  NULL) {.    rele
6780: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c  aseLockInfo(pFil
6790: 65 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 72  e->pLock);.    r
67a0: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
67b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 26 70 46 69 6c  (pFile->h, &pFil
67c0: 65 2d 3e 70 4c 6f 63 6b 2c 20 30 29 3b 0a 20 20  e->pLock, 0);.  
67d0: 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b    OSTRACE5("LOCK
67e0: 20 20 20 20 25 64 20 69 73 20 6e 6f 77 20 25 73      %d is now %s
67f0: 28 25 73 2c 25 64 29 5c 6e 22 2c 20 70 46 69 6c  (%s,%d)\n", pFil
6800: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
6810: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 46   locktypeName(pF
6820: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 0a  ile->locktype),.
6830: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
6840: 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  ypeName(pFile->p
6850: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c  Lock->locktype),
6860: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63   pFile->pLock->c
6870: 6e 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  nt);.    return 
6880: 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
6890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
68a0: 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  _OK;.  }.}.#else
68b0: 0a 20 20 2f 2a 20 4f 6e 20 73 69 6e 67 6c 65 2d  .  /* On single-
68c0: 74 68 72 65 61 64 65 64 20 62 75 69 6c 64 73 2c  threaded builds,
68d0: 20 6f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   ownership trans
68e0: 66 65 72 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a  fer is a no-op *
68f0: 2f 0a 23 20 64 65 66 69 6e 65 20 74 72 61 6e 73  /.# define trans
6900: 66 65 72 4f 77 6e 65 72 73 68 69 70 28 58 29 20  ferOwnership(X) 
6910: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
6920: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
6930: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
6940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78  .int sqlite3Unix
6950: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
6960: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
6970: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
6980: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
6990: 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
69a0: 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
69b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
69c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
69d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
69e0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 65 78  he named file ex
69f0: 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
6a00: 69 74 65 33 55 6e 69 78 46 69 6c 65 45 78 69 73  ite3UnixFileExis
6a10: 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ts(const char *z
6a20: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74  Filename){.  ret
6a30: 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65  urn access(zFile
6a40: 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a  name, 0)==0;.}..
6a50: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
6a60: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
6a70: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 55 6e 69   int allocateUni
6a80: 78 46 69 6c 65 28 0a 20 20 69 6e 74 20 68 2c 20  xFile(.  int h, 
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6aa0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
6ab0: 69 70 74 6f 72 20 6f 66 20 74 68 65 20 6f 70 65  iptor of the ope
6ac0: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 4f 73 46 69  n file */.  OsFi
6ad0: 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20 20 20 20  le **pId,       
6ae0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
6af0: 68 65 20 72 65 61 6c 20 66 69 6c 65 20 64 65 73  he real file des
6b00: 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
6b10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
6b20: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e  ilename,    /* N
6b30: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
6b40: 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
6b50: 20 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20    int delFlag   
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6b70: 66 20 74 72 75 65 2c 20 6d 61 6b 65 20 73 75 72  f true, make sur
6b80: 65 20 74 68 65 20 66 69 6c 65 20 64 65 6c 65 74  e the file delet
6b90: 65 73 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 29  es on close */.)
6ba0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ;../*.** Attempt
6bb0: 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20   to open a file 
6bc0: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
6bd0: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49   and writing.  I
6be0: 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c  f that.** fails,
6bf0: 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20   try opening it 
6c00: 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74  read-only.  If t
6c10: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
6c20: 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74   exist,.** try t
6c30: 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a  o create it..**.
6c40: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
6c50: 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
6c60: 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69  open file is wri
6c70: 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61  tten to *id.** a
6c80: 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73  nd *pReadonly is
6c90: 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68 65   set to 0 if the
6ca0: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
6cb0: 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64   for reading and
6cc0: 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20 31  .** writing or 1
6cd0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   if the file was
6ce0: 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
6cf0: 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  y.  The function
6d00: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49   returns.** SQLI
6d10: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  TE_OK..**.** On 
6d20: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e  failure, the fun
6d30: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
6d40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e  LITE_CANTOPEN an
6d50: 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20  d leaves.** *id 
6d60: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75  and *pReadonly u
6d70: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
6d80: 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70 65 6e   sqlite3UnixOpen
6d90: 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f 6e  ReadWrite(.  con
6da0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
6db0: 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70  me,.  OsFile **p
6dc0: 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64  Id,.  int *pRead
6dd0: 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 68 3b  only.){.  int h;
6de0: 0a 20 20 0a 20 20 43 52 41 53 48 5f 54 45 53 54  .  .  CRASH_TEST
6df0: 5f 4f 56 45 52 52 49 44 45 28 73 71 6c 69 74 65  _OVERRIDE(sqlite
6e00: 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57 72  3CrashOpenReadWr
6e10: 69 74 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ite, zFilename, 
6e20: 70 49 64 2c 20 70 52 65 61 64 6f 6e 6c 79 29 3b  pId, pReadonly);
6e30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
6e40: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
6e50: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
6e60: 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52  WR|O_CREAT|O_LAR
6e70: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c  GEFILE|O_BINARY,
6e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6e90: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6ea0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
6eb0: 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28  MISSIONS);.  if(
6ec0: 20 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45   h<0 ){.#ifdef E
6ed0: 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72  ISDIR.    if( er
6ee0: 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20  rno==EISDIR ){. 
6ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6f00: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
6f10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 68 20   }.#endif.    h 
6f20: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
6f30: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
6f40: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
6f50: 3b 0a 20 20 20 20 69 66 28 20 68 3c 30 20 29 7b  ;.    if( h<0 ){
6f60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
6f70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
6f80: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
6f90: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
6fa0: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
6fb0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
6fc0: 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78  urn allocateUnix
6fd0: 46 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69  File(h, pId, zFi
6fe0: 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 0a  lename, 0);.}...
6ff0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
7000: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
7010: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
7020: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
7030: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
7040: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
7050: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
7060: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
7070: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
7080: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
7090: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
70a0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
70b0: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
70c0: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
70d0: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
70e0: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
70f0: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
7100: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
7110: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
7120: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
7130: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
7140: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
7150: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
7160: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
7170: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
7180: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
7190: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
71a0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
71b0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
71c0: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
71d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
71e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
71f0: 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  ixOpenExclusive(
7200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
7210: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  ename, OsFile **
7220: 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  pId, int delFlag
7230: 29 7b 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20 43  ){.  int h;..  C
7240: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
7250: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
7260: 70 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a 46  penExclusive, zF
7270: 69 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65  ilename, pId, de
7280: 6c 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72 74  lFlag);.  assert
7290: 28 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 68  ( 0==*pId );.  h
72a0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
72b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
72c0: 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41     O_RDWR|O_CREA
72d0: 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c  T|O_EXCL|O_NOFOL
72e0: 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  LOW|O_LARGEFILE|
72f0: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
7300: 20 20 20 20 20 20 20 20 20 20 64 65 6c 46 6c 61            delFla
7310: 67 20 3f 20 30 36 30 30 20 3a 20 53 51 4c 49 54  g ? 0600 : SQLIT
7320: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
7330: 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69  ERMISSIONS);.  i
7340: 66 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65  f( h<0 ){.    re
7350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
7360: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OPEN;.  }.  retu
7370: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
7380: 69 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c  ile(h, pId, zFil
7390: 65 6e 61 6d 65 2c 20 64 65 6c 46 6c 61 67 29 3b  ename, delFlag);
73a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
73b0: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
73c0: 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e  file for read-on
73d0: 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  ly access..**.**
73e0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
73f0: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
7400: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
7410: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7420: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
7430: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
7440: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
7450: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f 70  nt sqlite3UnixOp
7460: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
7470: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7480: 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29 7b  , OsFile **pId){
7490: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 0a 20 20 43  .  int h;.  .  C
74a0: 52 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49  RASH_TEST_OVERRI
74b0: 44 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f  DE(sqlite3CrashO
74c0: 70 65 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69  penReadOnly, zFi
74d0: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b  lename, pId, 0);
74e0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70  .  assert( 0==*p
74f0: 49 64 20 29 3b 0a 20 20 68 20 3d 20 6f 70 65 6e  Id );.  h = open
7500: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
7510: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
7520: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
7530: 28 20 68 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  ( h<0 ){.    ret
7540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
7550: 50 45 4e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  PEN;.  }.  retur
7560: 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69  n allocateUnixFi
7570: 6c 65 28 68 2c 20 70 49 64 2c 20 7a 46 69 6c 65  le(h, pId, zFile
7580: 6e 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  name, 0);.}../*.
7590: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  ** Attempt to op
75a0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
75b0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72  ptor for the dir
75c0: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
75d0: 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20  ains a.** file. 
75e0: 20 54 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   This file descr
75f0: 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65  iptor can be use
7600: 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65  d to fsync() the
7610: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e   directory.** in
7620: 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
7630: 75 72 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ure the creation
7640: 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69   of a new file i
7650: 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
7660: 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  en.** to disk..*
7670: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7680: 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e  e is only meanin
7690: 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20  gful for Unix.  
76a0: 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  It is a no-op un
76b0: 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73  der.** windows s
76c0: 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65  ince windows doe
76d0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61  s not support ha
76e0: 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20  rd links..**.** 
76f0: 49 66 20 46 55 4c 4c 5f 46 53 59 4e 43 20 69 73  If FULL_FSYNC is
7700: 20 65 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 66   enabled, this f
7710: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6c  unction is not l
7720: 6f 6e 67 65 72 20 75 73 65 66 75 6c 2c 20 0a 2a  onger useful, .*
7730: 2a 20 61 20 46 55 4c 4c 5f 46 53 59 4e 43 20 73  * a FULL_FSYNC s
7740: 79 6e 63 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ync applies to a
7750: 6c 6c 20 70 65 6e 64 69 6e 67 20 64 69 73 6b 20  ll pending disk 
7760: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
7770: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
7780: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
7790: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
77a0: 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75  e at *id is.** u
77b0: 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
77c0: 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69  new directory fi
77d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  le descriptor an
77e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a  d SQLITE_OK is.*
77f0: 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
7800: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
7810: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
7820: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
7830: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
7840: 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a   *id unchanged..
7850: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
7860: 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  ixOpenDirectory(
7870: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20  .  OsFile *id,. 
7880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
7890: 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69 78 46  rname.){.  unixF
78a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
78b0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  ixFile*)id;.  as
78c0: 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
78d0: 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
78e0: 28 70 46 69 6c 65 29 3b 0a 20 20 61 73 73 65 72  (pFile);.  asser
78f0: 74 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3c  t( pFile->dirfd<
7900: 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 64 69  0 );.  pFile->di
7910: 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e  rfd = open(zDirn
7920: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
7930: 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66  BINARY, 0);.  if
7940: 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3c 30  ( pFile->dirfd<0
7950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7960: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20  QLITE_CANTOPEN; 
7970: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28  .  }.  OSTRACE3(
7980: 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
7990: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72 66  \n", pFile->dirf
79a0: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
79b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
79c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
79d0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
79e0: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
79f0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
7a00: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
7a10: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
7a20: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
7a30: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
7a40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
7a50: 78 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68  xTempFileName(ch
7a60: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
7a70: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7a80: 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
7a90: 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
7aa0: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
7ab0: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
7ac0: 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
7ad0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
7ae0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7af0: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
7b00: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
7b10: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
7b20: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
7b30: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
7b40: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
7b50: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
7b60: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
7b70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
7b80: 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72 73   = ".";.  azDirs
7b90: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
7ba0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
7bb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
7bc0: 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
7bd0: 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b  (azDirs[0]); i++
7be0: 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72  ){.    if( azDir
7bf0: 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
7c00: 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  ue;.    if( stat
7c10: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66  (azDirs[i], &buf
7c20: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
7c30: 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
7c40: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
7c50: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7c60: 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d  access(azDirs[i]
7c70: 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
7c80: 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
7c90: 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61  irs[i];.    brea
7ca0: 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20  k;.  }.  do{.   
7cb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7cc0: 66 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  f(SQLITE_TEMPNAM
7cd0: 45 5f 53 49 5a 45 2c 20 7a 42 75 66 2c 20 22 25  E_SIZE, zBuf, "%
7ce0: 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  s/"TEMP_FILE_PRE
7cf0: 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
7d00: 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  j = strlen(zBuf)
7d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e  ;.    sqlite3Ran
7d20: 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
7d30: 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  f[j]);.    for(i
7d40: 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
7d50: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  ++){.      zBuf[
7d60: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
7d70: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
7d80: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
7d90: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
7da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66  ;.    }.    zBuf
7db0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c  [j] = 0;.  }whil
7dc0: 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30  e( access(zBuf,0
7dd0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
7de0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
7df0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
7e00: 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d   a given pathnam
7e10: 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  e is a directory
7e20: 20 61 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65   and is writable
7e30: 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   .**.*/.int sqli
7e40: 74 65 33 55 6e 69 78 49 73 44 69 72 57 72 69 74  te3UnixIsDirWrit
7e50: 61 62 6c 65 28 63 68 61 72 20 2a 7a 42 75 66 29  able(char *zBuf)
7e60: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
7e70: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
7e80: 4d 41 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  MAS.  struct sta
7e90: 74 20 62 75 66 3b 0a 20 20 69 66 28 20 7a 42 75  t buf;.  if( zBu
7ea0: 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  f==0 ) return 0;
7eb0: 0a 20 20 69 66 28 20 7a 42 75 66 5b 30 5d 3d 3d  .  if( zBuf[0]==
7ec0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7ed0: 69 66 28 20 73 74 61 74 28 7a 42 75 66 2c 20 26  if( stat(zBuf, &
7ee0: 62 75 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  buf) ) return 0;
7ef0: 0a 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28  .  if( !S_ISDIR(
7f00: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72  buf.st_mode) ) r
7f10: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61  eturn 0;.  if( a
7f20: 63 63 65 73 73 28 7a 42 75 66 2c 20 30 37 29 20  ccess(zBuf, 07) 
7f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
7f40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
7f50: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 20  T_PAGER_PRAGMAS 
7f60: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
7f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
7f80: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
7f90: 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
7fa0: 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
7fb0: 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
7fc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7fd0: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
7fe0: 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
7ff0: 20 6f 66 66 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   offset..*/.stat
8000: 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
8010: 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
8020: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
8030: 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
8040: 3b 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ;.  i64 newOffse
8050: 74 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  t;.  TIMER_START
8060: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ;.#if defined(US
8070: 45 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d  E_PREAD).  got =
8080: 20 70 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42   pread(id->h, pB
8090: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
80a0: 73 65 74 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  set);.  Simulate
80b0: 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
80c0: 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
80d0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
80e0: 20 20 67 6f 74 20 3d 20 70 72 65 61 64 36 34 28    got = pread64(
80f0: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
8100: 2c 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b 0a 20  , id->offset);. 
8110: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
8120: 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
8130: 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20  lse.  newOffset 
8140: 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 69  = lseek(id->h, i
8150: 64 2d 3e 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  d->offset, SEEK_
8160: 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
8170: 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
8180: 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
8190: 77 4f 66 66 73 65 74 21 3d 69 64 2d 3e 6f 66 66  wOffset!=id->off
81a0: 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  set ){.    retur
81b0: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74 20  n -1;.  }.  got 
81c0: 3d 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  = read(id->h, pB
81d0: 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66  uf, cnt);.#endif
81e0: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
81f0: 4f 53 54 52 41 43 45 35 28 22 52 45 41 44 20 20  OSTRACE5("READ  
8200: 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
8210: 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67   %d\n", id->h, g
8220: 6f 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c 20  ot, id->offset, 
8230: 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a  TIMER_ELAPSED);.
8240: 20 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20    if( got>0 ){. 
8250: 20 20 20 69 64 2d 3e 6f 66 66 73 65 74 20 2b 3d     id->offset +=
8260: 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75   got;.  }.  retu
8270: 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn got;.}../*.**
8280: 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
8290: 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
82a0: 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
82b0: 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
82c0: 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
82d0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
82e0: 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
82f0: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8300: 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
8310: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61  atic int unixRea
8320: 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76 6f  d(OsFile *id, vo
8330: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
8340: 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
8350: 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
8360: 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
8370: 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  ad((unixFile*)id
8380: 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
8390: 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
83a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83b0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
83c0: 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 72  ( got<0 ){.    r
83d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
83e0: 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
83f0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
8400: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
8410: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
8420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8430: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8440: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
8450: 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
8460: 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
8470: 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
8480: 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
8490: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
84a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
84b0: 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
84c0: 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
84d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
84e0: 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
84f0: 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20  File *id, const 
8500: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
8510: 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
8520: 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74  .  i64 newOffset
8530: 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
8540: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
8550: 5f 50 52 45 41 44 29 0a 20 20 67 6f 74 20 3d 20  _PREAD).  got = 
8560: 70 77 72 69 74 65 28 69 64 2d 3e 68 2c 20 70 42  pwrite(id->h, pB
8570: 75 66 2c 20 63 6e 74 2c 20 69 64 2d 3e 6f 66 66  uf, cnt, id->off
8580: 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
8590: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
85a0: 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
85b0: 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
85c0: 6e 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74 29 3b  nt, id->offset);
85d0: 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73  .#else.  newOffs
85e0: 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68  et = lseek(id->h
85f0: 2c 20 69 64 2d 3e 6f 66 66 73 65 74 2c 20 53 45  , id->offset, SE
8600: 45 4b 5f 53 45 54 29 3b 0a 20 20 69 66 28 20 6e  EK_SET);.  if( n
8610: 65 77 4f 66 66 73 65 74 21 3d 69 64 2d 3e 6f 66  ewOffset!=id->of
8620: 66 73 65 74 20 29 7b 0a 20 20 20 20 72 65 74 75  fset ){.    retu
8630: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 67 6f 74  rn -1;.  }.  got
8640: 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c 20   = write(id->h, 
8650: 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
8660: 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  if.  TIMER_END;.
8670: 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49 54    OSTRACE5("WRIT
8680: 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
8690: 6c 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c  ld %d\n", id->h,
86a0: 20 67 6f 74 2c 20 69 64 2d 3e 6f 66 66 73 65 74   got, id->offset
86b0: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
86c0: 3b 0a 20 20 69 66 28 20 67 6f 74 3e 30 20 29 7b  ;.  if( got>0 ){
86d0: 0a 20 20 20 20 69 64 2d 3e 6f 66 66 73 65 74 20  .    id->offset 
86e0: 2b 3d 20 67 6f 74 3b 0a 20 20 7d 0a 20 20 72 65  += got;.  }.  re
86f0: 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a 0a 0a 2f 2a  turn got;.}.../*
8700: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
8710: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
8720: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
8730: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
8740: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
8750: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
8760: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
8770: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
8780: 78 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69  xWrite(OsFile *i
8790: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
87a0: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
87b0: 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
87c0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
87d0: 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
87e0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e  );.  while( amt>
87f0: 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65  0 && (wrote = se
8800: 65 6b 41 6e 64 57 72 69 74 65 28 28 75 6e 69 78  ekAndWrite((unix
8810: 46 69 6c 65 2a 29 69 64 2c 20 70 42 75 66 2c 20  File*)id, pBuf, 
8820: 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
8830: 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
8840: 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
8850: 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
8860: 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
8870: 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
8880: 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
8890: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
88a0: 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
88b0: 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66 28 20  amt=1 ));.  if( 
88c0: 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  amt>0 ){.    if(
88d0: 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20   wrote<0 ){.    
88e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
88f0: 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
8900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
8910: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
8920: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8940: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
8950: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
8960: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
8970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
8980: 69 78 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69  ixSeek(OsFile *i
8990: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a  d, i64 offset){.
89a0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
89b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
89c0: 53 54 0a 20 20 69 66 28 20 6f 66 66 73 65 74 20  ST.  if( offset 
89d0: 29 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75  ) SimulateDiskfu
89e0: 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
89f0: 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 23 65 6e  QLITE_FULL);.#en
8a00: 64 69 66 0a 20 20 28 28 75 6e 69 78 46 69 6c 65  dif.  ((unixFile
8a10: 2a 29 69 64 29 2d 3e 6f 66 66 73 65 74 20 3d 20  *)id)->offset = 
8a20: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
8a30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
8a40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8a50: 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
8a60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
8a70: 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
8a80: 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
8a90: 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
8aa0: 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
8ab0: 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
8ac0: 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
8ad0: 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
8ae0: 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
8af0: 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
8b00: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
8b10: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
8b20: 0a 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ../*.** Use the 
8b30: 66 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20  fdatasync() API 
8b40: 6f 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45  only if the HAVE
8b50: 5f 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f  _FDATASYNC macro
8b60: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20   is defined..** 
8b70: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73  Otherwise use fs
8b80: 79 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61  ync() in its pla
8b90: 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48  ce..*/.#ifndef H
8ba0: 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
8bb0: 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
8bc0: 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
8bd0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
8be0: 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
8bf0: 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
8c00: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
8c10: 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
8c20: 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
8c30: 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
8c40: 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
8c50: 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
8c60: 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
8c70: 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
8c80: 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
8c90: 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
8ca0: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
8cb0: 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
8cc0: 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
8cd0: 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  SYNC 0.#endif...
8ce0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28  /*.** The fsync(
8cf0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f  ) system call do
8d00: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61  es not work as a
8d10: 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e  dvertised on man
8d20: 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d  y.** unix system
8d30: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
8d40: 67 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61  g procedure is a
8d50: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  n attempt to mak
8d60: 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74  e.** it work bet
8d70: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ter..**.** The S
8d80: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61  QLITE_NO_SYNC ma
8d90: 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c  cro disables all
8da0: 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73   fsync()s.  This
8db0: 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f   is useful.** fo
8dc0: 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77  r testing when w
8dd0: 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  e want to run th
8de0: 72 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73  rough the test s
8df0: 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a  uite quickly..**
8e00: 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c   You are strongl
8e10: 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20  y advised *not* 
8e20: 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53  to deploy with S
8e30: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a  QLITE_NO_SYNC.**
8e40: 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65   enabled, howeve
8e50: 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51  r, since with SQ
8e60: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61  LITE_NO_SYNC ena
8e70: 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73  bled, an OS cras
8e80: 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  h.** or power fa
8e90: 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c  ilure will likel
8ea0: 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61  y corrupt the da
8eb0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
8ec0: 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
8ed0: 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
8ee0: 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
8ef0: 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
8f00: 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72   rc;..  /* Recor
8f10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
8f20: 74 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f  times that we do
8f30: 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
8f40: 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c  ) and .  ** FULL
8f50: 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75  SYNC.  This is u
8f60: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
8f70: 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ng to verify tha
8f80: 74 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  t this procedure
8f90: 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65  .  ** gets calle
8fa0: 64 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  d with the corre
8fb0: 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20  ct arguments..  
8fc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8fd0: 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c  _TEST.  if( full
8fe0: 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66  Sync ) sqlite3_f
8ff0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
9000: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
9010: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
9020: 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
9030: 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
9040: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
9050: 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
9060: 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
9070: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
9080: 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20  TE_NO_SYNC.  rc 
9090: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  = SQLITE_OK;.#el
90a0: 73 65 0a 0a 23 69 66 20 48 41 56 45 5f 46 55 4c  se..#if HAVE_FUL
90b0: 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
90c0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
90d0: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  = fcntl(fd, F_FU
90e0: 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
90f0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
9100: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
9110: 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
9120: 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
9130: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
9140: 73 79 6e 63 28 29 2e 0a 20 20 20 2a 20 49 74 20  sync()..   * It 
9150: 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
9160: 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
9170: 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
9180: 68 65 20 6c 6f 63 61 6c 20 0a 20 20 20 2a 20 66  he local .   * f
9190: 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
91a0: 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
91b0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
91c0: 55 4c 4c 46 53 59 4e 43 0a 20 20 20 2a 20 69 73  ULLFSYNC.   * is
91d0: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
91e0: 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
91f0: 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
9200: 61 6e 20 66 73 79 6e 63 20 0a 20 20 20 2a 20 61  an fsync .   * a
9210: 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
9220: 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
9230: 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
9240: 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
9250: 20 20 20 2a 20 49 74 27 64 20 62 65 20 62 65 74     * It'd be bet
9260: 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
9270: 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
9280: 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
9290: 20 20 20 2a 20 74 68 65 20 66 63 6e 74 6c 20 63     * the fcntl c
92a0: 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
92b0: 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
92c0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20    */.  if( rc ) 
92d0: 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
92e0: 0a 23 65 6c 73 65 20 0a 20 20 69 66 28 20 64 61  .#else .  if( da
92f0: 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  taOnly ){.    rc
9300: 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29   = fdatasync(fd)
9310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
9320: 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
9330: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41 56   }.#endif /* HAV
9340: 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 23  E_FULLFSYNC */.#
9350: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
9360: 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
9370: 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   */..  return rc
9380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
9390: 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
93a0: 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
93b0: 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
93c0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
93d0: 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
93e0: 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
93f0: 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
9400: 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
9410: 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
9420: 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
9430: 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
9440: 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
9450: 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
9460: 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
9470: 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
9480: 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
9490: 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
94a0: 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
94b0: 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
94c0: 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
94d0: 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
94e0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
94f0: 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
9500: 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
9510: 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
9520: 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
9530: 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
9540: 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
9550: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
9560: 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
9570: 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
9580: 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
9590: 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
95a0: 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
95b0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
95c0: 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
95d0: 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
95e0: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
95f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
9600: 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
9610: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
9620: 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
9630: 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
9640: 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
9650: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
9660: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9670: 74 20 75 6e 69 78 53 79 6e 63 28 4f 73 46 69 6c  t unixSync(OsFil
9680: 65 20 2a 69 64 2c 20 69 6e 74 20 64 61 74 61 4f  e *id, int dataO
9690: 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
96a0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
96b0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
96c0: 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  d;.  assert( pFi
96d0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 32  le );.  OSTRACE2
96e0: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
96f0: 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  ", pFile->h);.  
9700: 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
9710: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
9720: 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61 74 61 4f  >fullSync, dataO
9730: 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
9740: 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
9750: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
9760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9770: 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d 0a  OERR_FSYNC;.  }.
9780: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69 72    if( pFile->dir
9790: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  fd>=0 ){.    OST
97a0: 52 41 43 45 34 28 22 44 49 52 53 59 4e 43 20 25  RACE4("DIRSYNC %
97b0: 2d 33 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73  -3d (have_fullfs
97c0: 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
97d0: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64  %d)\n", pFile->d
97e0: 69 72 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  irfd,.          
97f0: 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
9800: 2c 20 70 46 69 6c 65 2d 3e 66 75 6c 6c 53 79 6e  , pFile->fullSyn
9810: 63 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c);.#ifndef SQLI
9820: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
9830: 4e 43 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  NC.    /* The di
9840: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
9850: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
9860: 66 20 66 75 6c 6c 5f 66 73 79 6e 63 20 69 73 0a  f full_fsync is.
9870: 20 20 20 20 2a 2a 20 74 75 72 6e 65 64 20 6f 66      ** turned of
9880: 66 20 6f 72 20 75 6e 61 76 61 69 6c 61 62 6c 65  f or unavailable
9890: 2e 20 20 49 66 20 61 20 66 75 6c 6c 5f 66 73 79  .  If a full_fsy
98a0: 6e 63 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  nc occurred abov
98b0: 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  e,.    ** then t
98c0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  he directory syn
98d0: 63 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73  c is superfluous
98e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
98f0: 20 28 21 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e   (!HAVE_FULLFSYN
9900: 43 20 7c 7c 20 21 70 46 69 6c 65 2d 3e 66 75 6c  C || !pFile->ful
9910: 6c 53 79 6e 63 29 20 26 26 20 66 75 6c 6c 5f 66  lSync) && full_f
9920: 73 79 6e 63 28 70 46 69 6c 65 2d 3e 64 69 72 66  sync(pFile->dirf
9930: 64 2c 30 2c 30 29 20 29 7b 0a 20 20 20 20 20 20  d,0,0) ){.      
9940: 20 2f 2a 0a 20 20 20 20 20 20 20 2a 2a 20 57 65   /*.       ** We
9950: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 6d   have received m
9960: 75 6c 74 69 70 6c 65 20 72 65 70 6f 72 74 73 20  ultiple reports 
9970: 6f 66 20 66 73 79 6e 63 28 29 20 72 65 74 75 72  of fsync() retur
9980: 6e 69 6e 67 0a 20 20 20 20 20 20 20 2a 2a 20 65  ning.       ** e
9990: 72 72 6f 72 73 20 77 68 65 6e 20 61 70 70 6c 69  rrors when appli
99a0: 65 64 20 74 6f 20 64 69 72 65 63 74 6f 72 69 65  ed to directorie
99b0: 73 20 6f 6e 20 63 65 72 74 61 69 6e 20 66 69 6c  s on certain fil
99c0: 65 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  e systems..     
99d0: 20 20 2a 2a 20 41 20 66 61 69 6c 65 64 20 64 69    ** A failed di
99e0: 72 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20  rectory sync is 
99f0: 6e 6f 74 20 61 20 62 69 67 20 64 65 61 6c 2e 20  not a big deal. 
9a00: 20 53 6f 20 69 74 20 73 65 65 6d 73 0a 20 20 20   So it seems.   
9a10: 20 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f      ** better to
9a20: 20 69 67 6e 6f 72 65 20 74 68 65 20 65 72 72 6f   ignore the erro
9a30: 72 2e 20 20 54 69 63 6b 65 74 20 23 31 36 35 37  r.  Ticket #1657
9a40: 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
9a50: 20 20 2f 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    /* return SQLI
9a60: 54 45 5f 49 4f 45 52 52 3b 20 2a 2f 0a 20 20 20  TE_IOERR; */.   
9a70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 6c   }.#endif.    cl
9a80: 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66 64  ose(pFile->dirfd
9a90: 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  );  /* Only need
9aa0: 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
9ab0: 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72 65  o close the dire
9ac0: 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 70 46 69  ctory */.    pFi
9ad0: 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20  le->dirfd = -1; 
9ae0: 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72     /* when we ar
9af0: 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d 0a 20  e done. */.  }. 
9b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9b10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
9b20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 7a   the directory z
9b30: 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  Dirname. This is
9b40: 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70 65 72   a no-op on oper
9b50: 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6f 74  ating systems ot
9b60: 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e 49 58  her.** than UNIX
9b70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9b80: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
9b90: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 74 72  rnal file has tr
9bb0: 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65 74 65  uely been delete
9bc0: 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61 6b 69  d.** before maki
9bd0: 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 69 6e  ng changes to in
9be0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
9bf0: 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64 61 74  s on a multi-dat
9c00: 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a 2a 2a  abase commit..**
9c10: 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   The F_FULLFSYNC
9c20: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6e   option is not n
9c30: 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 69  eeded here..*/.i
9c40: 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 53 79  nt sqlite3UnixSy
9c50: 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  ncDirectory(cons
9c60: 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  t char *zDirname
9c70: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
9c80: 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
9c90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9ca0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
9cb0: 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20   fd;.  int r;.  
9cc0: 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
9cd0: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
9ce0: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 4f 53 54  INARY, 0);.  OST
9cf0: 52 41 43 45 33 28 22 44 49 52 53 59 4e 43 20 25  RACE3("DIRSYNC %
9d00: 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c  -3d (%s)\n", fd,
9d10: 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66   zDirname);.  if
9d20: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65  ( fd<0 ){.    re
9d30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
9d40: 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d  OPEN; .  }.  r =
9d50: 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c   fsync(fd);.  cl
9d60: 6f 73 65 28 66 64 29 3b 0a 20 20 53 69 6d 75 6c  ose(fd);.  Simul
9d70: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 3d 31 20  ateIOError( r=1 
9d80: 29 3b 0a 20 20 69 66 28 20 72 20 29 7b 0a 20 20  );.  if( r ){.  
9d90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9da0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3b  IOERR_DIR_FSYNC;
9db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9dd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
9de0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
9df0: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
9e00: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
9e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
9e20: 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20  Truncate(OsFile 
9e30: 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
9e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
9e50: 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
9e60: 3d 20 66 74 72 75 6e 63 61 74 65 28 28 28 75 6e  = ftruncate(((un
9e70: 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
9e80: 6e 42 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61  nByte);.  Simula
9e90: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
9ea0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
9eb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ec0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
9ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9ee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
9f00: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
9f10: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
9f20: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
9f30: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
9f40: 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64  eSize(OsFile *id
9f50: 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
9f60: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
9f70: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
9f80: 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
9f90: 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
9fa0: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
9fb0: 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
9fc0: 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
9fd0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
9fe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ff0: 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
a000: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
a010: 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72  st_size;.  retur
a020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a030: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a040: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
a050: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
a060: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
a070: 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
a080: 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
a090: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
a0a0: 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
a0b0: 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
a0c0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49  .** non-zero.  I
a0d0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
a0e0: 6c 6f 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20  locked or holds 
a0f0: 6f 6e 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b  only SHARED lock
a100: 73 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  s, then.** retur
a110: 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
a120: 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52  c int unixCheckR
a130: 65 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69  eservedLock(OsFi
a140: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
a150: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
a160: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
a170: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
a180: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 73  rt( pFile );.  s
a190: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
a1a0: 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
a1b0: 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73   pFile->pLock is
a1c0: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
a1d0: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
a1e0: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
a1f0: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
a200: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
a210: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
a220: 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
a230: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
a240: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
a250: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
a260: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
a270: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
a280: 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s it..  */.  if(
a290: 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63   !r ){.    struc
a2a0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
a2b0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
a2c0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
a2d0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
a2e0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
a2f0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
a300: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
a310: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
a320: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a330: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
a340: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c  ;.    if( lock.l
a350: 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29  _type!=F_UNLCK )
a360: 7b 0a 20 20 20 20 20 20 72 20 3d 20 31 3b 0a 20  {.      r = 1;. 
a370: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
a380: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
a390: 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28  x();.  OSTRACE3(
a3a0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
a3b0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
a3c0: 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  , r);..  return 
a3d0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  r;.}../*.** Lock
a3e0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
a3f0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
a400: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
a410: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
a420: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
a430: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
a440: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
a450: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
a460: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
a470: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
a480: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
a490: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
a4a0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
a4b0: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
a4c0: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
a4d0: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
a4e0: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
a4f0: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
a500: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
a510: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
a520: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
a530: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
a540: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
a550: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
a560: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
a570: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
a580: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
a590: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
a5a0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
a5b0: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
a5c0: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
a5d0: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
a5e0: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
a5f0: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
a600: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
a610: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
a620: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
a630: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
a640: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
a650: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
a660: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
a670: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
a680: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
a690: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a6a0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
a6b0: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
a6c0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
a6d0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
a6e0: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
a6f0: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
a700: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 4f 73 46  int unixLock(OsF
a710: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
a720: 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65  ktype){.  /* The
a730: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72   following descr
a740: 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ibes the impleme
a750: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ntation of the v
a760: 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64  arious locks and
a770: 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73  .  ** lock trans
a780: 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20  itions in terms 
a790: 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76  of the POSIX adv
a7a0: 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64  isory shared and
a7b0: 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20   exclusive.  ** 
a7c0: 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20  lock primitives 
a7d0: 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63  (called read-loc
a7e0: 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63  ks and write-loc
a7f0: 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f  ks below, to avo
a800: 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f  id.  ** confusio
a810: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f  n with SQLite lo
a820: 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61  ck names). The a
a830: 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f  lgorithms are co
a840: 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73  mplicated.  ** s
a850: 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72  lightly in order
a860: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
a870: 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73  e with windows s
a880: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
a890: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
a8a0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
a8b0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
a8c0: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
a8d0: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
a8e0: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
a8f0: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
a900: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
a910: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
a920: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
a930: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
a940: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
a950: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
a960: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
a970: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
a980: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
a990: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
a9a0: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
a9b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
a9c0: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
a9d0: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
a9e0: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
a9f0: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
aa00: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
aa10: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
aa20: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
aa30: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
aa40: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
aa50: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61  is read-locked a
aa60: 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
aa70: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
aa80: 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a  ' released..  **
aa90: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
aaa0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
aab0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
aac0: 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53  after it has a S
aad0: 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  HARED lock..  **
aae0: 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   A RESERVED lock
aaf0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
ab00: 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72  by grabbing a wr
ab10: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  ite-lock on the.
ab20: 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62    ** 'reserved b
ab30: 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  yte'. .  **.  **
ab40: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
ab50: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e  nly obtain a PEN
ab60: 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20  DING lock after 
ab70: 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20  it has obtained 
ab80: 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f  a.  ** SHARED lo
ab90: 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  ck. A PENDING lo
aba0: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
abb0: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
abc0: 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a   write-lock.  **
abd0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
abe0: 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73   byte'. This ens
abf0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77  ures that no new
ac00: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61   SHARED locks ca
ac10: 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  n be.  ** obtain
ac20: 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67  ed, but existing
ac30: 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72   SHARED locks ar
ac40: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72  e allowed to per
ac50: 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a  sist. A process.
ac60: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61    ** does not ha
ac70: 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52  ve to obtain a R
ac80: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
ac90: 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e  the way to a PEN
aca0: 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  DING lock..  ** 
acb0: 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73  This property is
acc0: 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67   used by the alg
acd0: 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69  orithm for rolli
ace0: 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
acf0: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65  l file.  ** afte
ad00: 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a  r a crash..  **.
ad10: 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56    ** An EXCLUSIV
ad20: 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64  E lock, obtained
ad30: 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47   after a PENDING
ad40: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69   lock is held, i
ad50: 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  s.  ** implement
ad60: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
ad70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
ad80: 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72  the entire 'shar
ad90: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
ada0: 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f  ge'. Since all o
adb0: 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69  ther locks requi
adc0: 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  re a read-lock o
add0: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74  n one of the byt
ade0: 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74  es.  ** within t
adf0: 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20  his range, this 
ae00: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
ae10: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20  other locks are 
ae20: 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  held on the.  **
ae30: 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a   database. .  **
ae40: 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e  .  ** The reason
ae50: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63   a single byte c
ae60: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e  annot be used in
ae70: 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68  stead of the 'sh
ae80: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
ae90: 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f  ange' is that so
aea0: 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77  me versions of w
aeb0: 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75  indows do not su
aec0: 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73  pport read-locks
aed0: 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e  . By.  ** lockin
aee0: 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20  g a random byte 
aef0: 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f  from a range, co
af00: 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20  ncurrent SHARED 
af10: 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a  locks may exist.
af20: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65    ** even if the
af30: 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
af40: 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79  ve used is alway
af50: 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a  s a write-lock..
af60: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
af70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
af80: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
af90: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
afa0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
afb0: 2a 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d 3e  *pLock = pFile->
afc0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
afd0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
afe0: 74 20 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t s;..  assert( 
aff0: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
b000: 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE7("LOCK    %d 
b010: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
b020: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
b030: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  e->h,.      lock
b040: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
b050: 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  e), locktypeName
b060: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
b070: 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b 74 79 70  ),.      locktyp
b080: 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63  eName(pLock->loc
b090: 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63  ktype), pLock->c
b0a0: 6e 74 20 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  nt , getpid());.
b0b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b0c0: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
b0d0: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
b0e0: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
b0f0: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73  e on the.  ** Os
b100: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
b110: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
b120: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
b130: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c  ath, as.  ** sql
b140: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
b150: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
b160: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
b170: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
b180: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
b190: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 33 28  ){.    OSTRACE3(
b1a0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
b1b0: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
b1c0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
b1d0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74             lockt
b1e0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
b1f0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
b200: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
b210: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b220: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
b230: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
b240: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
b250: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f  le->locktype!=NO
b260: 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70  _LOCK || locktyp
b270: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
b280: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
b290: 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type!=PENDING_LO
b2a0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
b2b0: 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56  locktype!=RESERV
b2c0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
b2d0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
b2e0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  ED_LOCK );..  /*
b2f0: 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
b300: 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
b310: 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68  ile->pLock is sh
b320: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
b330: 61 64 73 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ads.  */.  sqlit
b340: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
b350: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
b360: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  e the current th
b370: 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70 46  read owns the pF
b380: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ile..  */.  rc =
b390: 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73 68   transferOwnersh
b3a0: 69 70 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ip(pFile);.  if(
b3b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b3c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
b3d0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
b3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b3f0: 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65 2d    pLock = pFile-
b400: 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  >pLock;..  /* If
b410: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
b420: 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
b430: 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
b440: 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20  ferent OsFile*. 
b450: 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20   ** handle that 
b460: 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65  precludes the re
b470: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65  quested lock, re
b480: 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a  turn BUSY..  */.
b490: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f    if( (pFile->lo
b4a0: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
b4b0: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
b4c0: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
b4d0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
b4e0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
b4f0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
b500: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
b510: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
b520: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
b530: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
b540: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
b550: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
b560: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
b570: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
b580: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
b590: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
b5a0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
b5b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
b5c0: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
b5d0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
b5e0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b5f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
b600: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
b610: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
b620: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
b630: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
b640: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
b650: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
b660: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b670: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
b680: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  e->locktype==0 )
b690: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b6a0: 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20  ock->cnt>0 );.  
b6b0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
b6c0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
b6d0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
b6e0: 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f  +;.    pFile->pO
b6f0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  pen->nLock++;.  
b700: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
b710: 0a 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  }..  lock.l_l
b720: 65 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b  en = 1L;..  lock
b730: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
b740: 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45  _SET;..  /* A PE
b750: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
b760: 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
b770: 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
b780: 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
b790: 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
b7a0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
b7b0: 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
b7c0: 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
b7d0: 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
b7e0: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
b7f0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
b800: 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
b810: 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
b820: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
b830: 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
b840: 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  e<PENDING_LOCK).
b850: 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f    ){.    lock.l_
b860: 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65  type = (locktype
b870: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
b880: 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
b890: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
b8a0: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
b8b0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70  .    s = fcntl(p
b8c0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b8d0: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
b8e0: 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ( s==(-1) ){.   
b8f0: 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d     rc = (errno==
b900: 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45  EINVAL) ? SQLITE
b910: 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f  _NOLFS : SQLITE_
b920: 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BUSY;.      goto
b930: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
b940: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
b950: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
b960: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
b970: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
b980: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
b990: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
b9a0: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
b9b0: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
b9c0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b9d0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b9e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b9f0: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b 0a  Lock->cnt==0 );.
ba00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
ba10: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29  k->locktype==0 )
ba20: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  ;..    /* Now ge
ba30: 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
ba40: 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  */.    lock.l_st
ba50: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
ba60: 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ST;.    lock.l_l
ba70: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
ba80: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
ba90: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
baa0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20  K, &lock);..    
bab0: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
bac0: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
bad0: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
bae0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
baf0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
bb00: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
bb10: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
bb20: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66  UNLCK;.    if( f
bb30: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
bb40: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d  _SETLK, &lock)!=
bb50: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
bb60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
bb70: 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20 73 68  OCK;  /* This sh
bb80: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
bb90: 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20  n */.      goto 
bba0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
bbb0: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
bbc0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65  ){.      rc = (e
bbd0: 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20  rrno==EINVAL) ? 
bbe0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53  SQLITE_NOLFS : S
bbf0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
bc00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
bc10: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53  le->locktype = S
bc20: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
bc30: 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e    pFile->pOpen->
bc40: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70  nLock++;.      p
bc50: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20  Lock->cnt = 1;. 
bc60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
bc70: 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
bc80: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  SIVE_LOCK && pLo
bc90: 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20  ck->cnt>1 ){.   
bca0: 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
bcb0: 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
bcc0: 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
bcd0: 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
bce0: 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 70  is.    ** same p
bcf0: 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
bd00: 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64  holding a shared
bd10: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63   lock. */.    rc
bd20: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
bd30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
bd40: 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20  The request was 
bd50: 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  for a RESERVED o
bd60: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
bd70: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20  .  It is.    ** 
bd80: 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
bd90: 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f  re is a SHARED o
bda0: 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
bdb0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  n the file.    *
bdc0: 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  * already..    *
bdd0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21  /.    assert( 0!
bde0: 3d 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  =pFile->locktype
bdf0: 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   );.    lock.l_t
be00: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
be10: 20 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74     switch( lockt
be20: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
be30: 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a  e RESERVED_LOCK:
be40: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
be50: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
be60: 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62  _BYTE;.        b
be70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be80: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
be90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
bea0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
beb0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
bec0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
bed0: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
bee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
bef0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73  ault:.        as
bf00: 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
bf10: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69     s = fcntl(pFi
bf20: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
bf30: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
bf40: 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  s==(-1) ){.     
bf50: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
bf60: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
bf70: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
bf80: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
bf90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bfa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
bfb0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
bfc0: 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
bfd0: 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
bfe0: 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
bff0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
c000: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
c010: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
c020: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
c030: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
c040: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
c050: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
c060: 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33  _lock:.  sqlite3
c070: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
c080: 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43 4b    OSTRACE4("LOCK
c090: 20 20 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c      %d %s %s\n",
c0a0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
c0b0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
c0c0: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
c0d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
c0e0: 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72 65   "failed");.  re
c0f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c100: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
c110: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
c120: 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
c130: 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  le to locktype. 
c140: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
c150: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
c160: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
c170: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
c180: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
c190: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
c1a0: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
c1b0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
c1c0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
c1d0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
c1e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
c1f0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
c200: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 4f  int unixUnlock(O
c210: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
c220: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 73 74 72 75  ocktype){.  stru
c230: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f  ct lockInfo *pLo
c240: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
c250: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
c260: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c270: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
c280: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
c290: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
c2a0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37  le );.  OSTRACE7
c2b0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
c2c0: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
c2d0: 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d=%d\n", pFile->
c2e0: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20  h, locktype,.   
c2f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
c300: 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  pe, pFile->pLock
c310: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
c320: 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20 67  e->pLock->cnt, g
c330: 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 61 73 73  etpid());..  ass
c340: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
c350: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
c360: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
c370: 79 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype<=locktype ){
c380: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c390: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
c3a0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
c3b0: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  pFile) ){.    re
c3c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
c3d0: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
c3e0: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
c3f0: 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
c400: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72  ->pLock;.  asser
c410: 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30  t( pLock->cnt!=0
c420: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
c430: 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
c440: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
c450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ert( pLock->lock
c460: 74 79 70 65 3d 3d 70 46 69 6c 65 2d 3e 6c 6f 63  type==pFile->loc
c470: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 28  ktype );.    if(
c480: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
c490: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
c4a0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
c4b0: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  RDLCK;.      loc
c4c0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
c4d0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
c4e0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
c4f0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
c500: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
c510: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
c520: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
c530: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
c540: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
c550: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
c560: 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
c570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
c580: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
c590: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
c5a0: 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
c5b0: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
c5c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
c5d0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
c5e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
c5f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
c600: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
c610: 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
c620: 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
c630: 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
c640: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
c650: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
c660: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
c670: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
c680: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
c690: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
c6a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c6b0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f  IOERR_UNLOCK;  /
c6c0: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
c6d0: 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  ver happen */.  
c6e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f    }.  }.  if( lo
c6f0: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
c700: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70  ){.    struct op
c710: 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20  enCnt *pOpen;.. 
c720: 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
c730: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
c740: 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
c750: 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
c760: 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
c770: 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
c780: 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
c790: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
c7a0: 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
c7b0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
c7c0: 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63   */.    pLock->c
c7d0: 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c  nt--;.    if( pL
c7e0: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
c7f0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
c800: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
c810: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c820: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c830: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c840: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
c850: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
c860: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
c870: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31  TLK, &lock)!=(-1
c880: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ) ){.        pLo
c890: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e  ck->locktype = N
c8a0: 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65  O_LOCK;.      }e
c8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
c8c0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
c8d0: 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54 68 69 73 20  NLOCK;  /* This 
c8e0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
c8f0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  pen */.      }. 
c900: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
c910: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
c920: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
c930: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
c940: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
c950: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
c960: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
c970: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
c980: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
c990: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
c9a0: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
c9b0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
c9c0: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
c9d0: 20 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e   pOpen = pFile->
c9e0: 70 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e  pOpen;.    pOpen
c9f0: 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61  ->nLock--;.    a
ca00: 73 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c  ssert( pOpen->nL
ca10: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
ca20: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d  ( pOpen->nLock==
ca30: 30 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  0 && pOpen->nPen
ca40: 64 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  ding>0 ){.      
ca50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
ca60: 28 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e  (i=0; i<pOpen->n
ca70: 50 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20  Pending; i++){. 
ca80: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70         close(pOp
ca90: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29  en->aPending[i])
caa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cab0: 66 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  free(pOpen->aPen
cac0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70  ding);.      pOp
cad0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
cae0: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
caf0: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
cb00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
cb10: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
cb20: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
cb30: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
cb40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cb50: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
cb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cb70: 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c 65  unixClose(OsFile
cb80: 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 46   **pId){.  unixF
cb90: 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78 46  ile *id = (unixF
cba0: 69 6c 65 2a 29 2a 70 49 64 3b 0a 0a 20 20 69 66  ile*)*pId;..  if
cbb0: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
cbc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
cbd0: 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f  Unlock(*pId, NO_
cbe0: 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d  LOCK);.  if( id-
cbf0: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
cc00: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
cc10: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
cc20: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
cc30: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28 20  Mutex();..  if( 
cc40: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
cc50: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
cc60: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
cc70: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
cc80: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
cc90: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
cca0: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
ccb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
ccc0: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
ccd0: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
cce0: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
ccf0: 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65  scriptor to pOpe
cd00: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  n->aPending.  It
cd10: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
cd20: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
cd30: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
cd40: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
cd50: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
cd60: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74  nt *aNew;.    st
cd70: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
cd80: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b  pen = id->pOpen;
cd90: 0a 20 20 20 20 61 4e 65 77 20 3d 20 72 65 61 6c  .    aNew = real
cda0: 6c 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  loc( pOpen->aPen
cdb0: 64 69 6e 67 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50  ding, (pOpen->nP
cdc0: 65 6e 64 69 6e 67 2b 31 29 2a 73 69 7a 65 6f 66  ending+1)*sizeof
cdd0: 28 69 6e 74 29 20 29 3b 0a 20 20 20 20 69 66 28  (int) );.    if(
cde0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
cdf0: 20 20 2f 2a 20 49 66 20 61 20 6d 61 6c 6c 6f 63    /* If a malloc
ce00: 20 66 61 69 6c 73 2c 20 6a 75 73 74 20 6c 65 61   fails, just lea
ce10: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
ce20: 69 70 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 65 6c  iptor */.    }el
ce30: 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  se{.      pOpen-
ce40: 3e 61 50 65 6e 64 69 6e 67 20 3d 20 61 4e 65 77  >aPending = aNew
ce50: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
ce60: 50 65 6e 64 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e  Pending[pOpen->n
ce70: 50 65 6e 64 69 6e 67 5d 20 3d 20 69 64 2d 3e 68  Pending] = id->h
ce80: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e  ;.      pOpen->n
ce90: 50 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d  Pending++;.    }
cea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ceb0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   There are no ou
cec0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
ced0: 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20  so we can close 
cee0: 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  the file immedia
cef0: 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  tely */.    clos
cf00: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20  e(id->h);.  }.  
cf10: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
cf20: 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65  id->pLock);.  re
cf30: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d  leaseOpenCnt(id-
cf40: 3e 70 4f 70 65 6e 29 3b 0a 0a 20 20 73 71 6c 69  >pOpen);..  sqli
cf50: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
cf60: 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20  );.  id->isOpen 
cf70: 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  = 0;.  OSTRACE2(
cf80: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
cf90: 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  , id->h);.  Open
cfa0: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73  Counter(-1);.  s
cfb0: 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65  qlite3ThreadSafe
cfc0: 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64  Free(id);.  *pId
cfd0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
cfe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
cff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d000: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
d010: 0a 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 41 46  .#pragma mark AF
d020: 50 20 53 75 70 70 6f 72 74 0a 0a 2f 2a 0a 20 2a  P Support../*. *
d030: 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67  * The afpLocking
d040: 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
d050: 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61  e contains all a
d060: 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63  fp lock specific
d070: 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64   state. */.typed
d080: 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63  ef struct afpLoc
d090: 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c  kingContext afpL
d0a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
d0b0: 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
d0c0: 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 73 69  Context {.  unsi
d0d0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
d0e0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 0a 20  haredLockByte;. 
d0f0: 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 3b   char *filePath;
d100: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65  .};..struct Byte
d110: 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20  RangeLockPB2.{. 
d120: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
d130: 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20  ong offset;     
d140: 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20     /* offset to 
d150: 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f  first byte to lo
d160: 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
d170: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
d180: 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72  h;        /* nbr
d190: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
d1a0: 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
d1b0: 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e  long long retRan
d1c0: 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20  geStart; /* nbr 
d1d0: 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b  of 1st byte lock
d1e0: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
d1f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d200: 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20  har unLockFlag; 
d210: 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75          /* 1 = u
d220: 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20  nlock, 0 = lock 
d230: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d240: 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b  ar startEndFlag;
d250: 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20         /* 1=rel 
d260: 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20  to end of fork, 
d270: 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a  0=rel to start *
d280: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65        /* file de
d2b0: 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73  sc to assoc this
d2c0: 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b   lock with */.};
d2d0: 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42  ..#define afpfsB
d2e0: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
d2f0: 54 4c 09 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  TL._IOWR('z', 23
d300: 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
d310: 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 20 72  geLockPB2)../* r
d320: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
d330: 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65  ss, 1 on failure
d340: 2e 20 20 54 6f 20 6d 61 74 63 68 20 74 68 65 20  .  To match the 
d350: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20  behavior of the 
d360: 0a 20 20 6e 6f 72 6d 61 6c 20 70 6f 73 69 78 20  .  normal posix 
d370: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 28 75 73  file locking (us
d380: 65 64 20 69 6e 20 75 6e 69 78 4c 6f 63 6b 20 66  ed in unixLock f
d390: 6f 72 20 65 78 61 6d 70 6c 65 29 2c 20 77 65 20  or example), we 
d3a0: 73 68 6f 75 6c 64 20 0a 20 20 70 72 6f 76 69 64  should .  provid
d3b0: 65 20 27 72 69 63 68 65 72 27 20 72 65 74 75 72  e 'richer' retur
d3c0: 6e 20 63 6f 64 65 73 20 2d 20 73 70 65 63 69 66  n codes - specif
d3d0: 69 63 61 6c 6c 79 20 74 6f 20 64 69 66 66 65 72  ically to differ
d3e0: 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a  entiate between.
d3f0: 20 20 27 66 69 6c 65 20 62 75 73 79 27 20 61 6e    'file busy' an
d400: 64 20 27 66 69 6c 65 20 73 79 73 74 65 6d 20 65  d 'file system e
d410: 72 72 6f 72 27 20 72 65 73 75 6c 74 73 20 2a 2f  rror' results */
d420: 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 41 46 50  .static int _AFP
d430: 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 73 74 20  FSSetLock(const 
d440: 63 68 61 72 20 2a 70 61 74 68 2c 20 69 6e 74 20  char *path, int 
d450: 66 64 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  fd, unsigned lon
d460: 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 0a  g long offset, .
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
d490: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
d4a0: 74 68 2c 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  th, int setLockF
d4b0: 6c 61 67 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  lag).{.  struct 
d4c0: 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
d4d0: 09 70 62 3b 0a 20 20 69 6e 74 20 20 20 20 20 20  .pb;.  int      
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
d4f0: 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
d500: 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
d510: 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
d520: 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
d530: 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
d540: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
d550: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
d560: 20 0a 20 20 70 62 2e 66 64 20 3d 20 66 64 3b 0a   .  pb.fd = fd;.
d570: 20 20 4f 53 54 52 41 43 45 35 28 22 41 46 50 4c    OSTRACE5("AFPL
d580: 4f 43 4b 20 73 65 74 74 69 6e 67 20 6c 6f 63 6b  OCK setting lock
d590: 20 25 73 20 66 6f 72 20 25 64 20 69 6e 20 72 61   %s for %d in ra
d5a0: 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
d5b0: 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
d5c0: 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
d5d0: 20 66 64 2c 20 6f 66 66 73 65 74 2c 20 6c 65 6e   fd, offset, len
d5e0: 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  gth);.  err = fs
d5f0: 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
d600: 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
d610: 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
d620: 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
d630: 20 20 20 20 4f 53 54 52 41 43 45 34 28 22 41 46      OSTRACE4("AF
d640: 50 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  PLOCK failed to 
d650: 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
d660: 25 73 5c 6e 22 2c 20 70 61 74 68 2c 20 65 72 72  %s\n", path, err
d670: 6e 6f 2c 20 0a 20 20 20 20 20 20 73 74 72 65 72  no, .      strer
d680: 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
d690: 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 65 72   return 1; /* er
d6a0: 72 6f 72 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20  ror */.  } else 
d6b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d6c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 54 68    }.}../*. ** Th
d6d0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
d6e0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
d6f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
d700: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
d710: 69 65 64 0a 20 2a 2a 20 66 69 6c 65 20 62 79 20  ied. ** file by 
d720: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
d730: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
d740: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
d750: 64 2c 20 72 65 74 75 72 6e 0a 20 2a 2a 20 6e 6f  d, return. ** no
d760: 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20  n-zero.  If the 
d770: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
d780: 20 6f 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53   or holds only S
d790: 48 41 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65  HARED locks, the
d7a0: 6e 0a 20 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72  n. ** return zer
d7b0: 6f 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  o.. */.static in
d7c0: 74 20 61 66 70 55 6e 69 78 43 68 65 63 6b 52 65  t afpUnixCheckRe
d7d0: 73 65 72 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c  servedLock(OsFil
d7e0: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 20  e *id){.  int r 
d7f0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
d800: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
d810: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73  le*)id;.  .  ass
d820: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 20 0a 20  ert( pFile ); . 
d830: 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
d840: 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
d850: 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
d860: 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
d870: 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
d880: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
d890: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
d8a0: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
d8b0: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
d8c0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
d8d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
d8e0: 20 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20     r = 1;.  }.  
d8f0: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
d900: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
d910: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
d920: 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28  it..   */.  if (
d930: 20 21 72 20 29 20 7b 0a 20 20 20 20 2f 2a 20 6c   !r ) {.    /* l
d940: 6f 63 6b 20 74 68 65 20 62 79 74 65 20 2a 2f 0a  ock the byte */.
d950: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
d960: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
d970: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
d980: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  , pFile->h, RESE
d990: 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
d9a0: 20 20 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65    .    if (faile
d9b0: 64 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  d) {.      /* if
d9c0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
d9d0: 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
d9e0: 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
d9f0: 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
da00: 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 20     r = 1;.    } 
da10: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
da20: 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
da30: 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
da40: 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
da50: 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
da60: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
da70: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
da80: 0a 20 20 20 20 20 20 5f 41 46 50 46 53 53 65 74  .      _AFPFSSet
da90: 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69  Lock(context->fi
daa0: 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68  lePath, pFile->h
dab0: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
dac0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
dad0: 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 45  }.  OSTRACE3("TE
dae0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
daf0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
db00: 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72  );.  .  return r
db10: 3b 0a 7d 0a 0a 2f 2a 20 41 46 50 2d 73 74 79 6c  ;.}../* AFP-styl
db20: 65 20 6c 6f 63 6b 69 6e 67 20 66 6f 6c 6c 6f 77  e locking follow
db30: 69 6e 67 20 74 68 65 20 62 65 68 61 76 69 6f 72  ing the behavior
db40: 20 6f 66 20 75 6e 69 78 4c 6f 63 6b 2c 20 73 65   of unixLock, se
db50: 65 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 20 0a  e the unixLock .
db60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 6d  ** function comm
db70: 65 6e 74 73 20 66 6f 72 20 64 65 74 61 69 6c 73  ents for details
db80: 20 6f 66 20 6c 6f 63 6b 20 6d 61 6e 61 67 65 6d   of lock managem
db90: 65 6e 74 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  ent. */.static i
dba0: 6e 74 20 61 66 70 55 6e 69 78 4c 6f 63 6b 28 4f  nt afpUnixLock(O
dbb0: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
dbc0: 6f 63 6b 74 79 70 65 29 0a 7b 0a 20 20 69 6e 74  ocktype).{.  int
dbd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dbe0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
dbf0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
dc00: 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
dc10: 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
dc20: 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
dc30: 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
dc40: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
dc50: 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
dc60: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 0a 20 20 61  Lock = 0;.  .  a
dc70: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
dc80: 20 20 4f 53 54 52 41 43 45 35 28 22 4c 4f 43 4b    OSTRACE5("LOCK
dc90: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
dca0: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
dcb0: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 6c  e->h,.         l
dcc0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
dcd0: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
dce0: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
dcf0: 79 70 65 29 2c 20 67 65 74 70 69 64 28 29 29 3b  ype), getpid());
dd00: 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65    .  /* If there
dd10: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
dd20: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
dd30: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
dd40: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ive on the.    *
dd50: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
dd60: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
dd70: 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  the afp_end_lock
dd80: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
dd90: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73      ** sqlite3Os
dda0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
ddb0: 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
ddc0: 79 65 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66  yet..    */.  if
ddd0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
dde0: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
ddf0: 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
de00: 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
de10: 6c 72 65 61 64 79 20 68 65 6c 64 29 5c 6e 22 2c  lready held)\n",
de20: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
de30: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61        locktypeNa
de40: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  me(locktype));. 
de50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
de60: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
de70: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
de80: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
de90: 20 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2f 0a   correct.    */.
dea0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
deb0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
dec0: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
ded0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
dee0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
def0: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
df00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
df10: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
df20: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
df30: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
df40: 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
df50: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
df60: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
df70: 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  le->pLock is sha
df80: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
df90: 64 73 0a 20 20 20 20 2a 2f 0a 20 20 73 71 6c 69  ds.    */.  sqli
dfa0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
dfb0: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  );..  /* Make su
dfc0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
dfd0: 68 72 65 61 64 20 6f 77 6e 73 20 74 68 65 20 70  hread owns the p
dfe0: 46 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 72  File..    */.  r
dff0: 63 20 3d 20 74 72 61 6e 73 66 65 72 4f 77 6e 65  c = transferOwne
e000: 72 73 68 69 70 28 70 46 69 6c 65 29 3b 0a 20 20  rship(pFile);.  
e010: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e020: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
e030: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
e040: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e050: 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
e060: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
e070: 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
e080: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
e090: 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
e0a0: 20 20 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67      ** acquiring
e0b0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
e0c0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
e0d0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
e0e0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 20 20 2a  NDING will.    *
e0f0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
e100: 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b     */.  if( lock
e110: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
e120: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
e130: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
e140: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
e150: 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47  locktype<PENDING
e160: 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 7b 0a  _LOCK).      ){.
e170: 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
e180: 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63   _AFPFSSetLock(c
e190: 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68  ontext->filePath
e1a0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20  , pFile->h, .   
e1b0: 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
e1c0: 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
e1d0: 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
e1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
e1f0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
e200: 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
e210: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
e220: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
e230: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
e240: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
e250: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 20 20  ad and make.    
e260: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
e270: 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
e280: 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
e290: 2e 0a 20 20 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ..    */.  if( l
e2a0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
e2b0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  LOCK ){.    int 
e2c0: 6c 6b 2c 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  lk, failed;.    
e2d0: 69 6e 74 20 74 72 69 65 73 20 3d 20 30 3b 0a 20  int tries = 0;. 
e2e0: 20 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67     .    /* Now g
e2f0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
e300: 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20   */.    /* note 
e310: 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79  that the quality
e320: 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65   of the randomne
e330: 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ss doesn't matte
e340: 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20  r that much */. 
e350: 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29     lk = random()
e360: 3b 20 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e  ; .    context->
e370: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
e380: 20 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66   (lk & 0x7ffffff
e390: 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
e3a0: 2d 20 31 29 3b 0a 20 20 20 20 66 61 69 6c 65 64  - 1);.    failed
e3b0: 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   = _AFPFSSetLock
e3c0: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e3d0: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 0a 20  th, pFile->h, . 
e3e0: 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
e3f0: 54 2b 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65  T+context->share
e400: 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
e410: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 44 72  ;.    .    /* Dr
e420: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
e430: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
e440: 0a 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53  .    if (_AFPFSS
e450: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
e460: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
e470: 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
e480: 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20 20  , 1, 0)) {.     
e490: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
e4a0: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
e4b0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
e4c0: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20   happen */.     
e4d0: 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
e4e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  ck;.    }.    . 
e4f0: 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
e500: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e510: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
e520: 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  lse {.      pFil
e530: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  e->locktype = SH
e540: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
e550: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e560: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
e570: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
e580: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
e590: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
e5a0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
e5b0: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
e5c0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
e5d0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
e5e0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
e5f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  */.    int faile
e600: 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  d = 0;.    asser
e610: 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 6c 6f 63  t( 0!=pFile->loc
e620: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69 66 20  ktype );.    if 
e630: 28 6c 6f 63 6b 74 79 70 65 20 3e 3d 20 52 45 53  (locktype >= RES
e640: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
e650: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20  ile->locktype < 
e660: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
e670: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
e680: 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
e690: 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
e6a0: 61 69 6c 65 64 20 3d 20 5f 41 46 50 46 53 53 65  ailed = _AFPFSSe
e6b0: 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 66  tLock(context->f
e6c0: 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  ilePath, pFile->
e6d0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
e6e0: 2c 20 31 2c 31 29 3b 0a 20 20 20 20 7d 0a 20 20  , 1,1);.    }.  
e6f0: 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
e700: 20 6c 6f 63 6b 74 79 70 65 20 3d 3d 20 45 58 43   locktype == EXC
e710: 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
e720: 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
e730: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
e740: 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
e750: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
e760: 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
e770: 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
e780: 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
e790: 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
e7a0: 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
e7b0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
e7c0: 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
e7d0: 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 0a 20   afpUnixUnlock. 
e7e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e7f0: 20 28 21 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b   (!_AFPFSSetLock
e800: 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61  (context->filePa
e810: 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48  th, pFile->h, SH
e820: 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 73        context->s
e850: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
e860: 2c 20 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20  , 0)) {.        
e870: 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
e880: 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
e890: 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
e8a0: 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
e8b0: 64 20 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63  d = _AFPFSSetLoc
e8c0: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
e8d0: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53  ath, pFile->h, S
e8e0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20  HARED_FIRST, .  
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
e910: 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20  RED_SIZE, 1);.  
e920: 20 20 20 20 20 20 69 66 20 28 66 61 69 6c 65 64        if (failed
e930: 20 26 26 20 5f 41 46 50 46 53 53 65 74 4c 6f 63   && _AFPFSSetLoc
e940: 6b 28 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50  k(context->fileP
e950: 61 74 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53  ath, pFile->h, S
e960: 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20  HARED_FIRST +.  
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65    context->share
e9a0: 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29  dLockByte, 1, 1)
e9b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ) {.          rc
e9c0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
e9d0: 52 44 4c 4f 43 4b 3b 20 2f 2a 20 74 68 69 73 20  RDLOCK; /* this 
e9e0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
e9f0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  pen */.        }
ea00: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
ea10: 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20          /* */.  
ea20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ea30: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
ea40: 2f 2a 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* this should n
ea50: 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20  ever happen */. 
ea60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ea70: 20 69 66 28 20 66 61 69 6c 65 64 20 26 26 20 72   if( failed && r
ea80: 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 7b  c == SQLITE_OK){
ea90: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
eaa0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
eab0: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
eac0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ead0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
eae0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d   = locktype;.  }
eaf0: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
eb00: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
eb10: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
eb20: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
eb30: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a  NG_LOCK;.  }.  .
eb40: 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  afp_end_lock:.  
eb50: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
eb60: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
eb70: 43 45 34 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE4("LOCK    %d 
eb80: 25 73 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %s %s\n", pFile-
eb90: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  >h, locktypeName
eba0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20  (locktype), .   
ebb0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
ebc0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
ebd0: 69 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e  iled");.  return
ebe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c   rc;.}../*. ** L
ebf0: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
ec00: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
ec10: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
ec20: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
ec30: 63 6b 74 79 70 65 0a 20 2a 2a 20 6d 75 73 74 20  cktype. ** must 
ec40: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
ec50: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
ec60: 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65  .. **. ** If the
ec70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ec80: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
ec90: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
eca0: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a   at or below. **
ecb0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
ecc0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
ecd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
ece0: 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69  no-op.. */.stati
ecf0: 63 20 69 6e 74 20 61 66 70 55 6e 69 78 55 6e 6c  c int afpUnixUnl
ed00: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
ed10: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
ed20: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ed30: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
ed40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
ed50: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
ed60: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
ed70: 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
ed80: 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
ed90: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
eda0: 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
edb0: 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73 73  gContext;..  ass
edc0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
edd0: 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b  OSTRACE5("UNLOCK
ede0: 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
edf0: 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  id=%d\n", pFile-
ee00: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
ee10: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
ee20: 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64 28 29  cktype, getpid()
ee30: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
ee40: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
ee50: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
ee60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d  File->locktype<=
ee70: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
ee80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ee90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43  ;.  }.  if( CHEC
eea0: 4b 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65  K_THREADID(pFile
eeb0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
eec0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
eed0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
eee0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
eef0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
ef00: 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  e>SHARED_LOCK ){
ef10: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
ef20: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
ef30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c  {.      int fail
ef40: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ed = 0;..      /
ef50: 2a 20 75 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63  * unlock the exc
ef60: 6c 75 73 69 76 65 20 72 61 6e 67 65 20 2d 20 74  lusive range - t
ef70: 68 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  hen re-establish
ef80: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
ef90: 20 2a 2f 0a 20 20 20 20 20 20 69 66 20 28 70 46   */.      if (pF
efa0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 45  ile->locktype==E
efb0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
efc0: 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20  .        failed 
efd0: 3d 20 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28  = _AFPFSSetLock(
efe0: 63 6f 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74  context->filePat
eff0: 68 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  h, pFile->h, SHA
f000: 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
f030: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
f040: 20 20 20 20 20 20 69 66 20 28 21 66 61 69 6c 65        if (!faile
f050: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d) {.          /
f060: 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  * successfully r
f070: 65 6d 6f 76 65 64 20 74 68 65 20 65 78 63 6c 75  emoved the exclu
f080: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  sive lock */.   
f090: 20 20 20 20 20 20 20 69 66 20 28 5f 41 46 50 46         if (_AFPF
f0a0: 53 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  SSetLock(context
f0b0: 2d 3e 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c  ->filePath, pFil
f0c0: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
f0d0: 53 54 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ST+.            
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 63 6f 6e 74 65 78 74 2d 3e 73 68 61 72 65 64 4c  context->sharedL
f100: 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 29 20  ockByte, 1, 1)) 
f110: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
f120: 20 66 61 69 6c 65 64 20 74 6f 20 72 65 2d 65 73   failed to re-es
f130: 74 61 62 6c 69 73 68 20 6f 75 72 20 73 68 61 72  tablish our shar
f140: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ed lock */.     
f150: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f160: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b  TE_IOERR_RDLOCK;
f170: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
f180: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
f190: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f1a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
f1b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73         /* This s
f1c0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
f1d0: 65 6e 20 2d 20 66 61 69 6c 65 64 20 74 6f 20 75  en - failed to u
f1e0: 6e 6c 6f 63 6b 20 74 68 65 20 65 78 63 6c 75 73  nlock the exclus
f1f0: 69 76 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20  ive range */.   
f200: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f210: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f220: 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
f230: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f240: 20 28 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f   (rc == SQLITE_O
f250: 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
f260: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
f270: 43 4b 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  CK) {.      if (
f280: 5f 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f  _AFPFSSetLock(co
f290: 6e 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c  ntext->filePath,
f2a0: 20 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49   pFile->h, PENDI
f2b0: 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 29 7b  NG_BYTE, 1, 0)){
f2c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 69 6c  .        /* fail
f2d0: 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  ed to release th
f2e0: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  e pending lock *
f2f0: 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
f300: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f310: 43 4b 3b 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  CK; /* This shou
f320: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
f330: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
f340: 20 0a 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20   .    if (rc == 
f350: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69  SQLITE_OK && pFi
f360: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
f370: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SERVED_LOCK) {. 
f380: 20 20 20 20 20 69 66 20 28 5f 41 46 50 46 53 53       if (_AFPFSS
f390: 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
f3a0: 66 69 6c 65 50 61 74 68 2c 20 70 46 69 6c 65 2d  filePath, pFile-
f3b0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
f3c0: 45 2c 20 31 2c 20 30 29 29 20 7b 0a 20 20 20 20  E, 1, 0)) {.    
f3d0: 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f      /* failed to
f3e0: 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 73   release the res
f3f0: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
f400: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f410: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
f420: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
f430: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
f440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20        }.    } . 
f450: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
f460: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e==NO_LOCK ){.  
f470: 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 5f    int failed = _
f480: 41 46 50 46 53 53 65 74 4c 6f 63 6b 28 63 6f 6e  AFPFSSetLock(con
f490: 74 65 78 74 2d 3e 66 69 6c 65 50 61 74 68 2c 20  text->filePath, 
f4a0: 70 46 69 6c 65 2d 3e 68 2c 20 0a 20 20 20 20 20  pFile->h, .     
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
f4d0: 5f 46 49 52 53 54 20 2b 20 63 6f 6e 74 65 78 74  _FIRST + context
f4e0: 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
f4f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 20  , 1, 0);.    if 
f500: 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
f510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f520: 52 52 5f 55 4e 4c 4f 43 4b 3b 20 20 2f 2a 20 54  RR_UNLOCK;  /* T
f530: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
f540: 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 7d   happen */.    }
f550: 0a 20 20 7d 0a 20 20 69 66 20 28 72 63 20 3d 3d  .  }.  if (rc ==
f560: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20   SQLITE_OK).    
f570: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
f580: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 73 71  = locktype;.  sq
f590: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
f5a0: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
f5b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
f5c0: 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e  e a file & clean
f5d0: 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20  up AFP specific 
f5e0: 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
f5f0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
f600: 61 66 70 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46  afpUnixClose(OsF
f610: 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75  ile **pId) {.  u
f620: 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75  nixFile *id = (u
f630: 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20  nixFile*)*pId;. 
f640: 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65   .  if( !id ) re
f650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f660: 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b 28    afpUnixUnlock(
f670: 2a 70 49 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  *pId, NO_LOCK);.
f680: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 41 46    /* free the AF
f690: 50 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  P locking struct
f6a0: 75 72 65 20 2a 2f 0a 20 20 69 66 20 28 69 64 2d  ure */.  if (id-
f6b0: 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
f6c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 69  != NULL) {.    i
f6d0: 66 20 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  f (((afpLockingC
f6e0: 6f 6e 74 65 78 74 20 2a 29 69 64 2d 3e 6c 6f 63  ontext *)id->loc
f6f0: 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 66 69  kingContext)->fi
f700: 6c 65 50 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a  lePath != NULL).
f710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 68 72        sqlite3Thr
f720: 65 61 64 53 61 66 65 46 72 65 65 28 28 28 61 66  eadSafeFree(((af
f730: 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a  pLockingContext*
f740: 29 69 64 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  )id->lockingCont
f750: 65 78 74 29 2d 3e 66 69 6c 65 50 61 74 68 29 3b  ext)->filePath);
f760: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 68 72 65  .    sqlite3Thre
f770: 61 64 53 61 66 65 46 72 65 65 28 69 64 2d 3e 6c  adSafeFree(id->l
f780: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
f790: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 69 64 2d    }.  .  if( id-
f7a0: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
f7b0: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
f7c0: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
f7d0: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a    close(id->h);.
f7e0: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30    id->isOpen = 0
f7f0: 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c  ;.  OSTRACE2("CL
f800: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
f810: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
f820: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
f830: 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72 65  te3ThreadSafeFre
f840: 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20  e(id);.  *pId = 
f850: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
f860: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 70 72 61 67  TE_OK;.}...#prag
f870: 6d 61 20 6d 61 72 6b 20 66 6c 6f 63 6b 28 29 20  ma mark flock() 
f880: 73 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 0a 0a 2f  style locking../
f890: 2a 0a 20 2a 2a 20 54 68 65 20 66 6c 6f 63 6b 4c  *. ** The flockL
f8a0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 73  ockingContext is
f8b0: 20 6e 6f 74 20 75 73 65 64 0a 20 2a 2f 0a 74 79   not used. */.ty
f8c0: 70 65 64 65 66 20 76 6f 69 64 20 66 6c 6f 63 6b  pedef void flock
f8d0: 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
f8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
f8f0: 6b 55 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76  kUnixCheckReserv
f900: 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  edLock(OsFile *i
f910: 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  d) {.  unixFile 
f920: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f930: 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 69 66 20  le*)id;.  .  if 
f940: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
f950: 20 3d 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   == RESERVED_LOC
f960: 4b 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K) {.    return 
f970: 31 3b 20 2f 2a 20 61 6c 72 65 61 64 79 20 68 61  1; /* already ha
f980: 76 65 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ve a reserved lo
f990: 63 6b 20 2a 2f 0a 20 20 7d 20 65 6c 73 65 20 7b  ck */.  } else {
f9a0: 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20  .    /* attempt 
f9b0: 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
f9c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
f9d0: 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
f9e0: 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
f9f0: 42 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  B);.    if (!rc)
fa00: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20   {.      /* got 
fa10: 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
fa20: 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 66 6c 6f   it */.      flo
fa30: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
fa40: 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 72 65 74  K_UN);.      ret
fa50: 75 72 6e 20 30 3b 20 20 2f 2a 20 6e 6f 20 6f 6e  urn 0;  /* no on
fa60: 65 20 68 61 73 20 69 74 20 72 65 73 65 72 76 65  e has it reserve
fa70: 64 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72  d */.    }.    r
fa80: 65 74 75 72 6e 20 31 3b 20 2f 2a 20 73 6f 6d 65  eturn 1; /* some
fa90: 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
faa0: 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
fab0: 2a 2f 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  */.  }.}..static
fac0: 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f   int flockUnixLo
fad0: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
fae0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
faf0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
fb00: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
fb10: 3b 0a 20 20 0a 20 20 2f 2a 20 69 66 20 77 65 20  ;.  .  /* if we 
fb20: 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
fb30: 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
fb40: 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
fb50: 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
fb60: 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
fb70: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
fb80: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
fb90: 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
fba0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
fbb0: 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
fbc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fbd0: 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
fbe0: 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
fbf0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 72   lock */.  int r
fc00: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
fc10: 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
fc20: 43 4b 5f 4e 42 29 3b 0a 20 20 69 66 20 28 72 63  CK_NB);.  if (rc
fc30: 29 20 7b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27  ) {.    /* didn'
fc40: 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62  t get, must be b
fc50: 75 73 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  usy */.    retur
fc60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
fc70: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
fc80: 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
fc90: 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
fca0: 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
fcb0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
fcc0: 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
fcd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
fce0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
fcf0: 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 28 4f  lockUnixUnlock(O
fd00: 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
fd10: 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
fd20: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
fd30: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
fd40: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
fd50: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
fd60: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
fd70: 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
fd80: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
fd90: 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b 74 79 70 65  cktype==locktype
fda0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fdb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
fdc0: 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
fdd0: 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
fde0: 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
fdf0: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
fe00: 20 2a 2f 0a 20 20 69 66 20 28 6c 6f 63 6b 74 79   */.  if (lockty
fe10: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  pe==SHARED_LOCK)
fe20: 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f   {.    pFile->lo
fe30: 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
fe40: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
fe50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
fe60: 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
fe70: 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e   unlock. */.  in
fe80: 74 20 72 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69  t rc = flock(pFi
fe90: 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
fea0: 0a 20 20 69 66 20 28 72 63 29 0a 20 20 20 20 72  .  if (rc).    r
feb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
fec0: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 65 6c 73  RR_UNLOCK;.  els
fed0: 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  e {.    pFile->l
fee0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
fef0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
ff00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
ff10: 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
ff20: 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
ff30: 69 6e 74 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f  int flockUnixClo
ff40: 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
ff50: 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 69   {.  unixFile *i
ff60: 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 2a  d = (unixFile*)*
ff70: 70 49 64 3b 0a 20 20 0a 20 20 69 66 28 20 21 69  pId;.  .  if( !i
ff80: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
ff90: 45 5f 4f 4b 3b 0a 20 20 66 6c 6f 63 6b 55 6e 69  E_OK;.  flockUni
ffa0: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
ffb0: 5f 4c 4f 43 4b 29 3b 0a 20 20 0a 20 20 69 66 28  _LOCK);.  .  if(
ffc0: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
ffd0: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
ffe0: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
fff0: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45  -1;.  sqlite3OsE
10000 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a  nterMutex();.  .
10010 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 20    close(id->h); 
10020 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61   .  sqlite3OsLea
10030 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d  veMutex();.  id-
10040 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  >isOpen = 0;.  O
10050 53 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 20  STRACE2("CLOSE  
10060 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29   %-3d\n", id->h)
10070 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
10080 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 68  -1);.  sqlite3Th
10090 72 65 61 64 53 61 66 65 46 72 65 65 28 69 64 29  readSafeFree(id)
100a0 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a 20 20  ;.  *pId = 0;.  
100b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
100c0 3b 0a 7d 0a 0a 23 70 72 61 67 6d 61 20 6d 61 72  ;.}..#pragma mar
100d0 6b 20 4f 6c 64 2d 53 63 68 6f 6f 6c 20 2e 6c 6f  k Old-School .lo
100e0 63 6b 20 66 69 6c 65 20 62 61 73 65 64 20 6c 6f  ck file based lo
100f0 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  cking../*. ** Th
10100 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
10110 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72  Context structur
10120 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 64  e contains all d
10130 6f 74 6c 6f 63 6b 20 28 2e 6c 6f 63 6b 29 20 6c  otlock (.lock) l
10140 6f 63 6b 0a 20 2a 2a 20 73 70 65 63 69 66 69 63  ock. ** specific
10150 20 73 74 61 74 65 0a 20 2a 2f 0a 74 79 70 65 64   state. */.typed
10160 65 66 20 73 74 72 75 63 74 20 64 6f 74 6c 6f 63  ef struct dotloc
10170 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10180 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10190 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 64 6f  ntext;.struct do
101a0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
101b0 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 6c 6f  ext {.  char *lo
101c0 63 6b 50 61 74 68 3b 0a 7d 3b 0a 0a 0a 73 74 61  ckPath;.};...sta
101d0 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
101e0 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
101f0 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
10200 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
10210 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10220 2a 29 69 64 3b 0a 20 20 64 6f 74 6c 6f 63 6b 4c  *)id;.  dotlockL
10230 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
10240 6f 6e 74 65 78 74 20 3d 20 0a 20 20 20 20 28 64  ontext = .    (d
10250 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
10260 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
10270 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
10280 20 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c   .  if (pFile->l
10290 6f 63 6b 74 79 70 65 20 3d 3d 20 52 45 53 45 52  ocktype == RESER
102a0 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
102b0 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 61 6c 72  return 1; /* alr
102c0 65 61 64 79 20 68 61 76 65 20 61 20 72 65 73 65  eady have a rese
102d0 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  rved lock */.  }
102e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 74 72 75   else {.    stru
102f0 63 74 20 73 74 61 74 20 73 74 61 74 42 75 66 3b  ct stat statBuf;
10300 0a 20 20 20 20 69 66 20 28 6c 73 74 61 74 28 63  .    if (lstat(c
10310 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61 74 68  ontext->lockPath
10320 2c 26 73 74 61 74 42 75 66 29 20 3d 3d 20 30 29  ,&statBuf) == 0)
10330 0a 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 65  .      /* file e
10340 78 69 73 74 73 2c 20 73 6f 6d 65 6f 6e 65 20 65  xists, someone e
10350 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
10360 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
10370 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a 20 20 20   1;.    else.   
10380 20 20 20 2f 2a 20 66 69 6c 65 20 64 6f 65 73 20     /* file does 
10390 6e 6f 74 20 65 78 69 73 74 2c 20 77 65 20 63 6f  not exist, we co
103a0 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
103b0 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
103c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
103d0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
103e0 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63 6b 28 4f  otlockUnixLock(O
103f0 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  sFile *id, int l
10400 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69  ocktype) {.  uni
10410 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10420 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10430 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
10440 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
10450 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63 6b 4c 6f   .    (dotlockLo
10460 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
10470 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
10480 6e 74 65 78 74 3b 0a 20 20 0a 20 20 2f 2a 20 69  ntext;.  .  /* i
10490 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
104a0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
104b0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
104c0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
104d0 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
104e0 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
104f0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if (pFile->lock
10500 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20  type > NO_LOCK) 
10510 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63  {.    pFile->loc
10520 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
10530 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 41 6c  ;.    .    /* Al
10540 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20  ways update the 
10550 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65  timestamp on the
10560 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20   old file */.   
10570 20 75 74 69 6d 65 73 28 63 6f 6e 74 65 78 74 2d   utimes(context-
10580 3e 6c 6f 63 6b 50 61 74 68 2c 4e 55 4c 4c 29 3b  >lockPath,NULL);
10590 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
105a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
105b0 2f 2a 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  /* check to see 
105c0 69 66 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  if lock file alr
105d0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
105e0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
105f0 74 42 75 66 3b 0a 20 20 69 66 20 28 6c 73 74 61  tBuf;.  if (lsta
10600 74 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50  t(context->lockP
10610 61 74 68 2c 26 73 74 61 74 42 75 66 29 20 3d 3d  ath,&statBuf) ==
10620 20 30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20   0){.    return 
10630 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 2f 2a 20  SQLITE_BUSY; /* 
10640 69 74 20 64 6f 65 73 2c 20 62 75 73 79 20 2a 2f  it does, busy */
10650 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
10660 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
10670 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 64 20  ock */.  int fd 
10680 3d 20 6f 70 65 6e 28 63 6f 6e 74 65 78 74 2d 3e  = open(context->
10690 6c 6f 63 6b 50 61 74 68 2c 4f 5f 52 44 4f 4e 4c  lockPath,O_RDONL
106a0 59 7c 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c  Y|O_CREAT|O_EXCL
106b0 2c 30 36 30 30 29 3b 0a 20 20 69 66 20 28 66 64  ,0600);.  if (fd
106c0 20 3c 20 30 29 20 7b 0a 20 20 20 20 2f 2a 20 66   < 0) {.    /* f
106d0 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
106e0 65 61 74 65 20 74 68 65 20 66 69 6c 65 2c 20 73  eate the file, s
106f0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 61 79 20  omeone else may 
10700 68 61 76 65 20 73 74 6f 6c 65 6e 20 74 68 65 20  have stolen the 
10710 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 72 65 74 75  lock */.    retu
10720 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 20  rn SQLITE_BUSY; 
10730 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 28 66 64 29  .  }.  close(fd)
10740 3b 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74  ;.  .  /* got it
10750 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
10760 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
10770 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
10780 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
107a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
107b0 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63  dotlockUnixUnloc
107c0 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
107d0 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20 20  t locktype) {.  
107e0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
107f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
10800 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  .  dotlockLockin
10810 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  gContext *contex
10820 74 20 3d 20 0a 20 20 20 20 28 64 6f 74 6c 6f 63  t = .    (dotloc
10830 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
10840 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
10850 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
10860 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
10870 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10880 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
10890 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
108a0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
108b0 70 65 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe==locktype ){.
108c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
108d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
108e0 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
108f0 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
10900 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
10910 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
10920 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    if (locktype==
10930 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
10940 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
10950 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
10960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10970 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
10980 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c   no, really, unl
10990 6f 63 6b 2e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  ock. */.  unlink
109a0 28 63 6f 6e 74 65 78 74 2d 3e 6c 6f 63 6b 50 61  (context->lockPa
109b0 74 68 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  th);.  pFile->lo
109c0 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
109d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
109e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
109f0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
10a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
10a10 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73  lockUnixClose(Os
10a20 46 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20  File **pId) {.  
10a30 75 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28  unixFile *id = (
10a40 75 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a  unixFile*)*pId;.
10a50 20 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72    .  if( !id ) r
10a60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10a70 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 55 6e  .  dotlockUnixUn
10a80 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f 5f 4c 4f  lock(*pId, NO_LO
10a90 43 4b 29 3b 0a 20 20 2f 2a 20 66 72 65 65 20 74  CK);.  /* free t
10aa0 68 65 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69  he dotlock locki
10ab0 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
10ac0 20 20 69 66 20 28 69 64 2d 3e 6c 6f 63 6b 69 6e    if (id->lockin
10ad0 67 43 6f 6e 74 65 78 74 20 21 3d 20 4e 55 4c 4c  gContext != NULL
10ae0 29 20 7b 0a 20 20 20 20 69 66 20 28 28 28 64 6f  ) {.    if (((do
10af0 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
10b00 65 78 74 20 2a 29 69 64 2d 3e 6c 6f 63 6b 69 6e  ext *)id->lockin
10b10 67 43 6f 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50  gContext)->lockP
10b20 61 74 68 20 21 3d 20 4e 55 4c 4c 29 0a 20 20 20  ath != NULL).   
10b30 20 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64     sqlite3Thread
10b40 53 61 66 65 46 72 65 65 28 20 28 20 28 64 6f 74  SafeFree( ( (dot
10b50 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  lockLockingConte
10b60 78 74 20 2a 29 0a 20 20 20 20 20 20 20 20 69 64  xt *).        id
10b70 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
10b80 29 2d 3e 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  )->lockPath);.  
10b90 20 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53    sqlite3ThreadS
10ba0 61 66 65 46 72 65 65 28 69 64 2d 3e 6c 6f 63 6b  afeFree(id->lock
10bb0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  ingContext);.  }
10bc0 0a 20 20 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  .  .  if( id->di
10bd0 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65 28 69  rfd>=0 ) close(i
10be0 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69 64 2d  d->dirfd);.  id-
10bf0 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 73  >dirfd = -1;.  s
10c00 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
10c10 65 78 28 29 3b 0a 20 20 0a 20 20 63 6c 6f 73 65  ex();.  .  close
10c20 28 69 64 2d 3e 68 29 3b 0a 20 20 0a 20 20 73 71  (id->h);.  .  sq
10c30 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
10c40 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65  x();.  id->isOpe
10c50 6e 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45  n = 0;.  OSTRACE
10c60 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
10c70 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
10c80 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
10c90 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61   sqlite3ThreadSa
10ca0 66 65 46 72 65 65 28 69 64 29 3b 0a 20 20 2a 70  feFree(id);.  *p
10cb0 49 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Id = 0;.  return
10cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
10cd0 23 70 72 61 67 6d 61 20 6d 61 72 6b 20 4e 6f 20  #pragma mark No 
10ce0 6c 6f 63 6b 69 6e 67 0a 0a 2f 2a 0a 20 2a 2a 20  locking../*. ** 
10cf0 54 68 65 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e  The nolockLockin
10d00 67 43 6f 6e 74 65 78 74 20 69 73 20 76 6f 69 64  gContext is void
10d10 0a 20 2a 2f 0a 74 79 70 65 64 65 66 20 76 6f 69  . */.typedef voi
10d20 64 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43  d nolockLockingC
10d30 6f 6e 74 65 78 74 3b 0a 0a 73 74 61 74 69 63 20  ontext;..static 
10d40 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68  int nolockUnixCh
10d50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
10d60 4f 73 46 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  OsFile *id) {.  
10d70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
10d80 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10d90 69 78 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69  ixLock(OsFile *i
10da0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
10db0 20 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   {.  return SQLI
10dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
10dd0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 69 78 55   int nolockUnixU
10de0 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64  nlock(OsFile *id
10df0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
10e00 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
10e10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  E_OK;.}../*. ** 
10e20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a  Close a file.. *
10e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
10e40 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 28 4f 73 46  ockUnixClose(OsF
10e50 69 6c 65 20 2a 2a 70 49 64 29 20 7b 0a 20 20 75  ile **pId) {.  u
10e60 6e 69 78 46 69 6c 65 20 2a 69 64 20 3d 20 28 75  nixFile *id = (u
10e70 6e 69 78 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20  nixFile*)*pId;. 
10e80 20 0a 20 20 69 66 28 20 21 69 64 20 29 20 72 65   .  if( !id ) re
10e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10ea0 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e    if( id->dirfd>
10eb0 3d 30 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64  =0 ) close(id->d
10ec0 69 72 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72  irfd);.  id->dir
10ed0 66 64 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74  fd = -1;.  sqlit
10ee0 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
10ef0 3b 0a 20 20 0a 20 20 63 6c 6f 73 65 28 69 64 2d  ;.  .  close(id-
10f00 3e 68 29 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  >h);.  .  sqlite
10f10 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
10f20 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20  .  id->isOpen = 
10f30 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 43  0;.  OSTRACE2("C
10f40 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
10f50 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f  id->h);.  OpenCo
10f60 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
10f70 69 74 65 33 54 68 72 65 61 64 53 61 66 65 46 72  ite3ThreadSafeFr
10f80 65 65 28 69 64 29 3b 0a 20 20 2a 70 49 64 20 3d  ee(id);.  *pId =
10f90 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
10fa0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
10fb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10fc0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10fd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20   */../*.** Turn 
10fe0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
10ff0 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
11000 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72  pathname.  Retur
11010 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
11020 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  o the full pathn
11030 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70  ame stored in sp
11040 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
11050 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
11060 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
11070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
11080 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65  ponsible for fre
11090 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20  eing this space 
110a0 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f  once it.** is no
110b0 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a   longer needed..
110c0 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
110d0 55 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  UnixFullPathname
110e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65  (const char *zRe
110f0 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20  lative){.  char 
11100 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66  *zFull = 0;.  if
11110 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
11120 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
11130 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75  e3SetString(&zFu
11140 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28  ll, zRelative, (
11150 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73  char*)0);.  }els
11160 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75  e{.    char *zBu
11170 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  f = sqliteMalloc
11180 28 35 30 30 30 29 3b 0a 20 20 20 20 69 66 28 20  (5000);.    if( 
11190 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
111a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
111b0 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30  .    zBuf[0] = 0
111c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
111d0 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67  String(&zFull, g
111e0 65 74 63 77 64 28 7a 42 75 66 2c 20 35 30 30 30  etcwd(zBuf, 5000
111f0 29 2c 20 22 2f 22 2c 20 7a 52 65 6c 61 74 69 76  ), "/", zRelativ
11200 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
11210 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
11220 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11230 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 0a 23 69 66  (zBuf);.  }..#if
11240 20 30 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 6d   0.  /*.  ** Rem
11250 6f 76 65 20 22 2f 2e 2f 22 20 70 61 74 68 20 65  ove "/./" path e
11260 6c 65 6d 65 6e 74 73 20 61 6e 64 20 63 6f 6e 76  lements and conv
11270 65 72 74 20 22 2f 41 2f 2e 2f 22 20 70 61 74 68  ert "/A/./" path
11280 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 74   elements.  ** t
11290 6f 20 6a 75 73 74 20 22 2f 22 2e 0a 20 20 2a 2f  o just "/"..  */
112a0 0a 20 20 69 66 28 20 7a 46 75 6c 6c 20 29 7b 0a  .  if( zFull ){.
112b0 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
112c0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 75    for(i=j=0; zFu
112d0 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
112e0 20 20 20 69 66 28 20 7a 46 75 6c 6c 5b 69 5d 3d     if( zFull[i]=
112f0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
11300 69 66 28 20 7a 46 75 6c 6c 5b 69 2b 31 5d 3d 3d  if( zFull[i+1]==
11310 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '/' ) continue;.
11320 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c          if( zFul
11330 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 7a  l[i+1]=='.' && z
11340 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  Full[i+2]=='/' )
11350 7b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  {.          i +=
11360 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   1;.          co
11370 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
11380 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  }.        if( zF
11390 75 6c 6c 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ull[i+1]=='.' &&
113a0 20 7a 46 75 6c 6c 5b 69 2b 32 5d 3d 3d 27 2e 27   zFull[i+2]=='.'
113b0 20 26 26 20 7a 46 75 6c 6c 5b 69 2b 33 5d 3d 3d   && zFull[i+3]==
113c0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '/' ){.         
113d0 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
113e0 46 75 6c 6c 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  Full[j-1]!='/' )
113f0 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
11400 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20     i += 3;.     
11410 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
11420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11430 0a 20 20 20 20 20 20 7a 46 75 6c 6c 5b 6a 2b 2b  .      zFull[j++
11440 5d 20 3d 20 7a 46 75 6c 6c 5b 69 5d 3b 0a 20 20  ] = zFull[i];.  
11450 20 20 7d 0a 20 20 20 20 7a 46 75 6c 6c 5b 6a 5d    }.    zFull[j]
11460 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
11470 0a 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  ..  return zFull
11480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
11490 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
114a0 68 65 20 66 75 6c 6c 73 79 6e 63 20 66 6c 61 67  he fullsync flag
114b0 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 66 69   in the given fi
114c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
114d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
114e0 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 28 4f 73  ixSetFullSync(Os
114f0 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 76 29  File *id, int v)
11500 7b 0a 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29  {.  ((unixFile*)
11510 69 64 29 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  id)->fullSync = 
11520 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  v;.}../*.** Retu
11530 72 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rn the underlyin
11540 67 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  g file handle fo
11550 72 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73  r an OsFile.*/.s
11560 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
11570 6c 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65 20  leHandle(OsFile 
11580 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  *id){.  return (
11590 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
115a0 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  h;.}../*.** Retu
115b0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  rn an integer th
115c0 61 74 20 69 6e 64 69 63 65 73 20 74 68 65 20 74  at indices the t
115d0 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
115e0 65 6e 74 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79  ently held.** by
115f0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 28   this handle.  (
11600 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
11610 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
11620 6c 79 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ly.).*/.static i
11630 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65  nt unixLockState
11640 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
11650 72 65 74 75 72 6e 20 28 28 75 6e 69 78 46 69 6c  return ((unixFil
11660 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
11670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11680 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
11690 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
116a0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
116b0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
116c0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
116d0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
116e0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
116f0 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
11700 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
11710 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
11720 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
11730 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
11740 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
11750 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
11760 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
11770 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
11780 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
11790 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
117a0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
117b0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 27  database and it'
117c0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
117d0 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
117e0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
117f0 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
11800 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
11810 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
11820 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72  OsFile *id){.  r
11830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
11840 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
11850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11860 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
11870 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
11880 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
11890 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  on an OsFile.** 
118a0 66 6f 72 20 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61  for unix..*/.sta
118b0 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65 74 68  tic const IoMeth
118c0 6f 64 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6f  od sqlite3UnixIo
118d0 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 75 6e 69  Method = {.  uni
118e0 78 43 6c 6f 73 65 2c 0a 20 20 75 6e 69 78 4f 70  xClose,.  unixOp
118f0 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 75  enDirectory,.  u
11900 6e 69 78 52 65 61 64 2c 0a 20 20 75 6e 69 78 57  nixRead,.  unixW
11910 72 69 74 65 2c 0a 20 20 75 6e 69 78 53 65 65 6b  rite,.  unixSeek
11920 2c 0a 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  ,.  unixTruncate
11930 2c 0a 20 20 75 6e 69 78 53 79 6e 63 2c 0a 20 20  ,.  unixSync,.  
11940 75 6e 69 78 53 65 74 46 75 6c 6c 53 79 6e 63 2c  unixSetFullSync,
11950 0a 20 20 75 6e 69 78 46 69 6c 65 48 61 6e 64 6c  .  unixFileHandl
11960 65 2c 0a 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  e,.  unixFileSiz
11970 65 2c 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20  e,.  unixLock,. 
11980 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75   unixUnlock,.  u
11990 6e 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20  nixLockState,.  
119a0 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
119b0 64 4c 6f 63 6b 2c 0a 20 20 75 6e 69 78 53 65 63  dLock,.  unixSec
119c0 74 6f 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 23 69 66  torSize,.};..#if
119d0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
119e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
119f0 2f 2a 0a 20 2a 2a 20 54 68 69 73 20 76 65 63 74  /*. ** This vect
11a00 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
11a10 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
11a20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
11a30 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a 20 66 6f 72  n OsFile. ** for
11a40 20 75 6e 69 78 20 77 69 74 68 20 41 46 50 20 73   unix with AFP s
11a50 74 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  tyle file lockin
11a60 67 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  g.. */.static co
11a70 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c  nst IoMethod sql
11a80 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67 55 6e  ite3AFPLockingUn
11a90 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  ixIoMethod = {. 
11aa0 20 20 20 61 66 70 55 6e 69 78 43 6c 6f 73 65 2c     afpUnixClose,
11ab0 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72  .    unixOpenDir
11ac0 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78  ectory,.    unix
11ad0 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72  Read,.    unixWr
11ae0 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65  ite,.    unixSee
11af0 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63  k,.    unixTrunc
11b00 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e  ate,.    unixSyn
11b10 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75  c,.    unixSetFu
11b20 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  llSync,.    unix
11b30 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20  FileHandle,.    
11b40 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
11b50 20 20 61 66 70 55 6e 69 78 4c 6f 63 6b 2c 0a 20    afpUnixLock,. 
11b60 20 20 20 61 66 70 55 6e 69 78 55 6e 6c 6f 63 6b     afpUnixUnlock
11b70 2c 0a 20 20 20 20 75 6e 69 78 4c 6f 63 6b 53 74  ,.    unixLockSt
11b80 61 74 65 2c 0a 20 20 20 20 61 66 70 55 6e 69 78  ate,.    afpUnix
11b90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11ba0 6b 2c 0a 20 20 20 20 75 6e 69 78 53 65 63 74 6f  k,.    unixSecto
11bb0 72 53 69 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  rSize,.};../*. *
11bc0 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
11bd0 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
11be0 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
11bf0 70 65 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46  perate on an OsF
11c00 69 6c 65 0a 20 2a 2a 20 66 6f 72 20 75 6e 69 78  ile. ** for unix
11c10 20 77 69 74 68 20 66 6c 6f 63 6b 28 29 20 73 74   with flock() st
11c20 79 6c 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  yle file locking
11c30 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  .. */.static con
11c40 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69  st IoMethod sqli
11c50 74 65 33 46 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55  te3FlockLockingU
11c60 6e 69 78 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  nixIoMethod = {.
11c70 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 43 6c 6f      flockUnixClo
11c80 73 65 2c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e  se,.    unixOpen
11c90 44 69 72 65 63 74 6f 72 79 2c 0a 20 20 20 20 75  Directory,.    u
11ca0 6e 69 78 52 65 61 64 2c 0a 20 20 20 20 75 6e 69  nixRead,.    uni
11cb0 78 57 72 69 74 65 2c 0a 20 20 20 20 75 6e 69 78  xWrite,.    unix
11cc0 53 65 65 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72  Seek,.    unixTr
11cd0 75 6e 63 61 74 65 2c 0a 20 20 20 20 75 6e 69 78  uncate,.    unix
11ce0 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78 53 65  Sync,.    unixSe
11cf0 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75  tFullSync,.    u
11d00 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  nixFileHandle,. 
11d10 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
11d20 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69 78 4c 6f  .    flockUnixLo
11d30 63 6b 2c 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 69  ck,.    flockUni
11d40 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e 69  xUnlock,.    uni
11d50 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20 20  xLockState,.    
11d60 66 6c 6f 63 6b 55 6e 69 78 43 68 65 63 6b 52 65  flockUnixCheckRe
11d70 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 20 20  servedLock,.    
11d80 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 0a  unixSectorSize,.
11d90 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68 69 73 20  };../*. ** This 
11da0 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
11db0 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
11dc0 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
11dd0 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a 20 2a 2a  on an OsFile. **
11de0 20 66 6f 72 20 75 6e 69 78 20 77 69 74 68 20 64   for unix with d
11df0 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20 66 69 6c  otlock style fil
11e00 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 2f 0a 73  e locking.. */.s
11e10 74 61 74 69 63 20 63 6f 6e 73 74 20 49 6f 4d 65  tatic const IoMe
11e20 74 68 6f 64 20 73 71 6c 69 74 65 33 44 6f 74 6c  thod sqlite3Dotl
11e30 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f  ockLockingUnixIo
11e40 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 20 20 64  Method = {.    d
11e50 6f 74 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c  otlockUnixClose,
11e60 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 44 69 72  .    unixOpenDir
11e70 65 63 74 6f 72 79 2c 0a 20 20 20 20 75 6e 69 78  ectory,.    unix
11e80 52 65 61 64 2c 0a 20 20 20 20 75 6e 69 78 57 72  Read,.    unixWr
11e90 69 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 65 65  ite,.    unixSee
11ea0 6b 2c 0a 20 20 20 20 75 6e 69 78 54 72 75 6e 63  k,.    unixTrunc
11eb0 61 74 65 2c 0a 20 20 20 20 75 6e 69 78 53 79 6e  ate,.    unixSyn
11ec0 63 2c 0a 20 20 20 20 75 6e 69 78 53 65 74 46 75  c,.    unixSetFu
11ed0 6c 6c 53 79 6e 63 2c 0a 20 20 20 20 75 6e 69 78  llSync,.    unix
11ee0 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 20 20  FileHandle,.    
11ef0 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20  unixFileSize,.  
11f00 20 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 4c 6f 63    dotlockUnixLoc
11f10 6b 2c 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e  k,.    dotlockUn
11f20 69 78 55 6e 6c 6f 63 6b 2c 0a 20 20 20 20 75 6e  ixUnlock,.    un
11f30 69 78 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 20  ixLockState,.   
11f40 20 64 6f 74 6c 6f 63 6b 55 6e 69 78 43 68 65 63   dotlockUnixChec
11f50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20  kReservedLock,. 
11f60 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
11f70 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2a 20 54 68  e,.};../*. ** Th
11f80 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
11f90 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
11fa0 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
11fb0 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c 65 0a  te on an OsFile.
11fc0 20 2a 2a 20 66 6f 72 20 75 6e 69 78 20 77 69 74   ** for unix wit
11fd0 68 20 64 6f 74 6c 6f 63 6b 20 73 74 79 6c 65 20  h dotlock style 
11fe0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 20 2a  file locking.. *
11ff0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 49  /.static const I
12000 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33 4e  oMethod sqlite3N
12010 6f 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 55 6e 69 78  olockLockingUnix
12020 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 6e  IoMethod = {.  n
12030 6f 6c 6f 63 6b 55 6e 69 78 43 6c 6f 73 65 2c 0a  olockUnixClose,.
12040 20 20 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74    unixOpenDirect
12050 6f 72 79 2c 0a 20 20 75 6e 69 78 52 65 61 64 2c  ory,.  unixRead,
12060 0a 20 20 75 6e 69 78 57 72 69 74 65 2c 0a 20 20  .  unixWrite,.  
12070 75 6e 69 78 53 65 65 6b 2c 0a 20 20 75 6e 69 78  unixSeek,.  unix
12080 54 72 75 6e 63 61 74 65 2c 0a 20 20 75 6e 69 78  Truncate,.  unix
12090 53 79 6e 63 2c 0a 20 20 75 6e 69 78 53 65 74 46  Sync,.  unixSetF
120a0 75 6c 6c 53 79 6e 63 2c 0a 20 20 75 6e 69 78 46  ullSync,.  unixF
120b0 69 6c 65 48 61 6e 64 6c 65 2c 0a 20 20 75 6e 69  ileHandle,.  uni
120c0 78 46 69 6c 65 53 69 7a 65 2c 0a 20 20 6e 6f 6c  xFileSize,.  nol
120d0 6f 63 6b 55 6e 69 78 4c 6f 63 6b 2c 0a 20 20 6e  ockUnixLock,.  n
120e0 6f 6c 6f 63 6b 55 6e 69 78 55 6e 6c 6f 63 6b 2c  olockUnixUnlock,
120f0 0a 20 20 75 6e 69 78 4c 6f 63 6b 53 74 61 74 65  .  unixLockState
12100 2c 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 69 78 43 68  ,.  nolockUnixCh
12110 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
12120 0a 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  .  unixSectorSiz
12130 65 2c 0a 7d 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  e,.};..#endif /*
12140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
12150 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
12160 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
12170 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
12180 20 75 6e 69 78 46 69 6c 65 20 61 6e 64 20 69 6e   unixFile and in
12190 69 74 69 61 6c 69 7a 65 20 74 68 61 74 20 75 6e  itialize that un
121a0 69 78 46 69 6c 65 2e 0a 2a 2a 20 57 72 69 74 65  ixFile..** Write
121b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
121c0 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 69  e new unixFile i
121d0 6e 74 6f 20 2a 70 49 64 2e 0a 2a 2a 20 49 66 20  nto *pId..** If 
121e0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
121f0 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20  mory, close the 
12200 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  file and return 
12210 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66  an error..*/.#if
12220 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12230 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
12240 2f 2a 20 0a 20 2a 2a 20 57 68 65 6e 20 6c 6f 63  /* . ** When loc
12250 6b 69 6e 67 20 65 78 74 65 6e 73 69 6f 6e 73 20  king extensions 
12260 61 72 65 20 65 6e 61 62 6c 65 64 2c 20 74 68 65  are enabled, the
12270 20 66 69 6c 65 70 61 74 68 20 61 6e 64 20 6c 6f   filepath and lo
12280 63 6b 69 6e 67 20 73 74 79 6c 65 20 0a 20 2a 2a  cking style . **
12290 20 61 72 65 20 6e 65 65 64 65 64 20 74 6f 20 64   are needed to d
122a0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
122b0 78 46 69 6c 65 20 70 4d 65 74 68 6f 64 20 74 6f  xFile pMethod to
122c0 20 75 73 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67   use for locking
122d0 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 20 2a 2a   operations.. **
122e0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 2d 73 74 79   The locking-sty
122f0 6c 65 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  le specific lock
12300 69 6e 67 43 6f 6e 74 65 78 74 20 64 61 74 61 20  ingContext data 
12310 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
12320 61 74 65 64 20 0a 20 2a 2a 20 61 6e 64 20 61 73  ated . ** and as
12330 73 69 67 6e 65 64 20 68 65 72 65 20 61 6c 73 6f  signed here also
12340 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
12350 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
12360 65 28 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  e(.  int h,     
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12380 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
12390 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
123a0 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 4f  ng opened */.  O
123b0 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 20 20 20  sFile **pId,    
123c0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
123d0 63 6f 6d 70 6c 65 74 65 64 20 69 6e 69 74 69 61  completed initia
123e0 6c 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 2a 2f  lization here */
123f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12400 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
12410 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
12420 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
12430 20 69 6e 74 20 64 65 6c 46 6c 61 67 20 20 20 20   int delFlag    
12440 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
12450 74 65 2d 6f 6e 2d 6f 72 2d 62 65 66 6f 72 65 2d  te-on-or-before-
12460 63 6c 6f 73 65 20 66 6c 61 67 20 2a 2f 0a 29 7b  close flag */.){
12470 0a 20 20 73 71 6c 69 74 65 33 4c 6f 63 6b 69 6e  .  sqlite3Lockin
12480 67 53 74 79 6c 65 20 6c 6f 63 6b 69 6e 67 53 74  gStyle lockingSt
12490 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  yle;.  unixFile 
124a0 2a 70 4e 65 77 3b 0a 20 20 75 6e 69 78 46 69 6c  *pNew;.  unixFil
124b0 65 20 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  e f;.  int rc;..
124c0 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20    memset(&f, 0, 
124d0 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20 6c 6f  sizeof(f));.  lo
124e0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 73 71 6c  ckingStyle = sql
124f0 69 74 65 33 44 65 74 65 63 74 4c 6f 63 6b 69 6e  ite3DetectLockin
12500 67 53 74 79 6c 65 28 7a 46 69 6c 65 6e 61 6d 65  gStyle(zFilename
12510 2c 20 68 29 3b 0a 20 20 69 66 20 28 20 6c 6f 63  , h);.  if ( loc
12520 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 70 6f 73  kingStyle == pos
12530 69 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 29  ixLockingStyle )
12540 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   {.    sqlite3Os
12550 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
12560 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
12570 6e 66 6f 28 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c  nfo(h, &f.pLock,
12580 20 26 66 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20   &f.pOpen);.    
12590 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
125a0 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 72  tex();.    if( r
125b0 63 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65  c ){.      close
125c0 28 68 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  (h);.      unlin
125d0 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
125e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
125f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
12600 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
12610 20 20 70 4c 6f 63 6b 20 61 6e 64 20 70 4f 70 65    pLock and pOpe
12620 6e 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  n are only used 
12630 66 6f 72 20 70 6f 73 69 78 20 61 64 76 69 73 6f  for posix adviso
12640 72 79 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  ry locking */.  
12650 20 20 66 2e 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c    f.pLock = NULL
12660 3b 0a 20 20 20 20 66 2e 70 4f 70 65 6e 20 3d 20  ;.    f.pOpen = 
12670 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  NULL;.  }.  if( 
12680 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75  delFlag ){.    u
12690 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
126a0 3b 0a 20 20 7d 0a 20 20 66 2e 64 69 72 66 64 20  ;.  }.  f.dirfd 
126b0 3d 20 2d 31 3b 0a 20 20 66 2e 68 20 3d 20 68 3b  = -1;.  f.h = h;
126c0 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
126d0 26 66 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  &f);.  pNew = sq
126e0 6c 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d  lite3ThreadSafeM
126f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e  alloc( sizeof(un
12700 69 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  ixFile) );.  if(
12710 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
12720 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 73 71  close(h);.    sq
12730 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
12740 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
12750 4c 6f 63 6b 49 6e 66 6f 28 66 2e 70 4c 6f 63 6b  LockInfo(f.pLock
12760 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
12770 65 6e 43 6e 74 28 66 2e 70 4f 70 65 6e 29 3b 0a  enCnt(f.pOpen);.
12780 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
12790 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 2a  veMutex();.    *
127a0 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  pId = 0;.    ret
127b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
127c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
127d0 70 4e 65 77 20 3d 20 66 3b 0a 20 20 20 20 73 77  pNew = f;.    sw
127e0 69 74 63 68 28 6c 6f 63 6b 69 6e 67 53 74 79 6c  itch(lockingStyl
127f0 65 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e) {.      case 
12800 61 66 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a  afpLockingStyle:
12810 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 66   {.        /* af
12820 70 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  p locking uses t
12830 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
12840 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69  it needs to be i
12850 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 20  ncluded in.     
12860 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
12870 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 2f 0a 20  kingContext */. 
12880 20 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65         int nFile
12890 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  name;.        pN
128a0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73  ew->pMethod = &s
128b0 71 6c 69 74 65 33 41 46 50 4c 6f 63 6b 69 6e 67  qlite3AFPLocking
128c0 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
128d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
128e0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 0a 20 20  ingContext = .  
128f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
12900 68 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28  hreadSafeMalloc(
12910 73 69 7a 65 6f 66 28 61 66 70 4c 6f 63 6b 69 6e  sizeof(afpLockin
12920 67 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 20 20  gContext));.    
12930 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
12940 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
12950 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 28 28 61  )+1;.        ((a
12960 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
12970 20 2a 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67   *)pNew->locking
12980 43 6f 6e 74 65 78 74 29 2d 3e 66 69 6c 65 50 61  Context)->filePa
12990 74 68 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  th = .          
129a0 73 71 6c 69 74 65 33 54 68 72 65 61 64 53 61 66  sqlite3ThreadSaf
129b0 65 4d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  eMalloc(nFilenam
129c0 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  e);.        memc
129d0 70 79 28 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43  py(((afpLockingC
129e0 6f 6e 74 65 78 74 20 2a 29 70 4e 65 77 2d 3e 6c  ontext *)pNew->l
129f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e  ockingContext)->
12a00 66 69 6c 65 50 61 74 68 2c 20 0a 20 20 20 20 20  filePath, .     
12a10 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
12a20 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
12a30 0a 20 20 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  .        srandom
12a40 64 65 76 28 29 3b 0a 20 20 20 20 20 20 20 20 62  dev();.        b
12a50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12a60 20 20 20 20 63 61 73 65 20 66 6c 6f 63 6b 4c 6f      case flockLo
12a70 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20  ckingStyle:.    
12a80 20 20 20 20 2f 2a 20 66 6c 6f 63 6b 20 6c 6f 63      /* flock loc
12a90 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20 6e 65 65  king doesn't nee
12aa0 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  d additional loc
12ab0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69 6e 66 6f  kingContext info
12ac0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  rmation */.     
12ad0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
12ae0 20 3d 20 26 73 71 6c 69 74 65 33 46 6c 6f 63 6b   = &sqlite3Flock
12af0 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12b00 68 6f 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  hod;.        bre
12b10 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 64  ak;.      case d
12b20 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 53 74 79  otlockLockingSty
12b30 6c 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  le: {.        /*
12b40 20 64 6f 74 6c 6f 63 6b 20 6c 6f 63 6b 69 6e 67   dotlock locking
12b50 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
12b60 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
12b70 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
12b80 6e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  n.         ** th
12b90 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
12ba0 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 20  Context */.     
12bb0 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
12bc0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
12bd0 70 4d 65 74 68 6f 64 20 3d 20 26 73 71 6c 69 74  pMethod = &sqlit
12be0 65 33 44 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e3DotlockLocking
12bf0 55 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  UnixIoMethod;.  
12c00 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b        pNew->lock
12c10 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 73 71 6c  ingContext = sql
12c20 69 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61  ite3ThreadSafeMa
12c30 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
12c40 73 69 7a 65 6f 66 28 64 6f 74 6c 6f 63 6b 4c 6f  sizeof(dotlockLo
12c50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 29 3b 0a  ckingContext));.
12c60 20 20 20 20 20 20 20 20 6e 46 69 6c 65 6e 61 6d          nFilenam
12c70 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
12c80 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 20  name) + 6;.     
12c90 20 20 20 28 28 64 6f 74 6c 6f 63 6b 4c 6f 63 6b     ((dotlockLock
12ca0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 4e 65  ingContext *)pNe
12cb0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
12cc0 74 29 2d 3e 6c 6f 63 6b 50 61 74 68 20 3d 20 0a  t)->lockPath = .
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12ce0 74 65 33 54 68 72 65 61 64 53 61 66 65 4d 61 6c  te3ThreadSafeMal
12cf0 6c 6f 63 28 20 6e 46 69 6c 65 6e 61 6d 65 20 29  loc( nFilename )
12d00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12d10 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
12d20 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 20  name, .         
12d30 20 20 20 20 20 20 20 28 28 64 6f 74 6c 6f 63 6b         ((dotlock
12d40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
12d50 29 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  )pNew->lockingCo
12d60 6e 74 65 78 74 29 2d 3e 6c 6f 63 6b 50 61 74 68  ntext)->lockPath
12d70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
12d80 20 20 20 22 25 73 2e 6c 6f 63 6b 22 2c 20 7a 46     "%s.lock", zF
12d90 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
12da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
12db0 0a 20 20 20 20 20 20 63 61 73 65 20 70 6f 73 69  .      case posi
12dc0 78 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3a 0a 20  xLockingStyle:. 
12dd0 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 78 20         /* posix 
12de0 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 6e 27 74 20  locking doesn't 
12df0 6e 65 65 64 20 61 64 64 69 74 69 6f 6e 61 6c 20  need additional 
12e00 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 69  lockingContext i
12e10 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
12e20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74        pNew->pMet
12e30 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55 6e  hod = &sqlite3Un
12e40 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20  ixIoMethod;.    
12e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12e60 20 63 61 73 65 20 6e 6f 4c 6f 63 6b 69 6e 67 53   case noLockingS
12e70 74 79 6c 65 3a 0a 20 20 20 20 20 20 63 61 73 65  tyle:.      case
12e80 20 75 6e 73 75 70 70 6f 72 74 65 64 4c 6f 63 6b   unsupportedLock
12e90 69 6e 67 53 74 79 6c 65 3a 0a 20 20 20 20 20 20  ingStyle:.      
12ea0 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 20 20  default: .      
12eb0 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
12ec0 3d 20 26 73 71 6c 69 74 65 33 4e 6f 6c 6f 63 6b  = &sqlite3Nolock
12ed0 4c 6f 63 6b 69 6e 67 55 6e 69 78 49 6f 4d 65 74  LockingUnixIoMet
12ee0 68 6f 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  hod;.    }.    *
12ef0 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70  pId = (OsFile*)p
12f00 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75  New;.    OpenCou
12f10 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 72 65  nter(+1);.    re
12f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12f30 20 20 7d 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 53    }.}.#else /* S
12f40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
12f50 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 73 74  KING_STYLE */.st
12f60 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
12f70 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 69 6e 74  eUnixFile(.  int
12f80 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   h,             
12f90 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
12fa0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 66   descriptor on f
12fb0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
12fc0 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70   */.  OsFile **p
12fd0 49 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id,          /* 
12fe0 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 20  Write the resul 
12ff0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
13000 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
13010 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
13020 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me, /* Name of t
13030 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
13040 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  ened */.  int de
13050 6c 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  lFlag           
13060 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 64 65 6c   /* If true, del
13070 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ete the file on 
13080 6f 72 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  or before closin
13090 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  g */.){.  unixFi
130a0 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 75 6e 69 78  le *pNew;.  unix
130b0 46 69 6c 65 20 66 3b 0a 20 20 69 6e 74 20 72 63  File f;.  int rc
130c0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  ;..  memset(&f, 
130d0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
130e0 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
130f0 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66  utex();.  rc = f
13100 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 68 2c 20 26  indLockInfo(h, &
13110 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70 65  f.pLock, &f.pOpe
13120 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c  n);.  sqlite3OsL
13130 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
13140 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
13150 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
13160 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  me);.  }.  if( r
13170 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  c ){.    close(h
13180 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13190 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
131a0 20 20 4f 53 54 52 41 43 45 33 28 22 4f 50 45 4e    OSTRACE3("OPEN
131b0 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
131c0 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  h, zFilename);. 
131d0 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20   f.dirfd = -1;. 
131e0 20 66 2e 68 20 3d 20 68 3b 0a 20 20 53 45 54 5f   f.h = h;.  SET_
131f0 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20 20  THREADID(&f);.  
13200 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 54 68  pNew = sqlite3Th
13210 72 65 61 64 53 61 66 65 4d 61 6c 6c 6f 63 28 20  readSafeMalloc( 
13220 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
13230 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
13240 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 68  0 ){.    close(h
13250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
13260 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13270 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
13280 6f 28 66 2e 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  o(f.pLock);.    
13290 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 66  releaseOpenCnt(f
132a0 2e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c  .pOpen);.    sql
132b0 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
132c0 28 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 30  ();.    *pId = 0
132d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
132e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
132f0 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d 20  se{.    *pNew = 
13300 66 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  f;.    pNew->pMe
13310 74 68 6f 64 20 3d 20 26 73 71 6c 69 74 65 33 55  thod = &sqlite3U
13320 6e 69 78 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 20  nixIoMethod;.   
13330 20 2a 70 49 64 20 3d 20 28 4f 73 46 69 6c 65 2a   *pId = (OsFile*
13340 29 70 4e 65 77 3b 0a 20 20 20 20 4f 70 65 6e 43  )pNew;.    OpenC
13350 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20  ounter(+1);.    
13360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13370 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
13380 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
13390 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
133a0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
133b0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
133c0 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
133d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
133f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13410 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f  * Everything abo
13420 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69  ve deals with fi
13430 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68  le I/O.  Everyth
13440 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ing that follows
13450 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f   deals.** with o
13460 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75  ther miscellanou
13470 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65  s aspects of the
13480 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
13490 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a  m interface.****
134a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 0a 23 69 66 6e  ********/...#ifn
134f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13500 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
13510 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
13520 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
13530 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
13540 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
13550 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
13560 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
13570 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
13580 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
13590 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
135a0 66 63 6e 2e 68 3e 0a 76 6f 69 64 20 2a 73 71 6c  fcn.h>.void *sql
135b0 69 74 65 33 55 6e 69 78 44 6c 6f 70 65 6e 28 63  ite3UnixDlopen(c
135c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
135d0 6e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  name){.  return 
135e0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
135f0 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
13600 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 76 6f 69  D_GLOBAL);.}.voi
13610 64 20 2a 73 71 6c 69 74 65 33 55 6e 69 78 44 6c  d *sqlite3UnixDl
13620 73 79 6d 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c  sym(void *pHandl
13630 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
13640 53 79 6d 62 6f 6c 29 7b 0a 20 20 72 65 74 75 72  Symbol){.  retur
13650 6e 20 64 6c 73 79 6d 28 70 48 61 6e 64 6c 65 2c  n dlsym(pHandle,
13660 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 69 6e 74   zSymbol);.}.int
13670 20 73 71 6c 69 74 65 33 55 6e 69 78 44 6c 63 6c   sqlite3UnixDlcl
13680 6f 73 65 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c  ose(void *pHandl
13690 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 6c 63  e){.  return dlc
136a0 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d  lose(pHandle);.}
136b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
136c0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
136d0 4e 53 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NSION */../*.** 
136e0 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
136f0 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
13700 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
13710 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
13720 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
13730 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
13740 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
13750 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
13760 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
13770 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
13780 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
13790 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64   sqlite3UnixRand
137a0 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
137b0 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
137c0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
137d0 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
137e0 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
137f0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
13800 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
13810 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
13820 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
13830 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
13840 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
13850 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
13860 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
13870 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
13880 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
13890 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
138a0 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
138b0 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
138c0 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
138d0 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
138e0 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
138f0 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
13900 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
13910 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
13920 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
13930 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
13940 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
13950 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
13960 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
13970 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
13980 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
13990 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
139a0 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
139b0 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
139c0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
139d0 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
139e0 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
139f0 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
13a00 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
13a10 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
13a20 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
13a30 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69  Buf, 0, 256);.#i
13a40 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13a50 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
13a60 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
13a70 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
13a80 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
13a90 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
13aa0 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
13ab0 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
13ac0 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
13ad0 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
13ae0 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
13af0 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
13b00 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
13b10 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  f[sizeof(time_t)
13b20 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
13b30 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
13b40 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
13b50 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20   zBuf, 256);.   
13b60 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
13b70 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13b90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
13ba0 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
13bb0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
13bc0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
13bd0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
13be0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
13bf0 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
13c00 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
13c10 20 73 6c 65 65 70 2e 0a 2a 2f 0a 69 6e 74 20 73   sleep..*/.int s
13c20 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28  qlite3UnixSleep(
13c30 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66  int ms){.#if def
13c40 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
13c50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
13c60 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30  .  usleep(ms*100
13c70 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  0);.  return ms;
13c80 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28  .#else.  sleep((
13c90 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ms+999)/1000);. 
13ca0 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d   return 1000*((m
13cb0 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65  s+999)/1000);.#e
13cc0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  ndif.}../*.** St
13cd0 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
13ce0 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
13cf0 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 2e 0a  ynchronization..
13d00 2a 2a 0a 2a 2a 20 69 6e 4d 75 74 65 78 20 20 20  **.** inMutex   
13d10 20 20 20 74 68 65 20 6e 65 73 74 69 6e 67 20 64     the nesting d
13d20 65 70 74 68 20 6f 66 20 74 68 65 20 72 65 63 75  epth of the recu
13d30 72 73 69 76 65 20 6d 75 74 65 78 2e 20 20 54 68  rsive mutex.  Th
13d40 65 20 74 68 72 65 61 64 0a 2a 2a 20 20 20 20 20  e thread.**     
13d50 20 20 20 20 20 20 20 20 20 68 6f 6c 64 69 6e 67           holding
13d60 20 6d 75 74 65 78 4d 61 69 6e 20 63 61 6e 20 72   mutexMain can r
13d70 65 61 64 20 74 68 69 73 20 76 61 72 69 61 62 6c  ead this variabl
13d80 65 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 0a 2a  e at any time..*
13d90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42  *              B
13da0 75 74 20 69 73 20 6d 75 73 74 20 68 6f 6c 64 20  ut is must hold 
13db0 6d 75 74 65 78 41 75 78 20 74 6f 20 63 68 61 6e  mutexAux to chan
13dc0 67 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ge this variable
13dd0 2e 20 20 4f 74 68 65 72 0a 2a 2a 20 20 20 20 20  .  Other.**     
13de0 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73           threads
13df0 20 6d 75 73 74 20 68 6f 6c 64 20 6d 75 74 65 78   must hold mutex
13e00 41 75 78 20 74 6f 20 72 65 61 64 20 74 68 65 20  Aux to read the 
13e10 76 61 72 69 61 62 6c 65 20 61 6e 64 20 63 61 6e  variable and can
13e20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13e30 20 6e 65 76 65 72 20 77 72 69 74 65 2e 0a 2a 2a   never write..**
13e40 0a 2a 2a 20 6d 75 74 65 78 4f 77 6e 65 72 20 20  .** mutexOwner  
13e50 20 54 68 65 20 74 68 72 65 61 64 20 69 64 20 6f   The thread id o
13e60 66 20 74 68 65 20 74 68 72 65 61 64 20 68 6f 6c  f the thread hol
13e70 64 69 6e 67 20 6d 75 74 65 78 4d 61 69 6e 2e 20  ding mutexMain. 
13e80 20 53 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20   Same.**        
13e90 20 20 20 20 20 20 61 63 63 65 73 73 20 72 75 6c        access rul
13ea0 65 73 20 61 73 20 66 6f 72 20 69 6e 4d 75 74 65  es as for inMute
13eb0 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74 65 78 4f 77  x..**.** mutexOw
13ec0 6e 65 72 56 61 6c 69 64 20 20 20 54 72 75 65 20  nerValid   True 
13ed0 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
13ee0 6d 75 74 65 78 4f 77 6e 65 72 20 69 73 20 76 61  mutexOwner is va
13ef0 6c 69 64 2e 20 20 54 68 65 20 73 61 6d 65 0a 2a  lid.  The same.*
13f00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13f10 20 20 20 20 61 63 63 65 73 73 20 72 75 6c 65 73      access rules
13f20 20 61 70 70 6c 79 20 61 73 20 66 6f 72 20 69 6e   apply as for in
13f30 4d 75 74 65 78 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74  Mutex..**.** mut
13f40 65 78 4d 61 69 6e 20 20 20 20 54 68 65 20 6d 61  exMain    The ma
13f50 69 6e 20 6d 75 74 65 78 2e 20 20 48 6f 6c 64 20  in mutex.  Hold 
13f60 74 68 69 73 20 6d 75 74 65 78 20 69 6e 20 6f 72  this mutex in or
13f70 64 65 72 20 74 6f 20 67 65 74 20 65 78 63 6c 75  der to get exclu
13f80 73 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  sive.**         
13f90 20 20 20 20 20 61 63 63 65 73 73 20 74 6f 20 53       access to S
13fa0 51 4c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  QLite data struc
13fb0 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 6d 75 74  tures..**.** mut
13fc0 65 78 41 75 78 20 20 20 20 20 41 6e 20 61 75 78  exAux     An aux
13fd0 69 6c 69 61 72 79 20 6d 75 74 65 78 20 6e 65 65  iliary mutex nee
13fe0 64 65 64 20 74 6f 20 61 63 63 65 73 73 20 76 61  ded to access va
13ff0 72 69 61 62 6c 65 73 20 64 65 66 69 6e 65 64 20  riables defined 
14000 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 4d 75 74  above..**.** Mut
14010 65 78 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  exes are always 
14020 61 63 71 75 69 72 65 64 20 69 6e 20 74 68 69 73  acquired in this
14030 20 6f 72 64 65 72 3a 20 6d 75 74 65 78 4d 61 69   order: mutexMai
14040 6e 20 6d 75 74 65 78 41 75 78 2e 20 20 20 49 74  n mutexAux.   It
14050 0a 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  .** is not neces
14060 73 61 72 79 20 74 6f 20 61 63 71 75 69 72 65 20  sary to acquire 
14070 6d 75 74 65 78 4d 61 69 6e 20 69 6e 20 6f 72 64  mutexMain in ord
14080 65 72 20 74 6f 20 67 65 74 20 6d 75 74 65 78 41  er to get mutexA
14090 75 78 20 2d 20 6a 75 73 74 0a 2a 2a 20 64 6f 20  ux - just.** do 
140a0 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 61  not attempt to a
140b0 63 71 75 69 72 65 20 74 68 65 6d 20 69 6e 20 74  cquire them in t
140c0 68 65 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  he reverse order
140d0 3a 20 6d 75 74 65 78 41 75 78 20 6d 75 74 65 78  : mutexAux mutex
140e0 4d 61 69 6e 2e 0a 2a 2a 20 45 69 74 68 65 72 20  Main..** Either 
140f0 67 65 74 20 74 68 65 20 6d 75 74 65 78 65 73 20  get the mutexes 
14100 77 69 74 68 20 6d 75 74 65 78 4d 61 69 6e 20 66  with mutexMain f
14110 69 72 73 74 20 6f 72 20 67 65 74 20 6d 75 74 65  irst or get mute
14120 78 41 75 78 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  xAux only..**.**
14130 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
14140 20 61 20 70 6c 61 74 66 6f 72 6d 20 77 68 65 72   a platform wher
14150 65 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  e the three vari
14160 61 62 6c 65 73 20 69 6e 4d 75 74 65 78 2c 20 6d  ables inMutex, m
14170 75 74 65 78 4f 77 6e 65 72 2c 0a 2a 2a 20 61 6e  utexOwner,.** an
14180 64 20 6d 75 74 65 78 4f 77 6e 65 72 56 61 6c 69  d mutexOwnerVali
14190 64 20 63 61 6e 20 62 65 20 73 65 74 20 61 74 6f  d can be set ato
141a0 6d 69 63 61 6c 6c 79 2c 20 74 68 65 20 6d 75 74  mically, the mut
141b0 65 78 41 75 78 20 69 73 20 6e 6f 74 20 72 65 71  exAux is not req
141c0 75 69 72 65 64 2e 0a 2a 2a 20 4f 6e 20 6d 61 6e  uired..** On man
141d0 79 20 73 79 73 74 65 6d 73 2c 20 61 6c 6c 20 74  y systems, all t
141e0 68 72 65 65 20 61 72 65 20 33 32 2d 62 69 74 20  hree are 32-bit 
141f0 69 6e 74 65 67 65 72 73 20 61 6e 64 20 77 72 69  integers and wri
14200 74 69 6e 67 20 74 6f 20 61 20 33 32 2d 62 69 74  ting to a 32-bit
14210 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69 73 20 61  .** integer is a
14220 74 6f 6d 69 63 2e 20 20 49 20 74 68 69 6e 6b 2e  tomic.  I think.
14230 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20    But there are 
14240 6e 6f 20 67 75 61 72 61 6e 74 65 65 73 2e 20 20  no guarantees.  
14250 53 6f 20 69 74 20 73 65 65 6d 73 0a 2a 2a 20 73  So it seems.** s
14260 61 66 65 72 20 74 6f 20 70 72 6f 74 65 63 74 20  afer to protect 
14270 74 68 65 6d 20 75 73 69 6e 67 20 6d 75 74 65 78  them using mutex
14280 41 75 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Aux..*/.static i
14290 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a  nt inMutex = 0;.
142a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
142b0 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74 69  IX_THREADS.stati
142c0 63 20 70 74 68 72 65 61 64 5f 74 20 6d 75 74 65  c pthread_t mute
142d0 78 4f 77 6e 65 72 3b 20 20 20 20 20 20 20 20 20  xOwner;         
142e0 20 2f 2a 20 54 68 72 65 61 64 20 68 6f 6c 64 69   /* Thread holdi
142f0 6e 67 20 6d 75 74 65 78 4d 61 69 6e 20 2a 2f 0a  ng mutexMain */.
14300 73 74 61 74 69 63 20 69 6e 74 20 6d 75 74 65 78  static int mutex
14310 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30 3b 20  OwnerValid = 0; 
14320 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14330 20 6d 75 74 65 78 4f 77 6e 65 72 20 69 73 20 76   mutexOwner is v
14340 61 6c 69 64 20 2a 2f 0a 73 74 61 74 69 63 20 70  alid */.static p
14350 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
14360 75 74 65 78 4d 61 69 6e 20 3d 20 50 54 48 52 45  utexMain = PTHRE
14370 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
14380 49 5a 45 52 3b 20 2f 2a 20 54 68 65 20 6d 75 74  IZER; /* The mut
14390 65 78 20 2a 2f 0a 73 74 61 74 69 63 20 70 74 68  ex */.static pth
143a0 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74  read_mutex_t mut
143b0 65 78 41 75 78 20 3d 20 50 54 48 52 45 41 44 5f  exAux = PTHREAD_
143c0 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45  MUTEX_INITIALIZE
143d0 52 3b 20 20 2f 2a 20 41 75 78 20 6d 75 74 65 78  R;  /* Aux mutex
143e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
143f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
14400 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20  pair of routine 
14410 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c  implement mutual
14420 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a   exclusion for.*
14430 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  * multi-threaded
14440 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c   processes.  Onl
14450 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  y a single threa
14460 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a  d is allowed to.
14470 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f 64 65  ** executed code
14480 20 74 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e   that is surroun
14490 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65  ded by EnterMute
144a0 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74  x() and LeaveMut
144b0 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ex()..**.** SQLi
144c0 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73  te uses only a s
144d0 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68  ingle Mutex.  Th
144e0 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20  ere is not much 
144f0 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65  critical.** code
14500 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65   and what little
14510 20 74 68 65 72 65 20 69 73 20 65 78 65 63 75 74   there is execut
14520 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77  es quickly and w
14530 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
14540 0a 2a 2a 0a 2a 2a 20 41 73 20 6f 66 20 76 65 72  .**.** As of ver
14550 73 69 6f 6e 20 33 2e 33 2e 32 2c 20 74 68 69 73  sion 3.3.2, this
14560 20 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 72   mutex must be r
14570 65 63 75 72 73 69 76 65 2e 0a 2a 2f 0a 76 6f 69  ecursive..*/.voi
14580 64 20 73 71 6c 69 74 65 33 55 6e 69 78 45 6e 74  d sqlite3UnixEnt
14590 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65  erMutex(){.#ifde
145a0 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
145b0 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
145c0 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
145d0 78 41 75 78 29 3b 0a 20 20 69 66 28 20 21 6d 75  xAux);.  if( !mu
145e0 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 7c 7c  texOwnerValid ||
145f0 20 21 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28   !pthread_equal(
14600 6d 75 74 65 78 4f 77 6e 65 72 2c 20 70 74 68 72  mutexOwner, pthr
14610 65 61 64 5f 73 65 6c 66 28 29 29 20 29 7b 0a 20  ead_self()) ){. 
14620 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78     pthread_mutex
14630 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75  _unlock(&mutexAu
14640 78 29 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f  x);.    pthread_
14650 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
14660 78 4d 61 69 6e 29 3b 0a 20 20 20 20 61 73 73 65  xMain);.    asse
14670 72 74 28 20 69 6e 4d 75 74 65 78 3d 3d 30 20 29  rt( inMutex==0 )
14680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
14690 75 74 65 78 4f 77 6e 65 72 56 61 6c 69 64 20 29  utexOwnerValid )
146a0 3b 0a 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75  ;.    pthread_mu
146b0 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 41  tex_lock(&mutexA
146c0 75 78 29 3b 0a 20 20 20 20 6d 75 74 65 78 4f 77  ux);.    mutexOw
146d0 6e 65 72 20 3d 20 70 74 68 72 65 61 64 5f 73 65  ner = pthread_se
146e0 6c 66 28 29 3b 0a 20 20 20 20 6d 75 74 65 78 4f  lf();.    mutexO
146f0 77 6e 65 72 56 61 6c 69 64 20 3d 20 31 3b 0a 20  wnerValid = 1;. 
14700 20 7d 0a 20 20 69 6e 4d 75 74 65 78 2b 2b 3b 0a   }.  inMutex++;.
14710 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
14720 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 41 75 78  unlock(&mutexAux
14730 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 4d 75 74  );.#else.  inMut
14740 65 78 2b 2b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76  ex++;.#endif.}.v
14750 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78 4c  oid sqlite3UnixL
14760 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61  eaveMutex(){.  a
14770 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 3e 30  ssert( inMutex>0
14780 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
14790 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
147a0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
147b0 6f 63 6b 28 26 6d 75 74 65 78 41 75 78 29 3b 0a  ock(&mutexAux);.
147c0 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a 20 20 61    inMutex--;.  a
147d0 73 73 65 72 74 28 20 70 74 68 72 65 61 64 5f 65  ssert( pthread_e
147e0 71 75 61 6c 28 6d 75 74 65 78 4f 77 6e 65 72 2c  qual(mutexOwner,
147f0 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29   pthread_self())
14800 20 29 3b 0a 20 20 69 66 28 20 69 6e 4d 75 74 65   );.  if( inMute
14810 78 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  x==0 ){.    asse
14820 72 74 28 20 6d 75 74 65 78 4f 77 6e 65 72 56 61  rt( mutexOwnerVa
14830 6c 69 64 20 29 3b 0a 20 20 20 20 6d 75 74 65 78  lid );.    mutex
14840 4f 77 6e 65 72 56 61 6c 69 64 20 3d 20 30 3b 0a  OwnerValid = 0;.
14850 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
14860 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 4d  x_unlock(&mutexM
14870 61 69 6e 29 3b 0a 20 20 7d 0a 20 20 70 74 68 72  ain);.  }.  pthr
14880 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
14890 28 26 6d 75 74 65 78 41 75 78 29 3b 0a 23 65 6c  (&mutexAux);.#el
148a0 73 65 0a 20 20 69 6e 4d 75 74 65 78 2d 2d 3b 0a  se.  inMutex--;.
148b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
148c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
148d0 68 65 20 6d 75 74 65 78 20 69 73 20 63 75 72 72  he mutex is curr
148e0 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  ently held..**.*
148f0 2a 20 49 66 20 74 68 65 20 74 68 69 73 54 68 72  * If the thisThr
14900 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
14910 72 75 65 2c 20 72 65 74 75 72 6e 20 74 72 75 65  rue, return true
14920 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20   only if the.** 
14930 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 68  calling thread h
14940 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 20  olds the mutex. 
14950 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
14960 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65 74 75  r is false, retu
14970 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 61 6e  rn.** true if an
14980 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74  y thread holds t
14990 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74  he mutex..*/.int
149a0 20 73 71 6c 69 74 65 33 55 6e 69 78 49 6e 4d 75   sqlite3UnixInMu
149b0 74 65 78 28 69 6e 74 20 74 68 69 73 54 68 72 64  tex(int thisThrd
149c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
149d0 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
149e0 69 6e 74 20 72 63 3b 0a 20 20 70 74 68 72 65 61  int rc;.  pthrea
149f0 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
14a00 74 65 78 41 75 78 29 3b 0a 20 20 72 63 20 3d 20  texAux);.  rc = 
14a10 69 6e 4d 75 74 65 78 3e 30 20 26 26 20 28 74 68  inMutex>0 && (th
14a20 69 73 54 68 72 64 3d 3d 30 20 7c 7c 20 70 74 68  isThrd==0 || pth
14a30 72 65 61 64 5f 65 71 75 61 6c 28 6d 75 74 65 78  read_equal(mutex
14a40 4f 77 6e 65 72 2c 70 74 68 72 65 61 64 5f 73 65  Owner,pthread_se
14a50 6c 66 28 29 29 29 3b 0a 20 20 70 74 68 72 65 61  lf()));.  pthrea
14a60 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26  d_mutex_unlock(&
14a70 6d 75 74 65 78 41 75 78 29 3b 0a 20 20 72 65 74  mutexAux);.  ret
14a80 75 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20  urn rc;.#else.  
14a90 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78 3e 30  return inMutex>0
14aa0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14ab0 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e  * Remember the n
14ac0 75 6d 62 65 72 20 6f 66 20 74 68 72 65 61 64 2d  umber of thread-
14ad0 73 70 65 63 69 66 69 63 2d 64 61 74 61 20 62 6c  specific-data bl
14ae0 6f 63 6b 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  ocks allocated..
14af0 2a 2a 20 55 73 65 20 74 68 69 73 20 74 6f 20 76  ** Use this to v
14b00 65 72 69 66 79 20 74 68 61 74 20 77 65 20 61 72  erify that we ar
14b10 65 20 6e 6f 74 20 6c 65 61 6b 69 6e 67 20 74 68  e not leaking th
14b20 72 65 61 64 2d 73 70 65 63 69 66 69 63 2d 64 61  read-specific-da
14b30 74 61 2e 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  ta..** Ticket #1
14b40 36 30 31 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  601.*/.#ifdef SQ
14b50 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
14b60 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
14b70 3d 20 30 3b 0a 23 20 69 66 64 65 66 20 53 51 4c  = 0;.# ifdef SQL
14b80 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
14b90 0a 20 20 20 20 73 74 61 74 69 63 20 70 74 68 72  .    static pthr
14ba0 65 61 64 5f 6d 75 74 65 78 5f 74 20 74 73 64 5f  ead_mutex_t tsd_
14bb0 63 6f 75 6e 74 65 72 5f 6d 75 74 65 78 20 3d 20  counter_mutex = 
14bc0 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e  PTHREAD_MUTEX_IN
14bd0 49 54 49 41 4c 49 5a 45 52 3b 0a 23 20 20 20 64  ITIALIZER;.#   d
14be0 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54 45  efine TSD_COUNTE
14bf0 52 28 4e 29 20 5c 0a 20 20 20 20 20 20 20 20 20  R(N) \.         
14c00 20 20 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65      pthread_mute
14c10 78 5f 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  x_lock(&tsd_coun
14c20 74 65 72 5f 6d 75 74 65 78 29 3b 20 5c 0a 20 20  ter_mutex); \.  
14c30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c40 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20 2b 3d 20  e3_tsd_count += 
14c50 4e 3b 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  N; \.           
14c60 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
14c70 75 6e 6c 6f 63 6b 28 26 74 73 64 5f 63 6f 75 6e  unlock(&tsd_coun
14c80 74 65 72 5f 6d 75 74 65 78 29 3b 0a 23 20 65 6c  ter_mutex);.# el
14c90 73 65 0a 23 20 20 20 64 65 66 69 6e 65 20 54 53  se.#   define TS
14ca0 44 5f 43 4f 55 4e 54 45 52 28 4e 29 20 20 73 71  D_COUNTER(N)  sq
14cb0 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74 20  lite3_tsd_count 
14cc0 2b 3d 20 4e 0a 23 20 65 6e 64 69 66 0a 23 65 6c  += N.# endif.#el
14cd0 73 65 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f  se.# define TSD_
14ce0 43 4f 55 4e 54 45 52 28 4e 29 20 20 2f 2a 20 6e  COUNTER(N)  /* n
14cf0 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  o-op */.#endif..
14d00 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20  /*.** If called 
14d10 77 69 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61  with allocateFla
14d20 67 3e 30 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  g>0, then return
14d30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
14d40 72 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63  read.** specific
14d50 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75   data for the cu
14d60 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41  rrent thread.  A
14d70 6c 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f  llocate and zero
14d80 20 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73   the.** thread-s
14d90 70 65 63 69 66 69 63 20 64 61 74 61 20 69 66 20  pecific data if 
14da0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
14db0 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ady exist..**.**
14dc0 20 49 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20   If called with 
14dd0 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c  allocateFlag==0,
14de0 20 74 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20   then check the 
14df0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a  current thread.*
14e00 2a 20 73 70 65 63 69 66 69 63 20 64 61 74 61 2e  * specific data.
14e10 20 20 52 65 74 75 72 6e 20 69 74 20 69 66 20 69    Return it if i
14e20 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 69 74  t exists.  If it
14e30 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
14e40 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
14e50 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  NULL..**.** If c
14e60 61 6c 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63  alled with alloc
14e70 61 74 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b  ateFlag<0, check
14e80 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
14e90 68 72 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a  hread specific.*
14ea0 2a 20 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61  * data is alloca
14eb0 74 65 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a  ted and is all z
14ec0 65 72 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74  ero.  If it is t
14ed0 68 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69  hen deallocate i
14ee0 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  t..** Return a p
14ef0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68  ointer to the th
14f00 72 65 61 64 20 73 70 65 63 69 66 69 63 20 64 61  read specific da
14f10 74 61 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74  ta or NULL if it
14f20 20 69 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74   is.** unallocat
14f30 65 64 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c  ed or gets deall
14f40 6f 63 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61  ocated..*/.Threa
14f50 64 44 61 74 61 20 2a 73 71 6c 69 74 65 33 55 6e  dData *sqlite3Un
14f60 69 78 54 68 72 65 61 64 53 70 65 63 69 66 69 63  ixThreadSpecific
14f70 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74  Data(int allocat
14f80 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63  eFlag){.  static
14f90 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
14fa0 61 20 7a 65 72 6f 44 61 74 61 20 3d 20 7b 30 7d  a zeroData = {0}
14fb0 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
14fc0 72 20 74 6f 20 73 69 6c 65 6e 63 65 20 77 61 72  r to silence war
14fd0 6e 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20  nings.          
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 2a 2a 20 66 72 6f 6d 20 62 72 6f 6b 65 6e 20   ** from broken 
15010 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a 23 69 66  compilers */.#if
15020 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
15030 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
15040 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74 20 6b   pthread_key_t k
15050 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  ey;.  static int
15060 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20   keyInit = 0;.  
15070 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
15080 3b 0a 0a 20 20 69 66 28 20 21 6b 65 79 49 6e 69  ;..  if( !keyIni
15090 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
150a0 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
150b0 20 20 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74      if( !keyInit
150c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
150d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 68  ;.      rc = pth
150e0 72 65 61 64 5f 6b 65 79 5f 63 72 65 61 74 65 28  read_key_create(
150f0 26 6b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  &key, 0);.      
15100 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
15110 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
15120 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
15130 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
15140 20 7d 0a 20 20 20 20 20 20 6b 65 79 49 6e 69 74   }.      keyInit
15150 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
15160 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
15170 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 20 20 70 54  tex();.  }..  pT
15180 73 64 20 3d 20 70 74 68 72 65 61 64 5f 67 65 74  sd = pthread_get
15190 73 70 65 63 69 66 69 63 28 6b 65 79 29 3b 0a 20  specific(key);. 
151a0 20 69 66 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61   if( allocateFla
151b0 67 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  g>0 ){.    if( p
151c0 54 73 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tsd==0 ){.      
151d0 69 66 28 20 21 73 71 6c 69 74 65 33 54 65 73 74  if( !sqlite3Test
151e0 4d 61 6c 6c 6f 63 46 61 69 6c 28 29 20 29 7b 0a  MallocFail() ){.
151f0 20 20 20 20 20 20 20 20 70 54 73 64 20 3d 20 73          pTsd = s
15200 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 73  qlite3OsMalloc(s
15210 69 7a 65 6f 66 28 7a 65 72 6f 44 61 74 61 29 29  izeof(zeroData))
15220 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
15230 20 53 51 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47   SQLITE_MEMDEBUG
15240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
15250 73 46 61 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  sFail = 0;.#endi
15260 66 0a 20 20 20 20 20 20 69 66 28 20 70 54 73 64  f.      if( pTsd
15270 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73   ){.        *pTs
15280 64 20 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20  d = zeroData;.  
15290 20 20 20 20 20 20 70 74 68 72 65 61 64 5f 73 65        pthread_se
152a0 74 73 70 65 63 69 66 69 63 28 6b 65 79 2c 20 70  tspecific(key, p
152b0 54 73 64 29 3b 0a 20 20 20 20 20 20 20 20 54 53  Tsd);.        TS
152c0 44 5f 43 4f 55 4e 54 45 52 28 2b 31 29 3b 0a 20  D_COUNTER(+1);. 
152d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
152e0 65 6c 73 65 20 69 66 28 20 70 54 73 64 21 3d 30  else if( pTsd!=0
152f0 20 26 26 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67   && allocateFlag
15300 3c 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  <0 .            
15310 26 26 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20  && memcmp(pTsd, 
15320 26 7a 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f  &zeroData, sizeo
15330 66 28 54 68 72 65 61 64 44 61 74 61 29 29 3d 3d  f(ThreadData))==
15340 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15350 4f 73 46 72 65 65 28 70 54 73 64 29 3b 0a 20 20  OsFree(pTsd);.  
15360 20 20 70 74 68 72 65 61 64 5f 73 65 74 73 70 65    pthread_setspe
15370 63 69 66 69 63 28 6b 65 79 2c 20 30 29 3b 0a 20  cific(key, 0);. 
15380 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2d     TSD_COUNTER(-
15390 31 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30  1);.    pTsd = 0
153a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
153b0 54 73 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 61  Tsd;.#else.  sta
153c0 74 69 63 20 54 68 72 65 61 64 44 61 74 61 20 2a  tic ThreadData *
153d0 70 54 73 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pTsd = 0;.  if( 
153e0 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30 20 29  allocateFlag>0 )
153f0 7b 0a 20 20 20 20 69 66 28 20 70 54 73 64 3d 3d  {.    if( pTsd==
15400 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
15410 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6c 6c 6f  sqlite3TestMallo
15420 63 46 61 69 6c 28 29 20 29 7b 0a 20 20 20 20 20  cFail() ){.     
15430 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65     pTsd = sqlite
15440 33 4f 73 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3OsMalloc( sizeo
15450 66 28 7a 65 72 6f 44 61 74 61 29 20 29 3b 0a 20  f(zeroData) );. 
15460 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
15470 4c 49 54 45 5f 4d 45 4d 44 45 42 55 47 0a 20 20  LITE_MEMDEBUG.  
15480 20 20 20 20 73 71 6c 69 74 65 33 5f 69 73 46 61      sqlite3_isFa
15490 69 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  il = 0;.#endif. 
154a0 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29 7b       if( pTsd ){
154b0 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20 3d  .        *pTsd =
154c0 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20 20   zeroData;.     
154d0 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 28 2b     TSD_COUNTER(+
154e0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
154f0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  }.  }else if( pT
15500 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63 61 74  sd!=0 && allocat
15510 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20 20 20  eFlag<0.        
15520 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 54      && memcmp(pT
15530 73 64 2c 20 26 7a 65 72 6f 44 61 74 61 2c 20 73  sd, &zeroData, s
15540 69 7a 65 6f 66 28 54 68 72 65 61 64 44 61 74 61  izeof(ThreadData
15550 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
15560 69 74 65 33 4f 73 46 72 65 65 28 70 54 73 64 29  ite3OsFree(pTsd)
15570 3b 0a 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45  ;.    TSD_COUNTE
15580 52 28 2d 31 29 3b 0a 20 20 20 20 70 54 73 64 20  R(-1);.    pTsd 
15590 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
155a0 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66 0a 7d  n pTsd;.#endif.}
155b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
155c0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
155d0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
155e0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
155f0 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
15600 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
15610 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
15620 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
15630 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
15640 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
15650 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
15660 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15670 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
15680 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
15690 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
156a0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
156b0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
156c0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
156d0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
156e0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
156f0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
15700 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
15710 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
15720 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
15730 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
15740 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
15750 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  e3UnixCurrentTim
15760 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  e(double *prNow)
15770 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45 54 54  {.#ifdef NO_GETT
15780 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  OD.  time_t t;. 
15790 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
157a0 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20  Now = t/86400.0 
157b0 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c  + 2440587.5;.#el
157c0 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
157d0 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74  val sNow;.  gett
157e0 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
157f0 30 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32  0);.  *prNow = 2
15800 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e  440587.5 + sNow.
15810 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b  tv_sec/86400.0 +
15820 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36   sNow.tv_usec/86
15830 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e  400000000.0;.#en
15840 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
15850 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
15860 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
15870 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
15880 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
15890 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
158a0 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
158b0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
158c0 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  0;.}..#endif /* 
158d0 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.