System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 535cd82c2fa0b8c4ae9364edeb1ec5342887417e:


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 0a   unix only */...
0220: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
0230: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  >.#include <errn
0240: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  o.h>.#include <u
0250: 6e 69 73 74 64 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  nistd.h>../*.** 
0260: 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61  Do not include a
0270: 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65 20 49  ny of the File I
0280: 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70 72 6f  /O interface pro
0290: 63 65 64 75 72 65 73 20 69 66 20 74 68 65 0a 2a  cedures if the.*
02a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
02b0: 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20 64 65  SKIO macro is de
02c0: 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e  fined (indicatin
02d0: 67 20 74 68 61 74 20 74 68 65 72 65 20 64 61 74  g that there dat
02e0: 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  abase.** will be
02f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 29   in-memory only)
0300: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0310: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 0a  TE_OMIT_DISKIO..
0320: 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61  ./*.** Define va
0330: 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61  rious macros tha
0340: 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72  t are missing fr
0350: 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e  om some systems.
0360: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41  .*/.#ifndef O_LA
0370: 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65  RGEFILE.# define
0380: 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23   O_LARGEFILE 0.#
0390: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
03a0: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a  ITE_DISABLE_LFS.
03b0: 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46  # undef O_LARGEF
03c0: 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c  ILE.# define O_L
03d0: 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69  ARGEFILE 0.#endi
03e0: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f  f.#ifndef O_NOFO
03f0: 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f  LLOW.# define O_
0400: 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69  NOFOLLOW 0.#endi
0410: 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41  f.#ifndef O_BINA
0420: 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49  RY.# define O_BI
0430: 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  NARY 0.#endif../
0440: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
0450: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
0460: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
0470: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
0480: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
0490: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
04a0: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
04b0: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
04c0: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
04d0: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
04e0: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
04f0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
0500: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
0510: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
0520: 69 74 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64  its DOS - what d
0530: 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a  id you expect?.*
0540: 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50  /.#ifdef __DJGPP
0550: 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74  __.# define fcnt
0560: 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69  l(A,B,C) 0.#endi
0570: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  f../*.** Include
0580: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
0590: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
05a0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
05b0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
05c0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  h"../*.** The th
05d0: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
05e0: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
05f0: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
0600: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
0610: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
0620: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
0630: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
0640: 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20 74  HREADS.#define t
0650: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
0660: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
0670: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
0680: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
0690: 74 20 6f 72 20 63 68 65 63 6b 20 74 68 65 20 4f  t or check the O
06a0: 73 46 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e  sFile.tid field.
06b0: 20 20 54 68 69 73 20 66 69 65 6c 64 20 69 73 20    This field is 
06c0: 73 65 74 20 77 68 65 6e 20 61 6e 20 4f 73 46 69  set when an OsFi
06d0: 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f  le.** is first o
06e0: 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  pened.  All subs
06f0: 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74  equent uses of t
0700: 68 65 20 4f 73 46 69 6c 65 20 76 65 72 69 66 79  he OsFile verify
0710: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d   that the.** sam
0720: 65 20 74 68 72 65 61 64 20 69 73 20 6f 70 65 72  e thread is oper
0730: 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73 46  ating on the OsF
0740: 69 6c 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61  ile.  Some opera
0750: 74 69 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a  ting systems do.
0760: 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63  ** not allow loc
0770: 6b 73 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64  ks to be overrid
0780: 64 65 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72  den by other thr
0790: 65 61 64 73 20 61 6e 64 20 74 68 61 74 20 72 65  eads and that re
07a0: 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61  striction.** mea
07b0: 6e 73 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a  ns that sqlite3*
07c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
07d0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65  s cannot be move
07e0: 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61  d from one threa
07f0: 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e  d.** to another.
0800: 20 20 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b    This logic mak
0810: 65 73 20 73 75 72 65 20 61 20 75 73 65 72 20 64  es sure a user d
0820: 6f 65 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64  oes not try to d
0830: 6f 20 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73  o that.** by mis
0840: 74 61 6b 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  take..*/.#ifdef 
0850: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
0860: 41 44 53 0a 23 20 64 65 66 69 6e 65 20 53 45 54  ADS.# define SET
0870: 5f 54 48 52 45 41 44 49 44 28 58 29 20 20 20 58  _THREADID(X)   X
0880: 2d 3e 74 69 64 20 3d 20 70 74 68 72 65 61 64 5f  ->tid = pthread_
0890: 73 65 6c 66 28 29 0a 23 20 64 65 66 69 6e 65 20  self().# define 
08a0: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 58  CHECK_THREADID(X
08b0: 29 20 28 21 70 74 68 72 65 61 64 5f 65 71 75 61  ) (!pthread_equa
08c0: 6c 28 58 2d 3e 74 69 64 2c 20 70 74 68 72 65 61  l(X->tid, pthrea
08d0: 64 5f 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65  d_self())).#else
08e0: 0a 23 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48  .# define SET_TH
08f0: 52 45 41 44 49 44 28 58 29 0a 23 20 64 65 66 69  READID(X).# defi
0900: 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  ne CHECK_THREADI
0910: 44 28 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  D(X) 0.#endif../
0920: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
0930: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
0940: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
0950: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
0960: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
0970: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
0980: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
0990: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
09a0: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
09b0: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
09c0: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
09d0: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
09e0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
09f0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
0a00: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
0a10: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
0a20: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
0a30: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
0a40: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
0a50: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
0a60: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
0a70: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
0a80: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
0a90: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
0aa0: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
0ab0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
0ac0: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
0ad0: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
0ae0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
0af0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
0b00: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
0b10: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
0b20: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
0b30: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
0b40: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
0b50: 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  ly the same file
0b60: 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65   (because.** one
0b70: 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79   is a hard or sy
0b80: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74  mbolic link to t
0b90: 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69  he other) then i
0ba0: 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20  f you set.** an 
0bb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
0bc0: 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20  n fd1, then try 
0bd0: 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  to get an exclus
0be0: 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66  ive lock.** on f
0bf0: 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49  d2, it works.  I
0c00: 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65   would have expe
0c10: 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20  cted the second 
0c20: 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20  lock to.** fail 
0c30: 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20  since there was 
0c40: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
0c50: 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74  n the file due t
0c60: 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f  o fd1..** But no
0c70: 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74  t so.  Since bot
0c80: 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f  h locks came fro
0c90: 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  m the same proce
0ca0: 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  ss, the.** secon
0cb0: 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20  d overrides the 
0cc0: 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75  first, even thou
0cd0: 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20  gh they were on 
0ce0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
0cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
0d00: 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e  ened on differen
0d10: 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a  t file names..**
0d20: 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20  .** Bummer.  If 
0d30: 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73  you ask me, this
0d40: 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64   is broken.  Bad
0d50: 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d  ly broken.  It m
0d60: 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20  eans.** that we 
0d70: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
0d80: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
0d90: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
0da0: 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65  s among.** compe
0db0: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
0dc0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
0dd0: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
0de0: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
0df0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
0e00: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
0e10: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
0e20: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
0e30: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
0e40: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
0e50: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
0e60: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
0e70: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
0e80: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
0e90: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
0ea0: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
0eb0: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
0ec0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
0ed0: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
0ee0: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
0ef0: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
0f00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0f10: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
0f20: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
0f30: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
0f40: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
0f50: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
0f60: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
0f70: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
0f80: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
0f90: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
0fa0: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
0fb0: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
0fc0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
0fd0: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
0fe0: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
0ff0: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
1000: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
1010: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
1020: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
1030: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
1040: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
1050: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
1060: 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74  ** The OsFile st
1070: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
1080: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
1090: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
10a0: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
10b0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
10c0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
10d0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
10e0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
10f0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
1100: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
1110: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1120: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
1130: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
1140: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
1150: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
1160: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1170: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
1180: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
1190: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
11a0: 77 69 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c  wice, both OsFil
11b0: 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  e structures.** 
11c0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d  point to the sam
11d0: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
11e0: 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ure.  The lockin
11f0: 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  g structure keep
1200: 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
1210: 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69   count (so we wi
1220: 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20  ll know when to 
1230: 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61  delete it) and a
1240: 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20   "cnt".** field 
1250: 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74  that tells us it
1260: 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  s internal lock 
1270: 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20  status.  cnt==0 
1280: 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c  means the.** fil
1290: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  e is unlocked.  
12a0: 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68  cnt==-1 means th
12b0: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78  e file has an ex
12c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a  clusive lock..**
12d0: 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65   cnt>0 means the
12e0: 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65  re are cnt share
12f0: 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66  d locks on the f
1300: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61  ile..**.** Any a
1310: 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f  ttempt to lock o
1320: 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  r unlock a file 
1330: 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65  first checks the
1340: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75   locking.** stru
1350: 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74  cture.  The fcnt
1360: 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  l() system call 
1370: 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  is only invoked 
1380: 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53  to set a .** POS
1390: 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69  IX lock if the i
13a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72  nternal lock str
13b0: 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f  ucture transitio
13c0: 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20  ns between.** a 
13d0: 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e  locked and an un
13e0: 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a  locked state..**
13f0: 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a  .** 2004-Jan-11:
1400: 0a 2a 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20  .** More recent 
1410: 64 69 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75  discoveries abou
1420: 74 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  t POSIX advisory
1430: 20 6c 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f   locks.  (The mo
1440: 72 65 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72  re.** I discover
1450: 2c 20 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61  , the more I rea
1460: 6c 69 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58  lize the a POSIX
1470: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
1480: 61 72 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e  are.** an abomin
1490: 61 74 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66  ation.).**.** If
14a0: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
14b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
14c0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
14d0: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
14e0: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
14f0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
1500: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
1510: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
1520: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
1530: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
1540: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
1550: 2c 20 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74  , each OsFile st
1560: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1570: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
1580: 20 61 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75   an openCnt stru
1590: 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69 73  cture.  There is
15a0: 20 6f 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72   one openCnt str
15b0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70  ucture.** per op
15c0: 65 6e 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20  en inode, which 
15d0: 6d 65 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69  means that multi
15e0: 70 6c 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20  ple OsFiles can 
15f0: 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
1600: 65 0a 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57  e.** openCnt.  W
1610: 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
1620: 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20  s made to close 
1630: 61 6e 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68  an OsFile, if th
1640: 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72  ere are.** other
1650: 20 4f 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e   OsFiles open on
1660: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
1670: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
1680: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
1690: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
16a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16b0: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
16c0: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
16d0: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
16e0: 54 68 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  The openCnt stru
16f0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
1700: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
1710: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
1720: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
1730: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
1740: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
1750: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
1760: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
1770: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74  ars..**.** First
1780: 2c 20 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68  , under Linux th
1790: 72 65 61 64 73 2c 20 62 65 63 61 75 73 65 20 65  reads, because e
17a0: 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 61  ach thread has a
17b0: 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f   separate.** pro
17c0: 63 65 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70  cess ID, lock op
17d0: 65 72 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20  erations in one 
17e0: 74 68 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76  thread do not ov
17f0: 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20  erride locks.** 
1800: 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
1810: 20 69 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64   in other thread
1820: 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64  s.  Linux thread
1830: 73 20 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a  s behave like.**
1840: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
1850: 73 65 73 20 69 6e 20 74 68 69 73 20 72 65 73 70  ses in this resp
1860: 65 63 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f  ect.  But, if yo
1870: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a  u close a file.*
1880: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20  * descriptor in 
1890: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61  linux threads, a
18a0: 6c 6c 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65  ll locks are cle
18b0: 61 72 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73  ared, even locks
18c0: 0a 2a 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72  .** on other thr
18d0: 65 61 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68  eads and even th
18e0: 6f 75 67 68 20 74 68 65 20 6f 74 68 65 72 20 74  ough the other t
18f0: 68 72 65 61 64 73 20 68 61 76 65 20 64 69 66 66  hreads have diff
1900: 65 72 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73  erent.** process
1910: 20 49 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72   IDs.  Linux thr
1920: 65 61 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73  eads is inconsis
1930: 74 65 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73  tent in this res
1940: 70 65 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65  pect..** (I'm be
1950: 67 69 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b  ginning to think
1960: 20 74 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65   that linux thre
1970: 61 64 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e  ads is an abomin
1980: 61 74 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54  ation too.).** T
1990: 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f  he consequence o
19a0: 66 20 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68  f this all is th
19b0: 61 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  at the hash tabl
19c0: 65 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e  e for the lockIn
19d0: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
19e0: 68 61 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  has to include t
19f0: 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 61 73  he process id as
1a00: 20 70 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79   part of its key
1a10: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b   because.** lock
1a20: 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74  s in different t
1a30: 68 72 65 61 64 73 20 61 72 65 20 74 72 65 61 74  hreads are treat
1a40: 65 64 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20  ed as distinct. 
1a50: 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65   But the .** ope
1a60: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 73  nCnt structure s
1a70: 68 6f 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64  hould not includ
1a80: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64  e the process id
1a90: 20 69 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62   in its.** key b
1aa0: 65 63 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63  ecause close() c
1ab0: 6c 65 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c  lears lock on al
1ac0: 6c 20 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a  l threads, not j
1ad0: 75 73 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ust the current.
1ae0: 2a 2a 20 74 68 72 65 61 64 2e 20 20 57 65 72 65  ** thread.  Were
1af0: 20 69 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73   it not for this
1b00: 20 67 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69   goofiness in li
1b10: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 77 65 20  nux threads, we 
1b20: 63 6f 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65  could.** combine
1b30: 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e   the lockInfo an
1b40: 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  d openCnt struct
1b50: 75 72 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ures into a sing
1b60: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  le structure..**
1b70: 0a 2a 2a 20 32 30 30 34 2d 4a 75 6e 2d 32 38 3a  .** 2004-Jun-28:
1b80: 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 76 65 72 73  .** On some vers
1b90: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 2c 20 74  ions of linux, t
1ba0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
1bb0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
1bc0: 6c 6f 63 6b 73 2e 0a 2a 2a 20 4f 6e 20 6f 74 68  locks..** On oth
1bd0: 65 72 73 20 6e 6f 74 2e 20 20 53 6f 6d 65 74 69  ers not.  Someti
1be0: 6d 65 73 20 79 6f 75 20 63 61 6e 20 63 68 61 6e  mes you can chan
1bf0: 67 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ge the behavior 
1c00: 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  on the same.** s
1c10: 79 73 74 65 6d 20 62 79 20 73 65 74 74 69 6e 67  ystem by setting
1c20: 20 74 68 65 20 4c 44 5f 41 53 53 55 4d 45 5f 4b   the LD_ASSUME_K
1c30: 45 52 4e 45 4c 20 65 6e 76 69 72 6f 6e 6d 65 6e  ERNEL environmen
1c40: 74 20 76 61 72 69 61 62 6c 65 2e 20 20 54 68 65  t variable.  The
1c50: 0a 2a 2a 20 50 4f 53 49 58 20 73 74 61 6e 64 61  .** POSIX standa
1c60: 72 64 20 69 73 20 73 69 6c 65 6e 74 20 61 73 20  rd is silent as 
1c70: 74 6f 20 77 68 69 63 68 20 62 65 68 61 76 69 6f  to which behavio
1c80: 72 20 69 73 20 63 6f 72 72 65 63 74 2c 20 61 73  r is correct, as
1c90: 20 66 61 72 0a 2a 2a 20 61 73 20 49 20 63 61 6e   far.** as I can
1ca0: 20 74 65 6c 6c 2c 20 73 6f 20 6f 74 68 65 72 20   tell, so other 
1cb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
1cc0: 20 6d 69 67 68 74 20 73 68 6f 77 20 74 68 65 20   might show the 
1cd0: 73 61 6d 65 0a 2a 2a 20 69 6e 63 6f 6e 73 69 73  same.** inconsis
1ce0: 74 65 6e 63 79 2e 20 20 54 68 65 72 65 20 69 73  tency.  There is
1cf0: 20 6e 6f 20 6c 69 74 74 6c 65 20 64 6f 75 62 74   no little doubt
1d00: 20 69 6e 20 6d 79 20 6d 69 6e 64 20 74 68 61 74   in my mind that
1d10: 20 70 6f 73 69 78 0a 2a 2a 20 61 64 76 69 73 6f   posix.** adviso
1d20: 72 79 20 6c 6f 63 6b 73 20 61 6e 64 20 6c 69 6e  ry locks and lin
1d30: 75 78 20 74 68 72 65 61 64 73 20 61 72 65 20 70  ux threads are p
1d40: 72 6f 66 6f 75 6e 64 6c 79 20 62 72 6f 6b 65 6e  rofoundly broken
1d50: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
1d60: 61 72 6f 75 6e 64 20 74 68 65 20 69 6e 63 6f 6e  around the incon
1d70: 73 69 73 74 65 6e 63 69 65 73 2c 20 77 65 20 68  sistencies, we h
1d80: 61 76 65 20 74 6f 20 74 65 73 74 20 61 74 20 72  ave to test at r
1d90: 75 6e 74 69 6d 65 20 0a 2a 2a 20 77 68 65 74 68  untime .** wheth
1da0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
1db0: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
1dc0: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
1dd0: 2e 20 20 54 68 69 73 20 74 65 73 74 0a 2a 2a 20  .  This test.** 
1de0: 69 73 20 72 75 6e 20 6f 6e 63 65 2c 20 74 68 65  is run once, the
1df0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
1e00: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
1e10: 64 2e 20 20 41 20 73 74 61 74 69 63 20 0a 2a 2a  d.  A static .**
1e20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
1e30: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 72   to record the r
1e40: 65 73 75 6c 74 73 20 6f 66 20 74 68 69 73 20 74  esults of this t
1e50: 65 73 74 20 66 6f 72 20 66 75 74 75 72 65 0a 2a  est for future.*
1e60: 2a 20 75 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  * use..*/../*.**
1e70: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
1e80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1e90: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
1ea0: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
1eb0: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
1ec0: 72 74 69 63 75 6c 61 72 20 6c 6f 63 6b 49 6e 66  rticular lockInf
1ed0: 6f 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  o structure give
1ee0: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  n its inode..**.
1ef0: 2a 2a 20 49 66 20 74 68 72 65 61 64 73 20 63 61  ** If threads ca
1f00: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61  nnot override ea
1f10: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2c  ch others locks,
1f20: 20 74 68 65 6e 20 77 65 20 73 65 74 20 74 68 65   then we set the
1f30: 0a 2a 2a 20 6c 6f 63 6b 4b 65 79 2e 74 69 64 20  .** lockKey.tid 
1f40: 66 69 65 6c 64 20 74 6f 20 74 68 65 20 74 68 72  field to the thr
1f50: 65 61 64 20 49 44 2e 20 20 49 66 20 74 68 72 65  ead ID.  If thre
1f60: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
1f70: 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 73 20  .** each others 
1f80: 6c 6f 63 6b 73 20 74 68 65 6e 20 74 69 64 20 69  locks then tid i
1f90: 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
1fa0: 7a 65 72 6f 2e 20 20 74 69 64 20 69 73 20 61 6c  zero.  tid is al
1fb0: 73 6f 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  so.** set to zer
1fc0: 6f 20 69 66 20 77 65 20 63 6f 6d 70 69 6c 65 20  o if we compile 
1fd0: 77 69 74 68 6f 75 74 20 74 68 72 65 61 64 69 6e  without threadin
1fe0: 67 20 73 75 70 70 6f 72 74 2e 0a 2a 2f 0a 73 74  g support..*/.st
1ff0: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 7b 0a 20  ruct lockKey {. 
2000: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
2010: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
2020: 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e  er */.  ino_t in
2030: 6f 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64  o;       /* Inod
2040: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 64  e number */.#ifd
2050: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
2060: 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64  HREADS.  pthread
2070: 5f 74 20 74 69 64 3b 20 20 20 2f 2a 20 54 68 72  _t tid;   /* Thr
2080: 65 61 64 20 49 44 20 6f 72 20 7a 65 72 6f 20 69  ead ID or zero i
2090: 66 20 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74  f threads cannot
20a0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
20b0: 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ther */.#endif.}
20c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
20d0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
20e0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
20f0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
2100: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
2110: 6f 64 65 20 6f 6e 20 65 61 63 68 20 74 68 72 65  ode on each thre
2120: 61 64 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ad with a differ
2130: 65 6e 74 20 70 72 6f 63 65 73 73 20 49 44 2e 20  ent process ID. 
2140: 20 28 54 68 72 65 61 64 73 20 68 61 76 65 0a 2a   (Threads have.*
2150: 2a 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  * different proc
2160: 65 73 73 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78  ess IDs on linux
2170: 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73  , but not on mos
2180: 74 20 6f 74 68 65 72 20 75 6e 69 78 65 73 2e 29  t other unixes.)
2190: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
21a0: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
21b0: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
21c0: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
21d0: 68 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75  h OsFile.** stru
21e0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
21f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
2200: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
2210: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
2220: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
2230: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
2240: 75 6d 62 65 72 20 6f 66 20 4f 73 46 69 6c 65 73  umber of OsFiles
2250: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
2260: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49  .*/.struct lockI
2270: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 6c  nfo {.  struct l
2280: 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20  ockKey key;  /* 
2290: 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a  The lookup key *
22a0: 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20  /.  int cnt;    
22b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22c0: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
22d0: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  ks held */.  int
22e0: 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20   locktype;      
22f0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52    /* One of SHAR
2300: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
2310: 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20  D_LOCK etc. */. 
2320: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2330: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2340: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
2350: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
2360: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
2370: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
2380: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
2390: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
23a0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
23b0: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
23c0: 61 72 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ar openCnt struc
23d0: 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20 69  ture given its i
23e0: 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69  node.  This.** i
23f0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
2400: 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74  e lockKey except
2410: 20 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64   that the thread
2420: 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a   ID is omitted..
2430: 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  */.struct openKe
2440: 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  y {.  dev_t dev;
2450: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
2460: 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69  ber */.  ino_t i
2470: 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e  no;   /* Inode n
2480: 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  umber */.};../*.
2490: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
24a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
24b0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
24c0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
24d0: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
24e0: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b  This structure k
24f0: 65 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68  eeps track of th
2500: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
2510: 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f  s on that.** ino
2520: 64 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20  de.  If a close 
2530: 69 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61  is attempted aga
2540: 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68  inst an inode th
2550: 61 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a  at is holding.**
2560: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73   locks, the clos
2570: 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
2580: 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c  til all locks cl
2590: 65 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68  ear by adding th
25a0: 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  e.** file descri
25b0: 70 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65  ptor to be close
25c0: 64 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67  d to the pending
25d0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
25e0: 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72   openCnt {.  str
25f0: 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b  uct openKey key;
2600: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
2610: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   key */.  int nR
2620: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
2630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
2640: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
2650: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
2660: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
2670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2680: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
2690: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64  s */.  int nPend
26a0: 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
26b0: 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  Number of pendin
26c0: 67 20 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74  g close() operat
26d0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ions */.  int *a
26e0: 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20  Pending;        
26f0: 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63  /* Malloced spac
2700: 65 20 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61  e holding fd's a
2710: 77 61 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28  waiting a close(
2720: 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  ) */.};../* .** 
2730: 54 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65  These hash table
2740: 20 6d 61 70 73 20 69 6e 6f 64 65 73 20 61 6e 64   maps inodes and
2750: 20 70 72 6f 63 65 73 73 20 49 44 73 20 69 6e 74   process IDs int
2760: 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  o lockInfo and o
2770: 70 65 6e 43 6e 74 0a 2a 2a 20 73 74 72 75 63 74  penCnt.** struct
2780: 75 72 65 73 2e 20 20 41 63 63 65 73 73 20 74 6f  ures.  Access to
2790: 20 74 68 65 73 65 20 68 61 73 68 20 74 61 62 6c   these hash tabl
27a0: 65 73 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65  es must be prote
27b0: 63 74 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e  cted by a mutex.
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20  .*/.static Hash 
27d0: 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c  lockHash = { SQL
27e0: 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c  ITE_HASH_BINARY,
27f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
2800: 3b 0a 73 74 61 74 69 63 20 48 61 73 68 20 6f 70  ;.static Hash op
2810: 65 6e 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  enHash = { SQLIT
2820: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
2830: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
2840: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2850: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 2f 2a 0a  UNIX_THREADS./*.
2860: 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  ** This variable
2870: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
2880: 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20   or not threads 
2890: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
28a0: 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c 6f 63 6b  h others.** lock
28b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  s..**.**    0:  
28c0: 4e 6f 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  No.  Threads can
28d0: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 65 61 63  not override eac
28e0: 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a  h others locks..
28f0: 2a 2a 20 20 20 20 31 3a 20 20 59 65 73 2e 20 20  **    1:  Yes.  
2900: 54 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  Threads can over
2910: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2920: 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 2d 31 3a   locks..**   -1:
2930: 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e 6f 77 20    We don't know 
2940: 79 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yet..*/.static i
2950: 6e 74 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  nt threadsOverri
2960: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
2970: 73 20 3d 20 2d 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s = -1;../*.** T
2980: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
2990: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
29a0: 70 61 73 73 65 64 20 69 6e 74 6f 20 69 6e 64 69  passed into indi
29b0: 76 69 64 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74  vidual test.** t
29c0: 68 72 65 61 64 73 20 62 79 20 74 68 65 20 74 65  hreads by the te
29d0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
29e0: 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e  ehavior() routin
29f0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 68 72  e..*/.struct thr
2a00: 65 61 64 54 65 73 74 44 61 74 61 20 7b 0a 20 20  eadTestData {.  
2a10: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
2a20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
2a30: 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
2a40: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2a50: 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ck;     /* The l
2a60: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
2a70: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 75 6c 74   */.  int result
2a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a90: 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f  Result of the lo
2aa0: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  cking operation 
2ab0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51  */.};..#ifdef SQ
2ac0: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
2ad0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
2ae0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
2af0: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
2b00: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
2b10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2b20: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
2b30: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
2b40: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
2b50: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
2b60: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
2b70: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
2b80: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
2b90: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
2ba0: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
2bb0: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
2bc0: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
2bd0: 2a 20 74 75 72 6e 6e 65 64 20 6f 66 66 2e 0a 2a  * turnned off..*
2be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
2bf0: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
2c00: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
2c10: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
2c20: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
2c30: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
2c40: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
2c50: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
2c60: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
2c70: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
2c80: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
2c90: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
2ca0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
2cb0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  se{.    s = fcnt
2cc0: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
2cd0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ce0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e  intf("fcntl unkn
2cf0: 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c  own %d %d %d\n",
2d00: 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20   fd, op, s);.   
2d10: 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20   return s;.  }. 
2d20: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2d30: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_RDLCK ){.    z
2d40: 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a  Type = "RDLCK";.
2d50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2d60: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
2d70: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57  {.    zType = "W
2d80: 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  RLCK";.  }else i
2d90: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
2da0: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  UNLCK ){.    zTy
2db0: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
2dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2dd0: 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  t( 0 );.  }.  as
2de0: 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63  sert( p->l_whenc
2df0: 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20  e==SEEK_SET );. 
2e00: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2e10: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
2e20: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
2e30: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2e40: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
2e50: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
2e60: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
2e70: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
2e80: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
2e90: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
2ea0: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
2eb0: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
2ec0: 20 20 69 66 28 20 73 20 26 26 20 6f 70 3d 3d 46    if( s && op==F
2ed0: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
2ee0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
2ef0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
2f00: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
2f10: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
2f20: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63   l2 = *p;.    fc
2f30: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
2f40: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
2f50: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
2f60: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
2f70: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
2f80: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
2f90: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
2fa0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
2fb0: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
2fc0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
2fd0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
2fe0: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
2ff0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3000: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
3010: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3020: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
3030: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
3040: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
3050: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
3060: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
3070: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
3080: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
3090: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
30a0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
30b0: 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e  turn s;.}.#defin
30c0: 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63  e fcntl lockTrac
30d0: 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
30e0: 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f  TE_LOCK_TRACE */
30f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 65 73 74  ../*.** The test
3100: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
3110: 61 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 20  avior() routine 
3120: 6c 61 75 6e 63 68 65 73 20 74 77 6f 20 73 65 70  launches two sep
3130: 61 72 61 74 65 0a 2a 2a 20 74 68 72 65 61 64 73  arate.** threads
3140: 20 6f 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   on this routine
3150: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3160: 61 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f 63 6b  attempts to lock
3170: 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72   a file.** descr
3180: 69 70 74 6f 72 20 74 68 65 6e 20 72 65 74 75 72  iptor then retur
3190: 6e 73 2e 20 20 54 68 65 20 73 75 63 63 65 73 73  ns.  The success
31a0: 20 6f 72 20 66 61 69 6c 75 72 65 20 6f 66 20 74   or failure of t
31b0: 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 61  hat attempt.** a
31c0: 6c 6c 6f 77 73 20 74 68 65 20 74 65 73 74 54 68  llows the testTh
31d0: 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76  readLockingBehav
31e0: 69 6f 72 28 29 20 70 72 6f 63 65 64 75 72 65 20  ior() procedure 
31f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  to determine.** 
3200: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3210: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
3220: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
3230: 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  locks..*/.static
3240: 20 76 6f 69 64 20 2a 74 68 72 65 61 64 4c 6f 63   void *threadLoc
3250: 6b 69 6e 67 54 65 73 74 28 76 6f 69 64 20 2a 70  kingTest(void *p
3260: 41 72 67 29 7b 0a 20 20 73 74 72 75 63 74 20 74  Arg){.  struct t
3270: 68 72 65 61 64 54 65 73 74 44 61 74 61 20 2a 70  hreadTestData *p
3280: 44 61 74 61 20 3d 20 28 73 74 72 75 63 74 20 74  Data = (struct t
3290: 68 72 65 61 64 54 65 73 74 44 61 74 61 2a 29 70  hreadTestData*)p
32a0: 41 72 67 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65  Arg;.  pData->re
32b0: 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28 70 44 61  sult = fcntl(pDa
32c0: 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c  ta->fd, F_SETLK,
32d0: 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a   &pData->lock);.
32e0: 20 20 72 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d    return pArg;.}
32f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f  ../*.** This pro
3300: 63 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20  cedure attempts 
3310: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
3320: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
3330: 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72  ads.** can overr
3340: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
3350: 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20  locks then sets 
3360: 74 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f  the .** threadsO
3370: 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72  verrideEachOther
3380: 73 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20  sLocks variable 
3390: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a  appropriately..*
33a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
33b0: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
33c0: 65 68 61 76 69 6f 72 28 66 64 5f 6f 72 69 67 29  ehavior(fd_orig)
33d0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 73 74  {.  int fd;.  st
33e0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
33f0: 61 74 61 20 64 5b 32 5d 3b 0a 20 20 70 74 68 72  ata d[2];.  pthr
3400: 65 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a 20 20 66  ead_t t[2];..  f
3410: 64 20 3d 20 64 75 70 28 66 64 5f 6f 72 69 67 29  d = dup(fd_orig)
3420: 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 20 72  ;.  if( fd<0 ) r
3430: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
3440: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29  d, 0, sizeof(d))
3450: 3b 0a 20 20 64 5b 30 5d 2e 66 64 20 3d 20 66 64  ;.  d[0].fd = fd
3460: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
3470: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
3480: 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65    d[0].lock.l_le
3490: 6e 20 3d 20 31 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  n = 1;.  d[0].lo
34a0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  ck.l_start = 0;.
34b0: 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68    d[0].lock.l_wh
34c0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
34d0: 0a 20 20 64 5b 31 5d 20 3d 20 64 5b 30 5d 3b 0a  .  d[1] = d[0];.
34e0: 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79    d[1].lock.l_ty
34f0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
3500: 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28 26  pthread_create(&
3510: 74 5b 30 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c  t[0], 0, threadL
3520: 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b 30  ockingTest, &d[0
3530: 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72  ]);.  pthread_cr
3540: 65 61 74 65 28 26 74 5b 31 5d 2c 20 30 2c 20 74  eate(&t[1], 0, t
3550: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74  hreadLockingTest
3560: 2c 20 26 64 5b 31 5d 29 3b 0a 20 20 70 74 68 72  , &d[1]);.  pthr
3570: 65 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d 2c 20 30  ead_join(t[0], 0
3580: 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69  );.  pthread_joi
3590: 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a 20 20 63 6c  n(t[1], 0);.  cl
35a0: 6f 73 65 28 66 64 29 3b 0a 20 20 74 68 72 65 61  ose(fd);.  threa
35b0: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
35c0: 68 65 72 73 4c 6f 63 6b 73 20 3d 20 20 64 5b 30  hersLocks =  d[0
35d0: 5d 2e 72 65 73 75 6c 74 3d 3d 30 20 26 26 20 64  ].result==0 && d
35e0: 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d 30 3b 0a 7d  [1].result==0;.}
35f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3600: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 2a  E_UNIX_THREADS *
3610: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  /../*.** Release
3620: 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75   a lockInfo stru
3630: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
3640: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
3650: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f  ndLockInfo()..*/
3660: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3670: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72  easeLockInfo(str
3680: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  uct lockInfo *pL
3690: 6f 63 6b 29 7b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e  ock){.  pLock->n
36a0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4c 6f  Ref--;.  if( pLo
36b0: 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  ck->nRef==0 ){. 
36c0: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
36d0: 73 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20  sert(&lockHash, 
36e0: 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a  &pLock->key, siz
36f0: 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65 79 29 2c  eof(pLock->key),
3700: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
3710: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a  ree(pLock);.  }.
3720: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
3730: 20 61 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63   a openCnt struc
3740: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
3750: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
3760: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
3770: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3780: 61 73 65 4f 70 65 6e 43 6e 74 28 73 74 72 75 63  aseOpenCnt(struc
3790: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
37a0: 29 7b 0a 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66  ){.  pOpen->nRef
37b0: 2d 2d 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 2d  --;.  if( pOpen-
37c0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
37d0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
37e0: 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f  t(&openHash, &pO
37f0: 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  pen->key, sizeof
3800: 28 70 4f 70 65 6e 2d 3e 6b 65 79 29 2c 20 30 29  (pOpen->key), 0)
3810: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3820: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
3830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
3840: 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d 0a 7d 0a  e(pOpen);.  }.}.
3850: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
3860: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
3870: 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e 66 6f 20  locate lockInfo 
3880: 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73 74 72 75  and openCnt stru
3890: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 64  ctures that.** d
38a0: 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69  escribes that fi
38b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
38c0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
38d0: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
38e0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
38f0: 61 6c 75 65 73 20 6d 69 67 68 74 20 62 65 20 75  alues might be u
3900: 6e 73 65 74 20 69 66 20 61 6e 20 65 72 72 6f 72  nset if an error
3910: 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 52   occurs..**.** R
3920: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3930: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73   of errors..*/.s
3940: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c 6f  tatic int findLo
3950: 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74 20 66 64  ckInfo(.  int fd
3960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3970: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
3980: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73  le descriptor us
3990: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
39a0: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
39b0: 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20 20 20 20  fo **ppLock,    
39c0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f  /* Return the lo
39d0: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
39e0: 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
39f0: 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70 70 4f 70  t openCnt **ppOp
3a00: 65 6e 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  en      /* Retur
3a10: 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74  n the openCnt st
3a20: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
3a30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
3a40: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65  truct lockKey ke
3a50: 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  y1;.  struct ope
3a60: 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72  nKey key2;.  str
3a70: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
3a80: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
3a90: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
3aa0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
3ab0: 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  pen;.  rc = fsta
3ac0: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
3ad0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72  .  if( rc!=0 ) r
3ae0: 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
3af0: 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65  t(&key1, 0, size
3b00: 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79  of(key1));.  key
3b10: 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  1.dev = statbuf.
3b20: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69  st_dev;.  key1.i
3b30: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
3b40: 69 6e 6f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ino;.#ifdef SQLI
3b50: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
3b60: 20 20 69 66 28 20 74 68 72 65 61 64 73 4f 76 65    if( threadsOve
3b70: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
3b80: 6f 63 6b 73 3c 30 20 29 7b 0a 20 20 20 20 74 65  ocks<0 ){.    te
3b90: 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42  stThreadLockingB
3ba0: 65 68 61 76 69 6f 72 28 66 64 29 3b 0a 20 20 7d  ehavior(fd);.  }
3bb0: 0a 20 20 6b 65 79 31 2e 74 69 64 20 3d 20 74 68  .  key1.tid = th
3bc0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3bd0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3f 20 30  hOthersLocks ? 0
3be0: 20 3a 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28   : pthread_self(
3bf0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6d 65 6d 73  );.#endif.  mems
3c00: 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73 69 7a  et(&key2, 0, siz
3c10: 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20 6b 65  eof(key2));.  ke
3c20: 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66  y2.dev = statbuf
3c30: 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 32 2e  .st_dev;.  key2.
3c40: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
3c50: 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20  _ino;.  pLock = 
3c60: 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  (struct lockInfo
3c70: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
3c80: 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65  d(&lockHash, &ke
3c90: 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29  y1, sizeof(key1)
3ca0: 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d  );.  if( pLock==
3cb0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
3cc0: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a  lockInfo *pOld;.
3cd0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69      pLock = sqli
3ce0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
3cf0: 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a 20  eof(*pLock) );. 
3d00: 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20     if( pLock==0 
3d10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
3d20: 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79  pLock->key = key
3d30: 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  1;.    pLock->nR
3d40: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63  ef = 1;.    pLoc
3d50: 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  k->cnt = 0;.    
3d60: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
3d70: 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  = 0;.    pOld = 
3d80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3d90: 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c  t(&lockHash, &pL
3da0: 6f 63 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  ock->key, sizeof
3db0: 28 6b 65 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a  (key1), pLock);.
3dc0: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20      if( pOld!=0 
3dd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3de0: 20 70 4f 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a   pOld==pLock );.
3df0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
3e00: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  (pLock);.      r
3e10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3e20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
3e30: 6b 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  k->nRef++;.  }. 
3e40: 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b   *ppLock = pLock
3e50: 3b 0a 20 20 70 4f 70 65 6e 20 3d 20 28 73 74 72  ;.  pOpen = (str
3e60: 75 63 74 20 6f 70 65 6e 43 6e 74 2a 29 73 71 6c  uct openCnt*)sql
3e70: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6f 70  ite3HashFind(&op
3e80: 65 6e 48 61 73 68 2c 20 26 6b 65 79 32 2c 20 73  enHash, &key2, s
3e90: 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20  izeof(key2));.  
3ea0: 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a  if( pOpen==0 ){.
3eb0: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
3ec0: 6e 74 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4f  nt *pOld;.    pO
3ed0: 70 65 6e 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pen = sqliteMall
3ee0: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
3ef0: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 69 66 28  Open) );.    if(
3f00: 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20   pOpen==0 ){.   
3f10: 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
3f20: 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  fo(pLock);.     
3f30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3f40: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6b 65 79 20  .    pOpen->key 
3f50: 3d 20 6b 65 79 32 3b 0a 20 20 20 20 70 4f 70 65  = key2;.    pOpe
3f60: 6e 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  n->nRef = 1;.   
3f70: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20   pOpen->nLock = 
3f80: 30 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  0;.    pOpen->nP
3f90: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
3fa0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20  pOpen->aPending 
3fb0: 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  = 0;.    pOld = 
3fc0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3fd0: 74 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 70 4f  t(&openHash, &pO
3fe0: 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  pen->key, sizeof
3ff0: 28 6b 65 79 32 29 2c 20 70 4f 70 65 6e 29 3b 0a  (key2), pOpen);.
4000: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20      if( pOld!=0 
4010: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4020: 20 70 4f 6c 64 3d 3d 70 4f 70 65 6e 20 29 3b 0a   pOld==pOpen );.
4030: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
4040: 28 70 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 72  (pOpen);.      r
4050: 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70  eleaseLockInfo(p
4060: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74  Lock);.      ret
4070: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
4080: 65 6c 73 65 7b 0a 20 20 20 20 70 4f 70 65 6e 2d  else{.    pOpen-
4090: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
40a0: 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b 0a  ppOpen = pOpen;.
40b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
40c0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
40d0: 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f 0a 69 6e  named file.*/.in
40e0: 74 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  t sqlite3OsDelet
40f0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
4100: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 75 6e 6c 69  ilename){.  unli
4110: 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
4120: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4130: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
4140: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
4150: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73  amed file exists
4160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4170: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 63 6f 6e  OsFileExists(con
4180: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
4190: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 63  me){.  return ac
41a0: 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  cess(zFilename, 
41b0: 30 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0)==0;.}../*.** 
41c0: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
41d0: 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20  a file for both 
41e0: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
41f0: 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a  ing.  If that.**
4200: 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e   fails, try open
4210: 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79  ing it read-only
4220: 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64  .  If the file d
4230: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a  oes not exist,.*
4240: 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
4250: 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  it..**.** On suc
4260: 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66  cess, a handle f
4270: 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  or the open file
4280: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
4290: 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64  id.** and *pRead
42a0: 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30  only is set to 0
42b0: 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   if the file was
42c0: 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
42d0: 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69  ing and.** writi
42e0: 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66  ng or 1 if the f
42f0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
4300: 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66  ead-only.  The f
4310: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
4320: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ** SQLITE_OK..**
4330: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
4340: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
4350: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
4360: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
4370: 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61  ** *id and *pRea
4380: 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e  donly unchanged.
4390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
43a0: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a  sOpenReadWrite(.
43b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
43c0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c  ilename,.  OsFil
43d0: 65 20 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52  e *id,.  int *pR
43e0: 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 69 6e 74  eadonly.){.  int
43f0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
4400: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
4410: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
4420: 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 69    SET_THREADID(i
4430: 64 29 3b 0a 20 20 69 64 2d 3e 68 20 3d 20 6f 70  d);.  id->h = op
4440: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  en(zFilename, O_
4450: 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c  RDWR|O_CREAT|O_L
4460: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
4470: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4490: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
44a0: 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
44b0: 20 69 66 28 20 69 64 2d 3e 68 3c 30 20 29 7b 0a   if( id->h<0 ){.
44c0: 23 69 66 64 65 66 20 45 49 53 44 49 52 0a 20 20  #ifdef EISDIR.  
44d0: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 53    if( errno==EIS
44e0: 44 49 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74  DIR ){.      ret
44f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4500: 50 45 4e 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  PEN;.    }.#endi
4510: 66 0a 20 20 20 20 69 64 2d 3e 68 20 3d 20 6f 70  f.    id->h = op
4520: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f  en(zFilename, O_
4530: 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49  RDONLY|O_LARGEFI
4540: 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20  LE|O_BINARY);.  
4550: 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20 29 7b    if( id->h<0 ){
4560: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
4570: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a  LITE_CANTOPEN; .
4580: 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65 61 64      }.    *pRead
4590: 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  only = 1;.  }els
45a0: 65 7b 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  e{.    *pReadonl
45b0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  y = 0;.  }.  sql
45c0: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
45d0: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
45e0: 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 68 2c 20 26  ockInfo(id->h, &
45f0: 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 69 64 2d 3e  id->pLock, &id->
4600: 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pOpen);.  sqlite
4610: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
4620: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
4630: 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
4640: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4650: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 64  _NOMEM;.  }.  id
4660: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
4670: 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31    id->isOpen = 1
4680: 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ;.  TRACE3("OPEN
4690: 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20      %-3d %s\n", 
46a0: 69 64 2d 3e 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  id->h, zFilename
46b0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
46c0: 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (+1);.  return S
46d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
46e0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f  .** Attempt to o
46f0: 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66  pen a new file f
4700: 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
4710: 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f 63  ess by this proc
4720: 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ess..** The file
4730: 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
4740: 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
4750: 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54   and writing.  T
4760: 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74  o avoid.** a pot
4770: 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79 20  ential security 
4780: 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e  problem, we do n
4790: 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  ot allow the fil
47a0: 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65  e to have.** pre
47b0: 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e  viously existed.
47c0: 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f    Nor do we allo
47d0: 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  w the file to be
47e0: 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c   a symbolic.** l
47f0: 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65  ink..**.** If de
4800: 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  lFlag is true, t
4810: 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65  hen make arrange
4820: 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74  ments to automat
4830: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a  ically delete.**
4840: 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69   the file when i
4850: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
4860: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
4870: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
4880: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
4890: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
48a0: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
48b0: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
48c0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
48d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70  .int sqlite3OsOp
48e0: 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73  enExclusive(cons
48f0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
4900: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  e, OsFile *id, i
4910: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 69  nt delFlag){.  i
4920: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
4930: 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a   !id->isOpen );.
4940: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 46 69    if( access(zFi
4950: 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20 29 7b  lename, 0)==0 ){
4960: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4970: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
4980: 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
4990: 69 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  id);.  id->dirfd
49a0: 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e 68 20 3d   = -1;.  id->h =
49b0: 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c   open(zFilename,
49c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
49d0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c   O_RDWR|O_CREAT|
49e0: 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
49f0: 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f  W|O_LARGEFILE|O_
4a00: 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20 20  BINARY,.        
4a10: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
4a20: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4a30: 49 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20  ISSIONS);.  if( 
4a40: 69 64 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 72  id->h<0 ){.    r
4a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
4a60: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c  TOPEN;.  }.  sql
4a70: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
4a80: 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 4c  ();.  rc = findL
4a90: 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 68 2c 20 26  ockInfo(id->h, &
4aa0: 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 69 64 2d 3e  id->pLock, &id->
4ab0: 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pOpen);.  sqlite
4ac0: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
4ad0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
4ae0: 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
4af0: 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
4b00: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
4b10: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4b20: 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   }.  id->locktyp
4b30: 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f  e = 0;.  id->isO
4b40: 70 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 64  pen = 1;.  if( d
4b50: 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 75 6e  elFlag ){.    un
4b60: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
4b70: 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22 4f  .  }.  TRACE3("O
4b80: 50 45 4e 2d 45 58 20 25 2d 33 64 20 25 73 5c 6e  PEN-EX %-3d %s\n
4b90: 22 2c 20 69 64 2d 3e 68 2c 20 7a 46 69 6c 65 6e  ", id->h, zFilen
4ba0: 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ame);.  OpenCoun
4bb0: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
4bc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4bd0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
4be0: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
4bf0: 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61   for read-only a
4c00: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ccess..**.** On 
4c10: 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74  success, write t
4c20: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69  he file handle i
4c30: 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75  nto *id and retu
4c40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
4c50: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
4c60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4c70: 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  NTOPEN..*/.int s
4c80: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
4c90: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
4ca0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
4cb0: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
4cc0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 64  c;.  assert( !id
4cd0: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 45  ->isOpen );.  SE
4ce0: 54 5f 54 48 52 45 41 44 49 44 28 69 64 29 3b 0a  T_THREADID(id);.
4cf0: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
4d00: 3b 0a 20 20 69 64 2d 3e 68 20 3d 20 6f 70 65 6e  ;.  id->h = open
4d10: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44  (zFilename, O_RD
4d20: 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  ONLY|O_LARGEFILE
4d30: 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66  |O_BINARY);.  if
4d40: 28 20 69 64 2d 3e 68 3c 30 20 29 7b 0a 20 20 20  ( id->h<0 ){.   
4d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
4d60: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73  ANTOPEN;.  }.  s
4d70: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
4d80: 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e  ex();.  rc = fin
4d90: 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 68 2c  dLockInfo(id->h,
4da0: 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 69 64   &id->pLock, &id
4db0: 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pOpen);.  sqli
4dc0: 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  te3OsLeaveMutex(
4dd0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
4de0: 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b     close(id->h);
4df0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4e00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
4e10: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30  id->locktype = 0
4e20: 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
4e30: 20 31 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50   1;.  TRACE3("OP
4e40: 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22  EN-RO %-3d %s\n"
4e50: 2c 20 69 64 2d 3e 68 2c 20 7a 46 69 6c 65 6e 61  , id->h, zFilena
4e60: 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  me);.  OpenCount
4e70: 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
4e80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4e90: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
4ea0: 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  open a file desc
4eb0: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 64  riptor for the d
4ec0: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
4ed0: 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c 65  ntains a.** file
4ee0: 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65 73  .  This file des
4ef0: 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20 75  criptor can be u
4f00: 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20 74  sed to fsync() t
4f10: 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
4f20: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
4f30: 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74 69   sure the creati
4f40: 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c 65  on of a new file
4f50: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69   is actually wri
4f60: 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  tten.** to disk.
4f70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4f80: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61 6e  ine is only mean
4f90: 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78 2e  ingful for Unix.
4fa0: 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20    It is a no-op 
4fb0: 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77 73  under.** windows
4fc0: 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20 64   since windows d
4fd0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
4fe0: 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a  hard links..**.*
4ff0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20  * On success, a 
5000: 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72 65  handle for a pre
5010: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69 6c  viously open fil
5020: 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a 2a  e is at *id is.*
5030: 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  * updated with t
5040: 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79  he new directory
5050: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5060: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
5070: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
5080: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
5090: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
50a0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
50b0: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
50c0: 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65  .** *id unchange
50d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
50e0: 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
50f0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
5100: 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46 69  zDirname,.  OsFi
5110: 6c 65 20 2a 69 64 0a 29 7b 0a 20 20 69 66 28 20  le *id.){.  if( 
5120: 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29 7b 0a 20  !id->isOpen ){. 
5130: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70 65     /* Do not ope
5140: 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
5150: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
5160: 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f 74  ding file is not
5170: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20   already.    ** 
5180: 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  open. */.    ret
5190: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
51a0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54  PEN;.  }.  SET_T
51b0: 48 52 45 41 44 49 44 28 69 64 29 3b 0a 20 20 61  HREADID(id);.  a
51c0: 73 73 65 72 74 28 20 69 64 2d 3e 64 69 72 66 64  ssert( id->dirfd
51d0: 3c 30 20 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  <0 );.  id->dirf
51e0: 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
51f0: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
5200: 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20  NARY, 0);.  if( 
5210: 69 64 2d 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20  id->dirfd<0 ){. 
5220: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5230: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a  _CANTOPEN; .  }.
5240: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49    TRACE3("OPENDI
5250: 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64  R %-3d %s\n", id
5260: 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d  ->dirfd, zDirnam
5270: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
5280: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5290: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
52a0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
52b0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
52c0: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
52d0: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
52e0: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
52f0: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
5300: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
5310: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
5320: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20   files..*/.char 
5330: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
5340: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
5350: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
5360: 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
5370: 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
5380: 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
5390: 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74  gh to.** hold at
53a0: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
53b0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72  MPNAME_SIZE char
53c0: 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  acters..*/.int s
53d0: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
53e0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29  Name(char *zBuf)
53f0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
5400: 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
5410: 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
5420: 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
5430: 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
5440: 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
5450: 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ".",.  };.  stat
5460: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5470: 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
5480: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
5490: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
54a0: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
54b0: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
54c0: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
54d0: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
54e0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
54f0: 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
5500: 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20  r *zDir = ".";. 
5510: 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
5520: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
5530: 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ory;.  for(i=0; 
5540: 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
5550: 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
5560: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
5570: 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
5580: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5590: 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
55a0: 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
55b0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
55c0: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
55d0: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
55e0: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
55f0: 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
5600: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
5610: 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
5620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
5630: 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  do{.    sprintf(
5640: 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f  zBuf, "%s/"TEMP_
5650: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
5660: 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  r);.    j = strl
5670: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
5680: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
5690: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
56a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
56b0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
56c0: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
56d0: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
56e0: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
56f0: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
5700: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
5710: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
5720: 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
5730: 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
5740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5750: 4f 4b 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  OK; .}..#ifndef 
5760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
5770: 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20  R_PRAGMAS./*.** 
5780: 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76  Check that a giv
5790: 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61  en pathname is a
57a0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69   directory and i
57b0: 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a  s writable .**.*
57c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49  /.int sqlite3OsI
57d0: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61  sDirWritable(cha
57e0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 72 75  r *zBuf){.  stru
57f0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
5800: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
5810: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
5820: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
5830: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
5840: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
5850: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
5860: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
5870: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5880: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
5890: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
58a0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
58b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
58c0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
58d0: 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  MAS */../*.** Re
58e0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
58f0: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
5900: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
5910: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
5920: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
5930: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
5940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
5950: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
5960: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73   wrong..*/.int s
5970: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 4f 73 46  qlite3OsRead(OsF
5980: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
5990: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
59a0: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
59b0: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
59c0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
59d0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
59e0: 29 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  );.  TIMER_START
59f0: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
5a00: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 29  d->h, pBuf, amt)
5a10: 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
5a20: 20 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20   TRACE5("READ   
5a30: 20 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64   %-3d %5d %7d %d
5a40: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
5a50: 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45   last_page, TIME
5a60: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45  R_ELAPSED);.  SE
5a70: 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20  EK(0);.  /* if( 
5a80: 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b  got<0 ) got = 0;
5a90: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61   */.  if( got==a
5aa0: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
5ab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
5ac0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5ad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
5ae0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  }.}../*.** Write
5af0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
5b00: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
5b10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
5b20: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
5b30: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
5b40: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
5b50: 6c 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lure..*/.int sql
5b60: 69 74 65 33 4f 73 57 72 69 74 65 28 4f 73 46 69  ite3OsWrite(OsFi
5b70: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
5b80: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
5b90: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
5ba0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
5bb0: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61  d->isOpen );.  a
5bc0: 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
5bd0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5be0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
5bf0: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
5c00: 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 49 4d 45  ullError;.  TIME
5c10: 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65  R_START;.  while
5c20: 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
5c30: 65 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c  e = write(id->h,
5c40: 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
5c50: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
5c60: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
5c70: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
5c80: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45  ote];.  }.  TIME
5c90: 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28  R_END;.  TRACE5(
5ca0: 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
5cb0: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
5cc0: 3e 68 2c 20 77 72 6f 74 65 2c 20 6c 61 73 74 5f  >h, wrote, last_
5cd0: 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50  page, TIMER_ELAP
5ce0: 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  SED);.  SEEK(0);
5cf0: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
5d00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5d10: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
5d20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
5d40: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
5d50: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
5d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
5d70: 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Seek(OsFile *id,
5d80: 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a 20 20   i64 offset){.  
5d90: 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70  assert( id->isOp
5da0: 65 6e 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66  en );.  SEEK(off
5db0: 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20  set/1024 + 1);. 
5dc0: 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
5dd0: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
5de0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5df0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
5e00: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
5e10: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
5e20: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
5e30: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
5e40: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
5e50: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
5e60: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
5e70: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
5e80: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
5e90: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
5ea0: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
5eb0: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
5ec0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
5ed0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
5ee0: 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
5ef0: 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
5f00: 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
5f10: 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
5f20: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
5f30: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
5f40: 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
5f50: 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
5f60: 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
5f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
5f80: 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
5f90: 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
5fa0: 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
5fb0: 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
5fc0: 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
5fd0: 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
5fe0: 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
5ff0: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
6000: 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
6010: 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
6020: 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
6030: 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
6040: 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
6050: 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
6060: 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
6070: 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
6080: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
6090: 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
60a0: 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
60b0: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
60c0: 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
60d0: 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
60e0: 6c 6c 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72  llSync){.  int r
60f0: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
6100: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
6110: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
6120: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
6130: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
6140: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
6150: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
6160: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
6170: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
6180: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
6190: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
61a0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
61b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
61c0: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
61d0: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
61e0: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
61f0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
6200: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
6210: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
6220: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
6230: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
6240: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
6250: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
6260: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6270: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
6280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
6290: 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  ..#ifdef F_FULLF
62a0: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
62b0: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
62c0: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
62d0: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
62e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
62f0: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
6300: 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64 2c  FULLSYNC failed,
6310: 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f 72   try to do a nor
6320: 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 20  mal fsync() */. 
6330: 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
6340: 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65  sync(fd);..#else
6350: 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
6360: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
6370: 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e 43  ined(F_FULLFSYNC
6380: 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ) */.#endif /* d
6390: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
63a0: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
63b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
63c0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
63d0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
63e0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
63f0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
6400: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
6410: 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
6420: 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
6430: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
6440: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
6450: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
6460: 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
6470: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
6480: 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
6490: 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
64a0: 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
64b0: 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
64c0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
64d0: 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
64e0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
64f0: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
6500: 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
6510: 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
6520: 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
6530: 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
6540: 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
6550: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
6560: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
6570: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
6580: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
6590: 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
65a0: 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
65b0: 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
65c0: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
65d0: 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
65e0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
65f0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
6600: 6c 69 74 65 33 4f 73 53 79 6e 63 28 4f 73 46 69  lite3OsSync(OsFi
6610: 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73 73 65 72  le *id){.  asser
6620: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
6630: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6640: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
6650: 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e 43  ;.  TRACE2("SYNC
6660: 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d      %-3d\n", id-
6670: 3e 68 29 3b 0a 20 20 69 66 28 20 66 75 6c 6c 5f  >h);.  if( full_
6680: 66 73 79 6e 63 28 69 64 2d 3e 68 2c 20 69 64 2d  fsync(id->h, id-
6690: 3e 66 75 6c 6c 53 79 6e 63 29 20 29 7b 0a 20 20  >fullSync) ){.  
66a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
66b0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 69 66 28  IOERR;.  }.  if(
66c0: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b   id->dirfd>=0 ){
66d0: 0a 20 20 20 20 54 52 41 43 45 32 28 22 44 49 52  .    TRACE2("DIR
66e0: 53 59 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SYNC %-3d\n", id
66f0: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 66 75  ->dirfd);.    fu
6700: 6c 6c 5f 66 73 79 6e 63 28 69 64 2d 3e 64 69 72  ll_fsync(id->dir
6710: 66 64 2c 20 69 64 2d 3e 66 75 6c 6c 53 79 6e 63  fd, id->fullSync
6720: 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  );.    close(id-
6730: 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c  >dirfd);  /* Onl
6740: 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
6750: 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
6760: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  e directory */. 
6770: 20 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d     id->dirfd = -
6780: 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65  1;    /* when we
6790: 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20   are done. */.  
67a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
67b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
67c0: 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
67d0: 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73  y zDirname. This
67e0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f   is a no-op on o
67f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
6800: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55   other.** than U
6810: 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  NIX..**.** This 
6820: 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
6830: 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20  sure the master 
6840: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
6850: 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c   truely been del
6860: 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d  eted.** before m
6870: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
6880: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
6890: 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d  nals on a multi-
68a0: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e  database commit.
68b0: 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53  .** The F_FULLFS
68c0: 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  YNC option is no
68d0: 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a  t needed here..*
68e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53  /.int sqlite3OsS
68f0: 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  yncDirectory(con
6900: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
6910: 65 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  e){.  int fd;.  
6920: 69 6e 74 20 72 3b 0a 20 20 53 69 6d 75 6c 61 74  int r;.  Simulat
6930: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
6940: 49 4f 45 52 52 29 3b 0a 20 20 66 64 20 3d 20 6f  IOERR);.  fd = o
6950: 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
6960: 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
6970: 20 30 29 3b 0a 20 20 54 52 41 43 45 33 28 22 44   0);.  TRACE3("D
6980: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 25 73 29  IRSYNC %-3d (%s)
6990: 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
69a0: 65 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  e);.  if( fd<0 )
69b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
69c0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20  ITE_CANTOPEN; . 
69d0: 20 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63 28 66   }.  r = fsync(f
69e0: 64 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  d);.  close(fd);
69f0: 0a 20 20 72 65 74 75 72 6e 20 28 28 72 3d 3d 30  .  return ((r==0
6a00: 29 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  )?SQLITE_OK:SQLI
6a10: 54 45 5f 49 4f 45 52 52 29 3b 0a 7d 0a 0a 2f 2a  TE_IOERR);.}../*
6a20: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
6a30: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
6a40: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
6a50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72  .int sqlite3OsTr
6a60: 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  uncate(OsFile *i
6a70: 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
6a80: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
6a90: 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  pen );.  Simulat
6aa0: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
6ab0: 49 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e  IOERR);.  return
6ac0: 20 66 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 68   ftruncate(id->h
6ad0: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
6ae0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
6af0: 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _IOERR;.}../*.**
6b00: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
6b10: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
6b20: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
6b30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46  /.int sqlite3OsF
6b40: 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a  ileSize(OsFile *
6b50: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
6b60: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
6b70: 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
6b80: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69  ->isOpen );.  Si
6b90: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
6ba0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69  LITE_IOERR);.  i
6bb0: 66 28 20 66 73 74 61 74 28 69 64 2d 3e 68 2c 20  f( fstat(id->h, 
6bc0: 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20  &buf)!=0 ){.    
6bd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6be0: 45 52 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  ERR;.  }.  *pSiz
6bf0: 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
6c00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6c10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
6c20: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
6c30: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
6c40: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
6c50: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
6c60: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
6c70: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
6c80: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
6c90: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
6ca0: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
6cb0: 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69  zero.  If the fi
6cc0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f  le is unlocked o
6cd0: 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41  r holds only SHA
6ce0: 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a  RED locks, then.
6cf0: 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a  ** return zero..
6d00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
6d10: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
6d20: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  k(OsFile *id){. 
6d30: 20 69 6e 74 20 72 20 3d 20 30 3b 0a 0a 20 20 61   int r = 0;..  a
6d40: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
6d50: 6e 20 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b  n );.  if( CHECK
6d60: 5f 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20  _THREADID(id) ) 
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
6d80: 53 55 53 45 3b 0a 20 20 73 71 6c 69 74 65 33 4f  SUSE;.  sqlite3O
6d90: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  sEnterMutex(); /
6da0: 2a 20 4e 65 65 64 65 64 20 62 65 63 61 75 73 65  * Needed because
6db0: 20 69 64 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68   id->pLock is sh
6dc0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
6dd0: 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ads */..  /* Che
6de0: 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
6df0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
6e00: 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
6e10: 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c   */.  if( id->pL
6e20: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ock->locktype>SH
6e30: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
6e40: 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f   r = 1;.  }..  /
6e50: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
6e60: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
6e70: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
6e80: 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 20 29 7b    */.  if( !r ){
6e90: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
6ea0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
6eb0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
6ec0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
6ed0: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
6ee0: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
6ef0: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
6f00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
6f10: 57 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c  WRLCK;.    fcntl
6f20: 28 69 64 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  (id->h, F_GETLK,
6f30: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
6f40: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f   lock.l_type!=F_
6f50: 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  UNLCK ){.      r
6f60: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
6f70: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65    .  sqlite3OsLe
6f80: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52  aveMutex();.  TR
6f90: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
6fa0: 43 4b 20 25 64 20 25 64 5c 6e 22 2c 20 69 64 2d  CK %d %d\n", id-
6fb0: 3e 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72  >h, r);..  retur
6fc0: 6e 20 72 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n r;.}..#ifdef S
6fd0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
6fe0: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
6ff0: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
7000: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
7010: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
7020: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
7030: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
7040: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
7050: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
7060: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
7070: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
7080: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7090: 72 20 2a 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65  r * locktypeName
70a0: 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a  (int locktype){.
70b0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
70c0: 70 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f  pe ){.  case NO_
70d0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f  LOCK: return "NO
70e0: 4e 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52  NE";.  case SHAR
70f0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
7100: 22 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65  "SHARED";.  case
7110: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
7120: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
7130: 22 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e  ";.  case PENDIN
7140: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
7150: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65  PENDING";.  case
7160: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a   EXCLUSIVE_LOCK:
7170: 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49   return "EXCLUSI
7180: 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VE";.  }.  retur
7190: 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e  n "ERROR";.}.#en
71a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  dif../*.** Lock 
71b0: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
71c0: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
71d0: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
71e0: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
71f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7200: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
7210: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
7220: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
7230: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
7240: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
7250: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
7260: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
7270: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
7280: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
7290: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
72a0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
72b0: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
72c0: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
72d0: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
72e0: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
72f0: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
7300: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
7310: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
7320: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
7330: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
7340: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
7350: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
7360: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
7370: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
7380: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
7390: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
73a0: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
73b0: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
73c0: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
73d0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
73e0: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
73f0: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
7400: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
7410: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
7420: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
7430: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
7440: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
7450: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
7460: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
7470: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
7480: 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
7490: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
74a0: 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
74b0: 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
74c0: 76 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  vel..*/.int sqli
74d0: 74 65 33 4f 73 4c 6f 63 6b 28 4f 73 46 69 6c 65  te3OsLock(OsFile
74e0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
74f0: 70 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  pe){.  /* The fo
7500: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
7510: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
7520: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
7530: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
7540: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
7550: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
7560: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
7570: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
7580: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
7590: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
75a0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
75b0: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
75c0: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
75d0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
75e0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
75f0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
7600: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
7610: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
7620: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
7630: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
7640: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
7650: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
7660: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
7670: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
7680: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
7690: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
76a0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
76b0: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
76c0: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
76d0: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
76e0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
76f0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
7700: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
7710: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
7720: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
7730: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
7740: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
7750: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
7760: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
7770: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
7780: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
7790: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
77a0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
77b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
77c0: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
77d0: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
77e0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
77f0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
7800: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
7810: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
7820: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
7830: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
7840: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
7850: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
7860: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
7870: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
7880: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
7890: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
78a0: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
78b0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
78c0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
78d0: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
78e0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
78f0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
7900: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
7910: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
7920: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
7930: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
7940: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
7950: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
7960: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
7970: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
7980: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
7990: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
79a0: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
79b0: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
79c0: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
79d0: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
79e0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
79f0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
7a00: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
7a10: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
7a20: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
7a30: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
7a40: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
7a50: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
7a60: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
7a70: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
7a80: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
7a90: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
7aa0: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
7ab0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
7ac0: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
7ad0: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
7ae0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
7af0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
7b00: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
7b10: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
7b20: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
7b30: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
7b40: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
7b50: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
7b60: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
7b70: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
7b80: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
7b90: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
7ba0: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
7bb0: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
7bc0: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
7bd0: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
7be0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
7bf0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
7c00: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
7c10: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
7c20: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
7c30: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
7c40: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
7c50: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7c60: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
7c70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
7c80: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
7c90: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
7ca0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
7cb0: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
7cc0: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
7cd0: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
7ce0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
7cf0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
7d00: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
7d10: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
7d20: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
7d30: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
7d40: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74  ITE_OK;.  struct
7d50: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
7d60: 20 3d 20 69 64 2d 3e 70 4c 6f 63 6b 3b 0a 20 20   = id->pLock;.  
7d70: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
7d80: 6b 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61  k;.  int s;..  a
7d90: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
7da0: 6e 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 4c  n );.  TRACE7("L
7db0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
7dc0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
7dd0: 64 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63  d\n", id->h, loc
7de0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
7df0: 70 65 29 2c 20 0a 20 20 20 20 20 20 6c 6f 63 6b  pe), .      lock
7e00: 74 79 70 65 4e 61 6d 65 28 69 64 2d 3e 6c 6f 63  typeName(id->loc
7e10: 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65  ktype), locktype
7e20: 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  Name(pLock->lock
7e30: 74 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e  type), pLock->cn
7e40: 74 0a 20 20 20 20 20 20 2c 67 65 74 70 69 64 28  t.      ,getpid(
7e50: 29 20 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b  ) );.  if( CHECK
7e60: 5f 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20  _THREADID(id) ) 
7e70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
7e80: 53 55 53 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  SUSE;..  /* If t
7e90: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
7ea0: 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
7eb0: 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
7ec0: 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
7ed0: 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
7ee0: 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
7ef0: 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
7f00: 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
7f10: 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
7f20: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
7f30: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
7f40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e  .  */.  if( id->
7f50: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
7f60: 70 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 33  pe ){.    TRACE3
7f70: 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
7f80: 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
7f90: 29 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63  )\n", id->h, loc
7fa0: 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79  ktypeName(lockty
7fb0: 70 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  pe));.    return
7fc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
7fd0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7fe0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
7ff0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
8000: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
8010: 64 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  d->locktype!=NO_
8020: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
8030: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
8040: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
8050: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
8060: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
8070: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
8080: 44 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f  D_LOCK || id->lo
8090: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
80a0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
80b0: 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
80c0: 64 20 62 65 63 61 75 73 65 20 69 64 2d 3e 70 4c  d because id->pL
80d0: 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63  ock is shared ac
80e0: 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
80f0: 2f 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  /.  sqlite3OsEnt
8100: 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
8110: 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
8120: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
8130: 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
8140: 64 69 66 66 65 72 65 6e 74 20 4f 73 46 69 6c 65  different OsFile
8150: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
8160: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
8170: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
8180: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
8190: 2a 2f 0a 20 20 69 66 28 20 28 69 64 2d 3e 6c 6f  */.  if( (id->lo
81a0: 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c  cktype!=pLock->l
81b0: 6f 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20  ocktype && .    
81c0: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
81d0: 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  cktype>=PENDING_
81e0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
81f0: 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
8200: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
8210: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
8220: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  to end_lock;.  }
8230: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52  ..  /* If a SHAR
8240: 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ED lock is reque
8250: 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74  sted, and some t
8260: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
8270: 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a   PID already.  *
8280: 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f  * has a SHARED o
8290: 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  r RESERVED lock,
82a0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
82b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73  reference counts
82c0: 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e   and.  ** return
82d0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f   SQLITE_OK..  */
82e0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
82f0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
8300: 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c  .      (pLock->l
8310: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
8320: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c  LOCK || pLock->l
8330: 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
8340: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
8350: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d  ssert( locktype=
8360: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
8370: 20 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e      assert( id->
8380: 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20  locktype==0 );. 
8390: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
83a0: 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 69  ->cnt>0 );.    i
83b0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48  d->locktype = SH
83c0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
83d0: 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20  Lock->cnt++;.   
83e0: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
83f0: 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
8400: 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c  d_lock;.  }..  l
8410: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
8420: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
8430: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20   = SEEK_SET;..  
8440: 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
8450: 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
8460: 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
8470: 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
8480: 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
8490: 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
84a0: 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
84b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
84c0: 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
84d0: 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
84e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
84f0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
8500: 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63  K .      || (loc
8510: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
8520: 5f 4c 4f 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63  _LOCK && id->loc
8530: 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f  ktype<PENDING_LO
8540: 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63  CK).  ){.    loc
8550: 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b  k.l_type = (lock
8560: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
8570: 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
8580: 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
8590: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
85a0: 59 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e  YTE;.    s = fcn
85b0: 74 6c 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c  tl(id->h, F_SETL
85c0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
85d0: 66 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63  f( s ){.      rc
85e0: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
85f0: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
8600: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
8610: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
8620: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
8630: 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
8640: 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70  l gets to this p
8650: 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61  oint, then actua
8660: 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64  lly go ahead and
8670: 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61   make.  ** opera
8680: 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c  ting system call
8690: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  s for the specif
86a0: 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ied lock..  */. 
86b0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
86c0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
86d0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
86e0: 3e 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  >cnt==0 );.    a
86f0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f  ssert( pLock->lo
8700: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20  cktype==0 );..  
8710: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
8720: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
8730: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
8740: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
8750: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
8760: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
8770: 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 68   s = fcntl(id->h
8780: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
8790: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20  );..    /* Drop 
87a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
87b0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
87c0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
87d0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
87e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
87f0: 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
8800: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
8810: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d     if( fcntl(id-
8820: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
8830: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
8840: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8850: 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  R;  /* This shou
8860: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
8870: 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  */.      goto en
8880: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
8890: 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20    if( s ){.     
88a0: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
88b0: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
88c0: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
88d0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
88e0: 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70       id->locktyp
88f0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
8900: 0a 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e  .      id->pOpen
8910: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
8920: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b   pLock->cnt = 1;
8930: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
8940: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
8950: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
8960: 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
8970: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
8980: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
8990: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
89a0: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
89b0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
89c0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
89d0: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
89e0: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
89f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
8a00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
8a10: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
8a20: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
8a30: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
8a40: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
8a50: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
8a60: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
8a70: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
8a80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
8a90: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
8aa0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8ab0: 30 21 3d 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  0!=id->locktype 
8ac0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
8ad0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
8ae0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
8af0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
8b00: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
8b10: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
8b20: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
8b30: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
8b40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8b50: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
8b60: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
8b70: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
8b80: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
8b90: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8ba0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
8bb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
8bc0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
8bd0: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
8be0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e    s = fcntl(id->
8bf0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
8c00: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b  k);.    if( s ){
8c10: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
8c20: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
8c30: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
8c40: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
8c50: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
8c60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8c70: 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d    id->locktype =
8c80: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
8c90: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8ca0: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
8cb0: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
8cc0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
8cd0: 29 7b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74  ){.    id->lockt
8ce0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
8cf0: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
8d00: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
8d10: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
8d20: 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33  _lock:.  sqlite3
8d30: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
8d40: 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20    TRACE4("LOCK  
8d50: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 69    %d %s %s\n", i
8d60: 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  d->h, locktypeNa
8d70: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
8d80: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
8d90: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
8da0: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
8db0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
8dc0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
8dd0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
8de0: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
8df0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
8e00: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
8e10: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
8e20: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
8e30: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
8e40: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
8e50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
8e60: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
8e70: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
8e80: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
8e90: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
8ea0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
8eb0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
8ec0: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
8ed0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
8ee0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
8ef0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
8f00: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
8f10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
8f20: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 74 68   SHARED_LOCK, th
8f30: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
8f40: 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
8f50: 45 5f 49 4f 45 52 52 20 69 6e 73 74 65 61 64 20  E_IOERR instead 
8f60: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  of SQLITE_OK..*/
8f70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 55 6e  .int sqlite3OsUn
8f80: 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  lock(OsFile *id,
8f90: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
8fa0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
8fb0: 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  o *pLock;.  stru
8fc0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
8fd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8fe0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
8ff0: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
9000: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
9010: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
9020: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 69  %d) pid=%d\n", i
9030: 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  d->h, locktype, 
9040: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 0a 20  id->locktype, . 
9050: 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e       id->pLock->
9060: 6c 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e 70 4c  locktype, id->pL
9070: 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
9080: 28 29 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b  ());.  if( CHECK
9090: 5f 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20  _THREADID(id) ) 
90a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
90b0: 53 55 53 45 3b 0a 0a 20 20 61 73 73 65 72 74 28  SUSE;..  assert(
90c0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
90d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
90e0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f  id->locktype<=lo
90f0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
9100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9110: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45    }.  sqlite3OsE
9120: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
9130: 4c 6f 63 6b 20 3d 20 69 64 2d 3e 70 4c 6f 63 6b  Lock = id->pLock
9140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
9150: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
9160: 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e  f( id->locktype>
9170: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
9180: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
9190: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 69 64 2d 3e  ->locktype==id->
91a0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
91b0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
91c0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
91d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
91e0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
91f0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9200: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
9210: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
9220: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
9230: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
9240: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
9250: 20 20 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d     if( fcntl(id-
9260: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
9270: 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)!=0 ){.      
9280: 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
9290: 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f   never happen */
92a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
92b0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
92c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
92d0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
92e0: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
92f0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
9300: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
9310: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
9320: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
9330: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
9340: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
9350: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
9360: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
9370: 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  (id->h, F_SETLK,
9380: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
9390: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74      pLock->lockt
93a0: 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
93b0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
93c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
93d0: 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20  IOERR;  /* This 
93e0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
93f0: 70 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  pen */.    }.  }
9400: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
9410: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
9420: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
9430: 70 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44  pOpen;..    /* D
9440: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
9450: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
9460: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
9470: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
9480: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
9490: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
94a0: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
94b0: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
94c0: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
94d0: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
94e0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20   pLock->cnt--;. 
94f0: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e     if( pLock->cn
9500: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  t==0 ){.      lo
9510: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
9520: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
9530: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
9540: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
9550: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
9560: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
9570: 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d 3e 68   if( fcntl(id->h
9580: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
9590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
95a0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
95b0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
95c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
95d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
95e0: 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  R;  /* This shou
95f0: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
9600: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9610: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
9620: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
9630: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
9640: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
9650: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
9660: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
9670: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
9680: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
9690: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
96a0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
96b0: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
96c0: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
96d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70  ..    */.    pOp
96e0: 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a  en = id->pOpen;.
96f0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b      pOpen->nLock
9700: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
9710: 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  pOpen->nLock>=0 
9720: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e  );.    if( pOpen
9730: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f  ->nLock==0 && pO
9740: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20  pen->nPending>0 
9750: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9760: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9770: 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  <pOpen->nPending
9780: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9790: 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65  close(pOpen->aPe
97a0: 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20  nding[i]);.     
97b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46   }.      sqliteF
97c0: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
97d0: 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65  ing);.      pOpe
97e0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
97f0: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  .      pOpen->aP
9800: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
9810: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  }.  }.  sqlite3O
9820: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
9830: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20   id->locktype = 
9840: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  locktype;.  retu
9850: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9860: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
9870: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c  .int sqlite3OsCl
9880: 6f 73 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b  ose(OsFile *id){
9890: 0a 20 20 69 66 28 20 21 69 64 2d 3e 69 73 4f 70  .  if( !id->isOp
98a0: 65 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  en ) return SQLI
98b0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 43 48 45  TE_OK;.  if( CHE
98c0: 43 4b 5f 54 48 52 45 41 44 49 44 28 69 64 29 20  CK_THREADID(id) 
98d0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
98e0: 4d 49 53 55 53 45 3b 0a 20 20 73 71 6c 69 74 65  MISUSE;.  sqlite
98f0: 33 4f 73 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  3OsUnlock(id, NO
9900: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64  _LOCK);.  if( id
9910: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
9920: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
9930: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
9940: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
9950: 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  rMutex();.  if( 
9960: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
9970: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
9980: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
9990: 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
99a0: 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
99b0: 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
99c0: 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
99d0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
99e0: 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
99f0: 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
9a00: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
9a10: 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65  scriptor to pOpe
9a20: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  n->aPending.  It
9a30: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
9a40: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
9a50: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
9a60: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
9a70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
9a80: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74  nt *aNew;.    st
9a90: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
9aa0: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b  pen = id->pOpen;
9ab0: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  .    pOpen->nPen
9ac0: 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e 65 77  ding++;.    aNew
9ad0: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
9ae0: 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  ( pOpen->aPendin
9af0: 67 2c 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  g, pOpen->nPendi
9b00: 6e 67 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  ng*sizeof(int) )
9b10: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
9b20: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
9b30: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c   a malloc fails,
9b40: 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66   just leak the f
9b50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
9b60: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
9b70: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
9b80: 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ng = aNew;.     
9b90: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
9ba0: 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67  [pOpen->nPending
9bb0: 2d 31 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20 20 20  -1] = id->h;.   
9bc0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
9bd0: 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
9be0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
9bf0: 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73  s so we can clos
9c00: 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64  e the file immed
9c10: 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c  iately */.    cl
9c20: 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a  ose(id->h);.  }.
9c30: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
9c40: 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20  o(id->pLock);.  
9c50: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69  releaseOpenCnt(i
9c60: 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c  d->pOpen);.  sql
9c70: 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78  ite3OsLeaveMutex
9c80: 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e  ();.  id->isOpen
9c90: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22   = 0;.  TRACE2("
9ca0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
9cb0: 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43   id->h);.  OpenC
9cc0: 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65  ounter(-1);.  re
9cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
9cf0: 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
9d00: 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
9d10: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  thname.  Return 
9d20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9d30: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
9d40: 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63  e stored in spac
9d50: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
9d60: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a  sqliteMalloc()..
9d70: 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
9d80: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
9d90: 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69  nsible for freei
9da0: 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e  ng this space on
9db0: 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c  ce it.** is no l
9dc0: 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f  onger needed..*/
9dd0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4f 73  .char *sqlite3Os
9de0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
9df0: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
9e00: 76 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75  ve){.  char *zFu
9e10: 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52  ll = 0;.  if( zR
9e20: 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
9e30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
9e40: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
9e50: 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72  zRelative, (char
9e60: 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  *)0);.  }else{. 
9e70: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30     char zBuf[500
9e80: 30 5d 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20  0];.    zBuf[0] 
9e90: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
9ea0: 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c  SetString(&zFull
9eb0: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73  , getcwd(zBuf, s
9ec0: 69 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 22 2f  izeof(zBuf)), "/
9ed0: 22 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20  ", zRelative,.  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d    (char*)0);.  }
9f00: 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b  .  return zFull;
9f10: 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .}...#endif /* S
9f20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9f30: 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  O */./**********
9f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9f80: 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20  *.** Everything 
9f90: 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68  above deals with
9fa0: 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72   file I/O.  Ever
9fb0: 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c  ything that foll
9fc0: 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74  ows deals.** wit
9fd0: 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61  h other miscella
9fe0: 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66 20  nous aspects of 
9ff0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
a000: 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a  stem interface.*
a010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
a060: 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61  *.** Get informa
a070: 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65  tion to seed the
a080: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
a090: 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73  enerator.  The s
a0a0: 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  eed.** is writte
a0b0: 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  n into the buffe
a0c0: 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68  r zBuf[256].  Th
a0d0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
a0e0: 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c  on must.** suppl
a0f0: 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79  y a sufficiently
a100: 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a   large buffer..*
a110: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 52  /.int sqlite3OsR
a120: 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a  andomSeed(char *
a130: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68  zBuf){.  /* We h
a140: 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
a150: 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
a160: 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
a170: 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
a180: 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
a190: 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
a1a0: 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
a1b0: 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
a1c0: 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
a1d0: 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
a1e0: 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
a1f0: 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
a200: 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
a210: 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
a220: 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
a230: 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
a240: 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
a250: 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
a260: 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
a270: 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
a280: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
a290: 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
a2a0: 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
a2b0: 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
a2c0: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
a2d0: 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
a2e0: 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
a2f0: 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
a300: 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
a310: 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
a320: 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
a330: 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
a340: 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
a350: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
a360: 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
a370: 65 72 20 73 65 71 75 65 6e 63 65 2e 2a 20 54 68  er sequence.* Th
a380: 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
a390: 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
a3a0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
a3b0: 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36 29 3b  t(zBuf, 0, 256);
a3c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a3d0: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
a3e0: 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a     int pid, fd;.
a3f0: 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f      fd = open("/
a400: 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
a410: 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28  RDONLY);.    if(
a420: 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
a430: 69 6d 65 28 28 74 69 6d 65 5f 74 2a 29 7a 42 75  ime((time_t*)zBu
a440: 66 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20  f);.      pid = 
a450: 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20  getpid();.      
a460: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
a470: 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70  eof(time_t)], &p
a480: 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
a490: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4a0: 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66     read(fd, zBuf
a4b0: 2c 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c  , 256);.      cl
a4c0: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20  ose(fd);.    }. 
a4d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
a4e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a4f0: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
a500: 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
a510: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
a520: 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
a530: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
a540: 33 4f 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29  3OsSleep(int ms)
a550: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
a560: 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
a570: 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
a580: 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20 72  ep(ms*1000);.  r
a590: 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a  eturn ms;.#else.
a5a0: 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39 39 29    sleep((ms+999)
a5b0: 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
a5c0: 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39 29 2f   1000*((ms+999)/
a5d0: 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  1000);.#endif.}.
a5e0: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61  ./*.** Static va
a5f0: 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72  riables used for
a600: 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e   thread synchron
a610: 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ization.*/.stati
a620: 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
a630: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
a640: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74  _UNIX_THREADS.st
a650: 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74  atic pthread_mut
a660: 65 78 5f 74 20 6d 75 74 65 78 20 3d 20 50 54 48  ex_t mutex = PTH
a670: 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49  READ_MUTEX_INITI
a680: 41 4c 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a 0a  ALIZER;.#endif..
a690: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a6a0: 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74  ing pair of rout
a6b0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75  ine implement mu
a6c0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66  tual exclusion f
a6d0: 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65  or.** multi-thre
a6e0: 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20  aded processes. 
a6f0: 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   Only a single t
a700: 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64  hread is allowed
a710: 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20   to.** executed 
a720: 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72  code that is sur
a730: 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72  rounded by Enter
a740: 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76  Mutex() and Leav
a750: 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20  eMutex()..**.** 
a760: 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79  SQLite uses only
a770: 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e   a single Mutex.
a780: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d    There is not m
a790: 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20  uch critical.** 
a7a0: 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69  code and what li
a7b0: 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78  ttle there is ex
a7c0: 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61  ecutes quickly a
a7d0: 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b  nd without block
a7e0: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
a7f0: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
a800: 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  (){.#ifdef SQLIT
a810: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
a820: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c   pthread_mutex_l
a830: 6f 63 6b 28 26 6d 75 74 65 78 29 3b 0a 23 65 6e  ock(&mutex);.#en
a840: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21 69  dif.  assert( !i
a850: 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75  nMutex );.  inMu
a860: 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20  tex = 1;.}.void 
a870: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
a880: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
a890: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
a8a0: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
a8b0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
a8c0: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
a8d0: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
a8e0: 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  tex);.#endif.}..
a8f0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a900: 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
a910: 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
a920: 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65  ro value, become
a930: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
a940: 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71  returned from sq
a950: 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
a960: 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20 75  me().  This is u
a970: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e  sed for testing.
a980: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
a990: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
a9a0: 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
a9b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
a9c0: 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
a9d0: 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
a9e0: 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
a9f0: 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
aa00: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
aa10: 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
aa20: 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
aa30: 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
aa40: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
aa50: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
aa60: 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
aa70: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
aa80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
aa90: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f  OsCurrentTime(do
aaa0: 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
aab0: 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65  time_t t;.  time
aac0: 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d  (&t);.  *prNow =
aad0: 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34   t/86400.0 + 244
aae0: 30 35 38 37 2e 35 3b 0a 23 69 66 64 65 66 20 53  0587.5;.#ifdef S
aaf0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
ab00: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
ab10: 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72  _time ){.    *pr
ab20: 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75  Now = sqlite3_cu
ab30: 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30  rrent_time/86400
ab40: 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
ab50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
ab60: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66  urn 0;.}..#endif
ab70: 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a      /* OS_UNIX */.