System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 45540d7ee5095566da6685d584598edee5be857c:


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 4d 61 63 72 6f 73 20  f../*.** Macros 
0580: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
0590: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
05a0: 20 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e   to use threads.
05b0: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
05c0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63  UNIX_THREADS mac
05d0: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 69 66  ro is defined if
05e0: 20 77 65 20 61 72 65 20 73 79 6e 63 68 72 6f 6e   we are synchron
05f0: 69 7a 69 6e 67 20 66 6f 72 0a 2a 2a 20 50 6f 73  izing for.** Pos
0600: 69 78 20 74 68 72 65 61 64 73 20 61 6e 64 20 53  ix threads and S
0610: 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44  QLITE_W32_THREAD
0620: 53 20 69 73 20 64 65 66 69 6e 65 64 20 69 66 20  S is defined if 
0630: 77 65 20 61 72 65 0a 2a 2a 20 73 79 6e 63 68 72  we are.** synchr
0640: 6f 6e 69 7a 69 6e 67 20 75 73 69 6e 67 20 57 69  onizing using Wi
0650: 6e 33 32 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  n32 threads..*/.
0660: 23 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45  #if defined(THRE
0670: 41 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41  ADSAFE) && THREA
0680: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
0690: 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65  <pthread.h>.# de
06a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58  fine SQLITE_UNIX
06b0: 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69  _THREADS 1.#endi
06c0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  f.../*.** Includ
06d0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
06e0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
06f0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0700: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0710: 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h"..#if defined
0720: 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  (THREADSAFE) && 
0730: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
0740: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
0750: 0a 23 64 65 66 69 6e 65 20 67 65 74 70 69 64 20  .#define getpid 
0760: 70 74 68 72 65 61 64 5f 73 65 6c 66 0a 23 65 6e  pthread_self.#en
0770: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  dif../*.** Here 
0780: 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50  is the dirt on P
0790: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
07a0: 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31  cks:  ANSI STD 1
07b0: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
07c0: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
07d0: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
07e0: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
07f0: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
0800: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
0810: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
0820: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
0830: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
0840: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
0850: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
0860: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
0870: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
0880: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
0890: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
08a0: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
08b0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
08c0: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
08d0: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
08e0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
08f0: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
0900: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
0910: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
0920: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
0930: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
0940: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
0950: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
0960: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
0970: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
0980: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
0990: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
09a0: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
09b0: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
09c0: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
09d0: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
09e0: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
09f0: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
0a00: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
0a10: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
0a20: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
0a30: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
0a40: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
0a50: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
0a60: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
0a70: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
0a80: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
0a90: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
0aa0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
0ab0: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
0ac0: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
0ad0: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
0ae0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
0af0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
0b00: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
0b10: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
0b20: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
0b30: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
0b40: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
0b50: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
0b60: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
0b70: 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72  es..**.** Bummer
0b80: 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20 6d 65  .  If you ask me
0b90: 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b 65 6e  , this is broken
0ba0: 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e  .  Badly broken.
0bb0: 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68    It means.** th
0bc0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
0bd0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
0be0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
0bf0: 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a   access among.**
0c00: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
0c10: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
0c20: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
0c30: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
0c40: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
0c50: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
0c60: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
0c70: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
0c80: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
0c90: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
0ca0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
0cb0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
0cc0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
0cd0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
0ce0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
0cf0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
0d00: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
0d10: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
0d20: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
0d30: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
0d40: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
0d50: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0d60: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
0d70: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
0d80: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
0d90: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
0da0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
0db0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
0dc0: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
0dd0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
0de0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
0df0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
0e00: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
0e10: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
0e20: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
0e30: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
0e40: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
0e50: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
0e60: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
0e70: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
0e80: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
0e90: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
0ea0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
0eb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46  e..**.** The OsF
0ec0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
0ed0: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
0ee0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
0ef0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
0f00: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
0f10: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
0f20: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
0f30: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
0f40: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
0f50: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
0f60: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
0f70: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
0f80: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
0f90: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
0fa0: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
0fb0: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
0fc0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
0fd0: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
0fe0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
0ff0: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
1000: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1010: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
1020: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
1030: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1040: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1050: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
1060: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
1070: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1080: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
1090: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
10a0: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
10b0: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
10c0: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
10d0: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
10e0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
10f0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
1100: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
1110: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1120: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
1130: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1140: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1150: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1160: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1170: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1180: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1190: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
11a0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
11b0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
11c0: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
11d0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
11e0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
11f0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
1200: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
1210: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
1220: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
1230: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1240: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1250: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1260: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1270: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1280: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1290: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
12a0: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
12b0: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
12c0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
12d0: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
12e0: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
12f0: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
1300: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
1310: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
1320: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
1330: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
1340: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
1350: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
1360: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
1370: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
1380: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
1390: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
13a0: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 4f 73 46  roblem, each OsF
13b0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ile structure co
13c0: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e  ntains.** a poin
13d0: 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e  ter to an openCn
13e0: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
13f0: 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43  ere is one openC
1400: 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  nt structure.** 
1410: 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20  per open inode, 
1420: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
1430: 20 6d 75 6c 74 69 70 6c 65 20 4f 73 46 69 6c 65   multiple OsFile
1440: 73 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  s can point to a
1450: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
1460: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
1470: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
1480: 63 6c 6f 73 65 20 61 6e 20 4f 73 46 69 6c 65 2c  close an OsFile,
1490: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
14a0: 20 6f 74 68 65 72 20 4f 73 46 69 6c 65 73 20 6f   other OsFiles o
14b0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
14c0: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
14d0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
14e0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
14f0: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
1500: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
1510: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
1520: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
1530: 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43 6e  r..** The openCn
1540: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
1550: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
1560: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
1570: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
1580: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
1590: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
15a0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
15b0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
15c0: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
15d0: 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c 69   First, under Li
15e0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65 63  nux threads, bec
15f0: 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61 64  ause each thread
1600: 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65 0a   has a separate.
1610: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20 6c  ** process ID, l
1620: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  ock operations i
1630: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f 20  n one thread do 
1640: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  not override loc
1650: 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d  ks.** to the sam
1660: 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72 20  e file in other 
1670: 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78 20  threads.  Linux 
1680: 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20 6c  threads behave l
1690: 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ike.** separate 
16a0: 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68 69  processes in thi
16b0: 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74 2c  s respect.  But,
16c0: 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   if you close a 
16d0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
16e0: 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65  or in linux thre
16f0: 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ads, all locks a
1700: 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65 6e  re cleared, even
1710: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74 68   locks.** on oth
1720: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 65  er threads and e
1730: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
1740: 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61 76  ther threads hav
1750: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70  e different.** p
1760: 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69 6e  rocess IDs.  Lin
1770: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69 6e  ux threads is in
1780: 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74 68  consistent in th
1790: 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20 28  is respect..** (
17a0: 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  I'm beginning to
17b0: 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e 75   think that linu
17c0: 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e 20  x threads is an 
17d0: 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f 2e  abomination too.
17e0: 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71 75  ).** The consequ
17f0: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c 6c  ence of this all
1800: 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61 73   is that the has
1810: 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  h table for the 
1820: 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  lockInfo.** stru
1830: 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e 63  cture has to inc
1840: 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73 73  lude the process
1850: 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20 69   id as part of i
1860: 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a 2a  ts key because.*
1870: 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66 65  * locks in diffe
1880: 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72 65  rent threads are
1890: 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73 74   treated as dist
18a0: 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20 0a  inct.  But the .
18b0: 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ** openCnt struc
18c0: 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ture should not 
18d0: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
18e0: 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a 2a  ess id in its.**
18f0: 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c 6f   key because clo
1900: 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63 6b  se() clears lock
1910: 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 2c   on all threads,
1920: 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63 75   not just the cu
1930: 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 2e  rrent.** thread.
1940: 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66 6f    Were it not fo
1950: 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73 73  r this goofiness
1960: 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61 64   in linux thread
1970: 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20 63  s, we could.** c
1980: 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b 49  ombine the lockI
1990: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
19a0: 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20  structures into 
19b0: 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75  a single structu
19c0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  re..**.** 2004-J
19d0: 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d  un-28:.** On som
19e0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  e versions of li
19f0: 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63 61 6e  nux, threads can
1a00: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
1a10: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
1a20: 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e 20 20  On others not.  
1a30: 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20 63 61  Sometimes you ca
1a40: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62 65 68  n change the beh
1a50: 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  avior on the sam
1a60: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79 20 73  e.** system by s
1a70: 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f 41 53  etting the LD_AS
1a80: 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e 76 69  SUME_KERNEL envi
1a90: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1aa0: 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49 58 20  .  The.** POSIX 
1ab0: 73 74 61 6e 64 61 72 64 20 69 73 20 73 69 6c 65  standard is sile
1ac0: 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 20 62  nt as to which b
1ad0: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
1ae0: 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20 61 73  ct, as far.** as
1af0: 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73 6f 20   I can tell, so 
1b00: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  other versions o
1b10: 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73 68 6f  f unix might sho
1b20: 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 69 6e  w the same.** in
1b30: 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54 68  consistency.  Th
1b40: 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74 6c 65  ere is no little
1b50: 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d 69 6e   doubt in my min
1b60: 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a 2a 20  d that posix.** 
1b70: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
1b80: 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  nd linux threads
1b90: 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c 79 20   are profoundly 
1ba0: 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  broken..**.** To
1bb0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
1bc0: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
1bd0: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73  , we have to tes
1be0: 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a 2a 2a  t at runtime .**
1bf0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1c00: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
1c10: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
1c20: 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20 74 65   locks.  This te
1c30: 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f 6e 63  st.** is run onc
1c40: 65 2c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  e, the first tim
1c50: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
1c60: 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74 61 74  tempted.  A stat
1c70: 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ic .** variable 
1c80: 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f 72 64  is set to record
1c90: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1ca0: 74 68 69 73 20 74 65 73 74 20 66 6f 72 20 66 75  this test for fu
1cb0: 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a  ture.** use..*/.
1cc0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1cd0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1ce0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
1cf0: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
1d00: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
1d10: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c  e a particular l
1d20: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
1d30: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
1d40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
1d50: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
1d60: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
1d70: 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65 20 73  locks, then we s
1d80: 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 4b 65  et the.** lockKe
1d90: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
1da0: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
1db0: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
1dc0: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
1dd0: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
1de0: 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20 73   tid is always s
1df0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74 69 64  et to zero.  tid
1e00: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 20   is also.** set 
1e10: 74 6f 20 7a 65 72 6f 20 69 66 20 77 65 20 63 6f  to zero if we co
1e20: 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68  mpile without th
1e30: 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e  reading support.
1e40: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b  .*/.struct lockK
1e50: 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  ey {.  dev_t dev
1e60: 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63  ;       /* Devic
1e70: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1e80: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f  o_t ino;       /
1e90: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
1ea0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1eb0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70  UNIX_THREADS.  p
1ec0: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
1ed0: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72 20  /* Thread ID or 
1ee0: 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64 73 20  zero if threads 
1ef0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
1f00: 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65  each other */.#e
1f10: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
1f20: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1f30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1f40: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
1f50: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
1f60: 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63  .** inode on eac
1f70: 68 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20  h thread with a 
1f80: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
1f90: 73 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20  s ID.  (Threads 
1fa0: 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  have.** differen
1fb0: 74 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e  t process IDs on
1fc0: 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20   linux, but not 
1fd0: 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e  on most other un
1fe0: 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73  ixes.).**.** A s
1ff0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
2000: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
2010: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2020: 73 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a  so each OsFile.*
2030: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
2040: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
2050: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
2060: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
2070: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
2080: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
2090: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f   the number of O
20a0: 73 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20  sFiles pointing 
20b0: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
20c0: 20 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74   lockInfo {.  st
20d0: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79  ruct lockKey key
20e0: 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70  ;  /* The lookup
20f0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
2100: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
2120: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
2130: 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b  .  int locktype;
2140: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2150: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
2160: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
2170: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  . */.  int nRef;
2180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2190: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
21a0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
21b0: 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ure */.};../*.**
21c0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
21d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
21e0: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
21f0: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
2200: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
2210: 72 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74  rticular openCnt
2220: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
2230: 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69   its inode.  Thi
2240: 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65  s.** is the same
2250: 20 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20   as the lockKey 
2260: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
2270: 74 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69  thread ID is omi
2280: 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tted..*/.struct 
2290: 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f  openKey {.  dev_
22a0: 74 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69  t dev;   /* Devi
22b0: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
22c0: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49  no_t ino;   /* I
22d0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d  node number */.}
22e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
22f0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
2300: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
2310: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
2320: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
2330: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
2340: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
2350: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
2360: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
2370: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
2380: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
2390: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
23a0: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
23b0: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
23c0: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
23d0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
23e0: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
23f0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
2400: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
2410: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
2420: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a  ending list..*/.
2430: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b  struct openCnt {
2440: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
2450: 79 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  y key;   /* The 
2460: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
2470: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2480: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2490: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
24a0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
24b0: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
24c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24d0: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
24e0: 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74  g locks */.  int
24f0: 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   nPending;      
2500: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2510: 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20  pending close() 
2520: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
2530: 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20  int *aPending;  
2540: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65        /* Malloce
2550: 64 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20  d space holding 
2560: 66 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20  fd's awaiting a 
2570: 63 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  close() */.};../
2580: 2a 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68  * .** These hash
2590: 20 74 61 62 6c 65 20 6d 61 70 73 20 69 6e 6f 64   table maps inod
25a0: 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 49  es and process I
25b0: 44 73 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  Ds into lockInfo
25c0: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 0a 2a 2a 20   and openCnt.** 
25d0: 73 74 72 75 63 74 75 72 65 73 2e 20 20 41 63 63  structures.  Acc
25e0: 65 73 73 20 74 6f 20 74 68 65 73 65 20 68 61 73  ess to these has
25f0: 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  h tables must be
2600: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
2610: 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  mutex..*/.static
2620: 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d   Hash lockHash =
2630: 20 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42   { SQLITE_HASH_B
2640: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
2650: 30 2c 20 30 20 7d 3b 0a 73 74 61 74 69 63 20 48  0, 0 };.static H
2660: 61 73 68 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b  ash openHash = {
2670: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
2680: 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ARY, 0, 0, 0, 0,
2690: 20 30 20 7d 3b 0a 0a 0a 23 69 66 64 65 66 20 53   0 };...#ifdef S
26a0: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
26b0: 44 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  DS./*.** This va
26c0: 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77  riable records w
26d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
26e0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
26f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
2700: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
2710: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
2720: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
2730: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
2740: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20  ocks..**    1:  
2750: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
2760: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
2770: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
2780: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
2790: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2f 0a 73 74   know yet..*/.st
27a0: 61 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73  atic int threads
27b0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
27c0: 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a 0a 2f  rsLocks = -1;../
27d0: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
27e0: 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d  ure holds inform
27f0: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74  ation passed int
2800: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73  o individual tes
2810: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20  t.** threads by 
2820: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
2830: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
2840: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
2850: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
2860: 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  a {.  int fd;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2880: 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  File to be locke
2890: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  d */.  struct fl
28a0: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a  ock lock;     /*
28b0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   The locking ope
28c0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
28d0: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
28e0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
28f0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  the locking oper
2900: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ation */.};../*.
2910: 2a 2a 20 54 68 65 20 74 65 73 74 54 68 72 65 61  ** The testThrea
2920: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
2930: 28 29 20 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63  () routine launc
2940: 68 65 73 20 74 77 6f 20 73 65 70 61 72 61 74 65  hes two separate
2950: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6f 6e 20 74  .** threads on t
2960: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
2970: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
2980: 70 74 73 20 74 6f 20 6c 6f 63 6b 20 61 20 66 69  pts to lock a fi
2990: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
29a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 73 2e 20 20   then returns.  
29b0: 54 68 65 20 73 75 63 63 65 73 73 20 6f 72 20 66  The success or f
29c0: 61 69 6c 75 72 65 20 6f 66 20 74 68 61 74 20 61  ailure of that a
29d0: 74 74 65 6d 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73  ttempt.** allows
29e0: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
29f0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
2a00: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64 65   procedure to de
2a10: 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
2a20: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
2a30: 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  s can override e
2a40: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a60: 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54   *threadLockingT
2a70: 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  est(void *pArg){
2a80: 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61 64  .  struct thread
2a90: 54 65 73 74 44 61 74 61 20 2a 70 44 61 74 61 20  TestData *pData 
2aa0: 3d 20 28 73 74 72 75 63 74 20 74 68 72 65 61 64  = (struct thread
2ab0: 54 65 73 74 44 61 74 61 2a 29 70 41 72 67 3b 0a  TestData*)pArg;.
2ac0: 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c 74 20    pData->result 
2ad0: 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d 3e 66  = fcntl(pData->f
2ae0: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 70 44 61  d, F_SETLK, &pDa
2af0: 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72 65 74  ta->lock);.  ret
2b00: 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  urn pArg;.}../*.
2b10: 2a 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  ** This procedur
2b20: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  e attempts to de
2b30: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2b40: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 73 0a 2a  or not threads.*
2b50: 2a 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65  * can override e
2b60: 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73  ach others locks
2b70: 20 74 68 65 6e 20 73 65 74 73 20 74 68 65 20 0a   then sets the .
2b80: 2a 2a 20 74 68 72 65 61 64 73 4f 76 65 72 72 69  ** threadsOverri
2b90: 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b  deEachOthersLock
2ba0: 73 20 76 61 72 69 61 62 6c 65 20 61 70 70 72 6f  s variable appro
2bb0: 70 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  priately..*/.sta
2bc0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 54 68 72  tic void testThr
2bd0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
2be0: 6f 72 28 66 64 5f 6f 72 69 67 29 7b 0a 20 20 69  or(fd_orig){.  i
2bf0: 6e 74 20 66 64 3b 0a 20 20 73 74 72 75 63 74 20  nt fd;.  struct 
2c00: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 64  threadTestData d
2c10: 5b 32 5d 3b 0a 20 20 70 74 68 72 65 61 64 5f 74  [2];.  pthread_t
2c20: 20 74 5b 32 5d 3b 0a 0a 20 20 66 64 20 3d 20 64   t[2];..  fd = d
2c30: 75 70 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69  up(fd_orig);.  i
2c40: 66 28 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e  f( fd<0 ) return
2c50: 3b 0a 20 20 6d 65 6d 73 65 74 28 64 2c 20 30 2c  ;.  memset(d, 0,
2c60: 20 73 69 7a 65 6f 66 28 64 29 29 3b 0a 20 20 64   sizeof(d));.  d
2c70: 5b 30 5d 2e 66 64 20 3d 20 66 64 3b 0a 20 20 64  [0].fd = fd;.  d
2c80: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20  [0].lock.l_type 
2c90: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 64 5b 30  = F_RDLCK;.  d[0
2ca0: 5d 2e 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31  ].lock.l_len = 1
2cb0: 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f  ;.  d[0].lock.l_
2cc0: 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 64 5b 30  start = 0;.  d[0
2cd0: 5d 2e 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20  ].lock.l_whence 
2ce0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 64 5b  = SEEK_SET;.  d[
2cf0: 31 5d 20 3d 20 64 5b 30 5d 3b 0a 20 20 64 5b 31  1] = d[0];.  d[1
2d00: 5d 2e 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20  ].lock.l_type = 
2d10: 46 5f 57 52 4c 43 4b 3b 0a 20 20 70 74 68 72 65  F_WRLCK;.  pthre
2d20: 61 64 5f 63 72 65 61 74 65 28 26 74 5b 30 5d 2c  ad_create(&t[0],
2d30: 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e   0, threadLockin
2d40: 67 54 65 73 74 2c 20 26 64 5b 30 5d 29 3b 0a 20  gTest, &d[0]);. 
2d50: 20 70 74 68 72 65 61 64 5f 63 72 65 61 74 65 28   pthread_create(
2d60: 26 74 5b 31 5d 2c 20 30 2c 20 74 68 72 65 61 64  &t[1], 0, thread
2d70: 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26 64 5b  LockingTest, &d[
2d80: 31 5d 29 3b 0a 20 20 70 74 68 72 65 61 64 5f 6a  1]);.  pthread_j
2d90: 6f 69 6e 28 74 5b 30 5d 2c 20 30 29 3b 0a 20 20  oin(t[0], 0);.  
2da0: 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 31  pthread_join(t[1
2db0: 5d 2c 20 30 29 3b 0a 20 20 63 6c 6f 73 65 28 66  ], 0);.  close(f
2dc0: 64 29 3b 0a 20 20 74 68 72 65 61 64 73 4f 76 65  d);.  threadsOve
2dd0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
2de0: 6f 63 6b 73 20 3d 20 20 64 5b 30 5d 2e 72 65 73  ocks =  d[0].res
2df0: 75 6c 74 3d 3d 30 20 26 26 20 64 5b 31 5d 2e 72  ult==0 && d[1].r
2e00: 65 73 75 6c 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  esult==0;.}.#end
2e10: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 49  if /* SQLITE_UNI
2e20: 58 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a  X_THREADS */../*
2e30: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
2e40: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
2e50: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
2e60: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
2e70: 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74  kInfo()..*/.stat
2e80: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4c  ic void releaseL
2e90: 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20 6c  ockInfo(struct l
2ea0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b  ockInfo *pLock){
2eb0: 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d  .  pLock->nRef--
2ec0: 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e  ;.  if( pLock->n
2ed0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Ref==0 ){.    sq
2ee0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
2ef0: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63  &lockHash, &pLoc
2f00: 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  k->key, sizeof(p
2f10: 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Lock->key), 0);.
2f20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
2f30: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Lock);.  }.}../*
2f40: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70  .** Release a op
2f50: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2f60: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
2f70: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b  ated by findLock
2f80: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
2f90: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70  c void releaseOp
2fa0: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65  enCnt(struct ope
2fb0: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20  nCnt *pOpen){.  
2fc0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pOpen->nRef--;. 
2fd0: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66   if( pOpen->nRef
2fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2ff0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70  e3HashInsert(&op
3000: 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e  enHash, &pOpen->
3010: 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65  key, sizeof(pOpe
3020: 6e 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20  n->key), 0);.   
3030: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65   sqliteFree(pOpe
3040: 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20  n->aPending);.  
3050: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70    sqliteFree(pOp
3060: 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  en);.  }.}../*.*
3070: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
3080: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
3090: 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f  e lockInfo and o
30a0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
30b0: 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69  s that.** descri
30c0: 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65  bes that file de
30d0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
30e0: 65 20 61 20 6e 65 77 20 6f 6e 65 73 20 69 66 20  e a new ones if 
30f0: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
3100: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ** return values
3110: 20 6d 69 67 68 74 20 62 65 20 75 6e 73 65 74 20   might be unset 
3120: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
3130: 72 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  rs..**.** Return
3140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3150: 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
3160: 20 69 6e 74 20 66 69 6e 64 4c 6f 63 6b 49 6e 66   int findLockInf
3170: 6f 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  o(.  int fd,    
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
31a0: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 69 6e  scriptor used in
31b0: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   the key */.  st
31c0: 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a  ruct lockInfo **
31d0: 70 70 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 52 65  ppLock,    /* Re
31e0: 74 75 72 6e 20 74 68 65 20 6c 6f 63 6b 49 6e 66  turn the lockInf
31f0: 6f 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  o structure here
3200: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6f 70 65   */.  struct ope
3210: 6e 43 6e 74 20 2a 2a 70 70 4f 70 65 6e 20 20 20  nCnt **ppOpen   
3220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
3230: 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75   openCnt structu
3240: 72 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  re here */.){.  
3250: 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
3260: 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 31 3b 0a 20   lockKey key1;. 
3270: 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20   struct openKey 
3280: 6b 65 79 32 3b 0a 20 20 73 74 72 75 63 74 20 73  key2;.  struct s
3290: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 73  tat statbuf;.  s
32a0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
32b0: 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20  pLock;.  struct 
32c0: 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a  openCnt *pOpen;.
32d0: 20 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c    rc = fstat(fd,
32e0: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
32f0: 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
3300: 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65   1;.  memset(&ke
3310: 79 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  y1, 0, sizeof(ke
3320: 79 31 29 29 3b 0a 20 20 6b 65 79 31 2e 64 65 76  y1));.  key1.dev
3330: 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65   = statbuf.st_de
3340: 76 3b 0a 20 20 6b 65 79 31 2e 69 6e 6f 20 3d 20  v;.  key1.ino = 
3350: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
3360: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
3370: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 69 66 28  IX_THREADS.  if(
3380: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
3390: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c  EachOthersLocks<
33a0: 30 20 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72  0 ){.    testThr
33b0: 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69  eadLockingBehavi
33c0: 6f 72 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6b 65  or(fd);.  }.  ke
33d0: 79 31 2e 74 69 64 20 3d 20 74 68 72 65 61 64 73  y1.tid = threads
33e0: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
33f0: 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70 74  rsLocks ? 0 : pt
3400: 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23 65  hread_self();.#e
3410: 6e 64 69 66 0a 20 20 6d 65 6d 73 65 74 28 26 6b  ndif.  memset(&k
3420: 65 79 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b  ey2, 0, sizeof(k
3430: 65 79 32 29 29 3b 0a 20 20 6b 65 79 32 2e 64 65  ey2));.  key2.de
3440: 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64  v = statbuf.st_d
3450: 65 76 3b 0a 20 20 6b 65 79 32 2e 69 6e 6f 20 3d  ev;.  key2.ino =
3460: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
3470: 0a 20 20 70 4c 6f 63 6b 20 3d 20 28 73 74 72 75  .  pLock = (stru
3480: 63 74 20 6c 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c  ct lockInfo*)sql
3490: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 6c 6f  ite3HashFind(&lo
34a0: 63 6b 48 61 73 68 2c 20 26 6b 65 79 31 2c 20 73  ckHash, &key1, s
34b0: 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20  izeof(key1));.  
34c0: 69 66 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  if( pLock==0 ){.
34d0: 20 20 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49      struct lockI
34e0: 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 70  nfo *pOld;.    p
34f0: 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Lock = sqliteMal
3500: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
3510: 70 4c 6f 63 6b 29 20 29 3b 0a 20 20 20 20 69 66  pLock) );.    if
3520: 28 20 70 4c 6f 63 6b 3d 3d 30 20 29 20 72 65 74  ( pLock==0 ) ret
3530: 75 72 6e 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b  urn 1;.    pLock
3540: 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a 20 20  ->key = key1;.  
3550: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20    pLock->nRef = 
3560: 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  1;.    pLock->cn
3570: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f 63 6b  t = 0;.    pLock
3580: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
3590: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
35a0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f  e3HashInsert(&lo
35b0: 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e  ckHash, &pLock->
35c0: 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31  key, sizeof(key1
35d0: 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  ), pLock);.    i
35e0: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
35f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
3600: 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  ==pLock );.     
3610: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f 63   sqliteFree(pLoc
3620: 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  k);.      return
3630: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
3640: 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52  e{.    pLock->nR
3650: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c  ef++;.  }.  *ppL
3660: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 70  ock = pLock;.  p
3670: 4f 70 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f  Open = (struct o
3680: 70 65 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48  penCnt*)sqlite3H
3690: 61 73 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73  ashFind(&openHas
36a0: 68 2c 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66  h, &key2, sizeof
36b0: 28 6b 65 79 32 29 29 3b 0a 20 20 69 66 28 20 70  (key2));.  if( p
36c0: 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Open==0 ){.    s
36d0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
36e0: 4f 6c 64 3b 0a 20 20 20 20 70 4f 70 65 6e 20 3d  Old;.    pOpen =
36f0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3700: 28 20 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29  ( sizeof(*pOpen)
3710: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65   );.    if( pOpe
3720: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  n==0 ){.      re
3730: 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c  leaseLockInfo(pL
3740: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ock);.      retu
3750: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
3760: 70 4f 70 65 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79  pOpen->key = key
3770: 32 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52  2;.    pOpen->nR
3780: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4f 70 65  ef = 1;.    pOpe
3790: 6e 2d 3e 6e 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  n->nLock = 0;.  
37a0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
37b0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 65 6e  g = 0;.    pOpen
37c0: 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->aPending = 0;.
37d0: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
37e0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70  e3HashInsert(&op
37f0: 65 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e  enHash, &pOpen->
3800: 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  key, sizeof(key2
3810: 29 2c 20 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  ), pOpen);.    i
3820: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
3830: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
3840: 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  ==pOpen );.     
3850: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65   sqliteFree(pOpe
3860: 6e 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  n);.      releas
3870: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
3880: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
38a0: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66  .    pOpen->nRef
38b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f 70 65  ++;.  }.  *ppOpe
38c0: 6e 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 72 65 74  n = pOpen;.  ret
38d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
38e0: 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
38f0: 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   file.*/.int sql
3900: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 63 6f 6e  ite3OsDelete(con
3910: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3920: 6d 65 29 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46  me){.  unlink(zF
3930: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  ilename);.  retu
3940: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3950: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
3960: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
3970: 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  file exists..*/.
3980: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  int sqlite3OsFil
3990: 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68  eExists(const ch
39a0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
39b0: 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 28    return access(
39c0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30  zFilename, 0)==0
39d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
39e0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
39f0: 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  e for both readi
3a00: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
3a10: 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c   If that.** fail
3a20: 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69  s, try opening i
3a30: 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66  t read-only.  If
3a40: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
3a50: 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79  ot exist,.** try
3a60: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a   to create it..*
3a70: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
3a80: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68   a handle for th
3a90: 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77  e open file is w
3aa0: 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a  ritten to *id.**
3ab0: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
3ac0: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74  is set to 0 if t
3ad0: 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  he file was open
3ae0: 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61  ed for reading a
3af0: 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72  nd.** writing or
3b00: 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77   1 if the file w
3b10: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  as opened read-o
3b20: 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69  nly.  The functi
3b30: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51  on returns.** SQ
3b40: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f  LITE_OK..**.** O
3b50: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66  n failure, the f
3b60: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
3b70: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
3b80: 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69  and leaves.** *i
3b90: 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79  d and *pReadonly
3ba0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
3bb0: 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  nt sqlite3OsOpen
3bc0: 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f 6e  ReadWrite(.  con
3bd0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3be0: 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64  me,.  OsFile *id
3bf0: 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e  ,.  int *pReadon
3c00: 6c 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ly.){.  int rc;.
3c10: 20 20 61 73 73 65 72 74 28 20 21 69 64 2d 3e 69    assert( !id->i
3c20: 73 4f 70 65 6e 20 29 3b 0a 20 20 69 64 2d 3e 64  sOpen );.  id->d
3c30: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d  irfd = -1;.  id-
3c40: 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  >h = open(zFilen
3c50: 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
3c60: 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  EAT|O_LARGEFILE|
3c70: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
3ca0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
3cb0: 4f 4e 53 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  ONS);.  if( id->
3cc0: 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49  h<0 ){.#ifdef EI
3cd0: 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72  SDIR.    if( err
3ce0: 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20  no==EISDIR ){.  
3cf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3d00: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
3d10: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 64 2d  }.#endif.    id-
3d20: 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  >h = open(zFilen
3d30: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
3d40: 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
3d50: 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69 64 2d  RY);.    if( id-
3d60: 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  >h<0 ){.      re
3d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3d80: 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20 20 20  OPEN; .    }.   
3d90: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   *pReadonly = 1;
3da0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
3db0: 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
3dc0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  }.  sqlite3OsEnt
3dd0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
3de0: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69  = findLockInfo(i
3df0: 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b  d->h, &id->pLock
3e00: 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20  , &id->pOpen);. 
3e10: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
3e20: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
3e30: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64   ){.    close(id
3e40: 2d 3e 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ->h);.    return
3e50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
3e60: 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   }.  id->locktyp
3e70: 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f  e = 0;.  id->isO
3e80: 70 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41 43 45  pen = 1;.  TRACE
3e90: 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  3("OPEN    %-3d 
3ea0: 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 7a 46  %s\n", id->h, zF
3eb0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e  ilename);.  Open
3ec0: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
3ed0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3ee0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  .}.../*.** Attem
3ef0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  pt to open a new
3f00: 20 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73   file for exclus
3f10: 69 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68  ive access by th
3f20: 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54  is process..** T
3f30: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
3f40: 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20  opened for both 
3f50: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
3f60: 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a  ing.  To avoid.*
3f70: 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65  * a potential se
3f80: 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20  curity problem, 
3f90: 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  we do not allow 
3fa0: 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65  the file to have
3fb0: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65  .** previously e
3fc0: 78 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20  xisted.  Nor do 
3fd0: 77 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  we allow the fil
3fe0: 65 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c  e to be a symbol
3ff0: 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a  ic.** link..**.*
4000: 2a 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20  * If delFlag is 
4010: 74 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  true, then make 
4020: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
4030: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
4040: 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  lete.** the file
4050: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
4060: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ed..**.** On suc
4070: 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20  cess, write the 
4080: 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f  file handle into
4090: 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20   *id and return 
40a0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
40b0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74   On failure, ret
40c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
40d0: 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  PEN..*/.int sqli
40e0: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
40f0: 76 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ve(const char *z
4100: 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65  Filename, OsFile
4110: 20 2a 69 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61   *id, int delFla
4120: 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
4130: 61 73 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f  assert( !id->isO
4140: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 61 63 63  pen );.  if( acc
4150: 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  ess(zFilename, 0
4160: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
4170: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
4180: 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 64 69  EN;.  }.  id->di
4190: 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e  rfd = -1;.  id->
41a0: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
41b0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
41c0: 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45      O_RDWR|O_CRE
41d0: 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  AT|O_EXCL|O_NOFO
41e0: 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  LLOW|O_LARGEFILE
41f0: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 30 30 29  |O_BINARY, 0600)
4200: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20  ;.  if( id->h<0 
4210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4220: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
4230: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
4240: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
4250: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
4260: 69 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63  id->h, &id->pLoc
4270: 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a  k, &id->pOpen);.
4280: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
4290: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
42a0: 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69  c ){.    close(i
42b0: 64 2d 3e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  d->h);.    unlin
42c0: 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
42d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
42e0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 64 2d  NOMEM;.  }.  id-
42f0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20  >locktype = 0;. 
4300: 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b   id->isOpen = 1;
4310: 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29  .  if( delFlag )
4320: 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69  {.    unlink(zFi
4330: 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54  lename);.  }.  T
4340: 52 41 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25  RACE3("OPEN-EX %
4350: 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 68  -3d %s\n", id->h
4360: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
4370: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
4380: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4390: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
43a0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
43b0: 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61  new file for rea
43c0: 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a  d-only access..*
43d0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
43e0: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
43f0: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
4400: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
4410: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
4420: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
4430: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
4440: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
4450: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
4460: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
4470: 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b  me, OsFile *id){
4480: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
4490: 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e  ert( !id->isOpen
44a0: 20 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20   );.  id->dirfd 
44b0: 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e 68 20 3d 20  = -1;.  id->h = 
44c0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
44d0: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
44e0: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
44f0: 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20 29 7b    if( id->h<0 ){
4500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4510: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
4520: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
4530: 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
4540: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64   findLockInfo(id
4550: 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c  ->h, &id->pLock,
4560: 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20   &id->pOpen);.  
4570: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
4580: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20  tex();.  if( rc 
4590: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  ){.    close(id-
45a0: 3e 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >h);.    return 
45b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
45c0: 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  }.  id->locktype
45d0: 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70   = 0;.  id->isOp
45e0: 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41 43 45 33  en = 1;.  TRACE3
45f0: 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64 20 25  ("OPEN-RO %-3d %
4600: 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 7a 46 69  s\n", id->h, zFi
4610: 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43  lename);.  OpenC
4620: 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
4630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4640: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
4650: 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20   to open a file 
4660: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
4670: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
4680: 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  t contains a.** 
4690: 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65  file.  This file
46a0: 20 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20   descriptor can 
46b0: 62 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63  be used to fsync
46c0: 28 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  () the directory
46d0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
46e0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72  make sure the cr
46f0: 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20  eation of a new 
4700: 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  file is actually
4710: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64   written.** to d
4720: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  isk..**.** This 
4730: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
4740: 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55  meaningful for U
4750: 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f  nix.  It is a no
4760: 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e  -op under.** win
4770: 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f  dows since windo
4780: 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ws does not supp
4790: 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a  ort hard links..
47a0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
47b0: 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  , a handle for a
47c0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
47d0: 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69 64 20   file is at *id 
47e0: 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77 69  is.** updated wi
47f0: 74 68 20 74 68 65 20 6e 65 77 20 64 69 72 65 63  th the new direc
4800: 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
4810: 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  ptor and SQLITE_
4820: 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  OK is.** returne
4830: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  d..**.** On fail
4840: 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  ure, the functio
4850: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
4860: 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65  _CANTOPEN and le
4870: 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68  aves.** *id unch
4880: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
4890: 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
48a0: 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  tory(.  const ch
48b0: 61 72 20 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20  ar *zDirname,.  
48c0: 4f 73 46 69 6c 65 20 2a 69 64 0a 29 7b 0a 20 20  OsFile *id.){.  
48d0: 69 66 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20  if( !id->isOpen 
48e0: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
48f0: 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65 63 74   open the direct
4900: 6f 72 79 20 69 66 20 74 68 65 20 63 6f 72 72 65  ory if the corre
4910: 73 70 6f 6e 64 69 6e 67 20 66 69 6c 65 20 69 73  sponding file is
4920: 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 20 20 20   not already.   
4930: 20 2a 2a 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20   ** open. */.   
4940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
4950: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 61  ANTOPEN;.  }.  a
4960: 73 73 65 72 74 28 20 69 64 2d 3e 64 69 72 66 64  ssert( id->dirfd
4970: 3c 30 20 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  <0 );.  id->dirf
4980: 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  d = open(zDirnam
4990: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
49a0: 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20  NARY, 0);.  if( 
49b0: 69 64 2d 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20  id->dirfd<0 ){. 
49c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
49d0: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a  _CANTOPEN; .  }.
49e0: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49    TRACE3("OPENDI
49f0: 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64  R %-3d %s\n", id
4a00: 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d  ->dirfd, zDirnam
4a10: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
4a20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4a30: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
4a40: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
4a50: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
4a60: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
4a70: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
4a80: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
4a90: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
4aa0: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
4ab0: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
4ac0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20   files..*/.char 
4ad0: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
4ae0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
4af0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
4b00: 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
4b10: 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
4b20: 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
4b30: 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74  gh to.** hold at
4b40: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
4b50: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72  MPNAME_SIZE char
4b60: 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  acters..*/.int s
4b70: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
4b80: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66 29  Name(char *zBuf)
4b90: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
4ba0: 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
4bb0: 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
4bc0: 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
4bd0: 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
4be0: 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
4bf0: 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ".",.  };.  stat
4c00: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4c10: 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  d char zChars[] 
4c20: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
4c30: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
4c40: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
4c50: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
4c60: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
4c70: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
4c80: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
4c90: 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
4ca0: 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20  r *zDir = ".";. 
4cb0: 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c   azDirs[0] = sql
4cc0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
4cd0: 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ory;.  for(i=0; 
4ce0: 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
4cf0: 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
4d00: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
4d10: 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
4d20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
4d30: 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
4d40: 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
4d50: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
4d60: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
4d70: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
4d80: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
4d90: 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
4da0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
4db0: 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
4dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
4dd0: 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  do{.    sprintf(
4de0: 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d 50 5f  zBuf, "%s/"TEMP_
4df0: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44 69  FILE_PREFIX, zDi
4e00: 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c  r);.    j = strl
4e10: 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71  en(zBuf);.    sq
4e20: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
4e30: 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
4e40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
4e50: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
4e60: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
4e70: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
4e80: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
4e90: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
4ea0: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
4eb0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
4ec0: 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
4ed0: 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
4ee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4ef0: 4f 4b 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  OK; .}..#ifndef 
4f00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
4f10: 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20  R_PRAGMAS./*.** 
4f20: 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76  Check that a giv
4f30: 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61  en pathname is a
4f40: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69   directory and i
4f50: 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a  s writable .**.*
4f60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 49  /.int sqlite3OsI
4f70: 73 44 69 72 57 72 69 74 61 62 6c 65 28 63 68 61  sDirWritable(cha
4f80: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 72 75  r *zBuf){.  stru
4f90: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
4fa0: 66 28 20 7a 42 75 66 3d 3d 30 20 29 20 72 65 74  f( zBuf==0 ) ret
4fb0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a 42 75  urn 0;.  if( zBu
4fc0: 66 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  f[0]==0 ) return
4fd0: 20 30 3b 0a 20 20 69 66 28 20 73 74 61 74 28 7a   0;.  if( stat(z
4fe0: 42 75 66 2c 20 26 62 75 66 29 20 29 20 72 65 74  Buf, &buf) ) ret
4ff0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 53 5f  urn 0;.  if( !S_
5000: 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
5010: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5020: 20 69 66 28 20 61 63 63 65 73 73 28 7a 42 75 66   if( access(zBuf
5030: 2c 20 30 37 29 20 29 20 72 65 74 75 72 6e 20 30  , 07) ) return 0
5040: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
5050: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5060: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
5070: 4d 41 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  MAS */../*.** Re
5080: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
5090: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
50a0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
50b0: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
50c0: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
50d0: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
50e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
50f0: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
5100: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73   wrong..*/.int s
5110: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 4f 73 46  qlite3OsRead(OsF
5120: 69 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70  ile *id, void *p
5130: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20  Buf, int amt){. 
5140: 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
5150: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
5160: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
5170: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
5180: 29 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  );.  TIMER_START
5190: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
51a0: 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 29  d->h, pBuf, amt)
51b0: 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
51c0: 20 54 52 41 43 45 35 28 22 52 45 41 44 20 20 20   TRACE5("READ   
51d0: 20 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64   %-3d %5d %7d %d
51e0: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 67 6f 74 2c  \n", id->h, got,
51f0: 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45   last_page, TIME
5200: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45  R_ELAPSED);.  SE
5210: 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20  EK(0);.  /* if( 
5220: 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b  got<0 ) got = 0;
5230: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61   */.  if( got==a
5240: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
5250: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
5260: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5270: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
5280: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  }.}../*.** Write
5290: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
52a0: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
52b0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
52c0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
52d0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
52e0: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
52f0: 6c 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lure..*/.int sql
5300: 69 74 65 33 4f 73 57 72 69 74 65 28 4f 73 46 69  ite3OsWrite(OsFi
5310: 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f  le *id, const vo
5320: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d  id *pBuf, int am
5330: 74 29 7b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  t){.  int wrote 
5340: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
5350: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 61  d->isOpen );.  a
5360: 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
5370: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5380: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
5390: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
53a0: 75 6c 6c 45 72 72 6f 72 3b 0a 20 20 54 49 4d 45  ullError;.  TIME
53b0: 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65  R_START;.  while
53c0: 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
53d0: 65 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 68 2c  e = write(id->h,
53e0: 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
53f0: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
5400: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
5410: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
5420: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45  ote];.  }.  TIME
5430: 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28  R_END;.  TRACE5(
5440: 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 35  "WRITE   %-3d %5
5450: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
5460: 3e 68 2c 20 77 72 6f 74 65 2c 20 6c 61 73 74 5f  >h, wrote, last_
5470: 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50  page, TIMER_ELAP
5480: 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  SED);.  SEEK(0);
5490: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
54a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
54b0: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
54c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
54d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
54e0: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
54f0: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
5500: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
5510: 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Seek(OsFile *id,
5520: 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a 20 20   i64 offset){.  
5530: 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70  assert( id->isOp
5540: 65 6e 20 29 3b 0a 20 20 53 45 45 4b 28 6f 66 66  en );.  SEEK(off
5550: 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20  set/1024 + 1);. 
5560: 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
5570: 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
5580: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5590: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
55a0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
55b0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
55c0: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
55d0: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
55e0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
55f0: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
5600: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
5610: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
5620: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
5630: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
5640: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
5650: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
5660: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
5670: 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0;.#endif.../*.*
5680: 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
5690: 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
56a0: 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
56b0: 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
56c0: 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
56d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
56e0: 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
56f0: 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
5700: 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
5710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
5720: 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
5730: 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
5740: 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
5750: 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
5760: 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
5770: 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
5780: 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
5790: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
57a0: 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
57b0: 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
57c0: 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
57d0: 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
57e0: 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
57f0: 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
5800: 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
5810: 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
5820: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
5830: 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
5840: 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
5850: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
5860: 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
5870: 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
5880: 6c 6c 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 72  llSync){.  int r
5890: 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  c;..  /* Record 
58a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
58b0: 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
58c0: 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
58d0: 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
58e0: 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
58f0: 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
5900: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
5910: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
5920: 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
5930: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
5940: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
5950: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
5960: 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
5970: 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
5980: 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
5990: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
59a0: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
59b0: 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
59c0: 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
59d0: 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
59e0: 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
59f0: 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
5a00: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5a10: 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
5a20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
5a30: 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  ..#ifdef F_FULLF
5a40: 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
5a50: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
5a60: 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c  fcntl(fd, F_FULL
5a70: 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c  FSYNC, 0);.  }el
5a80: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  se{.    rc = 1;.
5a90: 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20    }.  /* If the 
5aa0: 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64 2c  FULLSYNC failed,
5ab0: 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f 72   try to do a nor
5ac0: 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 20  mal fsync() */. 
5ad0: 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66   if( rc ) rc = f
5ae0: 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73 65  sync(fd);..#else
5af0: 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
5b00: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  );.#endif /* def
5b10: 69 6e 65 64 28 46 5f 46 55 4c 4c 46 53 59 4e 43  ined(F_FULLFSYNC
5b20: 29 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ) */.#endif /* d
5b30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
5b40: 5f 53 59 4e 43 29 20 2a 2f 0a 0a 20 20 72 65 74  _SYNC) */..  ret
5b50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5b60: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
5b70: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
5b80: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
5b90: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
5ba0: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
5bb0: 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
5bc0: 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
5bd0: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
5be0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
5bf0: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
5c00: 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
5c10: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
5c20: 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
5c30: 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
5c40: 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
5c50: 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
5c60: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
5c70: 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
5c80: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5c90: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
5ca0: 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
5cb0: 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
5cc0: 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
5cd0: 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
5ce0: 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
5cf0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
5d00: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
5d10: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
5d20: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
5d30: 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
5d40: 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
5d50: 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
5d60: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
5d70: 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
5d80: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
5d90: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
5da0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 4f 73 46 69  lite3OsSync(OsFi
5db0: 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73 73 65 72  le *id){.  asser
5dc0: 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b  t( id->isOpen );
5dd0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
5de0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
5df0: 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59 4e 43  ;.  TRACE2("SYNC
5e00: 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d      %-3d\n", id-
5e10: 3e 68 29 3b 0a 20 20 69 66 28 20 66 75 6c 6c 5f  >h);.  if( full_
5e20: 66 73 79 6e 63 28 69 64 2d 3e 68 2c 20 69 64 2d  fsync(id->h, id-
5e30: 3e 66 75 6c 6c 53 79 6e 63 29 20 29 7b 0a 20 20  >fullSync) ){.  
5e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5e50: 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 69 66 28  IOERR;.  }.  if(
5e60: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b   id->dirfd>=0 ){
5e70: 0a 20 20 20 20 54 52 41 43 45 32 28 22 44 49 52  .    TRACE2("DIR
5e80: 53 59 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SYNC %-3d\n", id
5e90: 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 66 75  ->dirfd);.    fu
5ea0: 6c 6c 5f 66 73 79 6e 63 28 69 64 2d 3e 64 69 72  ll_fsync(id->dir
5eb0: 66 64 2c 20 69 64 2d 3e 66 75 6c 6c 53 79 6e 63  fd, id->fullSync
5ec0: 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  );.    close(id-
5ed0: 3e 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c  >dirfd);  /* Onl
5ee0: 79 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f  y need to sync o
5ef0: 6e 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68  nce, so close th
5f00: 65 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  e directory */. 
5f10: 20 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d     id->dirfd = -
5f20: 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65  1;    /* when we
5f30: 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20   are done. */.  
5f40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5f50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
5f60: 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
5f70: 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73  y zDirname. This
5f80: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f   is a no-op on o
5f90: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
5fa0: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55   other.** than U
5fb0: 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  NIX..**.** This 
5fc0: 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
5fd0: 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20  sure the master 
5fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
5ff0: 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c   truely been del
6000: 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d  eted.** before m
6010: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
6020: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
6030: 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d  nals on a multi-
6040: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e  database commit.
6050: 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53  .** The F_FULLFS
6060: 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  YNC option is no
6070: 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a  t needed here..*
6080: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53  /.int sqlite3OsS
6090: 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  yncDirectory(con
60a0: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d  st char *zDirnam
60b0: 65 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  e){.  int fd;.  
60c0: 69 6e 74 20 72 3b 0a 20 20 53 69 6d 75 6c 61 74  int r;.  Simulat
60d0: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
60e0: 49 4f 45 52 52 29 3b 0a 20 20 66 64 20 3d 20 6f  IOERR);.  fd = o
60f0: 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
6100: 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
6110: 20 30 29 3b 0a 20 20 54 52 41 43 45 33 28 22 44   0);.  TRACE3("D
6120: 49 52 53 59 4e 43 20 25 2d 33 64 20 28 25 73 29  IRSYNC %-3d (%s)
6130: 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
6140: 65 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  e);.  if( fd<0 )
6150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6160: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20  ITE_CANTOPEN; . 
6170: 20 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63 28 66   }.  r = fsync(f
6180: 64 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b  d);.  close(fd);
6190: 0a 20 20 72 65 74 75 72 6e 20 28 28 72 3d 3d 30  .  return ((r==0
61a0: 29 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  )?SQLITE_OK:SQLI
61b0: 54 45 5f 49 4f 45 52 52 29 3b 0a 7d 0a 0a 2f 2a  TE_IOERR);.}../*
61c0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
61d0: 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73  open file to a s
61e0: 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f  pecified size.*/
61f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72  .int sqlite3OsTr
6200: 75 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  uncate(OsFile *i
6210: 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
6220: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
6230: 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  pen );.  Simulat
6240: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
6250: 49 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e  IOERR);.  return
6260: 20 66 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 68   ftruncate(id->h
6270: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
6280: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
6290: 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _IOERR;.}../*.**
62a0: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
62b0: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
62c0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
62d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46  /.int sqlite3OsF
62e0: 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a  ileSize(OsFile *
62f0: 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
6300: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
6310: 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
6320: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69  ->isOpen );.  Si
6330: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
6340: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69  LITE_IOERR);.  i
6350: 66 28 20 66 73 74 61 74 28 69 64 2d 3e 68 2c 20  f( fstat(id->h, 
6360: 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20  &buf)!=0 ){.    
6370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6380: 45 52 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  ERR;.  }.  *pSiz
6390: 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
63a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
63b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
63c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
63d0: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
63e0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
63f0: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
6400: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
6410: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
6420: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
6430: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
6440: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
6450: 7a 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69  zero.  If the fi
6460: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f  le is unlocked o
6470: 72 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41  r holds only SHA
6480: 52 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a  RED locks, then.
6490: 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a  ** return zero..
64a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
64b0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
64c0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  k(OsFile *id){. 
64d0: 20 69 6e 74 20 72 20 3d 20 30 3b 0a 0a 20 20 61   int r = 0;..  a
64e0: 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65  ssert( id->isOpe
64f0: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
6500: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
6510: 20 4e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   Needed because 
6520: 69 64 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  id->pLock is sha
6530: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
6540: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
6550: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
6560: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
6570: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
6580: 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f  */.  if( id->pLo
6590: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  ck->locktype>SHA
65a0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
65b0: 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r = 1;.  }..  /*
65c0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
65d0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
65e0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
65f0: 20 2a 2f 0a 20 20 69 66 28 20 21 72 20 29 7b 0a   */.  if( !r ){.
6600: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
6610: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
6620: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
6630: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
6640: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
6650: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
6660: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
6670: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
6680: 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28  RLCK;.    fcntl(
6690: 69 64 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  id->h, F_GETLK, 
66a0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
66b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
66c0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20  NLCK ){.      r 
66d0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
66e0: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61   .  sqlite3OsLea
66f0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41  veMutex();.  TRA
6700: 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE3("TEST WR-LOC
6710: 4b 20 25 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e  K %d %d\n", id->
6720: 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  h, r);..  return
6730: 20 72 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   r;.}..#ifdef SQ
6740: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
6750: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
6760: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
6770: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
6780: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
6790: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
67a0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
67b0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
67c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
67d0: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
67e0: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
67f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6800: 20 2a 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28   * locktypeName(
6810: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
6820: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
6830: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
6840: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
6850: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
6860: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
6870: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
6880: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
6890: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
68a0: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
68b0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
68c0: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
68d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
68e0: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
68f0: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
6900: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
6910: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  if../*.** Lock t
6920: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
6930: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
6940: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
6950: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
6960: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
6970: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
6980: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
6990: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
69a0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
69b0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
69c0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
69d0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
69e0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
69f0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
6a00: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
6a10: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
6a20: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
6a30: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
6a40: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
6a50: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
6a60: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
6a70: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
6a80: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
6a90: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
6aa0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
6ab0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
6ac0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
6ad0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
6ae0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
6af0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
6b00: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
6b10: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
6b20: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
6b30: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
6b40: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
6b50: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
6b60: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
6b70: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
6b80: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
6b90: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
6ba0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
6bb0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
6bc0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
6bd0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
6be0: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
6bf0: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
6c00: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
6c10: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
6c20: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
6c30: 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  el..*/.int sqlit
6c40: 65 33 4f 73 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  e3OsLock(OsFile 
6c50: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
6c60: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
6c70: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
6c80: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
6c90: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
6ca0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
6cb0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
6cc0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
6cd0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
6ce0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
6cf0: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
6d00: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
6d10: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
6d20: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
6d30: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
6d40: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
6d50: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
6d60: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
6d70: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
6d80: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
6d90: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
6da0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
6db0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
6dc0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
6dd0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
6de0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6df0: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
6e00: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
6e10: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
6e20: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
6e30: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
6e40: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
6e50: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
6e60: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
6e70: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
6e80: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
6e90: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
6ea0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
6eb0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
6ec0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
6ed0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
6ee0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
6ef0: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
6f00: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
6f10: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
6f20: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
6f30: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
6f40: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
6f50: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
6f60: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
6f70: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
6f80: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
6f90: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
6fa0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
6fb0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
6fc0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
6fd0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
6fe0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
6ff0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
7000: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
7010: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
7020: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
7030: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
7040: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
7050: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
7060: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
7070: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
7080: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
7090: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
70a0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
70b0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
70c0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
70d0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
70e0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
70f0: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
7100: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
7110: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
7120: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
7130: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
7140: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
7150: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
7160: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
7170: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
7180: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
7190: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
71a0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
71b0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
71c0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
71d0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
71e0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
71f0: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
7200: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
7210: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
7220: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
7230: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
7240: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
7250: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
7260: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
7270: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
7280: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
7290: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
72a0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
72b0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
72c0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
72d0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
72e0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
72f0: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
7300: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
7310: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
7320: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
7330: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
7340: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
7350: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
7360: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
7370: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
7380: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
7390: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
73a0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
73b0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
73c0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
73d0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
73e0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
73f0: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
7400: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
7410: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
7420: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
7430: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
7440: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
7450: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
7460: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
7470: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
7480: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
7490: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
74a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
74b0: 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74 20  TE_OK;.  struct 
74c0: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  lockInfo *pLock 
74d0: 3d 20 69 64 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73  = id->pLock;.  s
74e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
74f0: 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73  ;.  int s;..  as
7500: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
7510: 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 4c 4f   );.  TRACE7("LO
7520: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
7530: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
7540: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
7550: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
7560: 65 29 2c 20 0a 20 20 20 20 20 20 6c 6f 63 6b 74  e), .      lockt
7570: 79 70 65 4e 61 6d 65 28 69 64 2d 3e 6c 6f 63 6b  ypeName(id->lock
7580: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
7590: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
75a0: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
75b0: 0a 20 20 20 20 20 20 2c 67 65 74 70 69 64 28 29  .      ,getpid()
75c0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
75d0: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
75e0: 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
75f0: 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
7600: 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
7610: 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
7620: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
7630: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
7640: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
7650: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
7660: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
7670: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
7680: 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f   */.  if( id->lo
7690: 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
76a0: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 33 28 22   ){.    TRACE3("
76b0: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
76c0: 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 5c   (already held)\
76d0: 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b 74  n", id->h, lockt
76e0: 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65  ypeName(locktype
76f0: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
7700: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
7710: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
7720: 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
7730: 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
7740: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  */.  assert( id-
7750: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
7760: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
7770: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
7780: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
7790: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
77a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
77b0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
77c0: 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63 6b  LOCK || id->lock
77d0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
77e0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
77f0: 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20  mutex is needed 
7800: 62 65 63 61 75 73 65 20 69 64 2d 3e 70 4c 6f 63  because id->pLoc
7810: 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  k is shared acro
7820: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
7830: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
7840: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 49  Mutex();..  /* I
7850: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
7860: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
7870: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
7880: 66 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a  fferent OsFile*.
7890: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
78a0: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
78b0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
78c0: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
78d0: 0a 20 20 69 66 28 20 28 69 64 2d 3e 6c 6f 63 6b  .  if( (id->lock
78e0: 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63  type!=pLock->loc
78f0: 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20 20  ktype && .      
7900: 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b      (pLock->lock
7910: 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
7920: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e 53  CK || locktype>S
7930: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
7940: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
7950: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
7960: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
7970: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
7980: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
7990: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
79a0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
79b0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
79c0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
79d0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
79e0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
79f0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
7a00: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
7a10: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
7a20: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
7a30: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
7a40: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
7a50: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
7a60: 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
7a70: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
7a80: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
7a90: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
7aa0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
7ab0: 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c 6f    assert( id->lo
7ac0: 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20  cktype==0 );.   
7ad0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
7ae0: 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 69 64 2d  cnt>0 );.    id-
7af0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
7b00: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f  ED_LOCK;.    pLo
7b10: 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 69  ck->cnt++;.    i
7b20: 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b  d->pOpen->nLock+
7b30: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
7b40: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f 63  lock;.  }..  loc
7b50: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
7b60: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
7b70: 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f 2a 20  SEEK_SET;..  /* 
7b80: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
7b90: 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20  s needed before 
7ba0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
7bb0: 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f  ED lock and befo
7bc0: 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e  re.  ** acquirin
7bd0: 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
7be0: 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48  ock.  For the SH
7bf0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50  ARED lock, the P
7c00: 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a  ENDING will.  **
7c10: 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
7c20: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
7c30: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a  e==SHARED_LOCK .
7c40: 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79        || (lockty
7c50: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
7c60: 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 74 79  CK && id->lockty
7c70: 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  pe<PENDING_LOCK)
7c80: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
7c90: 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70  _type = (locktyp
7ca0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46  e==SHARED_LOCK?F
7cb0: 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b  _RDLCK:F_WRLCK);
7cc0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
7cd0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
7ce0: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
7cf0: 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  id->h, F_SETLK, 
7d00: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
7d10: 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
7d20: 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20  (errno==EINVAL) 
7d30: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
7d40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
7d50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
7d60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  k;.    }.  }... 
7d70: 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
7d80: 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
7d90: 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
7da0: 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
7db0: 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
7dc0: 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
7dd0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
7de0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
7df0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
7e00: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
7e10: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63 6e  ssert( pLock->cn
7e20: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
7e30: 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  rt( pLock->lockt
7e40: 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  ype==0 );..    /
7e50: 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
7e60: 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
7e70: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
7e80: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
7e90: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
7ea0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73 20  RED_SIZE;.    s 
7eb0: 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c 20 46  = fcntl(id->h, F
7ec0: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
7ed0: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
7ee0: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
7ef0: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
7f00: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
7f10: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
7f20: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
7f30: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
7f40: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
7f50: 66 63 6e 74 6c 28 69 64 2d 3e 68 2c 20 46 5f 53  fcntl(id->h, F_S
7f60: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
7f70: 20 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20    if( s ){.     
7f80: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
7f90: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
7fa0: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
7fb0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
7fc0: 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70       id->locktyp
7fd0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
7fe0: 0a 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e  .      id->pOpen
7ff0: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
8000: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b   pLock->cnt = 1;
8010: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
8020: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
8030: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
8040: 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
8050: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
8060: 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
8070: 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
8080: 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
8090: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
80a0: 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
80b0: 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
80c0: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
80d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
80e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
80f0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
8100: 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
8110: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
8120: 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
8130: 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
8140: 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
8150: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
8160: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
8170: 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
8180: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
8190: 30 21 3d 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20  0!=id->locktype 
81a0: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  );.    lock.l_ty
81b0: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
81c0: 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79    switch( lockty
81d0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
81e0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a   RESERVED_LOCK:.
81f0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
8200: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
8210: 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72  BYTE;.        br
8220: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8230: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a  EXCLUSIVE_LOCK:.
8240: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
8250: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
8260: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
8270: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
8280: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62  _SIZE;.        b
8290: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
82a0: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
82b0: 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
82c0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e    s = fcntl(id->
82d0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
82e0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b  k);.    if( s ){
82f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
8300: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
8310: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
8320: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
8330: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
8340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8350: 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d    id->locktype =
8360: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70   locktype;.    p
8370: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8380: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c   locktype;.  }el
8390: 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  se if( locktype=
83a0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
83b0: 29 7b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74  ){.    id->lockt
83c0: 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
83d0: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
83e0: 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
83f0: 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
8400: 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33  _lock:.  sqlite3
8410: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
8420: 20 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20    TRACE4("LOCK  
8430: 20 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 69    %d %s %s\n", i
8440: 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61  d->h, locktypeNa
8450: 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20  me(locktype), . 
8460: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
8470: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
8480: 6c 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  led");.  return 
8490: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
84a0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
84b0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
84c0: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
84d0: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
84e0: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
84f0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
8500: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
8510: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
8520: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
8530: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
8540: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
8550: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
8560: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
8570: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
8580: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
8590: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
85a0: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
85b0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
85c0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
85d0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
85e0: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
85f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
8600: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 74 68   SHARED_LOCK, th
8610: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
8620: 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
8630: 45 5f 49 4f 45 52 52 20 69 6e 73 74 65 61 64 20  E_IOERR instead 
8640: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  of SQLITE_OK..*/
8650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 55 6e  .int sqlite3OsUn
8660: 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c  lock(OsFile *id,
8670: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
8680: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66    struct lockInf
8690: 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75  o *pLock;.  stru
86a0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
86b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
86c0: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
86d0: 69 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20  id->isOpen );.  
86e0: 54 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20  TRACE7("UNLOCK  
86f0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
8700: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 69  %d) pid=%d\n", i
8710: 64 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  d->h, locktype, 
8720: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 0a 20  id->locktype, . 
8730: 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e       id->pLock->
8740: 6c 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e 70 4c  locktype, id->pL
8750: 6f 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64  ock->cnt, getpid
8760: 28 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ());..  assert( 
8770: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
8780: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 69  _LOCK );.  if( i
8790: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63  d->locktype<=loc
87a0: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
87b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
87c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
87d0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c  terMutex();.  pL
87e0: 6f 63 6b 20 3d 20 69 64 2d 3e 70 4c 6f 63 6b 3b  ock = id->pLock;
87f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
8800: 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
8810: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  ( id->locktype>S
8820: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
8830: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
8840: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 69 64 2d 3e 6c  >locktype==id->l
8850: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69  ocktype );.    i
8860: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
8870: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
8880: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
8890: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_RDLCK;.      l
88a0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
88b0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
88c0: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
88d0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
88e0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
88f0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
8900: 20 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d 3e    if( fcntl(id->
8910: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
8920: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
8930: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
8940: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
8950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
8960: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
8970: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
8980: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
8990: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
89a0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
89b0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
89c0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
89d0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
89e0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
89f0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
8a00: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
8a10: 3b 0a 20 20 20 20 66 63 6e 74 6c 28 69 64 2d 3e  ;.    fcntl(id->
8a20: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
8a30: 6b 29 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  k);.    pLock->l
8a40: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
8a50: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  _LOCK;.  }.  if(
8a60: 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
8a70: 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  CK ){.    struct
8a80: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b   openCnt *pOpen;
8a90: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
8aa0: 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
8ab0: 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
8ac0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
8ad0: 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
8ae0: 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
8af0: 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
8b00: 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
8b10: 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
8b20: 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
8b30: 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b      */.    pLock
8b40: 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28  ->cnt--;.    if(
8b50: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29   pLock->cnt==0 )
8b60: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
8b70: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
8b80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
8b90: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
8ba0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
8bb0: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
8bc0: 20 30 4c 3b 0a 20 20 20 20 20 20 66 63 6e 74 6c   0L;.      fcntl
8bd0: 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  (id->h, F_SETLK,
8be0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70   &lock);.      p
8bf0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
8c00: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a   NO_LOCK;.    }.
8c10: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
8c20: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
8c30: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
8c40: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
8c50: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
8c60: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
8c70: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
8c80: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
8c90: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
8ca0: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
8cb0: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
8cc0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
8cd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65  .    */.    pOpe
8ce0: 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20  n = id->pOpen;. 
8cf0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
8d00: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
8d10: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
8d20: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
8d30: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
8d40: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
8d50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8d60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8d70: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b  pOpen->nPending;
8d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
8d90: 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  lose(pOpen->aPen
8da0: 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ding[i]);.      
8db0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
8dc0: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
8dd0: 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ng);.      pOpen
8de0: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
8df0: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
8e00: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d  nding = 0;.    }
8e10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
8e20: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
8e30: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  id->locktype = l
8e40: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
8e50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8e60: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
8e70: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  int sqlite3OsClo
8e80: 73 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  se(OsFile *id){.
8e90: 20 20 69 66 28 20 21 69 64 2d 3e 69 73 4f 70 65    if( !id->isOpe
8ea0: 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
8eb0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 4f  E_OK;.  sqlite3O
8ec0: 73 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  sUnlock(id, NO_L
8ed0: 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  OCK);.  if( id->
8ee0: 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73 65  dirfd>=0 ) close
8ef0: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 69  (id->dirfd);.  i
8f00: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
8f10: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
8f20: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64  utex();.  if( id
8f30: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
8f40: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
8f50: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
8f60: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
8f70: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
8f80: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
8f90: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
8fa0: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
8fb0: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
8fc0: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
8fd0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
8fe0: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
8ff0: 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
9000: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
9010: 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
9020: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  .    ** the last
9030: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
9040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9050: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75   *aNew;.    stru
9060: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
9070: 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20  n = id->pOpen;. 
9080: 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
9090: 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ng++;.    aNew =
90a0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
90b0: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c  pOpen->aPending,
90c0: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
90d0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
90e0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
90f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
9100: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
9110: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
9120: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
9130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9140: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
9150: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
9160: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
9170: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2d 31  Open->nPending-1
9180: 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20 7d  ] = id->h;.    }
9190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
91a0: 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   There are no ou
91b0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
91c0: 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65 20  so we can close 
91d0: 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  the file immedia
91e0: 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f 73  tely */.    clos
91f0: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20  e(id->h);.  }.  
9200: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
9210: 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 72 65  id->pLock);.  re
9220: 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69 64 2d  leaseOpenCnt(id-
9230: 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74  >pOpen);.  sqlit
9240: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
9250: 3b 0a 20 20 69 64 2d 3e 69 73 4f 70 65 6e 20 3d  ;.  id->isOpen =
9260: 20 30 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c   0;.  TRACE2("CL
9270: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
9280: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
9290: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
92a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
92b0: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
92c0: 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
92d0: 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
92e0: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61 20  name.  Return a 
92f0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
9300: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
9310: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
9320: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
9330: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  liteMalloc()..**
9340: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
9350: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
9360: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
9370: 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63 65   this space once
9380: 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e   it.** is no lon
9390: 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63  ger needed..*/.c
93a0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4f 73 46 75  har *sqlite3OsFu
93b0: 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e 73 74  llPathname(const
93c0: 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
93d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  ){.  char *zFull
93e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c   = 0;.  if( zRel
93f0: 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b  ative[0]=='/' ){
9400: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
9410: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52  tring(&zFull, zR
9420: 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72 2a 29  elative, (char*)
9430: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
9440: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 30 5d   char zBuf[5000]
9450: 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20  ;.    zBuf[0] = 
9460: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  0;.    sqlite3Se
9470: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
9480: 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a  getcwd(zBuf, siz
9490: 65 6f 66 28 7a 42 75 66 29 29 2c 20 22 2f 22 2c  eof(zBuf)), "/",
94a0: 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20   zRelative,.    
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20  (char*)0);.  }. 
94d0: 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d   return zFull;.}
94e0: 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ...#endif /* SQL
94f0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
9500: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
9510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9550: 2a 2a 20 45 76 65 72 79 74 68 69 6e 67 20 61 62  ** Everything ab
9560: 6f 76 65 20 64 65 61 6c 73 20 77 69 74 68 20 66  ove deals with f
9570: 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74  ile I/O.  Everyt
9580: 68 69 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77  hing that follow
9590: 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20  s deals.** with 
95a0: 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f  other miscellano
95b0: 75 73 20 61 73 70 65 63 74 73 20 6f 66 20 74 68  us aspects of th
95c0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
95d0: 65 6d 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a  em interface.***
95e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
95f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a  *********/.../*.
9630: 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69  ** Get informati
9640: 6f 6e 20 74 6f 20 73 65 65 64 20 74 68 65 20 72  on to seed the r
9650: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
9660: 65 72 61 74 6f 72 2e 20 20 54 68 65 20 73 65 65  erator.  The see
9670: 64 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20  d.** is written 
9680: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
9690: 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54 68 65 20  zBuf[256].  The 
96a0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
96b0: 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20   must.** supply 
96c0: 61 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20 6c  a sufficiently l
96d0: 61 72 67 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  arge buffer..*/.
96e0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 52 61 6e  int sqlite3OsRan
96f0: 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42  domSeed(char *zB
9700: 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76  uf){.  /* We hav
9710: 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
9720: 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20  zBuf to prevent 
9730: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65  valgrind from re
9740: 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72  porting.  ** err
9750: 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74  ors.  The report
9760: 73 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67  s issued by valg
9770: 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65  rind are incorre
9780: 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20  ct - we would.  
9790: 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74  ** prefer that t
97a0: 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65  he randomness be
97b0: 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61   increased by ma
97c0: 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a  king use of the.
97d0: 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a    ** uninitializ
97e0: 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66  ed space in zBuf
97f0: 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20   - but valgrind 
9800: 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77  errors tend to w
9810: 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75  orry.  ** some u
9820: 73 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68  sers.  Rather th
9830: 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65  an argue, it see
9840: 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74  ms easier just t
9850: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  o initialize.  *
9860: 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61  * the whole arra
9870: 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61  y and silence va
9880: 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20  lgrind, even if 
9890: 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20  that means less 
98a0: 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20  randomness.  ** 
98b0: 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65  in the random se
98c0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ed..  **.  ** Wh
98d0: 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74  en testing, init
98e0: 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20  ializing zBuf[] 
98f0: 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77  to zero is all w
9900: 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e  e do.  That mean
9910: 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61  s.  ** that we a
9920: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61  lways use the sa
9930: 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  me random number
9940: 20 73 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73   sequence.* This
9950: 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20   makes the.  ** 
9960: 74 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65  tests repeatable
9970: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
9980: 7a 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23  zBuf, 0, 256);.#
9990: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
99a0: 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20  TE_TEST).  {.   
99b0: 20 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20   int pid, fd;.  
99c0: 20 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65    fd = open("/de
99d0: 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
99e0: 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66  ONLY);.    if( f
99f0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d  d<0 ){.      tim
9a00: 65 28 28 74 69 6d 65 5f 74 2a 29 7a 42 75 66 29  e((time_t*)zBuf)
9a10: 3b 0a 20 20 20 20 20 20 70 69 64 20 3d 20 67 65  ;.      pid = ge
9a20: 74 70 69 64 28 29 3b 0a 20 20 20 20 20 20 6d 65  tpid();.      me
9a30: 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
9a40: 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64  f(time_t)], &pid
9a50: 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
9a60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a70: 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20   read(fd, zBuf, 
9a80: 32 35 36 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  256);.      clos
9a90: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(fd);.    }.  }
9aa0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
9ab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9ac0: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
9ad0: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
9ae0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
9af0: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
9b00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
9b10: 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  sSleep(int ms){.
9b20: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
9b30: 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
9b40: 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
9b50: 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  (ms*1000);.  ret
9b60: 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20  urn ms;.#else.  
9b70: 73 6c 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31  sleep((ms+999)/1
9b80: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
9b90: 30 30 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30  000*((ms+999)/10
9ba0: 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  00);.#endif.}../
9bb0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69  *.** Static vari
9bc0: 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74  ables used for t
9bd0: 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a  hread synchroniz
9be0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
9bf0: 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b  int inMutex = 0;
9c00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
9c10: 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74  NIX_THREADS.stat
9c20: 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ic pthread_mutex
9c30: 5f 74 20 6d 75 74 65 78 20 3d 20 50 54 48 52 45  _t mutex = PTHRE
9c40: 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41 4c  AD_MUTEX_INITIAL
9c50: 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  IZER;.#endif../*
9c60: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9c70: 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e  g pair of routin
9c80: 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75  e implement mutu
9c90: 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72  al exclusion for
9ca0: 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64  .** multi-thread
9cb0: 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f  ed processes.  O
9cc0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72  nly a single thr
9cd0: 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  ead is allowed t
9ce0: 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f  o.** executed co
9cf0: 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72 6f  de that is surro
9d00: 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75  unded by EnterMu
9d10: 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d  tex() and LeaveM
9d20: 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  utex()..**.** SQ
9d30: 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61  Lite uses only a
9d40: 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20   single Mutex.  
9d50: 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  There is not muc
9d60: 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f  h critical.** co
9d70: 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74  de and what litt
9d80: 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65 63  le there is exec
9d90: 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64  utes quickly and
9da0: 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e   without blockin
9db0: 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
9dc0: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
9dd0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
9de0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70  UNIX_THREADS.  p
9df0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
9e00: 6b 28 26 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  k(&mutex);.#endi
9e10: 66 0a 20 20 61 73 73 65 72 74 28 20 21 69 6e 4d  f.  assert( !inM
9e20: 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65  utex );.  inMute
9e30: 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71  x = 1;.}.void sq
9e40: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
9e50: 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  x(){.  assert( i
9e60: 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75  nMutex );.  inMu
9e70: 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  tex = 0;.#ifdef 
9e80: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
9e90: 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75  ADS.  pthread_mu
9ea0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65  tex_unlock(&mute
9eb0: 78 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  x);.#endif.}../*
9ec0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9ed0: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
9ee0: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
9ef0: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
9f00: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
9f10: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
9f20: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
9f30: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
9f40: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
9f50: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9f60: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
9f70: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
9f80: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
9f90: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
9fa0: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
9fb0: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
9fc0: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
9fd0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
9fe0: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
9ff0: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
a000: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
a010: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
a020: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
a030: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
a040: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
a050: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
a060: 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f 75 62  CurrentTime(doub
a070: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 74 69  le *prNow){.  ti
a080: 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
a090: 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
a0a0: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
a0b0: 38 37 2e 35 3b 0a 23 69 66 64 65 66 20 53 51 4c  87.5;.#ifdef SQL
a0c0: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73  ITE_TEST.  if( s
a0d0: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
a0e0: 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  ime ){.    *prNo
a0f0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72  w = sqlite3_curr
a100: 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30  ent_time/86400.0
a110: 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20   + 2440587.5;.  
a120: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
a130: 6e 20 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  n 0;.}..#endif /
a140: 2a 20 4f 53 5f 55 4e 49 58 20 2a 2f 0a           * OS_UNIX */.