System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 8943febbedc79649d21ec1ed14de14ad8214c899:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f   unix only */../
0220: 2a 0a 2a 2a 20 54 68 65 73 65 20 23 64 65 66 69  *.** These #defi
0230: 6e 65 73 20 73 68 6f 75 6c 64 20 65 6e 61 62 6c  nes should enabl
0240: 65 20 3e 32 47 42 20 66 69 6c 65 20 73 75 70 70  e >2GB file supp
0250: 6f 72 74 20 6f 6e 20 50 6f 73 69 78 20 69 66 20  ort on Posix if 
0260: 74 68 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  the.** underlyin
0270: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
0280: 65 6d 20 73 75 70 70 6f 72 74 73 20 69 74 2e 20  em supports it. 
0290: 20 49 66 20 74 68 65 20 4f 53 20 6c 61 63 6b 73   If the OS lacks
02a0: 0a 2a 2a 20 6c 61 72 67 65 20 66 69 6c 65 20 73  .** large file s
02b0: 75 70 70 6f 72 74 2c 20 6f 72 20 69 66 20 74 68  upport, or if th
02c0: 65 20 4f 53 20 69 73 20 77 69 6e 64 6f 77 73 2c  e OS is windows,
02d0: 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20 62 65   these should be
02e0: 20 6e 6f 2d 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c   no-ops..**.** L
02f0: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
0300: 74 20 63 61 6e 20 62 65 20 64 69 73 61 62 6c 65  t can be disable
0310: 64 20 75 73 69 6e 67 20 74 68 65 20 2d 44 53 51  d using the -DSQ
0320: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0330: 20 73 77 69 74 63 68 0a 2a 2a 20 6f 6e 20 74 68   switch.** on th
0340: 65 20 63 6f 6d 70 69 6c 65 72 20 63 6f 6d 6d 61  e compiler comma
0350: 6e 64 20 6c 69 6e 65 2e 20 20 54 68 69 73 20 69  nd line.  This i
0360: 73 20 6e 65 63 65 73 73 61 72 79 20 69 66 20 79  s necessary if y
0370: 6f 75 20 61 72 65 20 63 6f 6d 70 69 6c 69 6e 67  ou are compiling
0380: 0a 2a 2a 20 6f 6e 20 61 20 72 65 63 65 6e 74 20  .** on a recent 
0390: 6d 61 63 68 69 6e 65 20 28 65 78 3a 20 52 65 64  machine (ex: Red
03a0: 48 61 74 20 37 2e 32 29 20 62 75 74 20 79 6f 75  Hat 7.2) but you
03b0: 20 77 61 6e 74 20 79 6f 75 72 20 63 6f 64 65 20   want your code 
03c0: 74 6f 20 77 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e  to work.** on an
03d0: 20 6f 6c 64 65 72 20 6d 61 63 68 69 6e 65 20 28   older machine (
03e0: 65 78 3a 20 52 65 64 48 61 74 20 36 2e 30 29 2e  ex: RedHat 6.0).
03f0: 20 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65    If you compile
0400: 20 6f 6e 20 52 65 64 48 61 74 20 37 2e 32 0a 2a   on RedHat 7.2.*
0410: 2a 20 77 69 74 68 6f 75 74 20 74 68 69 73 20 6f  * without this o
0420: 70 74 69 6f 6e 2c 20 4c 46 53 20 69 73 20 65 6e  ption, LFS is en
0430: 61 62 6c 65 2e 20 20 42 75 74 20 4c 46 53 20 64  able.  But LFS d
0440: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69 6e  oes not exist in
0450: 20 74 68 65 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69   the kernel.** i
0460: 6e 20 52 65 64 48 61 74 20 36 2e 30 2c 20 73 6f  n RedHat 6.0, so
0470: 20 74 68 65 20 63 6f 64 65 20 77 6f 6e 27 74 20   the code won't 
0480: 77 6f 72 6b 2e 20 20 48 65 6e 63 65 2c 20 66 6f  work.  Hence, fo
0490: 72 20 6d 61 78 69 6d 75 6d 20 62 69 6e 61 72 79  r maximum binary
04a0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
04b0: 79 6f 75 20 73 68 6f 75 6c 64 20 6f 6d 69 74 20  you should omit 
04c0: 4c 46 53 2e 0a 2a 2a 0a 2a 2a 20 53 69 6d 69 6c  LFS..**.** Simil
04d0: 61 72 20 69 73 20 74 72 75 65 20 66 6f 72 20 4d  ar is true for M
04e0: 61 63 4f 53 2e 20 20 4c 46 53 20 69 73 20 6f 6e  acOS.  LFS is on
04f0: 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20  ly supported on 
0500: 4d 61 63 4f 53 20 39 20 61 6e 64 20 6c 61 74 65  MacOS 9 and late
0510: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r..*/.#ifndef SQ
0520: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
0530: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
0540: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
0550: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
0560: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
0570: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
0580: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
0590: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
05a0: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
05b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
05c0: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
05d0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
05e0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
05f0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0600: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
0610: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
0620: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
0630: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
0640: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
0650: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
0660: 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  no.h>../*.** Mac
0670: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0680: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0690: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
06a0: 61 64 73 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ads.  The.** SQL
06b0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
06c0: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
06d0: 64 20 69 66 20 77 65 20 61 72 65 20 73 79 6e 63  d if we are sync
06e0: 68 72 6f 6e 69 7a 69 6e 67 20 66 6f 72 0a 2a 2a  hronizing for.**
06f0: 20 50 6f 73 69 78 20 74 68 72 65 61 64 73 20 61   Posix threads a
0700: 6e 64 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48  nd SQLITE_W32_TH
0710: 52 45 41 44 53 20 69 73 20 64 65 66 69 6e 65 64  READS is defined
0720: 20 69 66 20 77 65 20 61 72 65 0a 2a 2a 20 73 79   if we are.** sy
0730: 6e 63 68 72 6f 6e 69 7a 69 6e 67 20 75 73 69 6e  nchronizing usin
0740: 67 20 57 69 6e 33 32 20 74 68 72 65 61 64 73 2e  g Win32 threads.
0750: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
0760: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 54  THREADSAFE) && T
0770: 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c  HREADSAFE.# incl
0780: 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a  ude <pthread.h>.
0790: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
07a0: 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23  UNIX_THREADS 1.#
07b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
07c0: 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
07d0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61   when creating a
07e0: 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66   new file.*/.#if
07f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  ndef SQLITE_DEFA
0800: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
0810: 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51  IONS.# define SQ
0820: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
0830: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36  E_PERMISSIONS 06
0840: 34 34 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  44.#endif..../*.
0850: 2a 2a 20 54 68 65 20 75 6e 69 78 46 69 6c 65 20  ** The unixFile 
0860: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62  structure is sub
0870: 63 6c 61 73 73 20 6f 66 20 4f 73 46 69 6c 65 20  class of OsFile 
0880: 73 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65  specific for the
0890: 20 75 6e 69 78 0a 2a 2a 20 70 72 6f 74 61 62 69   unix.** protabi
08a0: 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74  lity layer..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
08c0: 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b  ixFile unixFile;
08d0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
08e0: 20 7b 0a 20 20 49 6f 4d 65 74 68 6f 64 20 63 6f   {.  IoMethod co
08f0: 6e 73 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f  nst *pMethod;  /
0900: 2a 20 41 6c 77 61 79 73 20 74 68 65 20 66 69 72  * Always the fir
0910: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74  st entry */.  st
0920: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
0930: 70 65 6e 3b 20 20 20 20 2f 2a 20 49 6e 66 6f 20  pen;    /* Info 
0940: 61 62 6f 75 74 20 61 6c 6c 20 6f 70 65 6e 20 66  about all open f
0950: 64 27 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64  d's on this inod
0960: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f  e */.  struct lo
0970: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 20 20  ckInfo *pLock;  
0980: 20 2f 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c   /* Info about l
0990: 6f 63 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f  ocks on this ino
09a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  de */.  int h;  
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
09d0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
09e0: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b  signed char lock
09f0: 74 79 70 65 3b 20 20 20 2f 2a 20 54 68 65 20 74  type;   /* The t
0a00: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
0a10: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
0a20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
0a30: 73 4f 70 65 6e 3b 20 20 20 20 20 2f 2a 20 54 72  sOpen;     /* Tr
0a40: 75 65 20 69 66 20 6e 65 65 64 73 20 74 6f 20 62  ue if needs to b
0a50: 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
0a60: 73 69 67 6e 65 64 20 63 68 61 72 20 66 75 6c 6c  signed char full
0a70: 53 79 6e 63 3b 20 20 20 2f 2a 20 55 73 65 20 46  Sync;   /* Use F
0a80: 5f 46 55 4c 4c 53 59 4e 43 20 69 66 20 61 76 61  _FULLSYNC if ava
0a90: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
0aa0: 64 69 72 66 64 3b 20 20 20 20 20 20 20 20 20 20  dirfd;          
0ab0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
0ac0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
0ad0: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 23 69   directory */.#i
0ae0: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
0af0: 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65  _THREADS.  pthre
0b00: 61 64 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20  ad_t tid;       
0b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 68 72 65       /* The thre
0b20: 61 64 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f  ad authorized to
0b30: 20 75 73 65 20 74 68 69 73 20 4f 73 46 69 6c 65   use this OsFile
0b40: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
0b50: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 74 68 65  *.** Provide the
0b60: 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
0b70: 72 69 64 65 20 73 6f 6d 65 20 4f 53 2d 6c 61 79  ride some OS-lay
0b80: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 64 75 72  er functions dur
0b90: 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 2e 20  ing.** testing. 
0ba0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
0bb0: 20 73 69 6d 75 6c 61 74 65 20 4f 53 20 63 72 61   simulate OS cra
0bc0: 73 68 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  shes to verify t
0bd0: 68 61 74 20 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  hat .** commits 
0be0: 61 72 65 20 61 74 6f 6d 69 63 20 65 76 65 6e 20  are atomic even 
0bf0: 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
0c00: 61 6e 20 4f 53 20 63 72 61 73 68 2e 0a 2a 2f 0a  an OS crash..*/.
0c10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 52  #ifdef SQLITE_CR
0c20: 41 53 48 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ASH_TEST.  exter
0c30: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61  n int sqlite3Cra
0c40: 73 68 54 65 73 74 45 6e 61 62 6c 65 3b 0a 20 20  shTestEnable;.  
0c50: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
0c60: 65 33 43 72 61 73 68 4f 70 65 6e 52 65 61 64 57  e3CrashOpenReadW
0c70: 72 69 74 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  rite(const char*
0c80: 2c 20 4f 73 46 69 6c 65 2a 2a 2c 20 69 6e 74 2a  , OsFile**, int*
0c90: 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
0ca0: 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e  sqlite3CrashOpen
0cb0: 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20  Exclusive(const 
0cc0: 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65 2a 2a 2c  char*, OsFile**,
0cd0: 20 69 6e 74 29 3b 0a 20 20 65 78 74 65 72 6e 20   int);.  extern 
0ce0: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 61 73 68  int sqlite3Crash
0cf0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e  OpenReadOnly(con
0d00: 73 74 20 63 68 61 72 2a 2c 20 4f 73 46 69 6c 65  st char*, OsFile
0d10: 2a 2a 2c 20 69 6e 74 29 3b 0a 23 20 64 65 66 69  **, int);.# defi
0d20: 6e 65 20 43 52 41 53 48 5f 54 45 53 54 5f 4f 56  ne CRASH_TEST_OV
0d30: 45 52 52 49 44 45 28 58 2c 41 2c 42 2c 43 29 20  ERRIDE(X,A,B,C) 
0d40: 5c 0a 20 20 20 20 69 66 28 73 71 6c 69 74 65 33  \.    if(sqlite3
0d50: 43 72 61 73 68 54 65 73 74 45 6e 61 62 6c 65 29  CrashTestEnable)
0d60: 7b 20 72 65 74 75 72 6e 20 58 28 41 2c 42 2c 43  { return X(A,B,C
0d70: 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  ); }.#else.# def
0d80: 69 6e 65 20 43 52 41 53 48 5f 54 45 53 54 5f 4f  ine CRASH_TEST_O
0d90: 56 45 52 52 49 44 45 28 58 2c 41 2c 42 2c 43 29  VERRIDE(X,A,B,C)
0da0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65    /* no-op */.#e
0db0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  ndif.../*.** Inc
0dc0: 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20 69  lude code that i
0dd0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  s common to all 
0de0: 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a  os_*.c files.*/.
0df0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d  #include "os_com
0e00: 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 6f  mon.h"../*.** Do
0e10: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61 6e 79   not include any
0e20: 20 6f 66 20 74 68 65 20 46 69 6c 65 20 49 2f 4f   of the File I/O
0e30: 20 69 6e 74 65 72 66 61 63 65 20 70 72 6f 63 65   interface proce
0e40: 64 75 72 65 73 20 69 66 20 74 68 65 0a 2a 2a 20  dures if the.** 
0e50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
0e60: 49 4f 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  IO macro is defi
0e70: 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67 20  ned (indicating 
0e80: 74 68 61 74 20 74 68 65 72 65 20 64 61 74 61 62  that there datab
0e90: 61 73 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  ase.** will be i
0ea0: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 29 0a 2a  n-memory only).*
0eb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0ec0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 0a 0a 2f  _OMIT_DISKIO.../
0ed0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69  *.** Define vari
0ee0: 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20  ous macros that 
0ef0: 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  are missing from
0f00: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a   some systems..*
0f10: 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47  /.#ifndef O_LARG
0f20: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
0f30: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
0f40: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
0f50: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20  E_DISABLE_LFS.# 
0f60: 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  undef O_LARGEFIL
0f70: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
0f80: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
0f90: 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c  #ifndef O_NOFOLL
0fa0: 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f  OW.# define O_NO
0fb0: 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a  FOLLOW 0.#endif.
0fc0: 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59  #ifndef O_BINARY
0fd0: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  .# define O_BINA
0fe0: 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RY 0.#endif../*.
0ff0: 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d  ** The DJGPP com
1000: 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e  piler environmen
1010: 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c  t looks mostly l
1020: 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74  ike Unix, but it
1030: 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63  .** lacks the fc
1040: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
1050: 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20  l.  So redefine 
1060: 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f  fcntl() to be so
1070: 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20  mething.** that 
1080: 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
1090: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
10a0: 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e  t locking does n
10b0: 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a  ot occur under.*
10c0: 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74  * DJGPP.  But it
10d0: 27 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  's DOS - what di
10e0: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
10f0: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
1100: 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e 74 6c  _.# define fcntl
1110: 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64 69 66  (A,B,C) 0.#endif
1120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
1130: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
1140: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
1150: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
1160: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
1170: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
1180: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
1190: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
11a0: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 74 68 72  EADS.#define thr
11b0: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
11c0: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
11d0: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
11e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
11f0: 6f 72 20 63 68 65 63 6b 20 74 68 65 20 4f 73 46  or check the OsF
1200: 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20 20  ile.tid field.  
1210: 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73 65  This field is se
1220: 74 20 77 68 65 6e 20 61 6e 20 4f 73 46 69 6c 65  t when an OsFile
1230: 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f 70 65  .** is first ope
1240: 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ned.  All subseq
1250: 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74 68 65  uent uses of the
1260: 20 4f 73 46 69 6c 65 20 76 65 72 69 66 79 20 74   OsFile verify t
1270: 68 61 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  hat the.** same 
1280: 74 68 72 65 61 64 20 69 73 20 6f 70 65 72 61 74  thread is operat
1290: 69 6e 67 20 6f 6e 20 74 68 65 20 4f 73 46 69 6c  ing on the OsFil
12a0: 65 2e 20 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  e.  Some operati
12b0: 6e 67 20 73 79 73 74 65 6d 73 20 64 6f 0a 2a 2a  ng systems do.**
12c0: 20 6e 6f 74 20 61 6c 6c 6f 77 20 6c 6f 63 6b 73   not allow locks
12d0: 20 74 6f 20 62 65 20 6f 76 65 72 72 69 64 64 65   to be overridde
12e0: 6e 20 62 79 20 6f 74 68 65 72 20 74 68 72 65 61  n by other threa
12f0: 64 73 20 61 6e 64 20 74 68 61 74 20 72 65 73 74  ds and that rest
1300: 72 69 63 74 69 6f 6e 0a 2a 2a 20 6d 65 61 6e 73  riction.** means
1310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 2a 20 64   that sqlite3* d
1320: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
1330: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 76 65 64 20  cannot be moved 
1340: 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65 61 64 0a  from one thread.
1350: 2a 2a 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  ** to another.  
1360: 54 68 69 73 20 6c 6f 67 69 63 20 6d 61 6b 65 73  This logic makes
1370: 20 73 75 72 65 20 61 20 75 73 65 72 20 64 6f 65   sure a user doe
1380: 73 20 6e 6f 74 20 74 72 79 20 74 6f 20 64 6f 20  s not try to do 
1390: 74 68 61 74 0a 2a 2a 20 62 79 20 6d 69 73 74 61  that.** by mista
13a0: 6b 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ke..*/.#if defin
13b0: 65 64 28 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ed(SQLITE_UNIX_T
13c0: 48 52 45 41 44 53 29 20 26 26 20 21 64 65 66 69  HREADS) && !defi
13d0: 6e 65 64 28 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  ned(SQLITE_ALLOW
13e0: 5f 58 54 48 52 45 41 44 5f 43 4f 4e 4e 45 43 54  _XTHREAD_CONNECT
13f0: 49 4f 4e 53 29 0a 23 20 64 65 66 69 6e 65 20 53  IONS).# define S
1400: 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 20 20  ET_THREADID(X)  
1410: 20 28 58 29 2d 3e 74 69 64 20 3d 20 70 74 68 72   (X)->tid = pthr
1420: 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64 65 66  ead_self().# def
1430: 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45 41 44  ine CHECK_THREAD
1440: 49 44 28 58 29 20 28 21 70 74 68 72 65 61 64 5f  ID(X) (!pthread_
1450: 65 71 75 61 6c 28 28 58 29 2d 3e 74 69 64 2c 20  equal((X)->tid, 
1460: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
1470: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1480: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 0a  SET_THREADID(X).
1490: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
14a0: 48 52 45 41 44 49 44 28 58 29 20 30 0a 23 65 6e  HREADID(X) 0.#en
14b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  dif../*.** Here 
14c0: 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50  is the dirt on P
14d0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
14e0: 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31  cks:  ANSI STD 1
14f0: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
1500: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
1510: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
1520: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
1530: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
1540: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
1550: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
1560: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
1570: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
1580: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
1590: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
15a0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
15b0: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
15c0: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
15d0: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
15e0: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
15f0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
1600: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
1610: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
1620: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
1630: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
1640: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
1650: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
1660: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
1670: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
1680: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
1690: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
16a0: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
16b0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
16c0: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
16d0: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
16e0: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
16f0: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
1700: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
1710: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
1720: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
1730: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
1740: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
1750: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
1760: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
1770: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
1780: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
1790: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
17a0: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
17b0: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
17c0: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
17d0: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
17e0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17f0: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
1800: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
1810: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
1820: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
1830: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
1840: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
1850: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
1860: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
1870: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
1880: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
1890: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
18a0: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
18b0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72  es..**.** Bummer
18c0: 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20 6d 65  .  If you ask me
18d0: 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b 65 6e  , this is broken
18e0: 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e  .  Badly broken.
18f0: 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68    It means.** th
1900: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
1910: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
1920: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
1930: 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a   access among.**
1940: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
1950: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
1960: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
1970: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
1980: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
1990: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
19a0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
19b0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
19c0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
19d0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
19e0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
19f0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
1a00: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
1a10: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
1a20: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
1a30: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
1a40: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
1a50: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
1a60: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
1a70: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
1a80: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
1a90: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1aa0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
1ab0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
1ac0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
1ad0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
1ae0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
1af0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
1b00: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
1b10: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
1b20: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
1b30: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
1b40: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
1b50: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
1b60: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
1b70: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
1b80: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
1b90: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
1ba0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
1bb0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
1bc0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
1bd0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
1be0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
1bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46  e..**.** The OsF
1c00: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
1c10: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
1c20: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
1c30: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
1c40: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
1c50: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
1c60: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
1c70: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
1c80: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
1c90: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
1ca0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1cb0: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
1cc0: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
1cd0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1ce0: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
1cf0: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
1d00: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
1d10: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
1d20: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
1d30: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
1d40: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
1d50: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
1d60: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
1d70: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1d80: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1d90: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
1da0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
1db0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1dc0: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
1dd0: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
1de0: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
1df0: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
1e00: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
1e10: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
1e20: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
1e30: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
1e40: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
1e50: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1e60: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
1e70: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1e80: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1e90: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1ea0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1eb0: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1ec0: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1ed0: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
1ee0: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
1ef0: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1f00: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
1f10: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
1f20: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
1f30: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
1f40: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
1f50: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
1f60: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
1f70: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1f80: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1f90: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1fa0: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1fb0: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1fc0: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1fd0: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
1fe0: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
1ff0: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
2000: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
2010: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
2020: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
2030: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
2040: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2050: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
2060: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
2070: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
2080: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
2090: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
20a0: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
20b0: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
20c0: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
20d0: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
20e0: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 4f 73 46  roblem, each OsF
20f0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ile structure co
2100: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e  ntains.** a poin
2110: 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e  ter to an openCn
2120: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
2130: 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43  ere is one openC
2140: 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  nt structure.** 
2150: 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20  per open inode, 
2160: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
2170: 20 6d 75 6c 74 69 70 6c 65 20 4f 73 46 69 6c 65   multiple OsFile
2180: 73 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  s can point to a
2190: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
21a0: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
21b0: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
21c0: 63 6c 6f 73 65 20 61 6e 20 4f 73 46 69 6c 65 2c  close an OsFile,
21d0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
21e0: 20 6f 74 68 65 72 20 4f 73 46 69 6c 65 73 20 6f   other OsFiles o
21f0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2200: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
2210: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
2220: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
2230: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
2240: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
2250: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
2260: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
2270: 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43 6e  r..** The openCn
2280: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
2290: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
22a0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
22b0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
22c0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
22d0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
22e0: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
22f0: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
2300: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
2310: 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c 69   First, under Li
2320: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65 63  nux threads, bec
2330: 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61 64  ause each thread
2340: 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65 0a   has a separate.
2350: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20 6c  ** process ID, l
2360: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  ock operations i
2370: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f 20  n one thread do 
2380: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  not override loc
2390: 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d  ks.** to the sam
23a0: 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72 20  e file in other 
23b0: 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78 20  threads.  Linux 
23c0: 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20 6c  threads behave l
23d0: 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ike.** separate 
23e0: 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68 69  processes in thi
23f0: 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74 2c  s respect.  But,
2400: 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   if you close a 
2410: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
2420: 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65  or in linux thre
2430: 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ads, all locks a
2440: 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65 6e  re cleared, even
2450: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74 68   locks.** on oth
2460: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 65  er threads and e
2470: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
2480: 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61 76  ther threads hav
2490: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70  e different.** p
24a0: 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69 6e  rocess IDs.  Lin
24b0: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69 6e  ux threads is in
24c0: 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74 68  consistent in th
24d0: 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20 28  is respect..** (
24e0: 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  I'm beginning to
24f0: 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e 75   think that linu
2500: 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e 20  x threads is an 
2510: 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f 2e  abomination too.
2520: 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71 75  ).** The consequ
2530: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c 6c  ence of this all
2540: 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61 73   is that the has
2550: 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  h table for the 
2560: 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  lockInfo.** stru
2570: 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e 63  cture has to inc
2580: 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73 73  lude the process
2590: 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20 69   id as part of i
25a0: 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a 2a  ts key because.*
25b0: 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66 65  * locks in diffe
25c0: 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72 65  rent threads are
25d0: 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73 74   treated as dist
25e0: 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20 0a  inct.  But the .
25f0: 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ** openCnt struc
2600: 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ture should not 
2610: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
2620: 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a 2a  ess id in its.**
2630: 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c 6f   key because clo
2640: 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63 6b  se() clears lock
2650: 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 2c   on all threads,
2660: 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63 75   not just the cu
2670: 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 2e  rrent.** thread.
2680: 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66 6f    Were it not fo
2690: 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73 73  r this goofiness
26a0: 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61 64   in linux thread
26b0: 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20 63  s, we could.** c
26c0: 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b 49  ombine the lockI
26d0: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
26e0: 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20  structures into 
26f0: 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75  a single structu
2700: 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  re..**.** 2004-J
2710: 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d  un-28:.** On som
2720: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  e versions of li
2730: 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63 61 6e  nux, threads can
2740: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
2750: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
2760: 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e 20 20  On others not.  
2770: 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20 63 61  Sometimes you ca
2780: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62 65 68  n change the beh
2790: 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  avior on the sam
27a0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79 20 73  e.** system by s
27b0: 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f 41 53  etting the LD_AS
27c0: 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e 76 69  SUME_KERNEL envi
27d0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
27e0: 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49 58 20  .  The.** POSIX 
27f0: 73 74 61 6e 64 61 72 64 20 69 73 20 73 69 6c 65  standard is sile
2800: 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 20 62  nt as to which b
2810: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
2820: 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20 61 73  ct, as far.** as
2830: 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73 6f 20   I can tell, so 
2840: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  other versions o
2850: 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73 68 6f  f unix might sho
2860: 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 69 6e  w the same.** in
2870: 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54 68  consistency.  Th
2880: 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74 6c 65  ere is no little
2890: 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d 69 6e   doubt in my min
28a0: 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a 2a 20  d that posix.** 
28b0: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
28c0: 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  nd linux threads
28d0: 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c 79 20   are profoundly 
28e0: 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  broken..**.** To
28f0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
2900: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
2910: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73  , we have to tes
2920: 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a 2a 2a  t at runtime .**
2930: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2940: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
2950: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
2960: 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20 74 65   locks.  This te
2970: 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f 6e 63  st.** is run onc
2980: 65 2c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  e, the first tim
2990: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
29a0: 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74 61 74  tempted.  A stat
29b0: 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ic .** variable 
29c0: 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f 72 64  is set to record
29d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
29e0: 74 68 69 73 20 74 65 73 74 20 66 6f 72 20 66 75  this test for fu
29f0: 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a  ture.** use..*/.
2a00: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
2a10: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
2a20: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
2a30: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
2a40: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
2a50: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c  e a particular l
2a60: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
2a70: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
2a80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
2a90: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
2aa0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
2ab0: 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65 20 73  locks, then we s
2ac0: 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 4b 65  et the.** lockKe
2ad0: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
2ae0: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
2af0: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
2b00: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
2b10: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
2b20: 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20 73   tid is always s
2b30: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74 69 64  et to zero.  tid
2b40: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 20   is also.** set 
2b50: 74 6f 20 7a 65 72 6f 20 69 66 20 77 65 20 63 6f  to zero if we co
2b60: 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68  mpile without th
2b70: 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e  reading support.
2b80: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b  .*/.struct lockK
2b90: 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  ey {.  dev_t dev
2ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63  ;       /* Devic
2bb0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
2bc0: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f  o_t ino;       /
2bd0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
2be0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2bf0: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70  UNIX_THREADS.  p
2c00: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
2c10: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72 20  /* Thread ID or 
2c20: 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64 73 20  zero if threads 
2c30: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63  can override eac
2c40: 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65 6e 64 69  h other */.#endi
2c50: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
2c60: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2c70: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2c80: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
2c90: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
2ca0: 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63 68 20 74   inode on each t
2cb0: 68 72 65 61 64 20 77 69 74 68 20 61 20 64 69 66  hread with a dif
2cc0: 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 49  ferent process I
2cd0: 44 2e 20 20 28 54 68 72 65 61 64 73 20 68 61 76  D.  (Threads hav
2ce0: 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70  e.** different p
2cf0: 72 6f 63 65 73 73 20 49 44 73 20 6f 6e 20 6c 69  rocess IDs on li
2d00: 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20 6f 6e 20  nux, but not on 
2d10: 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e 69 78 65  most other unixe
2d20: 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67  s.).**.** A sing
2d30: 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76  le inode can hav
2d40: 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20  e multiple file 
2d50: 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20  descriptors, so 
2d60: 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a 2a 20 73  each OsFile.** s
2d70: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
2d80: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2d90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2da0: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
2db0: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
2dc0: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
2dd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f 73 46 69  e number of OsFi
2de0: 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  les pointing to 
2df0: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f  it..*/.struct lo
2e00: 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  ckInfo {.  struc
2e10: 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79 3b 20 20  t lockKey key;  
2e20: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
2e30: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  y */.  int cnt; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e50: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
2e60: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
2e70: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20  int locktype;   
2e80: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
2e90: 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
2ea0: 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a  RVED_LOCK etc. *
2eb0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ed0: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
2ee0: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
2ef0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
2f00: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2f10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2f20: 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74  ture serves as t
2f30: 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74  he key used.** t
2f40: 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69  o locate a parti
2f50: 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74 20 73 74  cular openCnt st
2f60: 72 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74  ructure given it
2f70: 73 20 69 6e 6f 64 65 2e 20 20 54 68 69 73 0a 2a  s inode.  This.*
2f80: 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  * is the same as
2f90: 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20 65 78 63   the lockKey exc
2fa0: 65 70 74 20 74 68 61 74 20 74 68 65 20 74 68 72  ept that the thr
2fb0: 65 61 64 20 49 44 20 69 73 20 6f 6d 69 74 74 65  ead ID is omitte
2fc0: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f 70 65  d..*/.struct ope
2fd0: 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  nKey {.  dev_t d
2fe0: 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20  ev;   /* Device 
2ff0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f  number */.  ino_
3000: 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64  t ino;   /* Inod
3010: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d 3b 0a 0a  e number */.};..
3020: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3030: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3040: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
3050: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
3060: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
3070: 2e 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72  .  This structur
3080: 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20 6f 66  e keeps track of
3090: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
30a0: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a 2a 2a 20  ocks on that.** 
30b0: 69 6e 6f 64 65 2e 20 20 49 66 20 61 20 63 6c 6f  inode.  If a clo
30c0: 73 65 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  se is attempted 
30d0: 61 67 61 69 6e 73 74 20 61 6e 20 69 6e 6f 64 65  against an inode
30e0: 20 74 68 61 74 20 69 73 20 68 6f 6c 64 69 6e 67   that is holding
30f0: 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63  .** locks, the c
3100: 6c 6f 73 65 20 69 73 20 64 65 66 65 72 72 65 64  lose is deferred
3110: 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73   until all locks
3120: 20 63 6c 65 61 72 20 62 79 20 61 64 64 69 6e 67   clear by adding
3130: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65 73   the.** file des
3140: 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 63 6c  criptor to be cl
3150: 6f 73 65 64 20 74 6f 20 74 68 65 20 70 65 6e 64  osed to the pend
3160: 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ing list..*/.str
3170: 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b 0a 20 20  uct openCnt {.  
3180: 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b  struct openKey k
3190: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  ey;   /* The loo
31a0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
31b0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
31c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
31e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
31f0: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
3200: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3210: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
3220: 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ocks */.  int nP
3230: 65 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 20  ending;         
3240: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 6e  /* Number of pen
3250: 64 69 6e 67 20 63 6c 6f 73 65 28 29 20 6f 70 65  ding close() ope
3260: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
3270: 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20 20 20 20   *aPending;     
3280: 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
3290: 70 61 63 65 20 68 6f 6c 64 69 6e 67 20 66 64 27  pace holding fd'
32a0: 73 20 61 77 61 69 74 69 6e 67 20 61 20 63 6c 6f  s awaiting a clo
32b0: 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  se() */.};../* .
32c0: 2a 2a 20 54 68 65 73 65 20 68 61 73 68 20 74 61  ** These hash ta
32d0: 62 6c 65 20 6d 61 70 73 20 69 6e 6f 64 65 73 20  ble maps inodes 
32e0: 61 6e 64 20 70 72 6f 63 65 73 73 20 49 44 73 20  and process IDs 
32f0: 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e  into lockInfo an
3300: 64 20 6f 70 65 6e 43 6e 74 0a 2a 2a 20 73 74 72  d openCnt.** str
3310: 75 63 74 75 72 65 73 2e 20 20 41 63 63 65 73 73  uctures.  Access
3320: 20 74 6f 20 74 68 65 73 65 20 68 61 73 68 20 74   to these hash t
3330: 61 62 6c 65 73 20 6d 75 73 74 20 62 65 20 70 72  ables must be pr
3340: 6f 74 65 63 74 65 64 20 62 79 20 61 20 6d 75 74  otected by a mut
3350: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48 61  ex..*/.static Ha
3360: 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b 20  sh lockHash = { 
3370: 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41  SQLITE_HASH_BINA
3380: 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  RY, 0, 0, 0, 0, 
3390: 30 20 7d 3b 0a 73 74 61 74 69 63 20 48 61 73 68  0 };.static Hash
33a0: 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b 20 53 51   openHash = { SQ
33b0: 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e 41 52 59  LITE_HASH_BINARY
33c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
33d0: 7d 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  };...#ifdef SQLI
33e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
33f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
3400: 62 6c 65 20 72 65 63 6f 72 64 73 20 77 68 65 74  ble records whet
3410: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
3420: 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ds can override 
3430: 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a 20 6c  each others.** l
3440: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30  ocks..**.**    0
3450: 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64 73 20  :  No.  Threads 
3460: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
3470: 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b  each others lock
3480: 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20 59 65 73  s..**    1:  Yes
3490: 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e 20 6f  .  Threads can o
34a0: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
34b0: 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20  ers locks..**   
34c0: 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20 6b 6e  -1:  We don't kn
34d0: 6f 77 20 79 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  ow yet..*/.stati
34e0: 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65  c int threadsOve
34f0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
3500: 6f 63 6b 73 20 3d 20 2d 31 3b 0a 0a 2f 2a 0a 2a  ocks = -1;../*.*
3510: 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65  * This structure
3520: 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69   holds informati
3530: 6f 6e 20 70 61 73 73 65 64 20 69 6e 74 6f 20 69  on passed into i
3540: 6e 64 69 76 69 64 75 61 6c 20 74 65 73 74 0a 2a  ndividual test.*
3550: 2a 20 74 68 72 65 61 64 73 20 62 79 20 74 68 65  * threads by the
3560: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
3570: 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75  ngBehavior() rou
3580: 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
3590: 74 68 72 65 61 64 54 65 73 74 44 61 74 61 20 7b  threadTestData {
35a0: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
35b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
35c0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
35d0: 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
35e0: 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 54 68   lock;     /* Th
35f0: 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  e locking operat
3600: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ion */.  int res
3610: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
3620: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65  /* Result of the
3630: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
3640: 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66  on */.};..#ifdef
3650: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41   SQLITE_LOCK_TRA
3660: 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f  CE./*.** Print o
3670: 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ut information a
3680: 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  bout all locking
3690: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   operations..**.
36a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
36b0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75  is used for trou
36c0: 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b  bleshooting lock
36d0: 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64  s on multithread
36e0: 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e  ed.** platforms.
36f0: 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70    Enable by comp
3700: 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d  iling with the -
3710: 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41  DSQLITE_LOCK_TRA
3720: 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69  CE.** command-li
3730: 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65  ne option on the
3740: 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73   compiler.  This
3750: 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c   code is normall
3760: 79 0a 2a 2a 20 74 75 72 6e 6e 65 64 20 6f 66 66  y.** turnned off
3770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3780: 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64  lockTrace(int fd
3790: 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74  , int op, struct
37a0: 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68   flock *p){.  ch
37b0: 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54  ar *zOpName, *zT
37c0: 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20  ype;.  int s;.  
37d0: 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a  int savedErrno;.
37e0: 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c    if( op==F_GETL
37f0: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
3800: 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "GETLK";.  }e
3810: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45  lse if( op==F_SE
3820: 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61  TLK ){.    zOpNa
3830: 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20  me = "SETLK";.  
3840: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 66  }else{.    s = f
3850: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
3860: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
3870: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
3880: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
3890: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
38a0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
38b0: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
38c0: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
38d0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
38e0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
38f0: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
3900: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
3910: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
3920: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
3930: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
3940: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
3950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
3960: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
3970: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
3980: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
3990: 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c 28 66 64  ;.  s = fcntl(fd
39a0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
39b0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
39c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
39d0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
39e0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
39f0: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
3a00: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
3a10: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
3a20: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
3a30: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
3a40: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
3a50: 29 3b 0a 20 20 69 66 28 20 73 20 26 26 20 6f 70  );.  if( s && op
3a60: 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d  ==F_SETLK && (p-
3a70: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
3a80: 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46   || p->l_type==F
3a90: 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73  _WRLCK) ){.    s
3aa0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a  truct flock l2;.
3ab0: 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20      l2 = *p;.   
3ac0: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54   fcntl(fd, F_GET
3ad0: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
3ae0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
3af0: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
3b00: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
3b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
3b20: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
3b30: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
3b40: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
3b50: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
3b60: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
3b70: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
3b80: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
3b90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
3ba0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3bb0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
3bc0: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
3bd0: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
3be0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
3bf0: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
3c00: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
3c10: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
3c20: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
3c30: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
3c40: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 64 65   return s;.}.#de
3c50: 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f 63 6b 54  fine fcntl lockT
3c60: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
3c70: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
3c80: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74   */../*.** The t
3c90: 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67  estThreadLocking
3ca0: 42 65 68 61 76 69 6f 72 28 29 20 72 6f 75 74 69  Behavior() routi
3cb0: 6e 65 20 6c 61 75 6e 63 68 65 73 20 74 77 6f 20  ne launches two 
3cc0: 73 65 70 61 72 61 74 65 0a 2a 2a 20 74 68 72 65  separate.** thre
3cd0: 61 64 73 20 6f 6e 20 74 68 69 73 20 72 6f 75 74  ads on this rout
3ce0: 69 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ine.  This routi
3cf0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c  ne attempts to l
3d00: 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65  ock a file.** de
3d10: 73 63 72 69 70 74 6f 72 20 74 68 65 6e 20 72 65  scriptor then re
3d20: 74 75 72 6e 73 2e 20 20 54 68 65 20 73 75 63 63  turns.  The succ
3d30: 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 20 6f  ess or failure o
3d40: 66 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  f that attempt.*
3d50: 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 74 65 73  * allows the tes
3d60: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
3d70: 68 61 76 69 6f 72 28 29 20 70 72 6f 63 65 64 75  havior() procedu
3d80: 72 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a  re to determine.
3d90: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
3da0: 74 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  t threads can ov
3db0: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
3dc0: 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  rs locks..*/.sta
3dd0: 74 69 63 20 76 6f 69 64 20 2a 74 68 72 65 61 64  tic void *thread
3de0: 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76 6f 69 64  LockingTest(void
3df0: 20 2a 70 41 72 67 29 7b 0a 20 20 73 74 72 75 63   *pArg){.  struc
3e00: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
3e10: 20 2a 70 44 61 74 61 20 3d 20 28 73 74 72 75 63   *pData = (struc
3e20: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
3e30: 2a 29 70 41 72 67 3b 0a 20 20 70 44 61 74 61 2d  *)pArg;.  pData-
3e40: 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e 74 6c 28  >result = fcntl(
3e50: 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f 53 45 54  pData->fd, F_SET
3e60: 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c 6f 63 6b  LK, &pData->lock
3e70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 67  );.  return pArg
3e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3e90: 70 72 6f 63 65 64 75 72 65 20 61 74 74 65 6d 70  procedure attemp
3ea0: 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
3eb0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3ec0: 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e 20 6f 76  hreads.** can ov
3ed0: 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68 65  erride each othe
3ee0: 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e 20 73 65  rs locks then se
3ef0: 74 73 20 74 68 65 20 0a 2a 2a 20 74 68 72 65 61  ts the .** threa
3f00: 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74  dsOverrideEachOt
3f10: 68 65 72 73 4c 6f 63 6b 73 20 76 61 72 69 61 62  hersLocks variab
3f20: 6c 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  le appropriately
3f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3f40: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
3f50: 6e 67 42 65 68 61 76 69 6f 72 28 66 64 5f 6f 72  ngBehavior(fd_or
3f60: 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  ig){.  int fd;. 
3f70: 20 73 74 72 75 63 74 20 74 68 72 65 61 64 54 65   struct threadTe
3f80: 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a 20 20 70  stData d[2];.  p
3f90: 74 68 72 65 61 64 5f 74 20 74 5b 32 5d 3b 0a 0a  thread_t t[2];..
3fa0: 20 20 66 64 20 3d 20 64 75 70 28 66 64 5f 6f 72    fd = dup(fd_or
3fb0: 69 67 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20  ig);.  if( fd<0 
3fc0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
3fd0: 65 74 28 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(d, 0, sizeof(
3fe0: 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66 64 20 3d  d));.  d[0].fd =
3ff0: 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b   fd;.  d[0].lock
4000: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
4010: 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c  K;.  d[0].lock.l
4020: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64 5b 30 5d  _len = 1;.  d[0]
4030: 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20  .lock.l_start = 
4040: 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c  0;.  d[0].lock.l
4050: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
4060: 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20 64 5b 30  ET;.  d[1] = d[0
4070: 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63 6b 2e 6c  ];.  d[1].lock.l
4080: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
4090: 0a 20 20 70 74 68 72 65 61 64 5f 63 72 65 61 74  .  pthread_creat
40a0: 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74 68 72 65  e(&t[0], 0, thre
40b0: 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 2c 20 26  adLockingTest, &
40c0: 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72 65 61 64  d[0]);.  pthread
40d0: 5f 63 72 65 61 74 65 28 26 74 5b 31 5d 2c 20 30  _create(&t[1], 0
40e0: 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54  , threadLockingT
40f0: 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a 20 20 70  est, &d[1]);.  p
4100: 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 5b 30 5d  thread_join(t[0]
4110: 2c 20 30 29 3b 0a 20 20 70 74 68 72 65 61 64 5f  , 0);.  pthread_
4120: 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29 3b 0a 20  join(t[1], 0);. 
4130: 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 74 68   close(fd);.  th
4140: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
4150: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 3d 20 20  hOthersLocks =  
4160: 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d 30 20 26  d[0].result==0 &
4170: 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74 3d 3d 30  & d[1].result==0
4180: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
4190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
41a0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  S */../*.** Rele
41b0: 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73  ase a lockInfo s
41c0: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
41d0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
41e0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e   findLockInfo().
41f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4200: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
4210: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
4220: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 70 4c 6f 63 6b  *pLock){.  pLock
4230: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
4240: 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d 30 20 29  pLock->nRef==0 )
4250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
4260: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
4270: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
4280: 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d 3e 6b 65  sizeof(pLock->ke
4290: 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  y), 0);.    sqli
42a0: 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  teFree(pLock);. 
42b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
42c0: 61 73 65 20 61 20 6f 70 65 6e 43 6e 74 20 73 74  ase a openCnt st
42d0: 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73  ructure previous
42e0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ly allocated by 
42f0: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a  findLockInfo()..
4300: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4310: 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73 74  eleaseOpenCnt(st
4320: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
4330: 70 65 6e 29 7b 0a 20 20 70 4f 70 65 6e 2d 3e 6e  pen){.  pOpen->n
4340: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 4f 70  Ref--;.  if( pOp
4350: 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  en->nRef==0 ){. 
4360: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4370: 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68 2c 20  sert(&openHash, 
4380: 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73 69 7a  &pOpen->key, siz
4390: 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65 79 29 2c  eof(pOpen->key),
43a0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46   0);.    sqliteF
43b0: 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ree(pOpen->aPend
43c0: 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
43d0: 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20 7d  Free(pOpen);.  }
43e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
43f0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
4400: 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63 6b 49 6e  r, locate lockIn
4410: 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20 73  fo and openCnt s
4420: 74 72 75 63 74 75 72 65 73 20 74 68 61 74 0a 2a  tructures that.*
4430: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
4440: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4450: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
4460: 6f 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ones if necessar
4470: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
4480: 6e 20 76 61 6c 75 65 73 20 6d 69 67 68 74 20 62  n values might b
4490: 65 20 75 6e 73 65 74 20 69 66 20 61 6e 20 65 72  e unset if an er
44a0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
44b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
44c0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
44d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
44e0: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74  dLockInfo(.  int
44f0: 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20   fd,            
4500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4510: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4520: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
4530: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
4540: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
4550: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
4560: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
4570: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
4580: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
4590: 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a 20 52 65  pOpen      /* Re
45a0: 74 75 72 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74  turn the openCnt
45b0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
45c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
45d0: 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79    struct lockKey
45e0: 20 6b 65 79 31 3b 0a 20 20 73 74 72 75 63 74 20   key1;.  struct 
45f0: 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20  openKey key2;.  
4600: 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
4610: 62 75 66 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f  buf;.  struct lo
4620: 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20  ckInfo *pLock;. 
4630: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
4640: 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66  *pOpen;.  rc = f
4650: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
4660: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
4670: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 6d  ) return 1;..  m
4680: 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30 2c 20  emset(&key1, 0, 
4690: 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b 0a 20  sizeof(key1));. 
46a0: 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74 61 74   key1.dev = stat
46b0: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65  buf.st_dev;.  ke
46c0: 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66  y1.ino = statbuf
46d0: 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65 66 20  .st_ino;.#ifdef 
46e0: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
46f0: 41 44 53 0a 20 20 69 66 28 20 74 68 72 65 61 64  ADS.  if( thread
4700: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
4710: 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a 20 20  ersLocks<0 ){.  
4720: 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b    testThreadLock
4730: 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64 29 3b  ingBehavior(fd);
4740: 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69 64 20  .  }.  key1.tid 
4750: 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64  = threadsOverrid
4760: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
4770: 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64 5f 73   ? 0 : pthread_s
4780: 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  elf();.#endif.  
4790: 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c  memset(&key2, 0,
47a0: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a   sizeof(key2));.
47b0: 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61    key2.dev = sta
47c0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b  tbuf.st_dev;.  k
47d0: 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  ey2.ino = statbu
47e0: 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63  f.st_ino;.  pLoc
47f0: 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b  k = (struct lock
4800: 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48 61 73  Info*)sqlite3Has
4810: 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c  hFind(&lockHash,
4820: 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b   &key1, sizeof(k
4830: 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f  ey1));.  if( pLo
4840: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ck==0 ){.    str
4850: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f  uct lockInfo *pO
4860: 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20  ld;.    pLock = 
4870: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
4880: 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20   sizeof(*pLock) 
4890: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
48a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
48b0: 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
48c0: 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66  exit_findlockinf
48d0: 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f  o;.    }.    pLo
48e0: 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65 79 31 3b 0a  ck->key = key1;.
48f0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 20      pLock->nRef 
4900: 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = 1;.    pLock->
4910: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 4c 6f  cnt = 0;.    pLo
4920: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30  ck->locktype = 0
4930: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
4940: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4950: 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b  lockHash, &pLock
4960: 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65  ->key, sizeof(ke
4970: 79 31 29 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20  y1), pLock);.   
4980: 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a   if( pOld!=0 ){.
4990: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
49a0: 6c 64 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  ld==pLock );.   
49b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c     sqliteFree(pL
49c0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
49d0: 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
49e0: 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f  xit_findlockinfo
49f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
4a00: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66  .    pLock->nRef
4a10: 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63  ++;.  }.  *ppLoc
4a20: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 70 4f 70  k = pLock;.  pOp
4a30: 65 6e 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65  en = (struct ope
4a40: 6e 43 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73  nCnt*)sqlite3Has
4a50: 68 46 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c  hFind(&openHash,
4a60: 20 26 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b   &key2, sizeof(k
4a70: 65 79 32 29 29 3b 0a 20 20 69 66 28 20 70 4f 70  ey2));.  if( pOp
4a80: 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  en==0 ){.    str
4a90: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c  uct openCnt *pOl
4aa0: 64 3b 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 73  d;.    pOpen = s
4ab0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
4ac0: 73 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29  sizeof(*pOpen) )
4ad0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d  ;.    if( pOpen=
4ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  =0 ){.      rele
4af0: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63  aseLockInfo(pLoc
4b00: 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  k);.      rc = 1
4b10: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
4b20: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
4b30: 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 65 6e 2d      }.    pOpen-
4b40: 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20 20  >key = key2;.   
4b50: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20 31   pOpen->nRef = 1
4b60: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  ;.    pOpen->nLo
4b70: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 65  ck = 0;.    pOpe
4b80: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b  n->nPending = 0;
4b90: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e  .    pOpen->aPen
4ba0: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 4f  ding = 0;.    pO
4bb0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
4bc0: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68  Insert(&openHash
4bd0: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73  , &pOpen->key, s
4be0: 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70  izeof(key2), pOp
4bf0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  en);.    if( pOl
4c00: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  d!=0 ){.      as
4c10: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
4c20: 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n );.      sqlit
4c30: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
4c40: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
4c50: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
4c60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
4c70: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
4c80: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 7d 0a 20 20  ckinfo;.    }.  
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 70 65 6e  }else{.    pOpen
4ca0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
4cb0: 2a 70 70 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 3b  *ppOpen = pOpen;
4cc0: 0a 0a 65 78 69 74 5f 66 69 6e 64 6c 6f 63 6b 69  ..exit_findlocki
4cd0: 6e 66 6f 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  nfo:.  return rc
4ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4cf0: 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
4d00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55  .*/.int sqlite3U
4d10: 6e 69 78 44 65 6c 65 74 65 28 63 6f 6e 73 74 20  nixDelete(const 
4d20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
4d30: 7b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65  {.  unlink(zFile
4d40: 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  name);.  return 
4d50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4d60: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
4d70: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
4d80: 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74  e exists..*/.int
4d90: 20 73 71 6c 69 74 65 33 55 6e 69 78 46 69 6c 65   sqlite3UnixFile
4da0: 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  Exists(const cha
4db0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
4dc0: 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 28 7a   return access(z
4dd0: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b  Filename, 0)==0;
4de0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
4df0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
4e00: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
4e10: 65 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69  eUnixFile(unixFi
4e20: 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46 69 6c  le *pInit, OsFil
4e30: 65 20 2a 2a 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a  e **pId);../*.**
4e40: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
4e50: 20 61 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68   a file for both
4e60: 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
4e70: 74 69 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a  ting.  If that.*
4e80: 2a 20 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65  * fails, try ope
4e90: 6e 69 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c  ning it read-onl
4ea0: 79 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  y.  If the file 
4eb0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a  does not exist,.
4ec0: 2a 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ** try to create
4ed0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75   it..**.** On su
4ee0: 63 63 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20  ccess, a handle 
4ef0: 66 6f 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c  for the open fil
4f00: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
4f10: 2a 69 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61  *id.** and *pRea
4f20: 64 6f 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20  donly is set to 
4f30: 30 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  0 if the file wa
4f40: 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  s opened for rea
4f50: 64 69 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74  ding and.** writ
4f60: 69 6e 67 20 6f 72 20 31 20 69 66 20 74 68 65 20  ing or 1 if the 
4f70: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
4f80: 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20  read-only.  The 
4f90: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
4fa0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
4fb0: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
4fc0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
4fd0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e  turns SQLITE_CAN
4fe0: 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73  TOPEN and leaves
4ff0: 0a 2a 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65  .** *id and *pRe
5000: 61 64 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64  adonly unchanged
5010: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5020: 55 6e 69 78 4f 70 65 6e 52 65 61 64 57 72 69 74  UnixOpenReadWrit
5030: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
5040: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73  *zFilename,.  Os
5050: 46 69 6c 65 20 2a 2a 70 49 64 2c 0a 20 20 69 6e  File **pId,.  in
5060: 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a  t *pReadonly.){.
5070: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
5080: 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41 53 48  File f;..  CRASH
5090: 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45 28 73  _TEST_OVERRIDE(s
50a0: 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65 6e 52  qlite3CrashOpenR
50b0: 65 61 64 57 72 69 74 65 2c 20 7a 46 69 6c 65 6e  eadWrite, zFilen
50c0: 61 6d 65 2c 20 70 49 64 2c 20 70 52 65 61 64 6f  ame, pId, pReado
50d0: 6e 6c 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nly);.  assert( 
50e0: 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 66 2e 64  0==*pId );.  f.d
50f0: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 53 45 54  irfd = -1;.  SET
5100: 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b 0a 20  _THREADID(&f);. 
5110: 20 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c   f.h = open(zFil
5120: 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ename, O_RDWR|O_
5130: 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c  CREAT|O_LARGEFIL
5140: 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20  E|O_BINARY,.    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
5170: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5180: 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66 2e  SIONS);.  if( f.
5190: 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49  h<0 ){.#ifdef EI
51a0: 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72  SDIR.    if( err
51b0: 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20  no==EISDIR ){.  
51c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
51d0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
51e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 2e 68  }.#endif.    f.h
51f0: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
5200: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
5210: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
5220: 29 3b 0a 20 20 20 20 69 66 28 20 66 2e 68 3c 30  );.    if( f.h<0
5230: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
5240: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
5250: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52  ; .    }.    *pR
5260: 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadonly = 1;.  }
5270: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 61 64  else{.    *pRead
5280: 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  only = 0;.  }.  
5290: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
52a0: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
52b0: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c 20  ndLockInfo(f.h, 
52c0: 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f 70  &f.pLock, &f.pOp
52d0: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
52e0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
52f0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 6c  if( rc ){.    cl
5300: 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 72 65  ose(f.h);.    re
5310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5320: 4d 3b 0a 20 20 7d 0a 20 20 66 2e 6c 6f 63 6b 74  M;.  }.  f.lockt
5330: 79 70 65 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  ype = 0;.  TRACE
5340: 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  3("OPEN    %-3d 
5350: 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69 6c  %s\n", f.h, zFil
5360: 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  ename);.  return
5370: 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46 69 6c   allocateUnixFil
5380: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 0a  e(&f, pId);.}...
5390: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
53a0: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
53b0: 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
53c0: 63 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72  ccess by this pr
53d0: 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69  ocess..** The fi
53e0: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  le will be opene
53f0: 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69  d for both readi
5400: 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20  ng and writing. 
5410: 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70   To avoid.** a p
5420: 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74  otential securit
5430: 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f  y problem, we do
5440: 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66   not allow the f
5450: 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70  ile to have.** p
5460: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
5470: 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c  d.  Nor do we al
5480: 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20  low the file to 
5490: 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a  be a symbolic.**
54a0: 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   link..**.** If 
54b0: 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c  delFlag is true,
54c0: 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e   then make arran
54d0: 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d  gements to autom
54e0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a  atically delete.
54f0: 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e  ** the file when
5500: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
5510: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
5520: 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
5530: 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20  handle into *id 
5540: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
5550: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  E_OK..**.** On f
5560: 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53  ailure, return S
5570: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a  QLITE_CANTOPEN..
5580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e  */.int sqlite3Un
5590: 69 78 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  ixOpenExclusive(
55a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
55b0: 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  ename, OsFile **
55c0: 70 49 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  pId, int delFlag
55d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
55e0: 6e 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52  nixFile f;..  CR
55f0: 41 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44  ASH_TEST_OVERRID
5600: 45 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70  E(sqlite3CrashOp
5610: 65 6e 45 78 63 6c 75 73 69 76 65 2c 20 7a 46 69  enExclusive, zFi
5620: 6c 65 6e 61 6d 65 2c 20 70 49 64 2c 20 64 65 6c  lename, pId, del
5630: 46 6c 61 67 29 3b 0a 20 20 61 73 73 65 72 74 28  Flag);.  assert(
5640: 20 30 3d 3d 2a 70 49 64 20 29 3b 0a 20 20 69 66   0==*pId );.  if
5650: 28 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61  ( access(zFilena
5660: 6d 65 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  me, 0)==0 ){.   
5670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
5680: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53  ANTOPEN;.  }.  S
5690: 45 54 5f 54 48 52 45 41 44 49 44 28 26 66 29 3b  ET_THREADID(&f);
56a0: 0a 20 20 66 2e 64 69 72 66 64 20 3d 20 2d 31 3b  .  f.dirfd = -1;
56b0: 0a 20 20 66 2e 68 20 3d 20 6f 70 65 6e 28 7a 46  .  f.h = open(zF
56c0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
56d0: 20 20 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c           O_RDWR|
56e0: 4f 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f  O_CREAT|O_EXCL|O
56f0: 5f 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47  _NOFOLLOW|O_LARG
5700: 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a  EFILE|O_BINARY,.
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
5730: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
5740: 3b 0a 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b  ;.  if( f.h<0 ){
5750: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5760: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
5770: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
5780: 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
5790: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e   findLockInfo(f.
57a0: 68 2c 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e  h, &f.pLock, &f.
57b0: 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65  pOpen);.  sqlite
57c0: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
57d0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
57e0: 20 63 6c 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20   close(f.h);.   
57f0: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
5800: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
5810: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5820: 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20  .  f.locktype = 
5830: 30 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67  0;.  if( delFlag
5840: 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a   ){.    unlink(z
5850: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Filename);.  }. 
5860: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 2d 45 58   TRACE3("OPEN-EX
5870: 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 2e 68   %-3d %s\n", f.h
5880: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
5890: 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74 65 55  return allocateU
58a0: 6e 69 78 46 69 6c 65 28 26 66 2c 20 70 49 64 29  nixFile(&f, pId)
58b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
58c0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  pt to open a new
58d0: 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f   file for read-o
58e0: 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a  nly access..**.*
58f0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72  * On success, wr
5900: 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e  ite the file han
5910: 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64  dle into *id and
5920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5930: 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c  K..**.** On fail
5940: 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ure, return SQLI
5950: 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a  TE_CANTOPEN..*/.
5960: 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69 78 4f  int sqlite3UnixO
5970: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73  penReadOnly(cons
5980: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
5990: 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  e, OsFile **pId)
59a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
59b0: 69 78 46 69 6c 65 20 66 3b 0a 0a 20 20 43 52 41  ixFile f;..  CRA
59c0: 53 48 5f 54 45 53 54 5f 4f 56 45 52 52 49 44 45  SH_TEST_OVERRIDE
59d0: 28 73 71 6c 69 74 65 33 43 72 61 73 68 4f 70 65  (sqlite3CrashOpe
59e0: 6e 52 65 61 64 4f 6e 6c 79 2c 20 7a 46 69 6c 65  nReadOnly, zFile
59f0: 6e 61 6d 65 2c 20 70 49 64 2c 20 30 29 3b 0a 20  name, pId, 0);. 
5a00: 20 61 73 73 65 72 74 28 20 30 3d 3d 2a 70 49 64   assert( 0==*pId
5a10: 20 29 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44   );.  SET_THREAD
5a20: 49 44 28 26 66 29 3b 0a 20 20 66 2e 64 69 72 66  ID(&f);.  f.dirf
5a30: 64 20 3d 20 2d 31 3b 0a 20 20 66 2e 68 20 3d 20  d = -1;.  f.h = 
5a40: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
5a50: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
5a60: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
5a70: 20 20 69 66 28 20 66 2e 68 3c 30 20 29 7b 0a 20    if( f.h<0 ){. 
5a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5a90: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
5aa0: 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
5ab0: 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66  utex();.  rc = f
5ac0: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 66 2e 68 2c  indLockInfo(f.h,
5ad0: 20 26 66 2e 70 4c 6f 63 6b 2c 20 26 66 2e 70 4f   &f.pLock, &f.pO
5ae0: 70 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  pen);.  sqlite3O
5af0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
5b00: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
5b10: 6c 6f 73 65 28 66 2e 68 29 3b 0a 20 20 20 20 72  lose(f.h);.    r
5b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5b30: 45 4d 3b 0a 20 20 7d 0a 20 20 66 2e 6c 6f 63 6b  EM;.  }.  f.lock
5b40: 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 52 41 43  type = 0;.  TRAC
5b50: 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64  E3("OPEN-RO %-3d
5b60: 20 25 73 5c 6e 22 2c 20 66 2e 68 2c 20 7a 46 69   %s\n", f.h, zFi
5b70: 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 72 65 74 75  lename);..  retu
5b80: 72 6e 20 61 6c 6c 6f 63 61 74 65 55 6e 69 78 46  rn allocateUnixF
5b90: 69 6c 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a  ile(&f, pId);.}.
5ba0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
5bb0: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65  o open a file de
5bc0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
5bd0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
5be0: 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69  contains a.** fi
5bf0: 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64  le.  This file d
5c00: 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65  escriptor can be
5c10: 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29   used to fsync()
5c20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a   the directory.*
5c30: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  * in order to ma
5c40: 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61  ke sure the crea
5c50: 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69  tion of a new fi
5c60: 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77  le is actually w
5c70: 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73  ritten.** to dis
5c80: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
5c90: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65  utine is only me
5ca0: 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69  aningful for Uni
5cb0: 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f  x.  It is a no-o
5cc0: 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f  p under.** windo
5cd0: 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73  ws since windows
5ce0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
5cf0: 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a  t hard links..**
5d00: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
5d10: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70  a handle for a p
5d20: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66  reviously open f
5d30: 69 6c 65 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a  ile at *id is.**
5d40: 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
5d50: 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72 79 20  e new directory 
5d60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5d70: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
5d80: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
5d90: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
5da0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
5db0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54  urns SQLITE_CANT
5dc0: 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a  OPEN and leaves.
5dd0: 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67 65 64  ** *id unchanged
5de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5df0: 75 6e 69 78 4f 70 65 6e 44 69 72 65 63 74 6f 72  unixOpenDirector
5e00: 79 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c  y(.  OsFile *id,
5e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5e20: 44 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 75 6e 69  Dirname.){.  uni
5e30: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
5e40: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
5e50: 69 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( pFile==0 ){.
5e60: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 70      /* Do not op
5e70: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  en the directory
5e80: 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   if the correspo
5e90: 6e 64 69 6e 67 20 66 69 6c 65 20 69 73 20 6e 6f  nding file is no
5ea0: 74 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  t already.    **
5eb0: 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 72 65   open. */.    re
5ec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
5ed0: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f  OPEN;.  }.  SET_
5ee0: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 3b  THREADID(pFile);
5ef0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
5f00: 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 70  ->dirfd<0 );.  p
5f10: 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 6f 70  File->dirfd = op
5f20: 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
5f30: 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
5f40: 30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  0);.  if( pFile-
5f50: 3e 64 69 72 66 64 3c 30 20 29 7b 0a 20 20 20 20  >dirfd<0 ){.    
5f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
5f70: 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54  NTOPEN; .  }.  T
5f80: 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20 25  RACE3("OPENDIR %
5f90: 2d 33 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  -3d %s\n", pFile
5fa0: 2d 3e 64 69 72 66 64 2c 20 7a 44 69 72 6e 61 6d  ->dirfd, zDirnam
5fb0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
5fc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5fd0: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
5fe0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
5ff0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
6000: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
6010: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
6020: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
6030: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
6040: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
6050: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
6060: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 68 61 72 20   files..*/.char 
6070: 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  *sqlite3_temp_di
6080: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a  rectory = 0;../*
6090: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
60a0: 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
60b0: 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
60c0: 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
60d0: 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74  gh to.** hold at
60e0: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
60f0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63 68 61 72  MPNAME_SIZE char
6100: 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  acters..*/.int s
6110: 71 6c 69 74 65 33 55 6e 69 78 54 65 6d 70 46 69  qlite3UnixTempFi
6120: 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75  leName(char *zBu
6130: 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
6140: 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
6150: 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
6160: 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
6170: 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
6180: 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
6190: 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74    ".",.  };.  st
61a0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
61b0: 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
61c0: 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
61d0: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
61e0: 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
61f0: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
6200: 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
6210: 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c  56789";.  int i,
6220: 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   j;.  struct sta
6230: 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
6240: 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b  har *zDir = ".";
6250: 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73  .  azDirs[0] = s
6260: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
6270: 63 74 6f 72 79 3b 0a 20 20 66 6f 72 28 69 3d 30  ctory;.  for(i=0
6280: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
6290: 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
62a0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
62b0: 69 66 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30  if( azDirs[i]==0
62c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
62d0: 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73   if( stat(azDirs
62e0: 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  [i], &buf) ) con
62f0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
6300: 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
6310: 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
6320: 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
6330: 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29  azDirs[i], 07) )
6340: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
6350: 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
6360: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
6370: 20 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74    do{.    sprint
6380: 66 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d  f(zBuf, "%s/"TEM
6390: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
63a0: 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  Dir);.    j = st
63b0: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
63c0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
63d0: 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
63e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
63f0: 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
6400: 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
6410: 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
6420: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
6430: 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
6440: 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
6450: 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
6460: 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63  0;.  }while( acc
6470: 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
6480: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6490: 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
64a0: 43 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76  Check that a giv
64b0: 65 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61  en pathname is a
64c0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69   directory and i
64d0: 73 20 77 72 69 74 61 62 6c 65 20 0a 2a 2a 0a 2a  s writable .**.*
64e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
64f0: 78 49 73 44 69 72 57 72 69 74 61 62 6c 65 28 63  xIsDirWritable(c
6500: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 6e  har *zBuf){.#ifn
6510: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6520: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20 20  PAGER_PRAGMAS.  
6530: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
6540: 0a 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29  .  if( zBuf==0 )
6550: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6560: 20 7a 42 75 66 5b 30 5d 3d 3d 30 20 29 20 72 65   zBuf[0]==0 ) re
6570: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74  turn 0;.  if( st
6580: 61 74 28 7a 42 75 66 2c 20 26 62 75 66 29 20 29  at(zBuf, &buf) )
6590: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
65a0: 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
65b0: 5f 6d 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  _mode) ) return 
65c0: 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  0;.  if( access(
65d0: 7a 42 75 66 2c 20 30 37 29 20 29 20 72 65 74 75  zBuf, 07) ) retu
65e0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  rn 0;.#endif /* 
65f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
6600: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 20 20 72  R_PRAGMAS */.  r
6610: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
6620: 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
6630: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
6640: 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
6650: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
6660: 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
6670: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
6680: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
6690: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
66a0: 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
66b0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
66c0: 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76  ad(OsFile *id, v
66d0: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61  oid *pBuf, int a
66e0: 6d 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  mt){.  int got;.
66f0: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
6700: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
6710: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
6720: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
6730: 20 20 67 6f 74 20 3d 20 72 65 61 64 28 28 28 75    got = read(((u
6740: 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
6750: 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 54   pBuf, amt);.  T
6760: 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43  IMER_END;.  TRAC
6770: 45 35 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E5("READ    %-3d
6780: 20 25 35 64 20 25 37 64 20 25 64 5c 6e 22 2c 20   %5d %7d %d\n", 
6790: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
67a0: 3e 68 2c 20 67 6f 74 2c 0a 20 20 20 20 20 20 20  >h, got,.       
67b0: 20 20 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49     last_page, TI
67c0: 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20  MER_ELAPSED);.  
67d0: 53 45 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66  SEEK(0);.  /* if
67e0: 28 20 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20  ( got<0 ) got = 
67f0: 30 3b 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d  0; */.  if( got=
6800: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
6810: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6820: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6830: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
6840: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69    }.}../*.** Wri
6850: 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
6860: 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
6870: 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
6880: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
6890: 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
68a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
68b0: 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
68c0: 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
68d0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73  OsFile *id, cons
68e0: 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
68f0: 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20 77 72  t amt){.  int wr
6900: 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
6910: 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
6920: 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 53 69  t( amt>0 );.  Si
6930: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
6940: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53  LITE_IOERR);.  S
6950: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
6960: 72 72 6f 72 3b 0a 20 20 54 49 4d 45 52 5f 53 54  rror;.  TIMER_ST
6970: 41 52 54 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d  ART;.  while( am
6980: 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
6990: 77 72 69 74 65 28 28 28 75 6e 69 78 46 69 6c 65  write(((unixFile
69a0: 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20  *)id)->h, pBuf, 
69b0: 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61  amt))>0 ){.    a
69c0: 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20  mt -= wrote;.   
69d0: 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
69e0: 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
69f0: 20 7d 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a   }.  TIMER_END;.
6a00: 20 20 54 52 41 43 45 35 28 22 57 52 49 54 45 20    TRACE5("WRITE 
6a10: 20 20 25 2d 33 64 20 25 35 64 20 25 37 64 20 25    %-3d %5d %7d %
6a20: 64 5c 6e 22 2c 20 28 28 75 6e 69 78 46 69 6c 65  d\n", ((unixFile
6a30: 2a 29 69 64 29 2d 3e 68 2c 20 77 72 6f 74 65 2c  *)id)->h, wrote,
6a40: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 5f  .          last_
6a50: 70 61 67 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50  page, TIMER_ELAP
6a60: 53 45 44 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  SED);.  SEEK(0);
6a70: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
6a80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6a90: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
6aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
6ac0: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
6ad0: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
6ae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
6af0: 69 78 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69  ixSeek(OsFile *i
6b00: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b 0a  d, i64 offset){.
6b10: 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
6b20: 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30    SEEK(offset/10
6b30: 32 34 20 2b 20 31 29 3b 0a 23 69 66 64 65 66 20  24 + 1);.#ifdef 
6b40: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
6b50: 28 20 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c  ( offset ) Simul
6b60: 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
6b70: 0a 23 65 6e 64 69 66 0a 20 20 6c 73 65 65 6b 28  .#endif.  lseek(
6b80: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
6b90: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
6ba0: 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  _SET);.  return 
6bb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
6bc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
6bd0: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
6be0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
6bf0: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
6c00: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
6c10: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
6c20: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
6c30: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
6c40: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
6c50: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
6c60: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
6c70: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
6c80: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
6c90: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
6ca0: 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  ./*.** Use the f
6cb0: 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f  datasync() API o
6cc0: 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f  nly if the HAVE_
6cd0: 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20  FDATASYNC macro 
6ce0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f  is defined..** O
6cf0: 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79  therwise use fsy
6d00: 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63  nc() in its plac
6d10: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41  e..*/.#ifndef HA
6d20: 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
6d30: 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
6d40: 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 0a 2f  fsync.#endif.../
6d50: 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
6d60: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
6d70: 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
6d80: 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
6d90: 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
6da0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6db0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
6dc0: 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
6dd0: 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
6de0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
6df0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
6e00: 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
6e10: 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
6e20: 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
6e30: 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
6e40: 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
6e50: 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
6e60: 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
6e70: 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
6e80: 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
6e90: 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
6ea0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
6eb0: 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
6ec0: 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
6ed0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
6ee0: 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
6ef0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
6f00: 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
6f10: 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
6f20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
6f30: 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
6f40: 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
6f50: 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
6f60: 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
6f70: 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rc;..  /* Record
6f80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
6f90: 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
6fa0: 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
6fb0: 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
6fc0: 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
6fd0: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
6fe0: 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
6ff0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
7000: 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
7010: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
7020: 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
7030: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7040: 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
7050: 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
7060: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
7070: 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
7080: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
7090: 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
70a0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
70b0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
70c0: 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
70d0: 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
70e0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
70f0: 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
7100: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
7110: 65 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  e..#ifdef F_FULL
7120: 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
7130: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
7140: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
7150: 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
7160: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
7170: 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
7180: 20 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64   FULLSYNC failed
7190: 2c 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f  , try to do a no
71a0: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a  rmal fsync() */.
71b0: 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
71c0: 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
71d0: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
71e0: 28 46 5f 46 55 4c 4c 53 59 4e 43 29 20 2a 2f 0a  (F_FULLSYNC) */.
71f0: 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29    if( dataOnly )
7200: 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61  {.    rc = fdata
7210: 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73  sync(fd);.  }els
7220: 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  e{.    rc = fsyn
7230: 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
7240: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 46 5f 46  f /* defined(F_F
7250: 55 4c 4c 46 53 59 4e 43 29 20 2a 2f 0a 23 65 6e  ULLFSYNC) */.#en
7260: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
7270: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a  QLITE_NO_SYNC) *
7280: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
7290: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
72a0: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
72b0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
72c0: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
72d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
72e0: 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
72f0: 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
7300: 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
7310: 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
7320: 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
7330: 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
7340: 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
7350: 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
7360: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
7370: 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
7380: 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
7390: 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
73a0: 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
73b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
73c0: 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
73d0: 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
73e0: 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
73f0: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
7400: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
7410: 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
7420: 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
7430: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
7440: 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
7450: 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
7460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
7470: 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
7480: 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
7490: 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
74a0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
74b0: 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
74c0: 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
74d0: 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
74e0: 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
74f0: 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
7500: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
7510: 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
7520: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7530: 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
7540: 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
7550: 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
7560: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
7570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7580: 75 6e 69 78 53 79 6e 63 28 4f 73 46 69 6c 65 20  unixSync(OsFile 
7590: 2a 69 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c  *id, int dataOnl
75a0: 79 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  y){.  unixFile *
75b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
75c0: 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)id;.  assert(
75d0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
75e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
75f0: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41  TE_IOERR);.  TRA
7600: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
7610: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b  d\n", pFile->h);
7620: 0a 20 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e  .  if( full_fsyn
7630: 63 28 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  c(pFile->h, pFil
7640: 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 64 61 74  e->fullSync, dat
7650: 61 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65  aOnly) ){.    re
7660: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7670: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  R;.  }.  if( pFi
7680: 6c 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a  le->dirfd>=0 ){.
7690: 20 20 20 20 54 52 41 43 45 32 28 22 44 49 52 53      TRACE2("DIRS
76a0: 59 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69  YNC %-3d\n", pFi
76b0: 6c 65 2d 3e 64 69 72 66 64 29 3b 0a 23 69 66 6e  le->dirfd);.#ifn
76c0: 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
76d0: 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20 69  LE_DIRSYNC.    i
76e0: 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46  f( full_fsync(pF
76f0: 69 6c 65 2d 3e 64 69 72 66 64 2c 20 70 46 69 6c  ile->dirfd, pFil
7700: 65 2d 3e 66 75 6c 6c 53 79 6e 63 2c 20 30 29 20  e->fullSync, 0) 
7710: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7720: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
7730: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7740: 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69   close(pFile->di
7750: 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e  rfd);  /* Only n
7760: 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65  eed to sync once
7770: 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  , so close the d
7780: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
7790: 70 46 69 6c 65 2d 3e 64 69 72 66 64 20 3d 20 2d  pFile->dirfd = -
77a0: 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65  1;    /* when we
77b0: 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20   are done. */.  
77c0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
77d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
77e0: 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
77f0: 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73  y zDirname. This
7800: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f   is a no-op on o
7810: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
7820: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55   other.** than U
7830: 4e 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  NIX..**.** This 
7840: 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
7850: 73 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20  sure the master 
7860: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
7870: 20 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c   truely been del
7880: 65 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d  eted.** before m
7890: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
78a0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
78b0: 6e 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d  nals on a multi-
78c0: 64 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e  database commit.
78d0: 0a 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53  .** The F_FULLFS
78e0: 59 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f  YNC option is no
78f0: 74 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a  t needed here..*
7900: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 6e 69  /.int sqlite3Uni
7910: 78 53 79 6e 63 44 69 72 65 63 74 6f 72 79 28 63  xSyncDirectory(c
7920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
7930: 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
7940: 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53  ITE_DISABLE_DIRS
7950: 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  YNC.  return SQL
7960: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
7970: 69 6e 74 20 66 64 3b 0a 20 20 69 6e 74 20 72 3b  int fd;.  int r;
7980: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
7990: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
79a0: 3b 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44  ;.  fd = open(zD
79b0: 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
79c0: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  |O_BINARY, 0);. 
79d0: 20 54 52 41 43 45 33 28 22 44 49 52 53 59 4e 43   TRACE3("DIRSYNC
79e0: 20 25 2d 33 64 20 28 25 73 29 5c 6e 22 2c 20 66   %-3d (%s)\n", f
79f0: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20  d, zDirname);.  
7a00: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
7a10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
7a20: 4e 54 4f 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 72  NTOPEN; .  }.  r
7a30: 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
7a40: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 72 65 74  close(fd);.  ret
7a50: 75 72 6e 20 28 28 72 3d 3d 30 29 3f 53 51 4c 49  urn ((r==0)?SQLI
7a60: 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f 49 4f 45  TE_OK:SQLITE_IOE
7a70: 52 52 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  RR);.#endif.}../
7a80: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
7a90: 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
7aa0: 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
7ab0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
7ac0: 78 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c 65  xTruncate(OsFile
7ad0: 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
7ae0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  {.  assert( id )
7af0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
7b00: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
7b10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 72 75  );.  return ftru
7b20: 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c 65  ncate(((unixFile
7b30: 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 29  *)id)->h, nByte)
7b40: 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ==0 ? SQLITE_OK 
7b50: 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  : SQLITE_IOERR;.
7b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
7b70: 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
7b80: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
7b90: 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
7ba0: 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
7bb0: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
7bc0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 73 74 72  4 *pSize){.  str
7bd0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
7be0: 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
7bf0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
7c00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
7c10: 20 69 66 28 20 66 73 74 61 74 28 28 28 75 6e 69   if( fstat(((uni
7c20: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
7c30: 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  buf)!=0 ){.    r
7c40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7c50: 52 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  RR;.  }.  *pSize
7c60: 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
7c70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
7c90: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
7ca0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
7cb0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
7cc0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
7cd0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
7ce0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
7cf0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
7d00: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
7d10: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
7d20: 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ero.  If the fil
7d30: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72  e is unlocked or
7d40: 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52   holds only SHAR
7d50: 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a  ED locks, then.*
7d60: 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  * return zero..*
7d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
7d80: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
7d90: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  ck(OsFile *id){.
7da0: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 75    int r = 0;.  u
7db0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
7dc0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
7de0: 20 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b 5f   );.  if( CHECK_
7df0: 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20  THREADID(pFile) 
7e00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7e10: 4d 49 53 55 53 45 3b 0a 20 20 73 71 6c 69 74 65  MISUSE;.  sqlite
7e20: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
7e30: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
7e40: 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61 72  e->pLock is shar
7e50: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
7e60: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
7e70: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
7e80: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
7e90: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
7ea0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
7eb0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  Lock->locktype>S
7ec0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
7ed0: 20 20 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20    r = 1;.  }..  
7ee0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
7ef0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
7f00: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
7f10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 20 29  .  */.  if( !r )
7f20: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
7f30: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
7f40: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
7f50: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
7f60: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
7f70: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
7f80: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
7f90: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
7fa0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e 74  _WRLCK;.    fcnt
7fb0: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45  l(pFile->h, F_GE
7fc0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20  TLK, &lock);.   
7fd0: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
7fe0: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
7ff0: 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a     r = 1;.    }.
8000: 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
8010: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
8020: 20 20 54 52 41 43 45 33 28 22 54 45 53 54 20 57    TRACE3("TEST W
8030: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e 22 2c  R-LOCK %d %d\n",
8040: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 29 3b 0a 0a   pFile->h, r);..
8050: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 23    return r;.}..#
8060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8070: 55 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  UG./*.** Helper 
8080: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69  function for pri
8090: 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20  nting out trace 
80a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
80b0: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69   debugging.** bi
80c0: 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74  naries. This ret
80d0: 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20  urns the string 
80e0: 72 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66  represetation of
80f0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a   the supplied.**
8100: 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79   integer lock-ty
8110: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  pe..*/.static co
8120: 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 74 79  nst char *lockty
8130: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
8140: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
8150: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
8160: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
8170: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
8180: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
8190: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
81a0: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
81b0: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
81c0: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
81d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
81e0: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
81f0: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
8200: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
8210: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
8220: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
8230: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
8240: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
8250: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
8260: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
8270: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
8280: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
8290: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
82a0: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
82b0: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
82c0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
82d0: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
82e0: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
82f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
8300: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
8310: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
8320: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
8330: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
8340: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
8350: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
8360: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
8370: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
8380: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
8390: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
83a0: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
83b0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
83c0: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
83d0: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
83e0: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
83f0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
8400: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
8410: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
8420: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
8430: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
8440: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
8450: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
8460: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
8470: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
8480: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
8490: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
84a0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
84b0: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
84c0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
84d0: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
84e0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
84f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8500: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
8510: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
8520: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
8530: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
8540: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
8550: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
8560: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
8570: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
8580: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f  t locktype){.  /
8590: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
85a0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
85b0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
85c0: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
85d0: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
85e0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
85f0: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
8600: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
8610: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
8620: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
8630: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
8640: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
8650: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
8660: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
8670: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
8680: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
8690: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
86a0: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
86b0: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
86c0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
86d0: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
86e0: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
86f0: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
8700: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
8710: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
8720: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
8730: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
8740: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
8750: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
8760: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
8770: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
8780: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
8790: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
87a0: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
87b0: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
87c0: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
87d0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
87e0: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
87f0: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
8800: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
8810: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
8820: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
8830: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
8840: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
8850: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
8860: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
8870: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
8880: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
8890: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
88a0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
88b0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
88c0: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
88d0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
88e0: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
88f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
8900: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
8910: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
8920: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
8930: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
8940: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
8950: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
8960: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
8970: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
8980: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
8990: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
89a0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
89b0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
89c0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
89d0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
89e0: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
89f0: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
8a00: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
8a10: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
8a20: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
8a30: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
8a40: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
8a50: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
8a60: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
8a70: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
8a80: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
8a90: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
8aa0: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
8ab0: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
8ac0: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
8ad0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
8ae0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
8af0: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
8b00: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
8b10: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
8b20: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
8b30: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
8b40: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
8b50: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
8b60: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
8b70: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
8b80: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
8b90: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
8ba0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
8bb0: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
8bc0: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
8bd0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
8be0: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
8bf0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
8c00: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
8c10: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
8c20: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
8c30: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
8c40: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
8c50: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
8c60: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
8c70: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
8c80: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
8c90: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
8ca0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
8cb0: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
8cc0: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
8cd0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
8ce0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
8cf0: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
8d00: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
8d10: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
8d20: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
8d30: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
8d40: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
8d50: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
8d60: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
8d70: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
8d80: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
8d90: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
8da0: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
8db0: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
8dc0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
8dd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8de0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
8df0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
8e00: 64 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  d;.  struct lock
8e10: 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20 3d 20 70 46  Info *pLock = pF
8e20: 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73 74  ile->pLock;.  st
8e30: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
8e40: 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73 73  .  int s;..  ass
8e50: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
8e60: 54 52 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20  TRACE7("LOCK    
8e70: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
8e80: 25 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70  %d) pid=%d\n", p
8e90: 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 6c  File->h,.      l
8ea0: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
8eb0: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
8ec0: 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  ame(pFile->lockt
8ed0: 79 70 65 29 2c 0a 20 20 20 20 20 20 6c 6f 63 6b  ype),.      lock
8ee0: 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b 2d 3e  typeName(pLock->
8ef0: 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f 63 6b  locktype), pLock
8f00: 2d 3e 63 6e 74 20 2c 20 67 65 74 70 69 64 28 29  ->cnt , getpid()
8f10: 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b 5f 54  );.  if( CHECK_T
8f20: 48 52 45 41 44 49 44 28 70 46 69 6c 65 29 20 29  HREADID(pFile) )
8f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
8f40: 49 53 55 53 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  ISUSE;..  /* If 
8f50: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
8f60: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
8f70: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
8f80: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
8f90: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
8fa0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
8fb0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
8fc0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
8fd0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
8fe0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
8ff0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
9000: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
9010: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
9020: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 54 52  cktype ){.    TR
9030: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
9040: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
9050: 68 65 6c 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  held)\n", pFile-
9060: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
9070: 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63  locktypeName(loc
9080: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 72 65 74  ktype));.    ret
9090: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
90a0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
90b0: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
90c0: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
90d0: 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
90e0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
90f0: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
9100: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9110: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9120: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
9130: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
9140: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
9150: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
9160: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
9170: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
9180: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
9190: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
91a0: 73 65 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20  se pFile->pLock 
91b0: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
91c0: 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
91d0: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
91e0: 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  tex();..  /* If 
91f0: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
9200: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
9210: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
9220: 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a 0a 20 20  erent OsFile*.  
9230: 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
9240: 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
9250: 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
9260: 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
9270: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 6c 6f 63   if( (pFile->loc
9280: 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f  ktype!=pLock->lo
9290: 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20  cktype && .     
92a0: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
92b0: 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
92c0: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e  OCK || locktype>
92d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
92e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
92f0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
9300: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
9310: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
9320: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
9330: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
9340: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
9350: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
9360: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
9370: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
9380: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
9390: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
93a0: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
93b0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
93c0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
93d0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
93e0: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
93f0: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
9400: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f  OCK || pLock->lo
9410: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
9420: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
9430: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
9440: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9450: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
9460: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b  ->locktype==0 );
9470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
9480: 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20  ck->cnt>0 );.   
9490: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
94a0: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
94b0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b      pLock->cnt++
94c0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70  ;.    pFile->pOp
94d0: 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  en->nLock++;.   
94e0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
94f0: 20 20 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    }..  lock.l_le
9500: 6e 20 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e  n = 1L;..  lock.
9510: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
9520: 53 45 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e  SET;..  /* A PEN
9530: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
9540: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
9550: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
9560: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
9570: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
9580: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
9590: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
95a0: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
95b0: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
95c0: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
95d0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
95e0: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
95f0: 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45   || (locktype==E
9600: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
9610: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
9620: 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
9630: 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
9640: 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79 70 65 3d  ype = (locktype=
9650: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52  =SHARED_LOCK?F_R
9660: 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20  DLCK:F_WRLCK);. 
9670: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
9680: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
9690: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46      s = fcntl(pF
96a0: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
96b0: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
96c0: 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   s ){.      rc =
96d0: 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29   (errno==EINVAL)
96e0: 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20   ? SQLITE_NOLFS 
96f0: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
9700: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
9710: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
9720: 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
9730: 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
9740: 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
9750: 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
9760: 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
9770: 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
9780: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
9790: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
97a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
97b0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
97c0: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 63  assert( pLock->c
97d0: 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nt==0 );.    ass
97e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ert( pLock->lock
97f0: 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  type==0 );..    
9800: 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
9810: 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
9820: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
9830: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
9840: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
9850: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 73  ARED_SIZE;.    s
9860: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
9870: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
9880: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  k);..    /* Drop
9890: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
98a0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
98b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
98c0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
98d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
98e0: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
98f0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
9900: 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 70 46      if( fcntl(pF
9910: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
9920: 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20   &lock)!=0 ){.  
9930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9940: 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20  IOERR;  /* This 
9950: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
9960: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74  pen */.      got
9970: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
9980: 7d 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20  }.    if( s ){. 
9990: 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f       rc = (errno
99a0: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
99b0: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
99c0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
99d0: 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
99e0: 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  locktype = SHARE
99f0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 46  D_LOCK;.      pF
9a00: 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  ile->pOpen->nLoc
9a10: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  k++;.      pLock
9a20: 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ->cnt = 1;.    }
9a30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
9a40: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
9a50: 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e  _LOCK && pLock->
9a60: 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  cnt>1 ){.    /* 
9a70: 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
9a80: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
9a90: 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
9aa0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
9ab0: 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65     ** same proce
9ac0: 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64  ss is still hold
9ad0: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
9ae0: 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  k. */.    rc = S
9af0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65  QLITE_BUSY;.  }e
9b00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
9b10: 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20  request was for 
9b20: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
9b30: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49  CLUSIVE lock.  I
9b40: 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75  t is.    ** assu
9b50: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
9b60: 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72  s a SHARED or gr
9b70: 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
9b80: 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c  e file.    ** al
9b90: 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
9ba0: 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
9bb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
9bc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9bd0: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 73  = F_WRLCK;.    s
9be0: 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70 65 20  witch( locktype 
9bf0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 52 45  ){.      case RE
9c00: 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20  SERVED_LOCK:.   
9c10: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
9c20: 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54  t = RESERVED_BYT
9c30: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
9c40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 58 43  ;.      case EXC
9c50: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20  LUSIVE_LOCK:.   
9c60: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
9c70: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
9c80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
9c90: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
9ca0: 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ZE;.        brea
9cb0: 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
9cc0: 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  :.        assert
9cd0: 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (0);.    }.    s
9ce0: 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   = fcntl(pFile->
9cf0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
9d00: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b  k);.    if( s ){
9d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
9d20: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
9d30: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
9d40: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
9d50: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d    }.  .  if( rc=
9d60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d70: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
9d80: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
9d90: 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
9da0: 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
9db0: 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79  }else if( lockty
9dc0: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
9dd0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
9de0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
9df0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  ING_LOCK;.    pL
9e00: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
9e10: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
9e20: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73  }..end_lock:.  s
9e30: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
9e40: 65 78 28 29 3b 0a 20 20 54 52 41 43 45 34 28 22  ex();.  TRACE4("
9e50: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
9e60: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
9e70: 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b  ocktypeName(lock
9e80: 74 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63  type), .      rc
9e90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
9ea0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a  k" : "failed");.
9eb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9ec0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
9ed0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
9ee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9ef0: 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
9f00: 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
9f10: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
9f20: 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
9f30: 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
9f40: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
9f50: 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
9f60: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
9f70: 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
9f80: 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
9f90: 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
9fa0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9fb0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
9fc0: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
9fd0: 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
9fe0: 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
9ff0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
a000: 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
a010: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
a020: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
a030: 52 45 44 5f 4c 4f 43 4b 2c 20 74 68 69 73 20 72  RED_LOCK, this r
a040: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
a050: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a060: 45 52 52 20 69 6e 73 74 65 61 64 20 6f 66 20 53  ERR instead of S
a070: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
a080: 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
a090: 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  ck(OsFile *id, i
a0a0: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
a0b0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
a0c0: 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74  *pLock;.  struct
a0d0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
a0e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a0f0: 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
a100: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
a110: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
a120: 20 70 46 69 6c 65 20 29 3b 0a 20 20 54 52 41 43   pFile );.  TRAC
a130: 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E7("UNLOCK  %d %
a140: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
a150: 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
a160: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
a170: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
a180: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
a190: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  ck->locktype, pF
a1a0: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c  ile->pLock->cnt,
a1b0: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 66   getpid());.  if
a1c0: 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44  ( CHECK_THREADID
a1d0: 28 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e  (pFile) ) return
a1e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
a1f0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
a200: 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
a210: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
a220: 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63 6b 74  >locktype<=lockt
a230: 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
a240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a250: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
a260: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f 63  rMutex();.  pLoc
a270: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
a280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63  ;.  assert( pLoc
a290: 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69  k->cnt!=0 );.  i
a2a0: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
a2b0: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
a2c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
a2d0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 70  ock->locktype==p
a2e0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
a2f0: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
a300: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a310: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
a320: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
a330: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
a340: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
a350: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
a360: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
a370: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
a380: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
a390: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  E;.      if( fcn
a3a0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
a3b0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20  ETLK, &lock)!=0 
a3c0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
a3d0: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
a3e0: 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20  happen */.      
a3f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
a400: 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ERR;.      }.   
a410: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
a420: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
a430: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
a440: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
a450: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
a460: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
a470: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
a480: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
a490: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
a4a0: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
a4b0: 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  if( fcntl(pFile-
a4c0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
a4d0: 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ck)==0 ){.      
a4e0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
a4f0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
a500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
a520: 52 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75  R;  /* This shou
a530: 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  ld never happen 
a540: 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  */.    }.  }.  i
a550: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
a560: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 74 72 75  LOCK ){.    stru
a570: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
a580: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  n;..    /* Decre
a590: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
a5a0: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
a5b0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
a5c0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
a5d0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
a5e0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
a5f0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
a600: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
a610: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
a620: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 6f  ..    */.    pLo
a630: 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 69  ck->cnt--;.    i
a640: 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30  f( pLock->cnt==0
a650: 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c   ){.      lock.l
a660: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
a670: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  .      lock.l_wh
a680: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a690: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
a6a0: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
a6b0: 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28   = 0L;.      if(
a6c0: 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c   fcntl(pFile->h,
a6d0: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
a6e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a6f0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
a700: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
a710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
a720: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
a730: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
a740: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
a750: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
a760: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
a770: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
a780: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
a790: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
a7a0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
a7b0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
a7c0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
a7d0: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
a7e0: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
a7f0: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
a800: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
a810: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
a820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65  .    */.    pOpe
a830: 6e 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e  n = pFile->pOpen
a840: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  ;.    pOpen->nLo
a850: 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ck--;.    assert
a860: 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d  ( pOpen->nLock>=
a870: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  0 );.    if( pOp
a880: 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20  en->nLock==0 && 
a890: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e  pOpen->nPending>
a8a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
a8b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a8c0: 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69   i<pOpen->nPendi
a8d0: 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ng; i++){.      
a8e0: 20 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61    close(pOpen->a
a8f0: 50 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20  Pending[i]);.   
a900: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a910: 65 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65  eFree(pOpen->aPe
a920: 6e 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f  nding);.      pO
a930: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
a940: 30 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e  0;.      pOpen->
a950: 61 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  aPending = 0;.  
a960: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a970: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  3OsLeaveMutex();
a980: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
a990: 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  pe = locktype;. 
a9a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a9b0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
a9c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a9d0: 20 75 6e 69 78 43 6c 6f 73 65 28 4f 73 46 69 6c   unixClose(OsFil
a9e0: 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  e **pId){.  unix
a9f0: 46 69 6c 65 20 2a 69 64 20 3d 20 28 75 6e 69 78  File *id = (unix
aa00: 46 69 6c 65 2a 29 2a 70 49 64 3b 0a 20 20 69 66  File*)*pId;.  if
aa10: 28 20 21 69 64 20 29 20 72 65 74 75 72 6e 20 53  ( !id ) return S
aa20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
aa30: 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28 69  CHECK_THREADID(i
aa40: 64 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  d) ) return SQLI
aa50: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 75 6e 69  TE_MISUSE;.  uni
aa60: 78 55 6e 6c 6f 63 6b 28 2a 70 49 64 2c 20 4e 4f  xUnlock(*pId, NO
aa70: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64  _LOCK);.  if( id
aa80: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
aa90: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
aaa0: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
aab0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
aac0: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 69 66 28  rMutex();..  if(
aad0: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
aae0: 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  k ){.    /* If t
aaf0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
ab00: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
ab10: 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
ab20: 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
ab30: 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
ab40: 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
ab50: 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
ab60: 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
ab70: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64  he file.    ** d
ab80: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70  escriptor to pOp
ab90: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  en->aPending.  I
aba0: 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
abb0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
abc0: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
abd0: 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
abe0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
abf0: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73  int *aNew;.    s
ac00: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
ac10: 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e  Open = id->pOpen
ac20: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
ac30: 69 74 65 52 65 61 6c 6c 6f 63 28 20 70 4f 70 65  iteRealloc( pOpe
ac40: 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f  n->aPending, (pO
ac50: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29  pen->nPending+1)
ac60: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
ac70: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
ac80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
ac90: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
aca0: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
acb0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
acc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
acd0: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
ace0: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
acf0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
ad00: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20  Open->nPending] 
ad10: 3d 20 69 64 2d 3e 68 3b 0a 20 20 20 20 20 20 70  = id->h;.      p
ad20: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b  Open->nPending++
ad30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
ad40: 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
ad50: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
ad60: 20 6c 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e   locks so we can
ad70: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
ad80: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20  immediately */. 
ad90: 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b     close(id->h);
ada0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f  .  }.  releaseLo
adb0: 63 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b  ckInfo(id->pLock
adc0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e  );.  releaseOpen
add0: 43 6e 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a  Cnt(id->pOpen);.
ade0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
adf0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  eMutex();.  id->
ae00: 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52  isOpen = 0;.  TR
ae10: 41 43 45 32 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE2("CLOSE   %-
ae20: 33 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20  3d\n", id->h);. 
ae30: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
ae40: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 69  ;.  sqliteFree(i
ae50: 64 29 3b 0a 20 20 2a 70 49 64 20 3d 20 30 3b 0a  d);.  *pId = 0;.
ae60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  OK;.}../*.** Tur
ae80: 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
ae90: 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
aea0: 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  l pathname.  Ret
aeb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
aec0: 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74   to the full pat
aed0: 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20  hname stored in 
aee0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
aef0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
af00: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  ()..** The calli
af10: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ng function is r
af20: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
af30: 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 61 63  reeing this spac
af40: 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20  e once it.** is 
af50: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64  no longer needed
af60: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
af70: 65 33 55 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  e3UnixFullPathna
af80: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
af90: 52 65 6c 61 74 69 76 65 29 7b 0a 20 20 63 68 61  Relative){.  cha
afa0: 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20  r *zFull = 0;.  
afb0: 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
afc0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
afd0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
afe0: 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c  Full, zRelative,
aff0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65   (char*)0);.  }e
b000: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
b010: 42 75 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Buf = sqliteMall
b020: 6f 63 28 35 30 30 30 29 3b 0a 20 20 20 20 69 66  oc(5000);.    if
b030: 28 20 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( zBuf==0 ){.   
b040: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b050: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d   }.    zBuf[0] =
b060: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   0;.    sqlite3S
b070: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c  etString(&zFull,
b080: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 35 30   getcwd(zBuf, 50
b090: 30 30 29 2c 20 22 2f 22 2c 20 7a 52 65 6c 61 74  00), "/", zRelat
b0a0: 69 76 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ive,.           
b0b0: 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
b0c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
b0d0: 65 65 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20  ee(zBuf);.  }.  
b0e0: 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a  return zFull;.}.
b0f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b100: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
b110: 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20  ullsync flag in 
b120: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b130: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
b140: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 65  atic void unixSe
b150: 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65  tFullSync(OsFile
b160: 20 2a 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20   *id, int v){.  
b170: 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
b180: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 7d  >fullSync = v;.}
b190: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b1a0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69  he underlying fi
b1b0: 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  le handle for an
b1c0: 20 4f 73 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69   OsFile.*/.stati
b1d0: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 48 61  c int unixFileHa
b1e0: 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a 69 64 29  ndle(OsFile *id)
b1f0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 6e 69  {.  return ((uni
b200: 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a 7d  xFile*)id)->h;.}
b210: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
b220: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  n integer that i
b230: 6e 64 69 63 65 73 20 74 68 65 20 74 79 70 65 20  ndices the type 
b240: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
b250: 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68 69  y held.** by thi
b260: 73 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65 64  s handle.  (Used
b270: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
b280: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 29   analysis only.)
b290: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b2a0: 6e 69 78 4c 6f 63 6b 53 74 61 74 65 28 4f 73 46  nixLockState(OsF
b2b0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75  ile *id){.  retu
b2c0: 72 6e 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rn ((unixFile*)i
b2d0: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d 0a  d)->locktype;.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
b2f0: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
b300: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
b310: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
b320: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72 20  n OsFile.** for 
b330: 75 6e 69 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unix..*/.static 
b340: 63 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73  const IoMethod s
b350: 71 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68  qlite3UnixIoMeth
b360: 6f 64 20 3d 20 7b 0a 20 20 75 6e 69 78 43 6c 6f  od = {.  unixClo
b370: 73 65 2c 0a 20 20 75 6e 69 78 4f 70 65 6e 44 69  se,.  unixOpenDi
b380: 72 65 63 74 6f 72 79 2c 0a 20 20 75 6e 69 78 52  rectory,.  unixR
b390: 65 61 64 2c 0a 20 20 75 6e 69 78 57 72 69 74 65  ead,.  unixWrite
b3a0: 2c 0a 20 20 75 6e 69 78 53 65 65 6b 2c 0a 20 20  ,.  unixSeek,.  
b3b0: 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 0a 20 20  unixTruncate,.  
b3c0: 75 6e 69 78 53 79 6e 63 2c 0a 20 20 75 6e 69 78  unixSync,.  unix
b3d0: 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20 75  SetFullSync,.  u
b3e0: 6e 69 78 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  nixFileHandle,. 
b3f0: 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 0a 20   unixFileSize,. 
b400: 20 75 6e 69 78 4c 6f 63 6b 2c 0a 20 20 75 6e 69   unixLock,.  uni
b410: 78 55 6e 6c 6f 63 6b 2c 0a 20 20 75 6e 69 78 4c  xUnlock,.  unixL
b420: 6f 63 6b 53 74 61 74 65 2c 0a 20 20 75 6e 69 78  ockState,.  unix
b430: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
b440: 6b 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  k,.};../*.** All
b450: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
b460: 20 61 20 75 6e 69 78 46 69 6c 65 2e 20 20 49 6e   a unixFile.  In
b470: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77  itialize the new
b480: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 74 6f 20   unixFile.** to 
b490: 74 68 65 20 76 61 6c 75 65 20 67 69 76 65 6e 20  the value given 
b4a0: 69 6e 20 70 49 6e 69 74 20 61 6e 64 20 72 65 74  in pInit and ret
b4b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b4c0: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69   the new.** OsFi
b4d0: 6c 65 2e 20 20 49 66 20 77 65 20 72 75 6e 20 6f  le.  If we run o
b4e0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c  ut of memory, cl
b4f0: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
b500: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
b510: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
b520: 63 61 74 65 55 6e 69 78 46 69 6c 65 28 75 6e 69  cateUnixFile(uni
b530: 78 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73  xFile *pInit, Os
b540: 46 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 75  File **pId){.  u
b550: 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20  nixFile *pNew;. 
b560: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
b570: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 75 6e 69  lloc( sizeof(uni
b580: 78 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  xFile) );.  if( 
b590: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 63  pNew==0 ){.    c
b5a0: 6c 6f 73 65 28 70 49 6e 69 74 2d 3e 68 29 3b 0a  lose(pInit->h);.
b5b0: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
b5c0: 6e 66 6f 28 70 49 6e 69 74 2d 3e 70 4c 6f 63 6b  nfo(pInit->pLock
b5d0: 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70  );.    releaseOp
b5e0: 65 6e 43 6e 74 28 70 49 6e 69 74 2d 3e 70 4f 70  enCnt(pInit->pOp
b5f0: 65 6e 29 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20  en);.    *pId = 
b600: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
b610: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
b620: 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65 77 20 3d  lse{.    *pNew =
b630: 20 2a 70 49 6e 69 74 3b 0a 20 20 20 20 70 4e 65   *pInit;.    pNe
b640: 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 73 71  w->pMethod = &sq
b650: 6c 69 74 65 33 55 6e 69 78 49 6f 4d 65 74 68 6f  lite3UnixIoMetho
b660: 64 3b 0a 20 20 20 20 2a 70 49 64 20 3d 20 28 4f  d;.    *pId = (O
b670: 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20  sFile*)pNew;.   
b680: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
b690: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b6a0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ITE_OK;.  }.}...
b6b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b6c0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.
b6d0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
b720: 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65  Everything above
b730: 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65   deals with file
b740: 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e   I/O.  Everythin
b750: 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  g that follows d
b760: 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68  eals.** with oth
b770: 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  er miscellanous 
b780: 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f  aspects of the o
b790: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
b7a0: 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a  interface.******
b7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  ******/.../*.** 
b800: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
b810: 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
b820: 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
b830: 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
b840: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
b850: 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
b860: 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
b870: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
b880: 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
b890: 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
b8a0: 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
b8b0: 20 73 71 6c 69 74 65 33 55 6e 69 78 52 61 6e 64   sqlite3UnixRand
b8c0: 6f 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75  omSeed(char *zBu
b8d0: 66 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  f){.  /* We have
b8e0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
b8f0: 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
b900: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
b910: 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
b920: 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
b930: 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
b940: 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
b950: 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
b960: 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
b970: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
b980: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
b990: 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
b9a0: 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
b9b0: 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
b9c0: 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
b9d0: 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
b9e0: 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
b9f0: 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
ba00: 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
ba10: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
ba20: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
ba30: 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
ba40: 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
ba50: 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
ba60: 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
ba70: 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
ba80: 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
ba90: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
baa0: 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
bab0: 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
bac0: 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
bad0: 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
bae0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
baf0: 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
bb00: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
bb10: 73 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20  sequence.* This 
bb20: 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
bb30: 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
bb40: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
bb50: 42 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69  Buf, 0, 256);.#i
bb60: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
bb70: 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
bb80: 69 6e 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20  int pid, fd;.   
bb90: 20 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76   fd = open("/dev
bba0: 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
bbb0: 4e 4c 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64  NLY);.    if( fd
bbc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
bbd0: 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
bbe0: 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
bbf0: 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
bc00: 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70  eof(t));.      p
bc10: 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20  id = getpid();. 
bc20: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
bc30: 66 5b 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  f[sizeof(time_t)
bc40: 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
bc50: 70 69 64 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pid));.    }else
bc60: 7b 0a 20 20 20 20 20 20 72 65 61 64 28 66 64 2c  {.      read(fd,
bc70: 20 7a 42 75 66 2c 20 32 35 36 29 3b 0a 20 20 20   zBuf, 256);.   
bc80: 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
bc90: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
bca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bcb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  K;.}../*.** Slee
bcc0: 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
bcd0: 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
bce0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
bcf0: 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
bd00: 71 6c 69 74 65 33 55 6e 69 78 53 6c 65 65 70 28  qlite3UnixSleep(
bd10: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20 64 65 66  int ms){.#if def
bd20: 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
bd30: 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
bd40: 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30  .  usleep(ms*100
bd50: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b  0);.  return ms;
bd60: 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28  .#else.  sleep((
bd70: 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ms+999)/1000);. 
bd80: 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d   return 1000*((m
bd90: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65  s+999)/1000);.#e
bda0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  ndif.}../*.** St
bdb0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
bdc0: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
bdd0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
bde0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
bdf0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
be00: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
be10: 45 41 44 53 0a 73 74 61 74 69 63 20 70 74 68 72  EADS.static pthr
be20: 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65  ead_mutex_t mute
be30: 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45  x = PTHREAD_MUTE
be40: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23  X_INITIALIZER;.#
be50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
be60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20   following pair 
be70: 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  of routine imple
be80: 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c  ment mutual excl
be90: 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c  usion for.** mul
bea0: 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63  ti-threaded proc
beb0: 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73  esses.  Only a s
bec0: 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73 20  ingle thread is 
bed0: 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78  allowed to.** ex
bee0: 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61 74  ecuted code that
bef0: 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62   is surrounded b
bf00: 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61  y EnterMutex() a
bf10: 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e  nd LeaveMutex().
bf20: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73  .**.** SQLite us
bf30: 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  es only a single
bf40: 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20 69   Mutex.  There i
bf50: 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69  s not much criti
bf60: 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20  cal.** code and 
bf70: 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72  what little ther
bf80: 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71 75  e is executes qu
bf90: 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75  ickly and withou
bfa0: 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76  t blocking..*/.v
bfb0: 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 78 45  oid sqlite3UnixE
bfc0: 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66  nterMutex(){.#if
bfd0: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
bfe0: 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61  THREADS.  pthrea
bff0: 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75  d_mutex_lock(&mu
c000: 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  tex);.#endif.  a
c010: 73 73 65 72 74 28 20 21 69 6e 4d 75 74 65 78 20  ssert( !inMutex 
c020: 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 31  );.  inMutex = 1
c030: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
c040: 55 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  UnixLeaveMutex()
c050: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75  {.  assert( inMu
c060: 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78  tex );.  inMutex
c070: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
c080: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
c090: 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  .  pthread_mutex
c0a0: 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b  _unlock(&mutex);
c0b0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c0c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c0d0: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
c0e0: 20 77 69 74 68 69 6e 20 74 68 65 20 6d 75 74 65   within the mute
c0f0: 78 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e  x and FALSE if n
c100: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
c110: 65 33 55 6e 69 78 49 6e 4d 75 74 65 78 28 29 7b  e3UnixInMutex(){
c120: 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65  .  return inMute
c130: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  x;.}../*.** This
c140: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c150: 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  led automaticall
c160: 79 20 77 68 65 6e 20 61 20 74 68 72 65 61 64 20  y when a thread 
c170: 65 78 69 73 74 73 20 74 6f 20 64 65 6c 65 74 65  exists to delete
c180: 0a 2a 2a 20 74 68 65 20 74 68 72 65 61 64 73 20  .** the threads 
c190: 54 68 72 65 61 64 44 61 74 61 20 73 74 72 75 63  ThreadData struc
c1a0: 74 75 72 65 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 63  ture. .**.** Bec
c1b0: 61 75 73 65 20 74 68 65 20 54 68 72 65 61 64 44  ause the ThreadD
c1c0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
c1d0: 20 72 65 71 75 69 72 65 64 20 62 79 20 68 69 67   required by hig
c1e0: 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
c1f0: 65 73 0a 2a 2a 20 73 75 63 68 20 61 73 20 73 71  es.** such as sq
c200: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 77 65 20  liteMalloc() we 
c210: 75 73 65 20 4f 73 46 72 65 65 28 29 20 61 6e 64  use OsFree() and
c220: 20 4f 73 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65   OsMalloc() dire
c230: 63 74 6c 79 20 74 6f 0a 2a 2a 20 61 6c 6c 6f 63  ctly to.** alloc
c240: 61 74 65 20 74 68 65 20 74 68 72 65 61 64 20 73  ate the thread s
c250: 70 65 63 69 66 69 63 20 64 61 74 61 2e 0a 2a 2f  pecific data..*/
c260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
c270: 4e 49 58 5f 54 48 52 45 41 44 53 0a 73 74 61 74  NIX_THREADS.stat
c280: 69 63 20 76 6f 69 64 20 64 65 6c 65 74 65 54 73  ic void deleteTs
c290: 64 28 76 6f 69 64 20 2a 70 54 73 64 29 7b 0a 20  d(void *pTsd){. 
c2a0: 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65 28 70   sqlite3OsFree(p
c2b0: 54 73 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Tsd);.}.#endif..
c2c0: 2f 2a 20 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  /* .** The first
c2d0: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
c2e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
c2f0: 6f 6d 20 61 20 73 70 65 63 69 66 69 63 20 74 68  om a specific th
c300: 72 65 61 64 2c 20 6e 42 79 74 65 20 0a 2a 2a 20  read, nByte .** 
c310: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
c320: 65 61 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ea are allocated
c330: 20 61 6e 64 20 7a 65 72 6f 65 64 2e 20 41 20 70   and zeroed. A p
c340: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
c350: 77 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  w .** allocation
c360: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
c370: 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a  the caller. .**.
c380: 2a 2a 20 45 61 63 68 20 73 75 62 73 65 71 75 65  ** Each subseque
c390: 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  nt call to this 
c3a0: 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68  function from th
c3b0: 65 20 74 68 72 65 61 64 20 72 65 74 75 72 6e 73  e thread returns
c3c0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 6f 69   the same.** poi
c3d0: 6e 74 65 72 2e 20 54 68 65 20 61 72 67 75 6d 65  nter. The argume
c3e0: 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 69 6e  nt is ignored in
c3f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 76   this case..*/.v
c400: 6f 69 64 20 2a 73 71 6c 69 74 65 33 55 6e 69 78  oid *sqlite3Unix
c410: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
c420: 74 61 28 69 6e 74 20 6e 42 79 74 65 29 7b 0a 23  ta(int nByte){.#
c430: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
c440: 58 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74  X_THREADS.  stat
c450: 69 63 20 70 74 68 72 65 61 64 5f 6b 65 79 5f 74  ic pthread_key_t
c460: 20 6b 65 79 3b 0a 20 20 73 74 61 74 69 63 20 69   key;.  static i
c470: 6e 74 20 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a  nt keyInit = 0;.
c480: 20 20 76 6f 69 64 20 2a 70 54 73 64 3b 0a 0a 20    void *pTsd;.. 
c490: 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b   if( !keyInit ){
c4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 45 6e  .    sqlite3OsEn
c4b0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
c4c0: 69 66 28 20 21 6b 65 79 49 6e 69 74 20 29 7b 0a  if( !keyInit ){.
c4d0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
c4e0: 20 20 20 20 72 63 20 3d 20 70 74 68 72 65 61 64      rc = pthread
c4f0: 5f 6b 65 79 5f 63 72 65 61 74 65 28 26 6b 65 79  _key_create(&key
c500: 2c 20 64 65 6c 65 74 65 54 73 64 29 3b 0a 20 20  , deleteTsd);.  
c510: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c520: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c        sqlite3OsL
c530: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
c540: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6b 65 79       }.      key
c560: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Init = 1;.    }.
c570: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61      sqlite3OsLea
c580: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
c590: 20 20 70 54 73 64 20 3d 20 70 74 68 72 65 61 64    pTsd = pthread
c5a0: 5f 67 65 74 73 70 65 63 69 66 69 63 28 6b 65 79  _getspecific(key
c5b0: 29 3b 0a 20 20 69 66 28 20 21 70 54 73 64 20 29  );.  if( !pTsd )
c5c0: 7b 0a 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c  {.    pTsd = sql
c5d0: 69 74 65 33 4f 73 4d 61 6c 6c 6f 63 28 6e 42 79  ite3OsMalloc(nBy
c5e0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 73  te);.    if( pTs
c5f0: 64 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  d ){.      memse
c600: 74 28 70 54 73 64 2c 20 30 2c 20 6e 42 79 74 65  t(pTsd, 0, nByte
c610: 29 3b 0a 20 20 20 20 20 20 70 74 68 72 65 61 64  );.      pthread
c620: 5f 73 65 74 73 70 65 63 69 66 69 63 28 6b 65 79  _setspecific(key
c630: 2c 20 70 54 73 64 29 3b 0a 20 20 20 20 7d 0a 20  , pTsd);.    }. 
c640: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 73 64   }.  return pTsd
c650: 3b 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63  ;.#else.  static
c660: 20 76 6f 69 64 20 2a 70 54 73 64 20 3d 20 30 3b   void *pTsd = 0;
c670: 0a 20 20 69 66 28 20 21 70 54 73 64 20 29 7b 0a  .  if( !pTsd ){.
c680: 20 20 20 20 70 54 73 64 20 3d 20 73 71 6c 69 74      pTsd = sqlit
c690: 65 33 4f 73 4d 61 6c 6c 6f 63 28 6e 42 79 74 65  e3OsMalloc(nByte
c6a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 73 64 20  );.    if( pTsd 
c6b0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
c6c0: 70 54 73 64 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pTsd, 0, nByte);
c6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c6e0: 75 72 6e 20 70 54 73 64 3b 0a 23 65 6e 64 69 66  urn pTsd;.#endif
c6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
c700: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
c710: 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
c720: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65  n-zero value, be
c730: 63 6f 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74  comes the result
c740: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f  .** returned fro
c750: 6d 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  m sqlite3OsCurre
c760: 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
c770: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c780: 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
c790: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
c7a0: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
c7b0: 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ime = 0;.#endif.
c7c0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
c7d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
c7e0: 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
c7f0: 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
c800: 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
c810: 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
c820: 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
c830: 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
c840: 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
c850: 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
c860: 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
c870: 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
c880: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
c890: 69 74 65 33 55 6e 69 78 43 75 72 72 65 6e 74 54  ite3UnixCurrentT
c8a0: 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ime(double *prNo
c8b0: 77 29 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 47 45  w){.#ifdef NO_GE
c8c0: 54 54 4f 44 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TTOD.  time_t t;
c8d0: 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
c8e0: 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
c8f0: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
c900: 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
c910: 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 73 74  meval sNow;.  st
c920: 72 75 63 74 20 74 69 6d 65 7a 6f 6e 65 20 73 54  ruct timezone sT
c930: 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  z;  /* Not used 
c940: 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66 64 61  */.  gettimeofda
c950: 79 28 26 73 4e 6f 77 2c 20 26 73 54 7a 29 3b 0a  y(&sNow, &sTz);.
c960: 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
c970: 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
c980: 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
c990: 77 2e 74 76 5f 75 73 65 63 2f 38 36 34 30 30 30  w.tv_usec/864000
c9a0: 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  00000.0;.#endif.
c9b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
c9c0: 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
c9d0: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
c9e0: 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73 71  .    *prNow = sq
c9f0: 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
ca00: 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34  me/86400.0 + 244
ca10: 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64  0587.5;.  }.#end
ca20: 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  if.  return 0;.}
ca30: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 55  ..#endif /* OS_U
ca40: 4e 49 58 20 2a 2f 0a                             NIX */.