/ Hex Artifact Content
Login

Artifact edbc13a32a6b835b5303a444bd7da9404dc17e58:


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 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
1600: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
1610: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
1620: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
1630: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
1640: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
1650: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
1660: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
1670: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
1680: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1690: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
16a0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
16b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
16c0: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
16d0: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
16e0: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
16f0: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
1700: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1710: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1720: 69 78 55 6e 75 73 65 64 46 64 3b 0a 73 74 72 75  ixUnusedFd;.stru
1730: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
1740: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1770: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
1780: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1790: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
17a0: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
17b0: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
17c0: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
17d0: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
17e0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
17f0: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1800: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1810: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1820: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1830: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
1840: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
1850: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
1860: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
1870: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
1880: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1890: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
18a0: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
18b0: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
18c0: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
18d0: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
18e0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
18f0: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
1900: 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
1910: 4f 70 65 6e 3b 20 20 20 20 20 20 20 2f 2a 20 49  Open;       /* I
1920: 6e 66 6f 20 61 62 6f 75 74 20 61 6c 6c 20 6f 70  nfo about all op
1930: 65 6e 20 66 64 27 73 20 6f 6e 20 74 68 69 73 20  en fd's on this 
1940: 69 6e 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63  inode */.  struc
1950: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
1960: 70 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 49  pLock;      /* I
1970: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
1980: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
1990: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
19c0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19d0: 69 6e 74 20 64 69 72 66 64 3b 20 20 20 20 20 20  int dirfd;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1a00: 74 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65  tor for the dire
1a10: 63 74 6f 72 79 20 2a 2f 0a 20 20 75 6e 73 69 67  ctory */.  unsig
1a20: 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70  ned char locktyp
1a30: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1a40: 68 65 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20  he type of lock 
1a50: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20  held on this fd 
1a60: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 45 72 72  */.  int lastErr
1a70: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1a80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a90: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  x errno from the
1aa0: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
1ab0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63 6b 69  */.  void *locki
1ac0: 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 20  ngContext;      
1ad0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67        /* Locking
1ae0: 20 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20   style specific 
1af0: 73 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55  state */.  UnixU
1b00: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
1b10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
1b20: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1b30: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 69  xUnusedFd */.  i
1b40: 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b 20 20 20  nt fileFlags;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20  /* Miscellanous 
1b70: 66 6c 61 67 73 20 2a 2f 0a 23 69 66 20 53 51 4c  flags */.#if SQL
1b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1b90: 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f  NG_STYLE.  int o
1ba0: 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20  penFlags;       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 68 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69  he flags specifi
1bd0: 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a  ed at open() */.
1be0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1bf0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1c00: 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65  _STYLE || define
1c10: 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75  d(__APPLE__).  u
1c20: 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b  nsigned fsFlags;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69   /* cached detai
1c50: 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29  ls from statfs()
1c60: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1c70: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
1c80: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   && defined(__li
1c90: 6e 75 78 5f 5f 29 0a 20 20 70 74 68 72 65 61 64  nux__).  pthread
1ca0: 5f 74 20 74 69 64 3b 20 20 20 20 20 20 20 20 20  _t tid;         
1cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cc0: 20 74 68 72 65 61 64 20 74 68 61 74 20 22 6f 77   thread that "ow
1cd0: 6e 73 22 20 74 68 69 73 20 75 6e 69 78 46 69 6c  ns" this unixFil
1ce0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  e */.#endif.#if 
1cf0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 6e 74  OS_VXWORKS.  int
1d00: 20 69 73 44 65 6c 65 74 65 3b 20 20 20 20 20 20   isDelete;      
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 44 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65   Delete on close
1d30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 73 74   if true */.  st
1d40: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
1d50: 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 2f  Id *pId;       /
1d60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1d70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
1d80: 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 54  ef NDEBUG.  /* T
1d90: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
1da0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
1db0: 73 65 64 20 74 6f 20 74 72 61 63 6b 20 77 68 65  sed to track whe
1dc0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 0a  ther or not the.
1dd0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1de0: 20 63 6f 75 6e 74 65 72 20 69 6e 20 62 79 74 65   counter in byte
1df0: 73 20 32 34 2d 32 37 20 6f 66 20 64 61 74 61 62  s 24-27 of datab
1e00: 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 75 70  ase files are up
1e10: 64 61 74 65 64 0a 20 20 2a 2a 20 77 68 65 6e 65  dated.  ** whene
1e20: 76 65 72 20 61 6e 79 20 70 61 72 74 20 6f 66 20  ver any part of 
1e30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 68 61  the database cha
1e40: 6e 67 65 73 2e 20 20 41 6e 20 61 73 73 65 72 74  nges.  An assert
1e50: 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 0a 20  ion fault will. 
1e60: 20 2a 2a 20 6f 63 63 75 72 20 69 66 20 61 20 66   ** occur if a f
1e70: 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 77  ile is updated w
1e80: 69 74 68 6f 75 74 20 61 6c 73 6f 20 75 70 64 61  ithout also upda
1e90: 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
1ea0: 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 65  tion.  ** counte
1eb0: 72 2e 20 20 54 68 69 73 20 74 65 73 74 20 69 73  r.  This test is
1ec0: 20 6d 61 64 65 20 74 6f 20 61 76 6f 69 64 20 6e   made to avoid n
1ed0: 65 77 20 70 72 6f 62 6c 65 6d 73 20 73 69 6d 69  ew problems simi
1ee0: 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  lar to the.  ** 
1ef0: 6f 6e 65 20 64 65 73 63 72 69 62 65 64 20 62 79  one described by
1f00: 20 74 69 63 6b 65 74 20 23 33 35 38 34 2e 20 0a   ticket #3584. .
1f10: 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20    */.  unsigned 
1f20: 63 68 61 72 20 74 72 61 6e 73 43 6e 74 72 43 68  char transCntrCh
1f30: 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ng;   /* True if
1f40: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f50: 20 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 64   counter changed
1f60: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1f70: 68 61 72 20 64 62 55 70 64 61 74 65 3b 20 20 20  har dbUpdate;   
1f80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1f90: 61 6e 79 20 70 61 72 74 20 6f 66 20 64 61 74 61  any part of data
1fa0: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
1fb0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
1fc0: 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c 57 72 69  char inNormalWri
1fd0: 74 65 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66  te;   /* True if
1fe0: 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69   in a normal wri
1ff0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  te operation */.
2000: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2010: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49  LITE_TEST.  /* I
2020: 6e 20 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63  n test mode, inc
2030: 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f  rease the size o
2040: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
2050: 20 61 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a   a bit so that .
2060: 20 20 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65    ** it is large
2070: 72 20 74 68 61 6e 20 74 68 65 20 73 74 72 75 63  r than the struc
2080: 74 20 43 72 61 73 68 46 69 6c 65 20 64 65 66 69  t CrashFile defi
2090: 6e 65 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a  ned in test6.c..
20a0: 20 20 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64    */.  char aPad
20b0: 64 69 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66  ding[32];.#endif
20c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
20d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
20e0: 64 65 66 69 6e 65 20 62 69 74 73 20 69 6e 20 75  define bits in u
20f0: 6e 69 78 46 69 6c 65 2e 66 69 6c 65 46 6c 61 67  nixFile.fileFlag
2100: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
2110: 49 54 45 5f 57 48 4f 4c 45 5f 46 49 4c 45 5f 4c  ITE_WHOLE_FILE_L
2120: 4f 43 4b 49 4e 47 20 20 30 78 30 30 30 31 20 20  OCKING  0x0001  
2130: 20 2f 2a 20 55 73 65 20 77 68 6f 6c 65 2d 66 69   /* Use whole-fi
2140: 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f  le locking */../
2150: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
2160: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
2170: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
2180: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
2190: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
21a0: 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72  /*.** Define var
21b0: 69 6f 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74  ious macros that
21c0: 20 61 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f   are missing fro
21d0: 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a  m some systems..
21e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52  */.#ifndef O_LAR
21f0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2200: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2210: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2220: 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23  TE_DISABLE_LFS.#
2230: 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49   undef O_LARGEFI
2240: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2250: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2260: 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c  .#ifndef O_NOFOL
2270: 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e  LOW.# define O_N
2280: 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66  OFOLLOW 0.#endif
2290: 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52  .#ifndef O_BINAR
22a0: 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e  Y.# define O_BIN
22b0: 41 52 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ARY 0.#endif../*
22c0: 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f  .** The DJGPP co
22d0: 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65  mpiler environme
22e0: 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20  nt looks mostly 
22f0: 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69  like Unix, but i
2300: 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66  t.** lacks the f
2310: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
2320: 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65  ll.  So redefine
2330: 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73   fcntl() to be s
2340: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74  omething.** that
2350: 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
2360: 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
2370: 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20  at locking does 
2380: 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a  not occur under.
2390: 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69  ** DJGPP.  But i
23a0: 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20  t is DOS - what 
23b0: 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a  did you expect?.
23c0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50  */.#ifdef __DJGP
23d0: 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20 66 63 6e  P__.# define fcn
23e0: 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23 65 6e 64  tl(A,B,C) 0.#end
23f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68  if../*.** The th
2400: 72 65 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73  readid macro res
2410: 6f 6c 76 65 73 20 74 6f 20 74 68 65 20 74 68 72  olves to the thr
2420: 65 61 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20  ead-id or to 0. 
2430: 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   Used for.** tes
2440: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
2450: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  ng only..*/.#if 
2460: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2470: 45 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64  E.#define thread
2480: 69 64 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28  id pthread_self(
2490: 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
24a0: 74 68 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69  threadid 0.#endi
24b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  f.../*.** Helper
24c0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
24d0: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
24e0: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
24f0: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
2500: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
2510: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
2520: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2c 20 75 6e   unixOpenCnt, un
2530: 69 78 4c 6f 63 6b 49 6e 66 6f 20 61 6e 64 0a 2a  ixLockInfo and.*
2540: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
2550: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
2560: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
2570: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
2580: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
2590: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
25a0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
25b0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
25c0: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
25d0: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
25e0: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
25f0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
2600: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2610: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
2620: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
2630: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
2640: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
2650: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
2660: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
2670: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
2680: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
2690: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
26a0: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
26b0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
26c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26d0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
26e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
26f0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
2700: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2710: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2720: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
2730: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
2740: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2750: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2760: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2780: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
2790: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
27a0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
27b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27c0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
27d0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
27e0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
27f0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65  }.#endif...#ifde
2800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2810: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
2820: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
2830: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
2840: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
2850: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
2860: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
2870: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
2880: 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  esetation of the
2890: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74   supplied.** int
28a0: 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a  eger lock-type..
28b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
28c0: 63 68 61 72 20 2a 6c 6f 63 6b 74 79 70 65 4e 61  char *locktypeNa
28d0: 6d 65 28 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  me(int locktype)
28e0: 7b 0a 20 20 73 77 69 74 63 68 28 20 6c 6f 63 6b  {.  switch( lock
28f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
2900: 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e   NO_LOCK: return
2910: 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73   "NONE";.    cas
2920: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
2930: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
2940: 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56 45      case RESERVE
2950: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
2960: 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63  RESERVED";.    c
2970: 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ase PENDING_LOCK
2980: 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e  : return "PENDIN
2990: 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43  G";.    case EXC
29a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74  LUSIVE_LOCK: ret
29b0: 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b  urn "EXCLUSIVE";
29c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45  .  }.  return "E
29d0: 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a  RROR";.}.#endif.
29e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c  .#ifdef SQLITE_L
29f0: 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  OCK_TRACE./*.** 
2a00: 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d  Print out inform
2a10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20  ation about all 
2a20: 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  locking operatio
2a30: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
2a40: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
2a50: 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69  or troubleshooti
2a60: 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74  ng locks on mult
2a70: 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61  ithreaded.** pla
2a80: 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20  tforms.  Enable 
2a90: 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  by compiling wit
2aa0: 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c  h the -DSQLITE_L
2ab0: 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d  OCK_TRACE.** com
2ac0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
2ad0: 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   on the compiler
2ae0: 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73 20  .  This code is 
2af0: 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e  normally.** turn
2b00: 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  ed off..*/.stati
2b10: 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28  c int lockTrace(
2b20: 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20  int fd, int op, 
2b30: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29  struct flock *p)
2b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  {.  char *zOpNam
2b50: 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  e, *zType;.  int
2b60: 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45   s;.  int savedE
2b70: 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  rrno;.  if( op==
2b80: 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_GETLK ){.    z
2b90: 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22  OpName = "GETLK"
2ba0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
2bb0: 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_SETLK ){.   
2bc0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c   zOpName = "SETL
2bd0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2be0: 20 73 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f   s = fcntl(fd, o
2bf0: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
2c00: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
2c10: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
2c20: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
2c30: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
2c40: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
2c50: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
2c60: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
2c70: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
2c80: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
2c90: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
2ca0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
2cb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
2cc0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
2cd0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
2ce0: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
2cf0: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2d00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2d10: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
2d20: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63  _SET );.  s = fc
2d30: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
2d40: 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65    savedErrno = e
2d50: 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44  rrno;.  sqlite3D
2d60: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2d70: 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64  l %d %d %s %s %d
2d80: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20   %d %d %d\n",.  
2d90: 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c     threadid, fd,
2da0: 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c   zOpName, zType,
2db0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74   (int)p->l_start
2dc0: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c  , (int)p->l_len,
2dd0: 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f  .     (int)p->l_
2de0: 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73  pid, s);.  if( s
2df0: 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f  ==(-1) && op==F_
2e00: 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74  SETLK && (p->l_t
2e10: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20  ype==F_RDLCK || 
2e20: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  p->l_type==F_WRL
2e30: 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  CK) ){.    struc
2e40: 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20  t flock l2;.    
2e50: 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e  l2 = *p;.    fcn
2e60: 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20  tl(fd, F_GETLK, 
2e70: 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32  &l2);.    if( l2
2e80: 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  .l_type==F_RDLCK
2e90: 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
2ea0: 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d  = "RDLCK";.    }
2eb0: 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79  else if( l2.l_ty
2ec0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
2ed0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52       zType = "WR
2ee0: 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LCK";.    }else 
2ef0: 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46  if( l2.l_type==F
2f00: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
2f10: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
2f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f30: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2f40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2f50: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
2f60: 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f  tl-failure-reaso
2f70: 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e  n: %s %d %d %d\n
2f80: 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c  ",.       zType,
2f90: 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74   (int)l2.l_start
2fa0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c  , (int)l2.l_len,
2fb0: 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b   (int)l2.l_pid);
2fc0: 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73  .  }.  errno = s
2fd0: 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74  avedErrno;.  ret
2fe0: 75 72 6e 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65  urn s;.}.#define
2ff0: 20 66 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65   fcntl lockTrace
3000: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3010: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a  E_LOCK_TRACE */.
3020: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
3030: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
3040: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
3050: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
3060: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
3070: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
3080: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
3090: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
30a0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
30b0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
30c0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
30d0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
30e0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
30f0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
3100: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
3110: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
3120: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
3130: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
3140: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
3150: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
3160: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
3170: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
3180: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
3190: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
31a0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
31b0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
31c0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
31d0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
31e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
3200: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
3210: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
3220: 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77 69 74  eIOErr) {.  swit
3230: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
3240: 7b 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  {.  case 0: .   
3250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3260: 4b 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45  K;.    .  case E
3270: 41 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54  AGAIN:.  case ET
3280: 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20  IMEDOUT:.  case 
3290: 45 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49  EBUSY:.  case EI
32a0: 4e 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c  NTR:.  case ENOL
32b0: 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e  CK:  .    /* ran
32c0: 64 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72  dom NFS retry er
32d0: 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69  ror, unless duri
32e0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
32f0: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69  upport .     * i
3300: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e  ntrospection, in
3310: 20 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c   which it actual
3320: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
3330: 20 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74   says */.    ret
3340: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
3350: 0a 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 43  .    .  case EAC
3360: 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43  CES: .    /* EAC
3370: 43 45 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41  CES is like EAGA
3380: 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e  IN during lockin
3390: 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75  g operations, bu
33a0: 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20  t not any other 
33b0: 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28  time*/.    if( (
33c0: 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53  sqliteIOErr == S
33d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
33e0: 29 20 7c 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f  ) || ..(sqliteIO
33f0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3400: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
3410: 09 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d  .(sqliteIOErr ==
3420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
3430: 4c 4f 43 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74  LOCK) ||..(sqlit
3440: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
3450: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
3460: 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  RVEDLOCK) ){.   
3470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3480: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
3490: 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68   /* else fall th
34a0: 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20  rough */.  case 
34b0: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
34c0: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
34d0: 20 20 20 20 0a 20 20 63 61 73 65 20 45 44 45 41      .  case EDEA
34e0: 44 4c 4b 3a 0a 20 20 20 20 72 65 74 75 72 6e 20  DLK:.    return 
34f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
3500: 43 4b 45 44 3b 0a 20 20 20 20 0a 23 69 66 20 45  CKED;.    .#if E
3510: 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53  OPNOTSUPP!=ENOTS
3520: 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e 4f 54  UP.  case EOPNOT
3530: 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f  SUPP: .    /* so
3540: 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74 65 72  mething went ter
3550: 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65  ribly awry, unle
3560: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
3570: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20  ystem support . 
3580: 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74      * introspect
3590: 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74  ion, in which it
35a0: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
35b0: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
35c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 4e  #endif.#ifdef EN
35d0: 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45 4e 4f  OTSUP.  case ENO
35e0: 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e  TSUP: .    /* in
35f0: 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65 73 73  valid fd, unless
3600: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
3610: 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e 74 72  tem support intr
3620: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3630: 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74 20 61  ich .     * it a
3640: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
3650: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65  at it says */.#e
3660: 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49 4f 3a  ndif.  case EIO:
3670: 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a 0a 20  .  case EBADF:. 
3680: 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20   case EINVAL:.  
3690: 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20  case ENOTCONN:. 
36a0: 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20   case ENODEV:.  
36b0: 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61  case ENXIO:.  ca
36c0: 73 65 20 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73  se ENOENT:.  cas
36d0: 65 20 45 53 54 41 4c 45 3a 0a 20 20 63 61 73 65  e ESTALE:.  case
36e0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
36f0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
3700: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
3710: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
3720: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
3730: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
3740: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
3750: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
3760: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
37c0: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
37d0: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
37e0: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
37f0: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
3800: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
3810: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
3820: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
3830: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
3840: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
3850: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
3860: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
3870: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
3880: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
3890: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
38a0: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
38b0: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
38c0: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
38d0: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
38e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
38f0: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
3900: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
3910: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3920: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
3930: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
3940: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
3950: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
3960: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
3970: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
3980: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
3990: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
39a0: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
39b0: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
39c0: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
39d0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
39e0: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
39f0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
3a00: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
3a10: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
3a20: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
3a30: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
3a40: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
3a50: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
3a60: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
3a70: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
3a80: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
3a90: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
3aa0: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
3ab0: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
3ac0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
3ad0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3ae0: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
3af0: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
3b00: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
3b10: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
3b20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3b50: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
3b60: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
3b70: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
3b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
3b90: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
3ba0: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
3bb0: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
3bc0: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
3bd0: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
3be0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
3bf0: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
3c00: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
3c10: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
3c20: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
3c30: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
3c40: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
3c50: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
3c60: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
3c70: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
3c80: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
3c90: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
3ca0: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
3cb0: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
3cc0: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
3cd0: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
3ce0: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
3cf0: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
3d00: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
3d10: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
3d20: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
3d30: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
3d40: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
3d50: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
3d60: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
3d70: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3d80: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
3d90: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
3da0: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
3db0: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
3dc0: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
3dd0: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
3de0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
3df0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
3e00: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
3e10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
3e20: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
3e30: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
3e40: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
3e50: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
3e60: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
3e70: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
3e80: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
3e90: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
3ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
3eb0: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
3ec0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
3ed0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
3ee0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
3ef0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
3f00: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
3f10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3f20: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3f30: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
3f40: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
3f50: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
3f60: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
3f70: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
3f80: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
3f90: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
3fa0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
3fb0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
3fc0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
3fd0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
3fe0: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
3ff0: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
4000: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
4010: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
4020: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
4030: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
4040: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
4050: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4060: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
4070: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
4080: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
4090: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
40a0: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
40b0: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
40c0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
40d0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
40e0: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
40f0: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
4100: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
4110: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
4120: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
4130: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
4140: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
4150: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
4160: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
4180: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
4190: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
41a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
41b0: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
41c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
41d0: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
41e0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
41f0: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
4200: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
4210: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
4220: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
4230: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
4240: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
4250: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
4260: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
4270: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
42a0: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
42b0: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
42c0: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
42d0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
42e0: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
42f0: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
4300: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
4310: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
4320: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
4330: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
4340: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4350: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
4360: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
4370: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
4380: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
4390: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
43a0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
43b0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
43c0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
43d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
43e0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
43f0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
4400: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
4410: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
4420: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
4430: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
4440: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4450: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
4460: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
4470: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
4480: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
4490: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
44a0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
44b0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
44c0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
44d0: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
44e0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
44f0: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
4500: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
4510: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
4520: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
4530: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
4540: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
4550: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
4560: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
4570: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
4580: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
4590: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
45a0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
45b0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
45c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
45d0: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
45e0: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
45f0: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
4600: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
4610: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
4620: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
4630: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
4640: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
4650: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
4660: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
4670: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
4680: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
4690: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
46a0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
46b0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
46c0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
46d0: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
46e0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
46f0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
4700: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
4710: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
4720: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
4730: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
4740: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
4750: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
4760: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
4770: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
4780: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
4790: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
47a0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
47b0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
47c0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
47d0: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
47e0: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
47f0: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
4800: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
4810: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
4820: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
4830: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
4840: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
4850: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
4860: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
4870: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4880: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
4890: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
48a0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
4910: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50  ************** P
4980: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
4990: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
49c0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
49d0: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
49e0: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
49f0: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
4a00: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
4a10: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
4a20: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
4a30: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
4a40: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
4a50: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
4a60: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
4a70: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
4a80: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
4a90: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
4aa0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
4ab0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
4ac0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
4ad0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
4ae0: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
4af0: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
4b00: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
4b10: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
4b20: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
4b30: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
4b40: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
4b50: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
4b60: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
4b70: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
4b80: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
4b90: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
4ba0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
4bb0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
4bc0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
4bd0: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
4be0: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
4bf0: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
4c00: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
4c10: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
4c20: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
4c30: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
4c40: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
4c50: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
4c60: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
4c70: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
4c80: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
4c90: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
4ca0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
4cb0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
4cc0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
4cd0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
4ce0: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
4cf0: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
4d00: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
4d10: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
4d20: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
4d30: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
4d40: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
4d50: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
4d60: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
4d70: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
4d80: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
4d90: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
4da0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
4db0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
4dc0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
4dd0: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
4de0: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
4df0: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
4e00: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
4e10: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
4e20: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
4e30: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
4e40: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
4e50: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
4e60: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
4e70: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
4e80: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
4e90: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
4ea0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4ec0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
4ed0: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
4ee0: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
4ef0: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
4f00: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
4f10: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
4f20: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
4f30: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
4f40: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
4f50: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
4f60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
4f70: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
4f80: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
4f90: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
4fa0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
4fb0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
4fc0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
4fd0: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
4fe0: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
4ff0: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
5000: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
5010: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
5020: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
5030: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
5040: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
5050: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
5060: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
5070: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
5080: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
5090: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
50a0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
50b0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
50c0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
50d0: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
50e0: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
50f0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
5100: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
5110: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
5120: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
5130: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
5140: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
5150: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
5160: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
5170: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
5180: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
5190: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
51a0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
51b0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
51c0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
51d0: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
51e0: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
51f0: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
5200: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
5210: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
5220: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
5230: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
5240: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
5250: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
5260: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
5270: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
5280: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
5290: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
52a0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
52b0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
52c0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
52d0: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
52e0: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
52f0: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
5300: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
5310: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
5320: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
5330: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
5340: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
5350: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
5360: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
5370: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
5380: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
5390: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
53a0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
53b0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
53c0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
53d0: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
53e0: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
53f0: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
5400: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
5410: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
5420: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
5430: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
5440: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
5450: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
5460: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
5470: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
5480: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
5490: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
54a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
54b0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
54c0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
54d0: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
54e0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
54f0: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
5500: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
5510: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
5520: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
5530: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
5540: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
5550: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
5560: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
5570: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
5580: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
5590: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
55a0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
55b0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
55c0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
55d0: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
55e0: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
55f0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
5600: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
5610: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
5620: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
5630: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
5640: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
5650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
5660: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
5670: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 20 69  ucture.  There i
5680: 73 20 6f 6e 65 20 75 6e 69 78 4f 70 65 6e 43 6e  s one unixOpenCn
5690: 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  t structure.** p
56a0: 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20 77  er open inode, w
56b0: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
56c0: 6d 75 6c 74 69 70 6c 65 20 75 6e 69 78 46 69 6c  multiple unixFil
56d0: 65 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  e can point to a
56e0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 75 6e 69 78 4f   single.** unixO
56f0: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
5700: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
5710: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
5720: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
5730: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
5740: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
5750: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
5760: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
5770: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
5780: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
5790: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
57a0: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
57b0: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
57c0: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
57d0: 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73 74 72   unixOpenCnt str
57e0: 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c  ucture keeps a l
57f0: 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63  ist of file desc
5800: 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65  riptors that nee
5810: 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65  d to.** be close
5820: 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20  d and that list 
5830: 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63  is walked (and c
5840: 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65  leared) when the
5850: 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c   last lock.** cl
5860: 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20  ears..**.** Yet 
5870: 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a  another problem:
5880: 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64    LinuxThreads d
5890: 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20  o not play well 
58a0: 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73  with posix locks
58b0: 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64  ..**.** Many old
58c0: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c  er versions of l
58d0: 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e  inux use the Lin
58e0: 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72  uxThreads librar
58f0: 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f  y which is.** no
5900: 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e  t posix complian
5910: 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54  t.  Under LinuxT
5920: 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63  hreads, a lock c
5930: 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64  reated by thread
5940: 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20  .** A cannot be 
5950: 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72  modified or over
5960: 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66  ridden by a diff
5970: 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a  erent thread B..
5980: 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41  ** Only thread A
5990: 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20   can modify the 
59a0: 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62  lock.  Locking b
59b0: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
59c0: 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70  ct.** if the app
59d0: 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65  liation uses the
59e0: 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f   newer Native Po
59f0: 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61  six Thread Libra
5a00: 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20  ry (NPTL).** on 
5a10: 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54  linux - with NPT
5a20: 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  L a lock created
5a30: 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e   by thread A can
5a40: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a   override locks.
5a50: 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20  ** in thread B. 
5a60: 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f   But there is no
5a70: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20   way to know at 
5a80: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69  compile-time whi
5a90: 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20  ch.** threading 
5aa0: 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67  library is being
5ab0: 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65   used.  So there
5ac0: 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e   is no way to kn
5ad0: 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65  ow at.** compile
5ae0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
5af0: 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61   not thread A ca
5b00: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
5b10: 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a   on thread B..**
5b20: 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 61   We have to do a
5b30: 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20   run-time check 
5b40: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5b50: 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a  behavior of the.
5b60: 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  ** current proce
5b70: 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 79 73  ss..**.** On sys
5b80: 74 65 6d 73 20 77 68 65 72 65 20 74 68 72 65 61  tems where threa
5b90: 64 20 41 20 69 73 20 75 6e 61 62 6c 65 20 74 6f  d A is unable to
5ba0: 20 6d 6f 64 69 66 79 20 6c 6f 63 6b 73 20 63 72   modify locks cr
5bb0: 65 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 72 65  eated by.** thre
5bc0: 61 64 20 42 2c 20 77 65 20 68 61 76 65 20 74 6f  ad B, we have to
5bd0: 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 77   keep track of w
5be0: 68 69 63 68 20 74 68 72 65 61 64 20 63 72 65 61  hich thread crea
5bf0: 74 65 64 20 65 61 63 68 0a 2a 2a 20 6c 6f 63 6b  ted each.** lock
5c00: 2e 20 20 48 65 6e 63 65 20 74 68 65 72 65 20 69  .  Hence there i
5c10: 73 20 61 6e 20 65 78 74 72 61 20 66 69 65 6c 64  s an extra field
5c20: 20 69 6e 20 74 68 65 20 6b 65 79 20 74 6f 20 74   in the key to t
5c30: 68 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 0a  he unixLockInfo.
5c40: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
5c50: 72 65 63 6f 72 64 20 74 68 69 73 20 69 6e 66 6f  record this info
5c60: 72 6d 61 74 69 6f 6e 2e 20 20 41 6e 64 20 6f 6e  rmation.  And on
5c70: 20 74 68 6f 73 65 20 73 79 73 74 65 6d 73 20 69   those systems i
5c80: 74 0a 2a 2a 20 69 73 20 69 6c 6c 65 67 61 6c 20  t.** is illegal 
5c90: 74 6f 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73  to begin a trans
5ca0: 61 63 74 69 6f 6e 20 69 6e 20 6f 6e 65 20 74 68  action in one th
5cb0: 72 65 61 64 20 61 6e 64 20 66 69 6e 69 73 68 20  read and finish 
5cc0: 69 74 0a 2a 2a 20 69 6e 20 61 6e 6f 74 68 65 72  it.** in another
5cd0: 2e 20 20 46 6f 72 20 74 68 69 73 20 6c 61 74 74  .  For this latt
5ce0: 65 72 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  er restriction, 
5cf0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
5d00: 2d 61 72 6f 75 6e 64 2e 0a 2a 2a 20 49 74 20 69  -around..** It i
5d10: 73 20 61 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f  s a limitation o
5d20: 66 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 0a  f LinuxThreads..
5d30: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  */../*.** Set or
5d40: 20 63 68 65 63 6b 20 74 68 65 20 75 6e 69 78 46   check the unixF
5d50: 69 6c 65 2e 74 69 64 20 66 69 65 6c 64 2e 20 20  ile.tid field.  
5d60: 54 68 69 73 20 66 69 65 6c 64 20 69 73 20 73 65  This field is se
5d70: 74 20 77 68 65 6e 20 61 6e 20 75 6e 69 78 46 69  t when an unixFi
5d80: 6c 65 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 6f  le.** is first o
5d90: 70 65 6e 65 64 2e 20 20 41 6c 6c 20 73 75 62 73  pened.  All subs
5da0: 65 71 75 65 6e 74 20 75 73 65 73 20 6f 66 20 74  equent uses of t
5db0: 68 65 20 75 6e 69 78 46 69 6c 65 20 76 65 72 69  he unixFile veri
5dc0: 66 79 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  fy that the.** s
5dd0: 61 6d 65 20 74 68 72 65 61 64 20 69 73 20 6f 70  ame thread is op
5de0: 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 75  erating on the u
5df0: 6e 69 78 46 69 6c 65 2e 20 20 53 6f 6d 65 20 6f  nixFile.  Some o
5e00: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
5e10: 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c 6f 77   do.** not allow
5e20: 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f 76 65   locks to be ove
5e30: 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68 65 72  rridden by other
5e40: 20 74 68 72 65 61 64 73 20 61 6e 64 20 74 68 61   threads and tha
5e50: 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  t restriction.**
5e60: 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71 6c 69   means that sqli
5e70: 74 65 33 2a 20 64 61 74 61 62 61 73 65 20 68 61  te3* database ha
5e80: 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62 65 20  ndles cannot be 
5e90: 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74  moved from one t
5ea0: 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e 6f 74  hread.** to anot
5eb0: 68 65 72 20 77 68 69 6c 65 20 6c 6f 63 6b 73 20  her while locks 
5ec0: 61 72 65 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  are held..**.** 
5ed0: 56 65 72 73 69 6f 6e 20 33 2e 33 2e 31 20 28 32  Version 3.3.1 (2
5ee0: 30 30 36 2d 30 31 2d 31 35 29 3a 20 20 75 6e 69  006-01-15):  uni
5ef0: 78 46 69 6c 65 20 63 61 6e 20 62 65 20 6d 6f 76  xFile can be mov
5f00: 65 64 20 66 72 6f 6d 20 6f 6e 65 20 74 68 72 65  ed from one thre
5f10: 61 64 20 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72  ad to.** another
5f20: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 61   as long as we a
5f30: 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61 20  re running on a 
5f40: 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 70 70  system that supp
5f50: 6f 72 74 73 20 74 68 72 65 61 64 73 0a 2a 2a 20  orts threads.** 
5f60: 6f 76 65 72 72 69 64 69 6e 67 20 65 61 63 68 20  overriding each 
5f70: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 77 68  others locks (wh
5f80: 69 63 68 20 69 73 20 6e 6f 77 20 74 68 65 20 6d  ich is now the m
5f90: 6f 73 74 20 63 6f 6d 6d 6f 6e 20 62 65 68 61 76  ost common behav
5fa0: 69 6f 72 29 0a 2a 2a 20 6f 72 20 69 66 20 6e 6f  ior).** or if no
5fb0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
5fc0: 20 20 42 75 74 20 74 68 65 20 75 6e 69 78 46 69    But the unixFi
5fd0: 6c 65 2e 70 4c 6f 63 6b 20 66 69 65 6c 64 20 6e  le.pLock field n
5fe0: 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20 72 65  eeds to be.** re
5ff0: 63 6f 6d 70 75 74 65 64 20 62 65 63 61 75 73 65  computed because
6000: 20 69 74 73 20 6b 65 79 20 69 6e 63 6c 75 64 65   its key include
6010: 73 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 2e  s the thread-id.
6020: 20 20 53 65 65 20 74 68 65 20 0a 2a 2a 20 74 72    See the .** tr
6030: 61 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28  ansferOwnership(
6040: 29 20 66 75 6e 63 74 69 6f 6e 20 62 65 6c 6f 77  ) function below
6050: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6060: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2f 0a 23  information.*/.#
6070: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6080: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6090: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 23 20 64 65 66  __linux__).# def
60a0: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
60b0: 28 58 29 20 20 20 28 58 29 2d 3e 74 69 64 20 3d  (X)   (X)->tid =
60c0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
60d0: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
60e0: 48 52 45 41 44 49 44 28 58 29 20 28 74 68 72 65  HREADID(X) (thre
60f0: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
6100: 74 68 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 26 26  thersLocks==0 &&
6110: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
6130: 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28 28 58  pthread_equal((X
6140: 29 2d 3e 74 69 64 2c 20 70 74 68 72 65 61 64 5f  )->tid, pthread_
6150: 73 65 6c 66 28 29 29 29 0a 23 65 6c 73 65 0a 23  self())).#else.#
6160: 20 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45   define SET_THRE
6170: 41 44 49 44 28 58 29 0a 23 20 64 65 66 69 6e 65  ADID(X).# define
6180: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6190: 58 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  X) 0.#endif../*.
61a0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
61b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
61c0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
61d0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
61e0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
61f0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 4f  particular unixO
6200: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
6210: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
6220: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74 68  .  This.** is th
6230: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 75 6e  e same as the un
6240: 69 78 4c 6f 63 6b 4b 65 79 20 65 78 63 65 70 74  ixLockKey except
6250: 20 74 68 61 74 20 74 68 65 20 74 68 72 65 61 64   that the thread
6260: 20 49 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a   ID is omitted..
6270: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
6280: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
6290: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
62a0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
62b0: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
62c0: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
62d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
62e0: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
62f0: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
6300: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
6310: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
6320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6330: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
6340: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
6350: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
6360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6370: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
6380: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
6390: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
63a0: 74 69 63 75 6c 61 72 20 75 6e 69 78 4c 6f 63 6b  ticular unixLock
63b0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 67  Info structure g
63c0: 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65 2e 0a  iven its inode..
63d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65 61 64 73  **.** If threads
63e0: 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65   cannot override
63f0: 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f 63   each others loc
6400: 6b 73 20 28 4c 69 6e 75 78 54 68 72 65 61 64 73  ks (LinuxThreads
6410: 29 2c 20 74 68 65 6e 20 77 65 0a 2a 2a 20 73 65  ), then we.** se
6420: 74 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b 4b 65  t the unixLockKe
6430: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
6440: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
6450: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
6460: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
6470: 74 68 65 72 73 20 6c 6f 63 6b 73 20 28 50 6f 73  thers locks (Pos
6480: 69 78 20 61 6e 64 20 4e 50 54 4c 29 20 74 68 65  ix and NPTL) the
6490: 6e 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20  n tid is always 
64a0: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  set to zero..** 
64b0: 74 69 64 20 69 73 20 6f 6d 69 74 74 65 64 20 69  tid is omitted i
64c0: 66 20 77 65 20 63 6f 6d 70 69 6c 65 20 77 69 74  f we compile wit
64d0: 68 6f 75 74 20 74 68 72 65 61 64 69 6e 67 20 73  hout threading s
64e0: 75 70 70 6f 72 74 20 6f 72 20 6f 6e 20 61 6e 20  upport or on an 
64f0: 4f 53 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e  OS.** other than
6500: 20 6c 69 6e 75 78 2e 0a 2a 2f 0a 73 74 72 75 63   linux..*/.struc
6510: 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20 7b 0a  t unixLockKey {.
6520: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
6530: 65 49 64 20 66 69 64 3b 20 20 2f 2a 20 55 6e 69  eId fid;  /* Uni
6540: 71 75 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  que identifier f
6550: 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 23  or the file */.#
6560: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
6570: 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28  SAFE && defined(
6580: 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 20 20 70 74 68  __linux__).  pth
6590: 72 65 61 64 5f 74 20 74 69 64 3b 20 20 2f 2a 20  read_t tid;  /* 
65a0: 54 68 72 65 61 64 20 49 44 20 6f 66 20 6c 6f 63  Thread ID of loc
65b0: 6b 20 6f 77 6e 65 72 2e 20 5a 65 72 6f 20 69 66  k owner. Zero if
65c0: 20 6e 6f 74 20 75 73 69 6e 67 20 4c 69 6e 75 78   not using Linux
65d0: 54 68 72 65 61 64 73 20 2a 2f 0a 23 65 6e 64 69  Threads */.#endi
65e0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  f.};../*.** An i
65f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
6600: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
6610: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
6620: 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a  for each open.**
6630: 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20   inode.  Or, on 
6640: 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68  LinuxThreads, th
6650: 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  ere is one of th
6660: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ese structures f
6670: 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65  or.** each inode
6680: 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68 20   opened by each 
6690: 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  thread..**.** A 
66a0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
66b0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
66c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
66d0: 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c   so each unixFil
66e0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63  e.** structure c
66f0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
6700: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6710: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6720: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65  and this.** obje
6730: 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74  ct keeps a count
6740: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6750: 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74  f unixFile point
6760: 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ing to it..*/.st
6770: 72 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66  ruct unixLockInf
6780: 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  o {.  struct uni
6790: 78 4c 6f 63 6b 4b 65 79 20 6c 6f 63 6b 4b 65 79  xLockKey lockKey
67a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f  ;     /* The loo
67b0: 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  kup key */.  int
67c0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
67e0: 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44  Number of SHARED
67f0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
6800: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b 20 20   int locktype;  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45   /* One of SHARE
6830: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
6840: 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20  _LOCK etc. */.  
6850: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
6880: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
6890: 72 75 63 74 75 72 65 20 2a 2f 0a 23 69 66 20 64  ructure */.#if d
68a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
68b0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
68c0: 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  LE).  unsigned l
68d0: 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42  ong long sharedB
68e0: 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50  yte;  /* for AFP
68f0: 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65   simulated share
6900: 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66  d lock */.#endif
6910: 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  .  struct unixLo
6920: 63 6b 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  ckInfo *pNext;  
6930: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
6940: 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 6f  l unixLockInfo o
6950: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 73 74 72 75  bjects */.  stru
6960: 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20  ct unixLockInfo 
6970: 2a 70 50 72 65 76 3b 20 20 20 20 20 2f 2a 20 20  *pPrev;     /*  
6980: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
6990: 6e 6b 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nked */.};../*.*
69a0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
69b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
69c0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
69d0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f  cated for each o
69e0: 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54  pen.** inode.  T
69f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65  his structure ke
6a00: 65 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eps track of the
6a10: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
6a20: 20 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64   on that.** inod
6a30: 65 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69  e.  If a close i
6a40: 73 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69  s attempted agai
6a50: 6e 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61  nst an inode tha
6a60: 74 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  t is holding.** 
6a70: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65  locks, the close
6a80: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
6a90: 69 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65  il all locks cle
6aa0: 61 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65  ar by adding the
6ab0: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
6ac0: 74 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  tor to be closed
6ad0: 20 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20   to the pending 
6ae0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  list..**.** TODO
6af0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 63 68 61 6e  :  Consider chan
6b00: 67 69 6e 67 20 74 68 69 73 20 73 6f 20 74 68 61  ging this so tha
6b10: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
6b20: 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 0a 2a 2a  a single file.**
6b30: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
6b40: 65 61 63 68 20 6f 70 65 6e 20 66 69 6c 65 2c 20  each open file, 
6b50: 65 76 65 6e 20 77 68 65 6e 20 69 74 20 69 73 20  even when it is 
6b60: 6f 70 65 6e 65 64 20 6d 75 6c 74 69 70 6c 65 20  opened multiple 
6b70: 74 69 6d 65 73 2e 0a 2a 2a 20 54 68 65 20 63 6c  times..** The cl
6b80: 6f 73 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ose() system cal
6b90: 6c 20 77 6f 75 6c 64 20 6f 6e 6c 79 20 6f 63 63  l would only occ
6ba0: 75 72 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ur when the last
6bb0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 75 73 69   database.** usi
6bc0: 6e 67 20 74 68 65 20 66 69 6c 65 20 63 6c 6f 73  ng the file clos
6bd0: 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  es..*/.struct un
6be0: 69 78 4f 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74  ixOpenCnt {.  st
6bf0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
6c00: 66 69 6c 65 49 64 3b 20 20 20 2f 2a 20 54 68 65  fileId;   /* The
6c10: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
6c20: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c40: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
6c50: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
6c60: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ture */.  int nL
6c70: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
6c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c90: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
6ca0: 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  ocks */.  UnixUn
6cb0: 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
6cc0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
6cd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
6ce0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 23 69 66   to close */.#if
6cf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65   OS_VXWORKS.  se
6d00: 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20  m_t *pSem;      
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6d20: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
6d30: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
6d40: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
6d50: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 20 2f 2a  ATHNAME+2];   /*
6d60: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
6d70: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
6d80: 66 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f  f.  struct unixO
6d90: 70 65 6e 43 6e 74 20 2a 70 4e 65 78 74 2c 20 2a  penCnt *pNext, *
6da0: 70 50 72 65 76 3b 20 20 20 2f 2a 20 4c 69 73 74  pPrev;   /* List
6db0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 4f 70 65 6e   of all unixOpen
6dc0: 43 6e 74 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d  Cnt objects */.}
6dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 69 73 74 73 20 6f  ;../*.** Lists o
6de0: 66 20 61 6c 6c 20 75 6e 69 78 4c 6f 63 6b 49 6e  f all unixLockIn
6df0: 66 6f 20 61 6e 64 20 75 6e 69 78 4f 70 65 6e 43  fo and unixOpenC
6e00: 6e 74 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 65  nt objects.  The
6e10: 73 65 20 75 73 65 64 20 74 6f 20 62 65 20 68 61  se used to be ha
6e20: 73 68 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 42  sh.** tables.  B
6e30: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
6e40: 20 6f 62 6a 65 63 74 73 20 69 73 20 72 61 72 65   objects is rare
6e50: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 61 20 64  ly more than a d
6e60: 6f 7a 65 6e 20 61 6e 64 0a 2a 2a 20 6e 65 76 65  ozen and.** neve
6e70: 72 20 65 78 63 65 65 64 73 20 61 20 66 65 77 20  r exceeds a few 
6e80: 74 68 6f 75 73 61 6e 64 2e 20 20 41 6e 64 20 6c  thousand.  And l
6e90: 6f 6f 6b 75 70 20 69 73 20 6e 6f 74 20 6f 6e 20  ookup is not on 
6ea0: 61 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 70 61  a critical.** pa
6eb0: 74 68 20 73 6f 20 61 20 73 69 6d 70 6c 65 20 6c  th so a simple l
6ec0: 69 6e 6b 65 64 20 6c 69 73 74 20 77 69 6c 6c 20  inked list will 
6ed0: 73 75 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74  suffice..*/.stat
6ee0: 69 63 20 73 74 72 75 63 74 20 75 6e 69 78 4c 6f  ic struct unixLo
6ef0: 63 6b 49 6e 66 6f 20 2a 6c 6f 63 6b 4c 69 73 74  ckInfo *lockList
6f00: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 73 74 72   = 0;.static str
6f10: 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20  uct unixOpenCnt 
6f20: 2a 6f 70 65 6e 4c 69 73 74 20 3d 20 30 3b 0a 0a  *openList = 0;..
6f30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
6f40: 62 6c 65 20 72 65 6d 65 6d 62 65 72 73 20 77 68  ble remembers wh
6f50: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72  ether or not thr
6f60: 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64  eads can overrid
6f70: 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a 2a  e each others.**
6f80: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   locks..**.**   
6f90: 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61 64   0:  No.  Thread
6fa0: 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64  s cannot overrid
6fb0: 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c 6f  e each others lo
6fc0: 63 6b 73 2e 20 20 28 4c 69 6e 75 78 54 68 72 65  cks.  (LinuxThre
6fd0: 61 64 73 29 0a 2a 2a 20 20 20 20 31 3a 20 20 59  ads).**    1:  Y
6fe0: 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61 6e  es.  Threads can
6ff0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
7000: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 28 50  thers locks.  (P
7010: 6f 73 69 78 20 26 20 4e 4c 50 54 29 0a 2a 2a 20  osix & NLPT).** 
7020: 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74 20    -1:  We don't 
7030: 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2a 0a 2a 2a 20  know yet..**.** 
7040: 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
7050: 20 77 65 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   we know at comp
7060: 69 6c 65 2d 74 69 6d 65 20 69 66 20 74 68 72 65  ile-time if thre
7070: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
7080: 20 65 61 63 68 0a 2a 2a 20 6f 74 68 65 72 73 20   each.** others 
7090: 6c 6f 63 6b 73 2e 20 20 4f 6e 20 74 68 6f 73 65  locks.  On those
70a0: 20 73 79 73 74 65 6d 73 2c 20 74 68 65 20 53 51   systems, the SQ
70b0: 4c 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52  LITE_THREAD_OVER
70c0: 52 49 44 45 5f 4c 4f 43 4b 20 6d 61 63 72 6f 0a  RIDE_LOCK macro.
70d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 73 65 74 20 61  ** will be set a
70e0: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 4f  ppropriately.  O
70f0: 6e 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2c  n other systems,
7100: 20 77 65 20 68 61 76 65 20 74 6f 20 63 68 65 63   we have to chec
7110: 6b 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2e  k at.** runtime.
7120: 20 20 4f 6e 20 74 68 65 73 65 20 6c 61 74 74 65    On these latte
7130: 72 20 73 79 73 74 65 6d 73 2c 20 53 51 4c 54 49  r systems, SQLTI
7140: 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52 49 44  E_THREAD_OVERRID
7150: 45 5f 4c 4f 43 4b 20 69 73 0a 2a 2a 20 75 6e 64  E_LOCK is.** und
7160: 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  efined..**.** Th
7170: 69 73 20 76 61 72 69 61 62 6c 65 20 6e 6f 72 6d  is variable norm
7180: 61 6c 6c 79 20 68 61 73 20 66 69 6c 65 20 73 63  ally has file sc
7190: 6f 70 65 20 6f 6e 6c 79 2e 20 20 42 75 74 20 64  ope only.  But d
71a0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2c 20 77  uring testing, w
71b0: 65 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 61 20 67  e make.** it a g
71c0: 6c 6f 62 61 6c 20 73 6f 20 74 68 61 74 20 74 68  lobal so that th
71d0: 65 20 74 65 73 74 20 63 6f 64 65 20 63 61 6e 20  e test code can 
71e0: 63 68 61 6e 67 65 20 69 74 73 20 76 61 6c 75 65  change its value
71f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 76 65 72   in order to ver
7200: 69 66 79 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ify.** that the 
7210: 72 69 67 68 74 20 73 74 75 66 66 20 68 61 70 70  right stuff happ
7220: 65 6e 73 20 69 6e 20 65 69 74 68 65 72 20 63 61  ens in either ca
7230: 73 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  se..*/.#if SQLIT
7240: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
7250: 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
7260: 5f 29 0a 23 20 20 69 66 6e 64 65 66 20 53 51 4c  _).#  ifndef SQL
7270: 49 54 45 5f 54 48 52 45 41 44 5f 4f 56 45 52 52  ITE_THREAD_OVERR
7280: 49 44 45 5f 4c 4f 43 4b 0a 23 20 20 20 20 64 65  IDE_LOCK.#    de
7290: 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 48 52 45  fine SQLITE_THRE
72a0: 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f 43 4b  AD_OVERRIDE_LOCK
72b0: 20 2d 31 0a 23 20 20 65 6e 64 69 66 0a 23 20 20   -1.#  endif.#  
72c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
72d0: 54 0a 69 6e 74 20 74 68 72 65 61 64 73 4f 76 65  T.int threadsOve
72e0: 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c  rrideEachOthersL
72f0: 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54 48  ocks = SQLITE_TH
7300: 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c 4f  READ_OVERRIDE_LO
7310: 43 4b 3b 0a 23 20 20 65 6c 73 65 0a 73 74 61 74  CK;.#  else.stat
7320: 69 63 20 69 6e 74 20 74 68 72 65 61 64 73 4f 76  ic int threadsOv
7330: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7340: 4c 6f 63 6b 73 20 3d 20 53 51 4c 49 54 45 5f 54  Locks = SQLITE_T
7350: 48 52 45 41 44 5f 4f 56 45 52 52 49 44 45 5f 4c  HREAD_OVERRIDE_L
7360: 4f 43 4b 3b 0a 23 20 20 65 6e 64 69 66 0a 23 65  OCK;.#  endif.#e
7370: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7380: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
7390: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   information pas
73a0: 73 65 64 20 69 6e 74 6f 20 69 6e 64 69 76 69 64  sed into individ
73b0: 75 61 6c 20 74 65 73 74 0a 2a 2a 20 74 68 72 65  ual test.** thre
73c0: 61 64 73 20 62 79 20 74 68 65 20 74 65 73 74 54  ads by the testT
73d0: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68 61  hreadLockingBeha
73e0: 76 69 6f 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  vior() routine..
73f0: 2a 2f 0a 73 74 72 75 63 74 20 74 68 72 65 61 64  */.struct thread
7400: 54 65 73 74 44 61 74 61 20 7b 0a 20 20 69 6e 74  TestData {.  int
7410: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
7420: 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 62      /* File to b
7430: 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 73 74  e locked */.  st
7440: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
7450: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b       /* The lock
7460: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ing operation */
7470: 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 20 20  .  int result;  
7480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
7490: 75 6c 74 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  ult of the locki
74a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ng operation */.
74b0: 7d 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  };..#if SQLITE_T
74c0: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
74d0: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a  ined(__linux__).
74e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
74f0: 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74  ion is used as t
7500: 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65 20  he main routine 
7510: 66 6f 72 20 61 20 74 68 72 65 61 64 20 6c 61 75  for a thread lau
7520: 6e 63 68 65 64 20 62 79 0a 2a 2a 20 74 65 73 74  nched by.** test
7530: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
7540: 61 76 69 6f 72 28 29 2e 20 49 74 20 74 65 73 74  avior(). It test
7550: 73 20 77 68 65 74 68 65 72 20 74 68 65 20 73 68  s whether the sh
7560: 61 72 65 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  ared-lock obtain
7570: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 61 69  ed.** by the mai
7580: 6e 20 74 68 72 65 61 64 20 69 6e 20 74 65 73 74  n thread in test
7590: 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65 68  ThreadLockingBeh
75a0: 61 76 69 6f 72 28 29 20 63 6f 6e 66 6c 69 63 74  avior() conflict
75b0: 73 20 77 69 74 68 20 61 0a 2a 2a 20 68 79 70 6f  s with a.** hypo
75c0: 74 68 65 74 69 63 61 6c 20 77 72 69 74 65 2d 6c  thetical write-l
75d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ock obtained by 
75e0: 74 68 69 73 20 74 68 72 65 61 64 20 6f 6e 20 74  this thread on t
75f0: 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a  he same file..**
7600: 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 2d 6c 6f  .** The write-lo
7610: 63 6b 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ck is not actual
7620: 6c 79 20 61 63 71 75 69 72 65 64 2c 20 61 73 20  ly acquired, as 
7630: 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
7640: 69 62 6c 65 20 69 66 20 0a 2a 2a 20 74 68 65 20  ible if .** the 
7650: 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 69 6e 20  file is open in 
7660: 72 65 61 64 2d 6f 6e 6c 79 20 6d 6f 64 65 20 28  read-only mode (
7670: 73 65 65 20 74 69 63 6b 65 74 20 23 33 34 37 32  see ticket #3472
7680: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
7690: 69 64 20 2a 74 68 72 65 61 64 4c 6f 63 6b 69 6e  id *threadLockin
76a0: 67 54 65 73 74 28 76 6f 69 64 20 2a 70 41 72 67  gTest(void *pArg
76b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  ){.  struct thre
76c0: 61 64 54 65 73 74 44 61 74 61 20 2a 70 44 61 74  adTestData *pDat
76d0: 61 20 3d 20 28 73 74 72 75 63 74 20 74 68 72 65  a = (struct thre
76e0: 61 64 54 65 73 74 44 61 74 61 2a 29 70 41 72 67  adTestData*)pArg
76f0: 3b 0a 20 20 70 44 61 74 61 2d 3e 72 65 73 75 6c  ;.  pData->resul
7700: 74 20 3d 20 66 63 6e 74 6c 28 70 44 61 74 61 2d  t = fcntl(pData-
7710: 3e 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 70  >fd, F_GETLK, &p
7720: 44 61 74 61 2d 3e 6c 6f 63 6b 29 3b 0a 20 20 72  Data->lock);.  r
7730: 65 74 75 72 6e 20 70 41 72 67 3b 0a 7d 0a 23 65  eturn pArg;.}.#e
7740: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
7750: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
7760: 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20  ined(__linux__) 
7770: 2a 2f 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  */...#if SQLITE_
7780: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65  THREADSAFE && de
7790: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 63  ./*.** This proc
77b0: 65 64 75 72 65 20 61 74 74 65 6d 70 74 73 20 74  edure attempts t
77c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
77d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61  her or not threa
77e0: 64 73 0a 2a 2a 20 63 61 6e 20 6f 76 65 72 72 69  ds.** can overri
77f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
7800: 6f 63 6b 73 20 74 68 65 6e 20 73 65 74 73 20 74  ocks then sets t
7810: 68 65 20 0a 2a 2a 20 74 68 72 65 61 64 73 4f 76  he .** threadsOv
7820: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7830: 4c 6f 63 6b 73 20 76 61 72 69 61 62 6c 65 20 61  Locks variable a
7840: 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 2a 2f  ppropriately..*/
7850: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
7860: 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e 67 42 65  tThreadLockingBe
7870: 68 61 76 69 6f 72 28 69 6e 74 20 66 64 5f 6f 72  havior(int fd_or
7880: 69 67 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  ig){.  int fd;. 
7890: 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
78a0: 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74 61  t threadTestData
78b0: 20 64 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f   d;.  struct flo
78c0: 63 6b 20 6c 3b 0a 20 20 70 74 68 72 65 61 64 5f  ck l;.  pthread_
78d0: 74 20 74 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70  t t;..  fd = dup
78e0: 28 66 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28  (fd_orig);.  if(
78f0: 20 66 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a   fd<0 ) return;.
7900: 20 20 6d 65 6d 73 65 74 28 26 6c 2c 20 30 2c 20    memset(&l, 0, 
7910: 73 69 7a 65 6f 66 28 6c 29 29 3b 0a 20 20 6c 2e  sizeof(l));.  l.
7920: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
7930: 3b 0a 20 20 6c 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  ;.  l.l_len = 1;
7940: 0a 20 20 6c 2e 6c 5f 73 74 61 72 74 20 3d 20 30  .  l.l_start = 0
7950: 3b 0a 20 20 6c 2e 6c 5f 77 68 65 6e 63 65 20 3d  ;.  l.l_whence =
7960: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 72 63 20   SEEK_SET;.  rc 
7970: 3d 20 66 63 6e 74 6c 28 66 64 5f 6f 72 69 67 2c  = fcntl(fd_orig,
7980: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 29 3b 0a 20   F_SETLK, &l);. 
7990: 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
79a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  urn;.  memset(&d
79b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 29 29 3b  , 0, sizeof(d));
79c0: 0a 20 20 64 2e 66 64 20 3d 20 66 64 3b 0a 20 20  .  d.fd = fd;.  
79d0: 64 2e 6c 6f 63 6b 20 3d 20 6c 3b 0a 20 20 64 2e  d.lock = l;.  d.
79e0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
79f0: 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 70 74 68  WRLCK;.  if( pth
7a00: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 2c 20  read_create(&t, 
7a10: 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67  0, threadLocking
7a20: 54 65 73 74 2c 20 26 64 29 3d 3d 30 20 29 7b 0a  Test, &d)==0 ){.
7a30: 20 20 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e      pthread_join
7a40: 28 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c  (t, 0);.  }.  cl
7a50: 6f 73 65 28 66 64 29 3b 0a 20 20 69 66 28 20 64  ose(fd);.  if( d
7a60: 2e 72 65 73 75 6c 74 21 3d 30 20 29 20 72 65 74  .result!=0 ) ret
7a70: 75 72 6e 3b 0a 20 20 74 68 72 65 61 64 73 4f 76  urn;.  threadsOv
7a80: 65 72 72 69 64 65 45 61 63 68 4f 74 68 65 72 73  errideEachOthers
7a90: 4c 6f 63 6b 73 20 3d 20 28 64 2e 6c 6f 63 6b 2e  Locks = (d.lock.
7aa0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 29  l_type==F_UNLCK)
7ab0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7ac0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
7ad0: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  && defined(__lin
7ae0: 75 78 5f 5f 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ux__) */../*.** 
7af0: 52 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4c 6f  Release a unixLo
7b00: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
7b10: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
7b20: 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63  cated by findLoc
7b30: 6b 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  kInfo()..**.** T
7b40: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
7b50: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
7b60: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
7b70: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
7b80: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
7b90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
7ba0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
7bb0: 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66  d releaseLockInf
7bc0: 6f 28 73 74 72 75 63 74 20 75 6e 69 78 4c 6f 63  o(struct unixLoc
7bd0: 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20  kInfo *pLock){. 
7be0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
7bf0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
7c00: 28 20 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ( pLock ){.    p
7c10: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
7c20: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65    if( pLock->nRe
7c30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
7c40: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 29  ( pLock->pPrev )
7c50: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7c60: 28 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 2d 3e  ( pLock->pPrev->
7c70: 70 4e 65 78 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a  pNext==pLock );.
7c80: 20 20 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70          pLock->p
7c90: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Prev->pNext = pL
7ca0: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
7cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7cc0: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 4c 69 73   assert( lockLis
7cd0: 74 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  t==pLock );.    
7ce0: 20 20 20 20 6c 6f 63 6b 4c 69 73 74 20 3d 20 70      lockList = p
7cf0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
7d00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
7d10: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Lock->pNext ){. 
7d20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7d30: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Lock->pNext->pPr
7d40: 65 76 3d 3d 70 4c 6f 63 6b 20 29 3b 0a 20 20 20  ev==pLock );.   
7d50: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78       pLock->pNex
7d60: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
7d70: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
7d80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
7d90: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
7da0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
7db0: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 4f 70 65  elease a unixOpe
7dc0: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 70  nCnt structure p
7dd0: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
7de0: 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49  ted by findLockI
7df0: 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nfo()..**.** The
7e00: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
7e10: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
7e20: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
7e30: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
7e40: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
7e50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
7e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e70: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 73  releaseOpenCnt(s
7e80: 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e  truct unixOpenCn
7e90: 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 61 73 73  t *pOpen){.  ass
7ea0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
7eb0: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 4f  ld() );.  if( pO
7ec0: 70 65 6e 20 29 7b 0a 20 20 20 20 70 4f 70 65 6e  pen ){.    pOpen
7ed0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
7ee0: 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30  ( pOpen->nRef==0
7ef0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
7f00: 70 65 6e 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  pen->pPrev ){.  
7f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
7f20: 70 65 6e 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  pen->pPrev->pNex
7f30: 74 3d 3d 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20  t==pOpen );.    
7f40: 20 20 20 20 70 4f 70 65 6e 2d 3e 70 50 72 65 76      pOpen->pPrev
7f50: 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 70 65 6e 2d  ->pNext = pOpen-
7f60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
7f70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7f80: 65 72 74 28 20 6f 70 65 6e 4c 69 73 74 3d 3d 70  ert( openList==p
7f90: 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  Open );.        
7fa0: 6f 70 65 6e 4c 69 73 74 20 3d 20 70 4f 70 65 6e  openList = pOpen
7fb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
7fc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e  .      if( pOpen
7fd0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
7fe0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
7ff0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d  ->pNext->pPrev==
8000: 70 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 20  pOpen );.       
8010: 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 2d 3e 70   pOpen->pNext->p
8020: 50 72 65 76 20 3d 20 70 4f 70 65 6e 2d 3e 70 50  Prev = pOpen->pP
8030: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  rev;.      }.#if
8040: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8050: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8060: 6c 69 6e 75 78 5f 5f 29 0a 20 20 20 20 20 20 61  linux__).      a
8070: 73 73 65 72 74 28 20 21 70 4f 70 65 6e 2d 3e 70  ssert( !pOpen->p
8080: 55 6e 75 73 65 64 20 7c 7c 20 74 68 72 65 61 64  Unused || thread
8090: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
80a0: 65 72 73 4c 6f 63 6b 73 3d 3d 30 20 29 3b 0a 23  ersLocks==0 );.#
80b0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
80c0: 49 66 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65  If pOpen->pUnuse
80d0: 64 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 74  d is not null, t
80e0: 68 65 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 66  hen memory and f
80f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 0a  ile-descriptors.
8100: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6c 65 61        ** are lea
8110: 6b 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ked..      **.  
8120: 20 20 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c      ** This will
8130: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 2c   only happen if,
8140: 20 75 6e 64 65 72 20 4c 69 6e 75 78 74 68 72 65   under Linuxthre
8150: 61 64 73 2c 20 74 68 65 20 75 73 65 72 20 68 61  ads, the user ha
8160: 73 20 6f 70 65 6e 65 64 0a 20 20 20 20 20 20 2a  s opened.      *
8170: 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
8180: 69 6e 20 6f 6e 65 20 74 68 72 65 61 64 2c 20 74  in one thread, t
8190: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
81a0: 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
81b0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
81c0: 6c 65 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  le from another 
81d0: 74 68 72 65 61 64 20 28 77 69 74 68 6f 75 74 20  thread (without 
81e0: 66 69 72 73 74 20 75 6e 6c 6f 63 6b 69 6e 67 20  first unlocking 
81f0: 74 68 65 20 64 62 20 66 69 6c 65 29 2e 0a 20 20  the db file)..  
8200: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
8210: 20 6d 69 73 75 73 65 2e 20 20 2a 2f 0a 20 20 20   misuse.  */.   
8220: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8230: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  pOpen);.    }.  
8240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
8250: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8260: 6f 72 2c 20 6c 6f 63 61 74 65 20 75 6e 69 78 4c  or, locate unixL
8270: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 75 6e 69 78  ockInfo and unix
8280: 4f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  OpenCnt structur
8290: 65 73 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  es that.** descr
82a0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
82b0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
82c0: 74 65 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e  te new ones if n
82d0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
82e0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
82f0: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
8300: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
8310: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
8320: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
8330: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
8340: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
8350: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
8360: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
8370: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
8380: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
8390: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
83a0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
83b0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 4c  static int findL
83c0: 6f 63 6b 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46  ockInfo(.  unixF
83d0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
83e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69            /* Uni
83f0: 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65  x file with file
8400: 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74 68   desc used in th
8410: 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
8420: 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a  t unixLockInfo *
8430: 2a 70 70 4c 6f 63 6b 2c 20 20 2f 2a 20 52 65 74  *ppLock,  /* Ret
8440: 75 72 6e 20 74 68 65 20 75 6e 69 78 4c 6f 63 6b  urn the unixLock
8450: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  Info structure h
8460: 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
8470: 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 2a 70 70  unixOpenCnt **pp
8480: 4f 70 65 6e 20 20 20 20 2f 2a 20 52 65 74 75 72  Open    /* Retur
8490: 6e 20 74 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e  n the unixOpenCn
84a0: 74 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  t structure here
84b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65          /* Syste
84e0: 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f  m call return co
84f0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  de */.  int fd; 
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
8530: 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72  r pFile */.  str
8540: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 4b 65 79 20  uct unixLockKey 
8550: 6c 6f 63 6b 4b 65 79 3b 20 20 20 20 2f 2a 20 4c  lockKey;    /* L
8560: 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68  ookup key for th
8570: 65 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 73  e unixLockInfo s
8580: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 73 74  tructure */.  st
8590: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
85a0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20  fileId;      /* 
85b0: 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74  Lookup key for t
85c0: 68 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 73  he unixOpenCnt s
85d0: 74 72 75 63 74 20 2a 2f 0a 20 20 73 74 72 75 63  truct */.  struc
85e0: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
8600: 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
8610: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  rmation */.  str
8620: 75 63 74 20 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f  uct unixLockInfo
8630: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 43   *pLock = 0;/* C
8640: 61 6e 64 69 64 61 74 65 20 75 6e 69 78 4c 6f 63  andidate unixLoc
8650: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a  kInfo object */.
8660: 20 20 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65    struct unixOpe
8670: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 20 20 20 20  nCnt *pOpen;    
8680: 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e   /* Candidate un
8690: 69 78 4f 70 65 6e 43 6e 74 20 6f 62 6a 65 63 74  ixOpenCnt object
86a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
86b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
86c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
86d0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
86e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
86f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
8700: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
8710: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
8720: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
8730: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
8740: 68 3b 0a 20 20 72 63 20 3d 20 66 73 74 61 74 28  h;.  rc = fstat(
8750: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
8760: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8770: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
8780: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 64  no = errno;.#ifd
8790: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
87a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
87b0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
87c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
87d0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
87e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
87f0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
8800: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
8810: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
8820: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
8830: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
8840: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
8850: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
8860: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
8870: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
8880: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
8890: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
88a0: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
88b0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
88c0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
88d0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
88e0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
88f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
8900: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
8910: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
8920: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
8930: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
8940: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
8950: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
8960: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
8970: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
8980: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
8990: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
89a0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
89b0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
89c0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
89d0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
89e0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
89f0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
8a00: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
8a10: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
8a20: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
8a30: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
8a40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
8a50: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
8a60: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
8a70: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
8a80: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
8a90: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
8aa0: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
8ab0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
8ac0: 77 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  write(fd, "S", 1
8ad0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
8ae0: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8af0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b00: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 73     }.    rc = fs
8b30: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
8b40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
8b50: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
8b60: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
8b70: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
8b80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8b90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8ba0: 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 4b  .  memset(&lockK
8bb0: 65 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 6f  ey, 0, sizeof(lo
8bc0: 63 6b 4b 65 79 29 29 3b 0a 20 20 6c 6f 63 6b 4b  ckKey));.  lockK
8bd0: 65 79 2e 66 69 64 2e 64 65 76 20 3d 20 73 74 61  ey.fid.dev = sta
8be0: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
8bf0: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 6c 6f   OS_VXWORKS.  lo
8c00: 63 6b 4b 65 79 2e 66 69 64 2e 70 49 64 20 3d 20  ckKey.fid.pId = 
8c10: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
8c20: 65 0a 20 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 2e  e.  lockKey.fid.
8c30: 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74  ino = statbuf.st
8c40: 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  _ino;.#endif.#if
8c50: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8c60: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  FE && defined(__
8c70: 6c 69 6e 75 78 5f 5f 29 0a 20 20 69 66 28 20 74  linux__).  if( t
8c80: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
8c90: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20  chOthersLocks<0 
8ca0: 29 7b 0a 20 20 20 20 74 65 73 74 54 68 72 65 61  ){.    testThrea
8cb0: 64 4c 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72  dLockingBehavior
8cc0: 28 66 64 29 3b 0a 20 20 7d 0a 20 20 6c 6f 63 6b  (fd);.  }.  lock
8cd0: 4b 65 79 2e 74 69 64 20 3d 20 74 68 72 65 61 64  Key.tid = thread
8ce0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
8cf0: 65 72 73 4c 6f 63 6b 73 20 3f 20 30 20 3a 20 70  ersLocks ? 0 : p
8d00: 74 68 72 65 61 64 5f 73 65 6c 66 28 29 3b 0a 23  thread_self();.#
8d10: 65 6e 64 69 66 0a 20 20 66 69 6c 65 49 64 20 3d  endif.  fileId =
8d20: 20 6c 6f 63 6b 4b 65 79 2e 66 69 64 3b 0a 20 20   lockKey.fid;.  
8d30: 69 66 28 20 70 70 4c 6f 63 6b 21 3d 30 20 29 7b  if( ppLock!=0 ){
8d40: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 6c 6f 63  .    pLock = loc
8d50: 6b 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  kList;.    while
8d60: 28 20 70 4c 6f 63 6b 20 26 26 20 6d 65 6d 63 6d  ( pLock && memcm
8d70: 70 28 26 6c 6f 63 6b 4b 65 79 2c 20 26 70 4c 6f  p(&lockKey, &pLo
8d80: 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 20 73 69 7a  ck->lockKey, siz
8d90: 65 6f 66 28 6c 6f 63 6b 4b 65 79 29 29 20 29 7b  eof(lockKey)) ){
8da0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
8db0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
8dc0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b   }.    if( pLock
8dd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==0 ){.      pLo
8de0: 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ck = sqlite3_mal
8df0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f  loc( sizeof(*pLo
8e00: 63 6b 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ck) );.      if(
8e10: 20 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20   pLock==0 ){.   
8e20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8e30: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
8e40: 67 6f 74 6f 20 65 78 69 74 5f 66 69 6e 64 6c 6f  goto exit_findlo
8e50: 63 6b 69 6e 66 6f 3b 0a 20 20 20 20 20 20 7d 0a  ckinfo;.      }.
8e60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4c        memcpy(&pL
8e70: 6f 63 6b 2d 3e 6c 6f 63 6b 4b 65 79 2c 26 6c 6f  ock->lockKey,&lo
8e80: 63 6b 4b 65 79 2c 73 69 7a 65 6f 66 28 6c 6f 63  ckKey,sizeof(loc
8e90: 6b 4b 65 79 29 29 3b 0a 20 20 20 20 20 20 70 4c  kKey));.      pL
8ea0: 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ock->nRef = 1;. 
8eb0: 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20       pLock->cnt 
8ec0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  = 0;.      pLock
8ed0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a  ->locktype = 0;.
8ee0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8f00: 47 5f 53 54 59 4c 45 29 0a 20 20 20 20 20 20 70  G_STYLE).      p
8f10: 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
8f20: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
8f30: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
8f40: 3d 20 6c 6f 63 6b 4c 69 73 74 3b 0a 20 20 20 20  = lockList;.    
8f50: 20 20 70 4c 6f 63 6b 2d 3e 70 50 72 65 76 20 3d    pLock->pPrev =
8f60: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f   0;.      if( lo
8f70: 63 6b 4c 69 73 74 20 29 20 6c 6f 63 6b 4c 69 73  ckList ) lockLis
8f80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4c 6f 63 6b  t->pPrev = pLock
8f90: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 4c 69 73 74  ;.      lockList
8fa0: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65   = pLock;.    }e
8fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  lse{.      pLock
8fc0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
8fd0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 70 4c      *ppLock = pL
8fe0: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ock;.  }.  if( p
8ff0: 70 4f 70 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  pOpen!=0 ){.    
9000: 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73 74  pOpen = openList
9010: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f 70  ;.    while( pOp
9020: 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69  en && memcmp(&fi
9030: 6c 65 49 64 2c 20 26 70 4f 70 65 6e 2d 3e 66 69  leId, &pOpen->fi
9040: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
9050: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 20 20 70  eId)) ){.      p
9060: 4f 70 65 6e 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e  Open = pOpen->pN
9070: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
9080: 66 28 20 70 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  f( pOpen==0 ){. 
9090: 20 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c       pOpen = sql
90a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
90b0: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
90c0: 20 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d       if( pOpen==
90d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
90e0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f  easeLockInfo(pLo
90f0: 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ck);.        rc 
9100: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9110: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
9120: 74 5f 66 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3b 0a  t_findlockinfo;.
9130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
9140: 6d 73 65 74 28 70 4f 70 65 6e 2c 20 30 2c 20 73  mset(pOpen, 0, s
9150: 69 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 29 3b 0a  izeof(*pOpen));.
9160: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 66 69 6c        pOpen->fil
9170: 65 49 64 20 3d 20 66 69 6c 65 49 64 3b 0a 20 20  eId = fileId;.  
9180: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20      pOpen->nRef 
9190: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  = 1;.      pOpen
91a0: 2d 3e 70 4e 65 78 74 20 3d 20 6f 70 65 6e 4c 69  ->pNext = openLi
91b0: 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  st;.      if( op
91c0: 65 6e 4c 69 73 74 20 29 20 6f 70 65 6e 4c 69 73  enList ) openLis
91d0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 4f 70 65 6e  t->pPrev = pOpen
91e0: 3b 0a 20 20 20 20 20 20 6f 70 65 6e 4c 69 73 74  ;.      openList
91f0: 20 3d 20 70 4f 70 65 6e 3b 0a 20 20 20 20 7d 65   = pOpen;.    }e
9200: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f 70 65 6e  lse{.      pOpen
9210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
9220: 20 20 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f      *ppOpen = pO
9230: 70 65 6e 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 66  pen;.  }..exit_f
9240: 69 6e 64 6c 6f 63 6b 69 6e 66 6f 3a 0a 20 20 72  indlockinfo:.  r
9250: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9260: 2a 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  ** If we are cur
9270: 72 65 6e 74 6c 79 20 69 6e 20 61 20 64 69 66 66  rently in a diff
9280: 65 72 65 6e 74 20 74 68 72 65 61 64 20 74 68 61  erent thread tha
9290: 6e 20 74 68 65 20 74 68 72 65 61 64 20 74 68 61  n the thread tha
92a0: 74 20 74 68 65 0a 2a 2a 20 75 6e 69 78 46 69 6c  t the.** unixFil
92b0: 65 20 61 72 67 75 6d 65 6e 74 20 62 65 6c 6f 6e  e argument belon
92c0: 67 73 20 74 6f 2c 20 74 68 65 6e 20 74 72 61 6e  gs to, then tran
92d0: 73 66 65 72 20 6f 77 6e 65 72 73 68 69 70 20 6f  sfer ownership o
92e0: 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a  f the unixFile.*
92f0: 2a 20 6f 76 65 72 20 74 6f 20 74 68 65 20 63 75  * over to the cu
9300: 72 72 65 6e 74 20 74 68 72 65 61 64 2e 0a 2a 2a  rrent thread..**
9310: 0a 2a 2a 20 41 20 75 6e 69 78 46 69 6c 65 20 69  .** A unixFile i
9320: 73 20 6f 6e 6c 79 20 6f 77 6e 65 64 20 62 79 20  s only owned by 
9330: 61 20 74 68 72 65 61 64 20 6f 6e 20 73 79 73 74  a thread on syst
9340: 65 6d 73 20 74 68 61 74 20 75 73 65 20 4c 69 6e  ems that use Lin
9350: 75 78 54 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  uxThreads..**.**
9360: 20 4f 77 6e 65 72 73 68 69 70 20 74 72 61 6e 73   Ownership trans
9370: 66 65 72 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  fer is only allo
9380: 77 65 64 20 69 66 20 74 68 65 20 75 6e 69 78 46  wed if the unixF
9390: 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
93a0: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2a 20 49 66   unlocked..** If
93b0: 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 69 73   the unixFile is
93c0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 6f   locked and an o
93d0: 77 6e 65 72 73 68 69 70 20 69 73 20 77 72 6f 6e  wnership is wron
93e0: 67 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  g, then return.*
93f0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e  * SQLITE_MISUSE.
9400: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72    SQLITE_OK is r
9410: 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
9420: 74 68 69 6e 67 20 77 6f 72 6b 73 2e 0a 2a 2f 0a  thing works..*/.
9430: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
9440: 44 53 41 46 45 20 26 26 20 64 65 66 69 6e 65 64  DSAFE && defined
9450: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 0a 73 74 61 74  (__linux__).stat
9460: 69 63 20 69 6e 74 20 74 72 61 6e 73 66 65 72 4f  ic int transferO
9470: 77 6e 65 72 73 68 69 70 28 75 6e 69 78 46 69 6c  wnership(unixFil
9480: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
9490: 20 72 63 3b 0a 20 20 70 74 68 72 65 61 64 5f 74   rc;.  pthread_t
94a0: 20 68 53 65 6c 66 3b 0a 20 20 69 66 28 20 74 68   hSelf;.  if( th
94b0: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
94c0: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 29 7b 0a  hOthersLocks ){.
94d0: 20 20 20 20 2f 2a 20 4f 77 6e 65 72 73 68 69 70      /* Ownership
94e0: 20 74 72 61 6e 73 66 65 72 73 20 6e 6f 74 20 6e   transfers not n
94f0: 65 65 64 65 64 20 6f 6e 20 74 68 69 73 20 73 79  eeded on this sy
9500: 73 74 65 6d 20 2a 2f 0a 20 20 20 20 72 65 74 75  stem */.    retu
9510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
9520: 7d 0a 20 20 68 53 65 6c 66 20 3d 20 70 74 68 72  }.  hSelf = pthr
9530: 65 61 64 5f 73 65 6c 66 28 29 3b 0a 20 20 69 66  ead_self();.  if
9540: 28 20 70 74 68 72 65 61 64 5f 65 71 75 61 6c 28  ( pthread_equal(
9550: 70 46 69 6c 65 2d 3e 74 69 64 2c 20 68 53 65 6c  pFile->tid, hSel
9560: 66 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  f) ){.    /* We 
9570: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
9580: 20 73 61 6d 65 20 74 68 72 65 61 64 20 2a 2f 0a   same thread */.
9590: 20 20 20 20 4f 53 54 52 41 43 45 31 28 22 4e 6f      OSTRACE1("No
95a0: 2d 74 72 61 6e 73 66 65 72 2c 20 73 61 6d 65 20  -transfer, same 
95b0: 74 68 72 65 61 64 5c 6e 22 29 3b 0a 20 20 20 20  thread\n");.    
95c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
95d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c  ;.  }.  if( pFil
95e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
95f0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 57  LOCK ){.    /* W
9600: 65 20 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20  e cannot change 
9610: 6f 77 6e 65 72 73 68 69 70 20 77 68 69 6c 65 20  ownership while 
9620: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
9630: 20 6c 6f 63 6b 21 20 2a 2f 0a 20 20 20 20 72 65   lock! */.    re
9640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9650: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 4f  SE_BKPT;.  }.  O
9660: 53 54 52 41 43 45 34 28 22 54 72 61 6e 73 66 65  STRACE4("Transfe
9670: 72 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 25  r ownership of %
9680: 64 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c  d from %d to %d\
9690: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
96a0: 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
96b0: 3e 74 69 64 2c 20 68 53 65 6c 66 29 3b 0a 20 20  >tid, hSelf);.  
96c0: 70 46 69 6c 65 2d 3e 74 69 64 20 3d 20 68 53 65  pFile->tid = hSe
96d0: 6c 66 3b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  lf;.  if (pFile-
96e0: 3e 70 4c 6f 63 6b 20 21 3d 20 4e 55 4c 4c 29 20  >pLock != NULL) 
96f0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63  {.    releaseLoc
9700: 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f  kInfo(pFile->pLo
9710: 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  ck);.    rc = fi
9720: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 70 46 69 6c 65  ndLockInfo(pFile
9730: 2c 20 26 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2c  , &pFile->pLock,
9740: 20 30 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45   0);.    OSTRACE
9750: 35 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 69 73  5("LOCK    %d is
9760: 20 6e 6f 77 20 25 73 28 25 73 2c 25 64 29 5c 6e   now %s(%s,%d)\n
9770: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
9780: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
9790: 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  Name(pFile->lock
97a0: 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20 20 20  type),.         
97b0: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70    locktypeName(p
97c0: 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63  File->pLock->loc
97d0: 6b 74 79 70 65 29 2c 20 70 46 69 6c 65 2d 3e 70  ktype), pFile->p
97e0: 4c 6f 63 6b 2d 3e 63 6e 74 29 3b 0a 20 20 20 20  Lock->cnt);.    
97f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
9800: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
9810: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9820: 7d 0a 23 65 6c 73 65 20 20 2f 2a 20 69 66 20 6e  }.#else  /* if n
9830: 6f 74 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ot SQLITE_THREAD
9840: 53 41 46 45 20 2a 2f 0a 20 20 2f 2a 20 4f 6e 20  SAFE */.  /* On 
9850: 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 20  single-threaded 
9860: 62 75 69 6c 64 73 2c 20 6f 77 6e 65 72 73 68 69  builds, ownershi
9870: 70 20 74 72 61 6e 73 66 65 72 20 69 73 20 61 20  p transfer is a 
9880: 6e 6f 2d 6f 70 20 2a 2f 0a 23 20 64 65 66 69 6e  no-op */.# defin
9890: 65 20 74 72 61 6e 73 66 65 72 4f 77 6e 65 72 73  e transferOwners
98a0: 68 69 70 28 58 29 20 53 51 4c 49 54 45 5f 4f 4b  hip(X) SQLITE_OK
98b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
98c0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 2a 2f 0a  E_THREADSAFE */.
98d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
98e0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
98f0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
9900: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
9910: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
9920: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
9930: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
9940: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
9950: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
9960: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
9970: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
9980: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
9990: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
99a0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
99b0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
99c0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
99d0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
99e0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
99f0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
9a00: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
9a10: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
9a20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9a30: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
9a40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9a50: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
9a60: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
9a70: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
9a80: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
9a90: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9aa0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
9ab0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
9ac0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
9ad0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
9ae0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
9af0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
9b00: 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20  pFile->pLock is 
9b10: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
9b20: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
9b30: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
9b40: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9b50: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
9b60: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
9b70: 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79  e->pLock->lockty
9b80: 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  pe>SHARED_LOCK )
9b90: 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
9ba0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74   1;.  }..  /* Ot
9bb0: 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
9bc0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9bd0: 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f  s holds it..  */
9be0: 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50  .#ifndef __DJGPP
9bf0: 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  __.  if( !reserv
9c00: 65 64 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ed ){.    struct
9c10: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
9c20: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9c30: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
9c40: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45  ock.l_start = RE
9c50: 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20  SERVED_BYTE;.   
9c60: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
9c70: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9c80: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
9c90: 69 66 20 28 2d 31 20 3d 3d 20 66 63 6e 74 6c 28  if (-1 == fcntl(
9ca0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
9cb0: 4b 2c 20 26 6c 6f 63 6b 29 29 20 7b 0a 20 20 20  K, &lock)) {.   
9cc0: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
9cd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
9ce0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
9cf0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
9d00: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
9d10: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
9d20: 43 4b 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  CK);.      pFile
9d30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45  ->lastErrno = tE
9d40: 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
9d50: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
9d60: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
9d70: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
9d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
9d90: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
9da0: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
9db0: 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE4("TEST WR-LOC
9dc0: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
9dd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9de0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 0a  rc, reserved);..
9df0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
9e00: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
9e10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
9e20: 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
9e30: 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
9e40: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
9e50: 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
9e60: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
9e70: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
9e80: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
9e90: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
9ea0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
9eb0: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
9ec0: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
9ed0: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
9ee0: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
9ef0: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
9f00: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
9f10: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
9f20: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
9f30: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
9f40: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
9f50: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
9f60: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
9f70: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
9f80: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
9f90: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
9fa0: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
9fb0: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
9fc0: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
9fd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
9fe0: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
9ff0: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
a000: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
a010: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
a020: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
a030: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
a040: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
a050: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
a060: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
a070: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
a080: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
a090: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
a0a0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a0b0: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
a0c0: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
a0d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a0e0: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
a0f0: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
a100: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
a110: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
a120: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
a130: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
a140: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
a150: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a160: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
a170: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
a180: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
a190: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
a1a0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
a1b0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
a1c0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
a1d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
a1e0: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
a1f0: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
a200: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
a210: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
a220: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
a230: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
a240: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
a250: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
a260: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
a270: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
a280: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
a290: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
a2a0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
a2b0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
a2c0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
a2d0: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
a2e0: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
a2f0: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
a300: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
a310: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
a320: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
a330: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
a340: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
a350: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
a360: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
a370: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
a380: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
a390: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
a3a0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
a3b0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
a3c0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
a3d0: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
a3e0: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
a3f0: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
a400: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
a410: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
a420: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
a430: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
a440: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
a450: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
a460: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
a470: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
a480: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
a490: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
a4a0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
a4b0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
a4c0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
a4d0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
a4e0: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
a4f0: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
a500: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
a510: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
a520: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
a530: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
a540: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
a550: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
a560: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
a570: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
a580: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
a590: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
a5a0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
a5b0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
a5c0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
a5d0: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
a5e0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
a5f0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
a600: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
a610: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
a620: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
a630: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
a640: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
a650: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
a660: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
a670: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
a680: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
a690: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
a6a0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
a6b0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
a6c0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
a6d0: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
a6e0: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
a6f0: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
a700: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
a710: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
a720: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
a730: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
a740: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
a750: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
a760: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
a770: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
a780: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
a790: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
a7a0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
a7b0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
a7c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
a7d0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
a7e0: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
a7f0: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
a800: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
a810: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
a820: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
a830: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
a840: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
a850: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
a860: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
a870: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
a880: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
a890: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
a8a0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
a8b0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a8c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
a8d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
a8e0: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
a8f0: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
a900: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
a910: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
a920: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
a930: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
a940: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
a950: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
a960: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
a970: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
a980: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
a990: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
a9a0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
a9b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a9c0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
a9d0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
a9e0: 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
a9f0: 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
aa00: 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
aa10: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
aa20: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d   lock;.  int s =
aa30: 20 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f   0;.  int tErrno
aa40: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
aa50: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
aa60: 41 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE7("LOCK    %d
aa70: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
aa80: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
aa90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
aaa0: 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
aab0: 28 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b  (locktype), lock
aac0: 74 79 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e  typeName(pFile->
aad0: 6c 6f 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20  locktype),.     
aae0: 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c   locktypeName(pL
aaf0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20  ock->locktype), 
ab00: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20 67 65 74  pLock->cnt , get
ab10: 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  pid());..  /* If
ab20: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
ab30: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
ab40: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
ab50: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
ab60: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
ab70: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
ab80: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
ab90: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
aba0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
abb0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
abc0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
abd0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
abe0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
abf0: 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52  type ){.    OSTR
ac00: 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE3("LOCK    %d
ac10: 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20   %s ok (already 
ac20: 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c  held) (unix)\n",
ac30: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
ac40: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e         locktypeN
ac50: 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  ame(locktype));.
ac60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ac70: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
ac80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
ac90: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
aca0: 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20  s correct..  ** 
acb0: 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f   (1) We never mo
acc0: 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  ve from unlocked
acd0: 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67   to anything hig
ace0: 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20  her than shared 
acf0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20  lock..  **  (2) 
ad00: 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70  SQLite never exp
ad10: 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73  licitly requests
ad20: 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a   a pendig lock..
ad30: 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72    **  (3) A shar
ad40: 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79  ed lock is alway
ad50: 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65  s held when a re
ad60: 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65  serve lock is re
ad70: 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
ad80: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
ad90: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
ada0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
adb0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
adc0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
add0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
ade0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
adf0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
ae00: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
ae10: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
ae20: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
ae30: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
ae40: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
ae50: 70 4c 6f 63 6b 20 69 73 20 73 68 61 72 65 64 20  pLock is shared 
ae60: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20  across threads. 
ae70: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
ae80: 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 4d 61  utex();..  /* Ma
ae90: 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 72  ke sure the curr
aea0: 65 6e 74 20 74 68 72 65 61 64 20 6f 77 6e 73 20  ent thread owns 
aeb0: 74 68 65 20 70 46 69 6c 65 2e 0a 20 20 2a 2f 0a  the pFile..  */.
aec0: 20 20 72 63 20 3d 20 74 72 61 6e 73 66 65 72 4f    rc = transferO
aed0: 77 6e 65 72 73 68 69 70 28 70 46 69 6c 65 29 3b  wnership(pFile);
aee0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
aef0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 69 78  E_OK ){.    unix
af00: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
af10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
af20: 0a 20 20 70 4c 6f 63 6b 20 3d 20 70 46 69 6c 65  .  pLock = pFile
af30: 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49  ->pLock;..  /* I
af40: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
af50: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
af60: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
af70: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
af80: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
af90: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
afa0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
afb0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
afc0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
afd0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c 6f 63 6b  >locktype!=pLock
afe0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26 20 0a 20  ->locktype && . 
aff0: 20 20 20 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d           (pLock-
b000: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
b010: 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NG_LOCK || lockt
b020: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ype>SHARED_LOCK)
b030: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
b040: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b050: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
b060: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
b070: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
b080: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
b090: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
b0a0: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
b0b0: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
b0c0: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
b0d0: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
b0e0: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
b0f0: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
b100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
b110: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
b120: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b130: 26 26 20 0a 20 20 20 20 20 20 28 70 4c 6f 63 6b  && .      (pLock
b140: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
b150: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b  ED_LOCK || pLock
b160: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
b170: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
b180: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
b190: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b1a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
b1b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
b1c0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b1d0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
b1e0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
b1f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b200: 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63  CK;.    pLock->c
b210: 6e 74 2b 2b 3b 0a 20 20 20 20 70 46 69 6c 65 2d  nt++;.    pFile-
b220: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b230: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
b240: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
b250: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
b260: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
b270: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
b280: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
b290: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
b2a0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
b2b0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
b2c0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
b2d0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
b2e0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
b2f0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
b300: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
b310: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
b320: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
b330: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
b340: 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65      || (locktype
b350: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b360: 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
b370: 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ype<PENDING_LOCK
b380: 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e  ).  ){.    lock.
b390: 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74 79  l_type = (lockty
b3a0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  pe==SHARED_LOCK?
b3b0: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
b3c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b3d0: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
b3e0: 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  E;.    s = fcntl
b3f0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
b400: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
b410: 69 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( s==(-1) ){. 
b420: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
b430: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
b440: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
b450: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
b460: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
b470: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
b480: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
b490: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
b4a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
b4b0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
b4c0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
b4d0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
b4e0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
b4f0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
b500: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
b510: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
b520: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
b530: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
b540: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
b550: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
b560: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b570: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b580: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
b590: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
b5a0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
b5b0: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
b5c0: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
b5d0: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
b5e0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
b5f0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
b600: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
b610: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
b620: 69 66 28 20 28 73 20 3d 20 66 63 6e 74 6c 28 70  if( (s = fcntl(p
b630: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
b640: 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d 31 29 20  , &lock))==(-1) 
b650: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
b660: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20  = errno;.    }. 
b670: 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74     /* Drop the t
b680: 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47  emporary PENDING
b690: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63   lock */.    loc
b6a0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
b6b0: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
b6c0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
b6d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
b6e0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66   F_UNLCK;.    if
b6f0: 28 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  ( fcntl(pFile->h
b700: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
b710: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
b720: 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  ( s != -1 ){.   
b730: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75       /* This cou
b740: 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  ld happen with a
b750: 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a   network mount *
b760: 2f 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  /.        tErrno
b770: 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20 20 20 20   = errno; .     
b780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
b790: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
b7a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
b7b0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20  _IOERR_UNLOCK); 
b7c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
b7d0: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
b7e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  {.          pFil
b7f0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
b800: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  Errno;.        }
b810: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
b820: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  d_lock;.      }.
b830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 3d      }.    if( s=
b840: 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 72  =(-1) ){.      r
b850: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
b860: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
b870: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
b880: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
b890: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
b8a0: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
b8b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
b8c0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
b8d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b8e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
b8f0: 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
b900: 43 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  CK;.      pFile-
b910: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
b920: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
b930: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
b940: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
b950: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
b960: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
b970: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
b980: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
b990: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
b9a0: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
b9b0: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
b9c0: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
b9d0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
b9e0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
b9f0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ba00: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ba10: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
ba20: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
ba30: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
ba40: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
ba50: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
ba60: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
ba70: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
ba80: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
ba90: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
baa0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
bab0: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
bac0: 6c 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20  locktype );.    
bad0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
bae0: 57 52 4c 43 4b 3b 0a 20 20 20 20 73 77 69 74 63  WRLCK;.    switc
baf0: 68 28 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  h( locktype ){. 
bb00: 20 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56       case RESERV
bb10: 45 44 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  ED_LOCK:.       
bb20: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb30: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bb40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bb50: 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49      case EXCLUSI
bb60: 56 45 5f 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VE_LOCK:.       
bb70: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bb80: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
bb90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
bba0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
bbb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bbc0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
bbd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
bbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 66  .    }.    s = f
bbf0: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
bc00: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
bc10: 20 20 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20      if( s==(-1) 
bc20: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
bc30: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
bc40: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
bc50: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
bc60: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
bc70: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
bc80: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
bc90: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
bca0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
bcb0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
bcc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcd0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
bce0: 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
bcf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
bd00: 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
bd10: 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
bd20: 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
bd30: 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
bd40: 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
bd50: 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
bd60: 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
bd70: 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
bd80: 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
bd90: 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
bda0: 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
bdb0: 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
bdc0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
bdd0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
bde0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
bdf0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c  pFile->locktype<
be00: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20  =SHARED_LOCK.   
be10: 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  && locktype==RES
be20: 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a  ERVED_LOCK.  ){.
be30: 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
be40: 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20  CntrChng = 0;.  
be50: 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
be60: 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  e = 0;.    pFile
be70: 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20  ->inNormalWrite 
be80: 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 1;.  }.#endif.
be90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
bea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
beb0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  le->locktype = l
bec0: 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f  ocktype;.    pLo
bed0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  ck->locktype = l
bee0: 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ocktype;.  }else
bef0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
bf00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
bf10: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
bf20: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
bf30: 4f 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  OCK;.    pLock->
bf40: 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  locktype = PENDI
bf50: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
bf60: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
bf70: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
bf80: 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20 20  TRACE4("LOCK    
bf90: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
bfa0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
bfb0: 63 6b 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74  cktypeName(lockt
bfc0: 79 70 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d  ype), .      rc=
bfd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
bfe0: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20  " : "failed");. 
bff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c000: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
c010: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
c020: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
c030: 65 20 75 6e 69 78 4f 70 65 6e 43 6e 74 2d 3e 70  e unixOpenCnt->p
c040: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 20  Unused list..** 
c050: 49 66 20 61 6c 6c 20 73 75 63 68 20 66 69 6c 65  If all such file
c060: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 72 65   descriptors are
c070: 20 63 6c 6f 73 65 64 20 77 69 74 68 6f 75 74 20   closed without 
c080: 65 72 72 6f 72 2c 20 74 68 65 20 6c 69 73 74 20  error, the list 
c090: 69 73 0a 2a 2a 20 63 6c 65 61 72 65 64 20 61 6e  is.** cleared an
c0a0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c0b0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  rned..**.** Othe
c0c0: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
c0d0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
c0e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6c 6f  successfully clo
c0f0: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
c100: 74 6f 72 0a 2a 2a 20 65 6e 74 72 69 65 73 20 61  tor.** entries a
c110: 72 65 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  re removed from 
c120: 74 68 65 20 6c 69 73 74 2c 20 61 6e 64 20 53 51  the list, and SQ
c130: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
c140: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 6e   returned. .** n
c150: 6f 74 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  ot deleted and S
c160: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
c170: 45 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  E returned..*/ .
c180: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
c190: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
c1a0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
c1b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1c0: 4b 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  K;.  struct unix
c1d0: 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d  OpenCnt *pOpen =
c1e0: 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20   pFile->pOpen;. 
c1f0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
c200: 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 55 6e 69  Error = 0;.  Uni
c210: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
c220: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
c230: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 4f 70  ext;.  for(p=pOp
c240: 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  en->pUnused; p; 
c250: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
c260: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
c270: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d      if( close(p-
c280: 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 46  >fd) ){.      pF
c290: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
c2a0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c2c0: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e  CLOSE;.      p->
c2d0: 70 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a  pNext = pError;.
c2e0: 20 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70        pError = p
c2f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c300: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c310: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
c320: 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 20 3d  pOpen->pUnused =
c330: 20 70 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72   pError;.  retur
c340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
c350: 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  dd the file desc
c360: 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20 66  riptor used by f
c370: 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65  ile handle pFile
c380: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
c390: 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64  nding.** pUnused
c3a0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
c3b0: 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67   void setPending
c3c0: 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  Fd(unixFile *pFi
c3d0: 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  le){.  struct un
c3e0: 69 78 4f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  ixOpenCnt *pOpen
c3f0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b   = pFile->pOpen;
c400: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
c410: 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75  *p = pFile->pUnu
c420: 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  sed;.  p->pNext 
c430: 3d 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64  = pOpen->pUnused
c440: 3b 0a 20 20 70 4f 70 65 6e 2d 3e 70 55 6e 75 73  ;.  pOpen->pUnus
c450: 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
c460: 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
c470: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
c480: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
c490: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
c4a0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
c4b0: 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b  or pFile to lock
c4c0: 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
c4d0: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
c4e0: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
c4f0: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
c500: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
c510: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
c520: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
c530: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
c540: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
c550: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
c560: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
c570: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
c580: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
c590: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
c5a0: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
c5b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
c5c0: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
c5d0: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
c5e0: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
c5f0: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
c600: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
c610: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
c620: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
c630: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
c640: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
c650: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
c660: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
c670: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
c680: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
c690: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
c6a0: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
c6b0: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
c6c0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
c6d0: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
c6e0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
c6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c700: 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71   _posixUnlock(sq
c710: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c720: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 2c 20 69 6e  int locktype, in
c730: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
c740: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
c750: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
c760: 65 2a 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20  e*)id;.  struct 
c770: 75 6e 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c  unixLockInfo *pL
c780: 6f 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ock;.  struct fl
c790: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
c7a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c7b0: 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 74    int h;.  int t
c7c0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
c7e0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
c7f0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
c800: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
c810: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
c820: 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE7("UNLOCK  %d 
c830: 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29  %d was %d(%d,%d)
c840: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
c850: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
c860: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 70 46 69  ktype,.      pFi
c870: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
c880: 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
c890: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
c8a0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
c8b0: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
c8c0: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
c8d0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
c8e0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
c8f0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
c900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c910: 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
c920: 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
c930: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c940: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c950: 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
c960: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 68 20 3d  erMutex();.  h =
c970: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 70 4c 6f   pFile->h;.  pLo
c980: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
c990: 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
c9a0: 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
c9b0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
c9c0: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
c9d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c9e0: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
c9f0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
ca00: 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
ca10: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
ca20: 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
ca30: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
ca40: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
ca50: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 0a 23 69  orBenign(0);..#i
ca60: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
ca70: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
ca80: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
ca90: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
caa0: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
cab0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
cac0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
cad0: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
cae0: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
caf0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
cb00: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
cb10: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
cb20: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
cb30: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
cb40: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
cb50: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
cb60: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
cb70: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
cb80: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
cb90: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
cba0: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
cbb0: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
cbc0: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
cbd0: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
cbe0: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
cbf0: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
cc00: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
cc10: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
cc20: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
cc30: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
cc40: 0a 23 69 66 20 30 0a 20 20 20 20 61 73 73 65 72  .#if 0.    asser
cc50: 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
cc60: 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
cc70: 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
cc80: 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
cc90: 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61     || pFile->tra
cca0: 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b  nsCntrChng==1 );
ccb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 46 69 6c  .#endif.    pFil
ccc0: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
ccd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
cce0: 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67    /* downgrading
ccf0: 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
cd00: 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65  k on NFS involve
cd10: 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77  s clearing the w
cd20: 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a  rite lock.    **
cd30: 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73   before establis
cd40: 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63  hing the readloc
cd50: 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72  k - to avoid a r
cd60: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65  ace condition we
cd70: 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a   downgrade.    *
cd80: 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20  * the lock in 2 
cd90: 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20  blocks, so that 
cda0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  part of the rang
cdb0: 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65  e will be covere
cdc0: 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77  d by a .    ** w
cdd0: 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rite lock until 
cde0: 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65  the rest is cove
cdf0: 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f  red by a read lo
ce00: 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20  ck:.    **  1:  
ce10: 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20   [WWWWW].    ** 
ce20: 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20   2:   [....W].  
ce30: 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52    **  3:   [RRRR
ce40: 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20  W].    **  4:   
ce50: 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20  [RRRR.].    */. 
ce60: 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
ce70: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
ce80: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
ce90: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
cea0: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
ceb0: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
cec0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
ced0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
cee0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
cef0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
cf00: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
cf10: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
cf20: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
cf30: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
cf40: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
cf50: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
cf60: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
cf70: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
cf80: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
cf90: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
cfa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cfb0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
cfc0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
cfd0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
cfe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
cff0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d000: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d010: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d020: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d040: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d050: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d060: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
d070: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
d080: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
d090: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
d0a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
d0b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d0c0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
d0d0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
d0e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63 6e  .        if( fcn
d0f0: 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  tl(h, F_SETLK, &
d100: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
d110: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
d120: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
d130: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d140: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d150: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d160: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
d170: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
d180: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
d190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d1a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d1b0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
d1c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d1d0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
d1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d1f0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
d200: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
d210: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
d220: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
d230: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
d240: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
d250: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
d260: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
d270: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
d280: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  e;.        if( f
d290: 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c  cntl(h, F_SETLK,
d2a0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
d2b0: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
d2c0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
d2d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2e0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d2f0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d300: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
d310: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d320: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d340: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d350: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d370: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
d380: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
d390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d3a0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d3b0: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
d3c0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
d3d0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
d3e0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d3f0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
d400: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
d410: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
d420: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 63  ;.        if( fc
d430: 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  ntl(h, F_SETLK, 
d440: 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
d450: 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
d460: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
d470: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
d480: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
d490: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
d4a0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
d4b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
d4c0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
d4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d4e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d4f0: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
d500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d510: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
d520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d530: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
d540: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
d550: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
d560: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d570: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
d580: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
d590: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
d5a0: 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
d5b0: 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
d5c0: 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
d5d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c  );.    if( fcntl
d5e0: 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  (h, F_SETLK, &lo
d5f0: 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)!=(-1) ){.   
d600: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d610: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
d620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d630: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d640: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d650: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d660: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d670: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
d680: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d690: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
d6a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
d6b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
d6c0: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  tErrno;.      }.
d6d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
d6e0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  nlock;.    }.  }
d6f0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
d700: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
d710: 73 74 72 75 63 74 20 75 6e 69 78 4f 70 65 6e 43  struct unixOpenC
d720: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20 20 20  nt *pOpen;..    
d730: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
d740: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
d750: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
d760: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
d770: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
d780: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
d790: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
d7a0: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
d7b0: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
d7c0: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
d7d0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2d  .    pLock->cnt-
d7e0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  -;.    if( pLock
d7f0: 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->cnt==0 ){.    
d800: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
d810: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_UNLCK;.      l
d820: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
d830: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
d840: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
d850: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
d860: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d870: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
d880: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d890: 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
d8a0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d8b0: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
d8c0: 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28 68       if( fcntl(h
d8d0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
d8e0: 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )!=(-1) ){.     
d8f0: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
d900: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
d910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d920: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d930: 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
d940: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d950: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d960: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
d970: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
d980: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
d990: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
d9a0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d9b0: 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
d9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d9d0: 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20  pLock->locktype 
d9e0: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
d9f0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
da00: 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
da10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
da20: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
da30: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
da40: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
da50: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
da60: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
da70: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
da80: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
da90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
daa0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
dab0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
dac0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
dad0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
dae0: 20 2a 2f 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20   */.    pOpen = 
daf0: 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 3b 0a 20 20  pFile->pOpen;.  
db00: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
db10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
db20: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
db30: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
db40: 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nLock==0 ){.    
db50: 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f 73    int rc2 = clos
db60: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
db70: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
db80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db90: 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
dba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbb0: 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a   }...end_unlock:
dbc0: 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
dbd0: 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x();.  if( rc==S
dbe0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65  QLITE_OK ) pFile
dbf0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
dc00: 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20  ktype;.  return 
dc10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
dc20: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
dc30: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
dc40: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
dc50: 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
dc60: 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
dc70: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
dc80: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
dc90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
dca0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
dcb0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
dcc0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
dcd0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
dce0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
dcf0: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
dd00: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
dd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
dd20: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
dd30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
dd40: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65 74  locktype){.  ret
dd50: 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b  urn _posixUnlock
dd60: 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 30  (id, locktype, 0
dd70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
dd80: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
dd90: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
dda0: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
ddb0: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
ddc0: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
ddd0: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
dde0: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
ddf0: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
de00: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
de10: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
de20: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
de30: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
de40: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
de50: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
de60: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
de70: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
de80: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
de90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
dea0: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
deb0: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
dec0: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
ded0: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
dee0: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
def0: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
df00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
df10: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
df20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
df30: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
df40: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
df50: 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
df60: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
df70: 65 2d 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20  e->dirfd>=0 ){. 
df80: 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 63       int err = c
df90: 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
dfa0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72  d);.      if( er
dfb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  r ){.        pFi
dfc0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
dfd0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
dfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
dff0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20  RR_DIR_CLOSE;.  
e000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e010: 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3d     pFile->dirfd=
e020: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e030: 7d 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  }.    if( pFile-
e040: 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  >h>=0 ){.      i
e050: 6e 74 20 65 72 72 20 3d 20 63 6c 6f 73 65 28 70  nt err = close(p
e060: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
e070: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
e080: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
e090: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e0b0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a  TE_IOERR_CLOSE;.
e0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
e0d0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
e0e0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
e0f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69  ){.      if( pFi
e100: 6c 65 2d 3e 69 73 44 65 6c 65 74 65 20 29 7b 0a  le->isDelete ){.
e110: 20 20 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 70          unlink(p
e120: 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  File->pId->zCano
e130: 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
e140: 20 20 7d 0a 20 20 20 20 20 20 76 78 77 6f 72 6b    }.      vxwork
e150: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
e160: 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
e170: 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30    pFile->pId = 0
e180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e190: 20 20 20 4f 53 54 52 41 43 45 32 28 22 43 4c 4f     OSTRACE2("CLO
e1a0: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46  SE   %-3d\n", pF
e1b0: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 4f 70 65  ile->h);.    Ope
e1c0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
e1d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e1e0: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
e1f0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
e200: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
e210: 46 69 6c 65 29 29 3b 0a 20 20 7d 0a 20 20 72 65  File));.  }.  re
e220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e230: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e240: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e250: 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
e260: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
e270: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e280: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
e290: 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
e2a0: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e2b0: 69 6c 65 20 2a 29 69 64 3b 0a 20 20 20 20 75 6e  ile *)id;.    un
e2c0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
e2d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
e2e0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
e2f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4f 70 65   if( pFile->pOpe
e300: 6e 20 26 26 20 70 46 69 6c 65 2d 3e 70 4f 70 65  n && pFile->pOpe
e310: 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  n->nLock ){.    
e320: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e330: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
e340: 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
e350: 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
e360: 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
e370: 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
e380: 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
e390: 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
e3a0: 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
e3b0: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
e3c0: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
e3d0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
e3e0: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
e3f0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
e400: 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
e410: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
e420: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
e430: 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
e440: 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
e450: 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
e460: 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
e470: 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
e480: 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
e490: 70 4f 70 65 6e 29 3b 0a 20 20 20 20 72 63 20 3d  pOpen);.    rc =
e4a0: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
e4b0: 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  d);.    unixLeav
e4c0: 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  eMutex();.  }.  
e4d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
e4f0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
e500: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
e510: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
e580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
e5f0: 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
e600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
e620: 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
e630: 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
e640: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
e650: 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
e660: 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
e670: 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
e680: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
e690: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
e6a0: 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
e6b0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
e6c0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
e6d0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e6e0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
e6f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e700: 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
e710: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
e720: 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
e730: 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
e740: 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
e750: 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
e760: 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
e770: 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
e780: 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
e790: 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
e7a0: 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
e7b0: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
e7c0: 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
e7d0: 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
e7e0: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
e7f0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
e800: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
e810: 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
e820: 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
e830: 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
e840: 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
e850: 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
e860: 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
e870: 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
e880: 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
e890: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
e8a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e8b0: 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
e8c0: 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
e8d0: 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
e8e0: 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
e8f0: 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
e900: 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
e910: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e920: 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
e930: 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
e940: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
e950: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
e960: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
e970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e980: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
e990: 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
e9a0: 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
e9b0: 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
e9c0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e9d0: 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
e9e0: 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
e9f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ea00: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
ea10: 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
ea20: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
ea30: 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
ea40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ea50: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
ea60: 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
ea70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ea80: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
ea90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
eaa0: 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
eab0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
eac0: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
ead0: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
eae0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
eaf0: 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
eb00: 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
eb10: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
eb20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
eb30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
eb80: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
eb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ebd0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
ebe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
ebf0: 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
ec00: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
ec10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
ec30: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
ec40: 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
ec50: 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  he existance of 
ec60: 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
ec70: 20 66 69 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   files in order 
ec80: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
ec90: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
eca0: 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 6f  e.  This works o
ecb0: 6e 20 6a 75 73 74 0a 2a 2a 20 61 62 6f 75 74 20  n just.** about 
ecc0: 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
ecd0: 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
ece0: 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
ecf0: 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
ed00: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ed10: 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
ed20: 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
ed30: 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
ed40: 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
ed50: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
ed60: 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
ed70: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
ed80: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
ed90: 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
eda0: 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
edb0: 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
edc0: 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
edd0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
ede0: 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
edf0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
ee00: 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
ee10: 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
ee20: 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
ee30: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
ee40: 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
ee50: 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
ee60: 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
ee70: 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
ee80: 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
ee90: 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
eea0: 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
eeb0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
eec0: 65 63 74 6f 72 79 20 61 73 20 74 68 65 0a 2a 2a  ectory as the.**
eed0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69   database and wi
eee0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
eef0: 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f   but with a ".lo
ef00: 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64  ck" extension ad
ef10: 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73  ded..** The exis
ef20: 74 61 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20  tance of a lock 
ef30: 66 69 6c 65 20 69 6d 70 6c 69 65 73 20 61 6e 20  file implies an 
ef40: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ef50: 20 41 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 0a   All other lock.
ef60: 2a 2a 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ** types (SHARED
ef70: 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
ef80: 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
ef90: 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
efa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
efb0: 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
efc0: 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
efd0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
efe0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
eff0: 0a 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  .** lock file..*
f000: 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
f010: 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
f020: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
f030: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
f040: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
f050: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
f060: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
f070: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
f080: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
f090: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
f0a0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
f0b0: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
f0c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
f0d0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
f0e0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
f0f0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
f100: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
f110: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
f120: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
f130: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
f140: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
f150: 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
f160: 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
f170: 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
f180: 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
f190: 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
f1a0: 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
f1b0: 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
f1c0: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
f1d0: 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
f1e0: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
f1f0: 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
f200: 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
f210: 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
f220: 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
f230: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f240: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f250: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
f260: 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
f270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
f280: 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
f290: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
f2a0: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
f2b0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
f2c0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
f2d0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
f2e0: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
f2f0: 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
f300: 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
f310: 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
f320: 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
f330: 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
f340: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
f350: 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c  ocktype>SHARED_L
f360: 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  OCK ){.    /* Ei
f370: 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63  ther this connec
f380: 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68  tion or some oth
f390: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  er connection in
f3a0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
f3b0: 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61  s.    ** holds a
f3c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
f3d0: 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63  e.  No need to c
f3e0: 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f  heck further. */
f3f0: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
f400: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f410: 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68  /* The lock is h
f420: 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  eld if and only 
f430: 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20  if the lockfile 
f440: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f  exists */.    co
f450: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  nst char *zLockF
f460: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
f470: 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  r*)pFile->lockin
f480: 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65  gContext;.    re
f490: 73 65 72 76 65 64 20 3d 20 61 63 63 65 73 73 28  served = access(
f4a0: 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30  zLockFile, 0)==0
f4b0: 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34  ;.  }.  OSTRACE4
f4c0: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
f4d0: 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b  d %d %d (dotlock
f4e0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f4f0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a 20  rc, reserved);. 
f500: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
f510: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
f520: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
f530: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
f540: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
f550: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
f560: 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
f570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
f590: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
f5a0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
f5b0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
f5c0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
f5d0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
f5e0: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
f5f0: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
f600: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
f610: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
f620: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
f630: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
f640: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
f650: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
f660: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
f670: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
f680: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
f690: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
f6a0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
f6b0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
f6c0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
f6d0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
f6e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
f6f0: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
f700: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
f710: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
f720: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
f730: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
f740: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
f750: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
f760: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
f770: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
f780: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f790: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
f7a0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
f7b0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
f7c0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
f7d0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
f7e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
f7f0: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
f800: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
f810: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
f820: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
f830: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
f840: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
f850: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
f860: 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
f870: 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
f880: 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
f890: 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
f8a0: 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
f8b0: 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
f8c0: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
f8d0: 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
f8e0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
f8f0: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
f900: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
f910: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
f920: 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63  d;.  int fd;.  c
f930: 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
f940: 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
f950: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
f960: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f970: 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
f980: 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
f990: 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
f9a0: 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
f9b0: 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
f9c0: 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
f9d0: 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
f9e0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
f9f0: 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
fa00: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
fa10: 6c 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f  locktype > NO_LO
fa20: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
fa30: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
fa40: 74 79 70 65 3b 0a 23 69 66 20 21 4f 53 5f 56 58  type;.#if !OS_VX
fa50: 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41 6c 77  WORKS.    /* Alw
fa60: 61 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74  ays update the t
fa70: 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20  imestamp on the 
fa80: 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  old file */.    
fa90: 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65  utimes(zLockFile
faa0: 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
fab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fac0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
fad0: 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
fae0: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 66 64  ive lock */.  fd
faf0: 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46 69 6c   = open(zLockFil
fb00: 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43 52 45  e,O_RDONLY|O_CRE
fb10: 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30 29 3b  AT|O_EXCL,0600);
fb20: 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
fb30: 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20     /* failed to 
fb40: 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
fb50: 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20 65 6c  file, someone el
fb60: 73 65 20 6d 61 79 20 68 61 76 65 20 73 74 6f 6c  se may have stol
fb70: 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  en the lock */. 
fb80: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
fb90: 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
fba0: 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
fbb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fbc0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
fbd0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
fbe0: 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
fbf0: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
fc00: 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
fc10: 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
fc20: 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
fc30: 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
fc40: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fc50: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
fc60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
fc70: 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 69  urn rc;.  } .  i
fc80: 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29 7b 0a  f( close(fd) ){.
fc90: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
fca0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
fcb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fcc0: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d 0a 20  ERR_CLOSE;.  }. 
fcd0: 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
fce0: 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
fcf0: 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
fd00: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
fd10: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74   locktype;.  ret
fd20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd30: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
fd40: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
fd50: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fd60: 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  e to locktype.  
fd70: 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
fd80: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
fd90: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
fda0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
fdb0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
fdc0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
fdd0: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
fde0: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
fdf0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
fe00: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
fe10: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fe20: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
fe30: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
fe40: 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
fe50: 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
fe60: 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
fe70: 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
fe80: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
fe90: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
fea0: 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ype) {.  unixFil
feb0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fec0: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72  File*)id;.  char
fed0: 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63   *zLockFile = (c
fee0: 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
fef0: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  kingContext;..  
ff00: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
ff10: 0a 20 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c  .  OSTRACE5("UNL
ff20: 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
ff30: 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
ff40: 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
ff50: 20 6c 6f 63 6b 74 79 70 65 2c 0a 09 20 20 20 70   locktype,..   p
ff60: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
ff70: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 61 73 73  getpid());.  ass
ff80: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
ff90: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
ffa0: 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
ffb0: 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
ffc0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
ffd0: 3d 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  ==locktype ){.  
ffe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fff0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
10000 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
10010 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
10020 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10030 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
10040 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
10050 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
10060 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
10070 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
10080 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
10090 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
100a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
100b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
100c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
100d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
100e0 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
100f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
10100 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
10110 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
10120 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
10130 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
10140 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
10150 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
10160 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
10170 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
10180 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
10190 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
101a0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
101b0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
101c0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
101d0 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  NLOCK);.    }.  
101e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
101f0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10200 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10210 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
10220 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
10230 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c   .  }.  pFile->l
10240 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
10250 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
10260 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10270 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
10280 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
10290 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
102a0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
102b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
102c0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
102d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
102e0 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69   {.  int rc;.  i
102f0 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
10300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
10310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
10320 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28    dotlockUnlock(
10330 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
10340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10350 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
10360 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  text);.  }.  rc 
10370 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
10380 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  id);.  return rc
10390 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
103a0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
103b0 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  he dot-file lock
103c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
103f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
104a0 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b  Begin flock Lock
104b0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
104c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
104d0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ****.**.** Use t
104e0 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65  he flock() syste
104f0 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c  m call to do fil
10500 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e locking..**.**
10510 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67   flock() locking
10520 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c   is like dot-fil
10530 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61  e locking in tha
10540 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  t the various.**
10550 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b   fine-grain lock
10560 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f  ing levels suppo
10570 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20 61  rted by SQLite a
10580 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74  re collapsed int
10590 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78  o.** a single ex
105a0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
105b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53  n other words, S
105c0 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
105d0 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20   and.** PENDING 
105e0 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73 61  locks are the sa
105f0 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45  me thing as an E
10600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10610 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20  SQLite.** still 
10620 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64  works when you d
10630 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63  o this, but conc
10640 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75 63  urrency is reduc
10650 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79  ed since.** only
10660 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
10670 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
10680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
10690 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f   a time..**.** O
106a0 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e  mit this section
106b0 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
106c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
106d0 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72  is turned off or
106e0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67   if.** compiling
106f0 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f   for VXWORKS..*/
10700 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
10710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
10720 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
10730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10740 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10750 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10760 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10770 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10780 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10790 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
107a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
107b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
107c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
107d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
107e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
107f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10800 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10810 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10820 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
10830 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10840 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10850 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
10860 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
10870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10880 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10890 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
108a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
108b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
108c0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
108d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
108e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
108f0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
10900 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10910 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
10920 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
10930 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
10940 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65  e );.  .  /* Che
10950 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
10960 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
10970 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
10980 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10990 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41 52 45 44  >locktype>SHARED
109a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
109b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  erved = 1;.  }. 
109c0 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65   .  /* Otherwise
109d0 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
109e0 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
109f0 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72   it. */.  if( !r
10a00 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
10a10 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74  * attempt to get
10a20 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20   the lock */.   
10a30 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f 63 6b   int lrc = flock
10a40 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
10a50 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20  EX | LOCK_NB);. 
10a60 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20     if( !lrc ){. 
10a70 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20       /* got the 
10a80 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
10a90 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 66  */.      lrc = f
10aa0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
10ab0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
10ac0 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
10ad0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
10ae0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
10af0 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
10b00 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
10b10 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
10b20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
10b30 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
10b40 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
10b50 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 20  NLOCK); .       
10b60 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
10b70 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
10b80 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10b90 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
10ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
10bb0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10bc0 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
10bd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72   {.      int tEr
10be0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10bf0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
10c00 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e  .      /* someon
10c10 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76  e else might hav
10c20 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f  e it reserved */
10c30 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c  .      lrc = sql
10c40 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10c50 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10c70 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49 53  ); .      if( IS
10c80 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
10c90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
10ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
10cb0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  Errno;.        r
10cc0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
10cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
10ce0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
10cf0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
10d00 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
10d10 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
10d20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10d30 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
10d40 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
10d50 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
10d60 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
10d70 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
10d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
10d90 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23  eserved=1;.  }.#
10da0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10db0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
10dc0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70  K_ERRORS */.  *p
10dd0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
10de0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
10df0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
10e00 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
10e10 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
10e20 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
10e30 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
10e40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10e50 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
10e60 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
10e70 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
10e80 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
10e90 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
10ea0 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
10eb0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
10ec0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
10ed0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
10ee0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
10ef0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
10f00 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
10f10 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
10f20 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
10f30 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
10f40 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
10f50 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
10f60 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
10f70 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
10f80 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
10f90 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
10fa0 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
10fb0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
10fc0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
10fd0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
10fe0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
10ff0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
11000 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
11010 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
11020 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
11030 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
11040 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
11050 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
11060 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
11070 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11080 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11090 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
110a0 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b  SIVE.**.** flock
110b0 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  () only really s
110c0 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
110d0 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
110e0 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
110f0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
11100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
11110 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
11120 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
11130 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
11140 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
11150 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
11160 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
11170 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
11180 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
11190 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
111a0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
111b0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
111c0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
111d0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
111e0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
111f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11200 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
11210 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
11220 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
11230 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
11240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11250 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11260 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11270 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
11280 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
11290 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
112a0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
112b0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
112c0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
112d0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
112e0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
112f0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f (pFile->lockty
11300 70 65 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a  pe > NO_LOCK) {.
11310 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
11320 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
11330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11340 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
11350 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73  * grab an exclus
11360 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20  ive lock */.  . 
11370 20 69 66 20 28 66 6c 6f 63 6b 28 70 46 69 6c 65   if (flock(pFile
11380 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
11390 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69  OCK_NB)) {.    i
113a0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
113b0 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74  o;.    /* didn't
113c0 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75   get, must be bu
113d0 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  sy */.    rc = s
113e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
113f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11410 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
11420 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11430 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11440 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
11450 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73  o;.    }.  } els
11460 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69  e {.    /* got i
11470 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
11480 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
11490 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  .    pFile->lock
114a0 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
114b0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 34 28  .  }.  OSTRACE4(
114c0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
114d0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
114e0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
114f0 4e 61 6d 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20  Name(locktype), 
11500 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  .           rc==
11510 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
11520 20 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 23 69   : "failed");.#i
11530 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
11540 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
11550 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
11560 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
11570 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
11580 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11590 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
115a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
115b0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
115c0 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
115d0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
115e0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
115f0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
11600 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
11610 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
11620 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
11630 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
11640 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
11650 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
11660 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
11670 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
11680 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
11690 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
116a0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
116b0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
116c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
116d0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
116e0 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
116f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11700 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a  int locktype) {.
11710 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11720 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11730 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
11740 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11750 43 45 35 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE5("UNLOCK  %d 
11760 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11770 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
11780 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
11790 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
117a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74  e->locktype, get
117b0 70 69 64 28 29 29 3b 0a 20 20 61 73 73 65 72 74  pid());.  assert
117c0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
117d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
117e0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
117f0 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
11800 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c  ile->locktype==l
11810 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
11820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11830 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
11840 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
11850 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
11860 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
11870 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
11880 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
11890 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
118a0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
118b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 72 65  locktype;.    re
118c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
118d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20    }.  .  /* no, 
118e0 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20  really, unlock. 
118f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 66 6c  */.  int rc = fl
11900 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
11910 43 4b 5f 55 4e 29 3b 0a 20 20 69 66 20 28 72 63  CK_UN);.  if (rc
11920 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 2c 20 74  ) {.    int r, t
11930 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
11940 20 20 20 72 20 3d 20 73 71 6c 69 74 65 45 72 72     r = sqliteErr
11950 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
11960 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
11970 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
11980 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
11990 52 52 4f 52 28 72 29 20 29 7b 0a 20 20 20 20 20  RROR(r) ){.     
119a0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
119b0 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
119c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
119d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
119e0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 69 66 28  K_ERRORS.    if(
119f0 20 28 72 20 26 20 53 51 4c 49 54 45 5f 49 4f 45   (r & SQLITE_IOE
11a00 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
11a10 45 52 52 20 29 7b 0a 20 20 20 20 20 20 72 20 3d  ERR ){.      r =
11a20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
11a30 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
11a40 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
11a50 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
11a60 0a 20 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e  .    .    return
11a70 20 72 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   r;.  } else {. 
11a80 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
11a90 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  pe = NO_LOCK;.  
11aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ab0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
11ac0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
11ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
11ae0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
11af0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
11b00 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
11b10 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
11b20 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OCK);.  }.  retu
11b30 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11b40 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  (id);.}..#endif 
11b50 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11b60 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
11b70 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a  & !OS_VXWORK */.
11b80 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11b90 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
11ba0 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c   flock lock impl
11bb0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11c20 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
11c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11c70 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
11c90 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65   Named Semaphore
11ca0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
11cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11cc0 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  *.**.** Named se
11cd0 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
11ce0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
11cf0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  d on VxWorks..**
11d00 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
11d10 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
11d20 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b  t-lock and flock
11d30 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c   in that it real
11d40 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f  ly only.** suppo
11d50 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  rts EXCLUSIVE lo
11d60 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73  cking.  Only a s
11d70 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
11d80 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  n read or write.
11d90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11da0 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20  file at a time. 
11db0 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f   This reduces po
11dc0 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65  tential concurre
11dd0 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65  ncy, but.** make
11de0 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65  s the lock imple
11df0 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65  mentation much e
11e00 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53  asier..*/.#if OS
11e10 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20  _VXWORKS../*.** 
11e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
11e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
11e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
11e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
11e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
11e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
11e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
11ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
11eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
11ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
11ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
11ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
11ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
11f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
11f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
11f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
11f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
11f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
11f50 6e 74 20 73 65 6d 43 68 65 63 6b 52 65 73 65 72  nt semCheckReser
11f60 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
11f70 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
11f80 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
11f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11fa0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
11fb0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
11fc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11fd0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
11fe0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
11ff0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
12000 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
12010 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
12020 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12030 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
12040 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
12050 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
12060 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
12070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48  ile->locktype>SH
12080 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12090 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
120a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
120b0 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
120c0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
120d0 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
120e0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
120f0 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
12100 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e 70   pFile->pOpen->p
12110 53 65 6d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Sem;.    struct 
12120 73 74 61 74 20 73 74 61 74 42 75 66 3b 0a 0a 20  stat statBuf;.. 
12130 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61     if( sem_trywa
12140 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a  it(pSem)==-1 ){.
12150 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12160 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12170 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45  if( EAGAIN != tE
12180 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  rrno ){.        
12190 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
121a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
121b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
121c0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
121d0 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
121e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
121f0 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20   = tErrno;.     
12200 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12210 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
12220 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
12230 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
12240 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
12250 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
12260 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3c 20 53  le->locktype < S
12270 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
12280 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12290 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
122a0 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
122b0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
122c0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
122d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
122e0 52 41 43 45 34 28 22 54 45 53 54 20 57 52 2d 4c  RACE4("TEST WR-L
122f0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
12300 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
12310 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 3b 0a   rc, reserved);.
12320 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
12330 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
12340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12350 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
12360 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
12370 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
12380 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
12390 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
123a0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
123b0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
123c0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
123d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
123e0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
123f0 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
12400 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
12410 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
12420 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
12430 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
12440 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
12450 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
12460 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
12470 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
12480 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
12490 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
124a0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
124b0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
124c0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
124d0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
124e0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
124f0 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
12500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
12510 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
12520 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
12530 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
12540 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
12550 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
12560 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
12570 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
12580 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
12590 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
125a0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
125b0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
125c0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
125d0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
125e0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
125f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
12600 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
12610 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
12620 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
12630 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12640 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12650 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
12660 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
12670 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
12680 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
12690 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
126a0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
126b0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
126c0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
126d0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
126e0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
126f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12700 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12710 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12720 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12730 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12740 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12750 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
12760 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 4c 6f  static int semLo
12770 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
12780 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
12790 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  e) {.  unixFile 
127a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
127b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 66 64  le*)id;.  int fd
127c0 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20  ;.  sem_t *pSem 
127d0 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65 6e 2d 3e  = pFile->pOpen->
127e0 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pSem;.  int rc =
127f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12800 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
12810 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
12820 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
12830 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
12840 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
12850 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
12860 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  /.  if (pFile->l
12870 6f 63 6b 74 79 70 65 20 3e 20 4e 4f 5f 4c 4f 43  ocktype > NO_LOC
12880 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12890 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74  locktype = lockt
128a0 79 70 65 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ype;.    rc = SQ
128b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
128c0 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
128d0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
128e0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
128f0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
12900 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
12910 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
12920 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
12930 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12940 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
12950 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
12960 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
12970 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
12980 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
12990 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
129a0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 0a 20  e = locktype;.. 
129b0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
129c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
129d0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
129e0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
129f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12a00 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  File to locktype
12a10 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
12a20 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12a30 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12a40 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12a50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12a60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12a70 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12a80 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12a90 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12aa0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12ad0 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63 6b 28  c int semUnlock(
12ae0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12af0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
12b00 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12b10 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12b20 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
12b30 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 4f 70 65  em = pFile->pOpe
12b40 6e 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65  n->pSem;..  asse
12b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
12b60 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a 20  ssert( pSem );. 
12b70 20 4f 53 54 52 41 43 45 35 28 22 55 4e 4c 4f 43   OSTRACE5("UNLOC
12b80 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12b90 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c  pid=%d (sem)\n",
12ba0 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
12bb0 79 70 65 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e  ype,..   pFile->
12bc0 6c 6f 63 6b 74 79 70 65 2c 20 67 65 74 70 69 64  locktype, getpid
12bd0 28 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ());.  assert( l
12be0 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
12bf0 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
12c00 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
12c10 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
12c20 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 6c 6f 63 6b  ->locktype==lock
12c30 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
12c40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12c50 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64  }.  .  /* shared
12c60 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74   can just be set
12c70 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61   because we alwa
12c80 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  ys have an exclu
12c90 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 6c 6f  sive */.  if (lo
12ca0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12cb0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
12cc0 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63  ->locktype = loc
12cd0 6b 74 79 70 65 3b 0a 20 20 20 20 72 65 74 75 72  ktype;.    retur
12ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12cf0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
12d00 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
12d10 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
12d20 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
12d30 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
12d40 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
12d50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12d60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12d70 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12d80 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
12d90 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12da0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
12db0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12dc0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
12dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
12de0 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
12df0 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
12e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e10 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
12e20 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
12e30 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c 6f  tatic int semClo
12e40 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12e50 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
12e60 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
12e70 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e80 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 55  le*)id;.    semU
12e90 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
12ea0 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  K);.    assert( 
12eb0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69  pFile );.    uni
12ec0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
12ed0 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e     releaseLockIn
12ee0 66 6f 28 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 29  fo(pFile->pLock)
12ef0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 4f 70 65  ;.    releaseOpe
12f00 6e 43 6e 74 28 70 46 69 6c 65 2d 3e 70 4f 70 65  nCnt(pFile->pOpe
12f10 6e 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  n);.    unixLeav
12f20 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
12f30 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
12f40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12f50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
12f60 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
12f70 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
12f80 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
12f90 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
12fa0 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
12fb0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12fc0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
12fd0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
12fe0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
12ff0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13000 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13050 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
13060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130a0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
130b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130c0 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
130d0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
13100 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
13110 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
13120 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
13130 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
13140 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
13150 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
13160 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
13170 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
13180 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
13190 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
131a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
131b0 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
131c0 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
131d0 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
131e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
131f0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
13200 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
13210 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
13220 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
13230 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
13240 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
13250 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
13260 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
13270 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
13280 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13290 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
132a0 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
132b0 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
132c0 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
132d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
132e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
132f0 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
13300 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
13310 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
13320 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
13330 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
13340 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
13350 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
13360 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
13370 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
13380 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
13390 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
133a0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
133b0 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
133c0 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
133d0 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
133e0 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
133f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
13400 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
13410 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
13420 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
13430 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
13440 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
13450 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
13460 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
13470 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
13480 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
134b0 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
134c0 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
134d0 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
134e0 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
134f0 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
13500 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
13510 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
13520 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
13530 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
13540 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
13550 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
13560 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
13570 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
13580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
13590 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
135a0 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
135b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
135c0 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
135d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
13600 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
13610 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
13620 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13640 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
13650 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
13660 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
13670 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
13680 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
13690 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
136a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
136b0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
136c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
136d0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
136e0 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
136f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
13700 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
13710 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
13720 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
13730 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
13740 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
13750 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
13760 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
13770 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
13780 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
13790 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
137a0 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
137b0 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
137c0 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
137d0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
137e0 20 4f 53 54 52 41 43 45 36 28 22 41 46 50 53 45   OSTRACE6("AFPSE
137f0 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
13800 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
13810 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
13820 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
13830 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
13840 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
13850 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
13860 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
13870 6e 67 74 68 29 3b 0a 20 20 65 72 72 20 3d 20 66  ngth);.  err = f
13880 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
13890 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
138a0 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
138b0 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
138c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
138d0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
138e0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
138f0 34 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  4("AFPSETLOCK fa
13900 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
13910 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
13920 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
13930 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
13940 6f 72 28 74 45 72 72 6e 6f 29 29 3b 0a 23 69 66  or(tErrno));.#if
13950 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
13960 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
13970 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
13980 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
13990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
139a0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
139b0 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
139d0 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
139e0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
139f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
13a00 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
13a10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
13a20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
13a30 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
13a40 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
13a50 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13a60 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20  rno = tErrno;.  
13a70 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
13a80 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
13a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13aa0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13ab0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13ac0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13ad0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13ae0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
13af0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
13b00 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
13b10 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
13b20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
13b30 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13b40 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13b50 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13b60 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13b70 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13b80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13b90 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13ba0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13bb0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13bc0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13bd0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13be0 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
13bf0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13c00 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13c10 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c30 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13c40 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13c50 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13c60 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75  e*)id;.  .  Simu
13c70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13c80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13c90 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13ca0 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13cb0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 61  rt( pFile );.  a
13cc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
13cd0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
13ce0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
13cf0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
13d00 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
13d10 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
13d20 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
13d30 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
13d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13d50 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
13d60 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
13d70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
13d80 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
13d90 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
13da0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
13db0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
13dc0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
13dd0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
13de0 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  le->pLock->lockt
13df0 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
13e00 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
13e10 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
13e20 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
13e30 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
13e40 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
13e50 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65    */.  if( !rese
13e60 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  rved ){.    /* l
13e70 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44  ock the RESERVED
13e80 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74   byte */.    int
13e90 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63   lrc = afpSetLoc
13ea0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
13eb0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
13ec0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20  ED_BYTE, 1,1);  
13ed0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
13ee0 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20  OK==lrc ){.     
13ef0 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65   /* if we succee
13f00 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68  ded in taking th
13f10 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c  e reserved lock,
13f20 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65   unlock it to re
13f30 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  store.      ** t
13f40 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  he original stat
13f50 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  e */.      lrc =
13f60 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
13f70 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
13f80 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
13f90 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
13fa0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
13fb0 69 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  if we failed to 
13fc0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65  get the lock the
13fd0 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d  n someone else m
13fe0 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20  ust have it */. 
13ff0 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
14000 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
14010 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
14020 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d  rc) ){.      rc=
14030 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  lrc;.    }.  }. 
14040 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14050 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  ex();.  OSTRACE4
14060 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
14070 64 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22  d %d %d (afp)\n"
14080 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14090 72 65 73 65 72 76 65 64 29 3b 0a 20 20 0a 20 20  reserved);.  .  
140a0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
140b0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
140c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
140d0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
140e0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
140f0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
14100 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
14110 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14120 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
14130 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
14140 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
14150 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
14160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
14170 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
14180 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
14190 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
141a0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
141b0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
141c0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
141d0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
141e0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
141f0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
14200 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
14210 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
14220 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
14230 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
14240 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
14250 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
14260 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
14270 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
14280 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
14290 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
142a0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
142b0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
142c0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
142d0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
142e0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
142f0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14300 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
14310 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
14320 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14330 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
14340 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14350 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14360 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
14370 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
14380 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
14390 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
143a0 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
143b0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
143c0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
143d0 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
143e0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
143f0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
14400 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
14410 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
14420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14430 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14440 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14450 29 69 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e  )id;.  struct un
14460 69 78 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  ixLockInfo *pLoc
14470 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b  k = pFile->pLock
14480 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
14490 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
144a0 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
144b0 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
144c0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
144d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
144e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28 22   );.  OSTRACE7("
144f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
14500 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
14510 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
14520 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
14530 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c    locktypeName(l
14540 6f 63 6b 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79  ocktype), lockty
14550 70 65 4e 61 6d 65 28 70 46 69 6c 65 2d 3e 6c 6f  peName(pFile->lo
14560 63 6b 74 79 70 65 29 2c 0a 20 20 20 20 20 20 20  cktype),.       
14570 20 20 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65      locktypeName
14580 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  (pLock->locktype
14590 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 2c 20  ), pLock->cnt , 
145a0 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 2f 2a  getpid());..  /*
145b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
145c0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
145d0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
145e0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
145f0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
14600 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
14610 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
14620 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
14630 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
14640 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
14650 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
14660 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
14670 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
14680 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
14690 20 20 20 4f 53 54 52 41 43 45 33 28 22 4c 4f 43     OSTRACE3("LOC
146a0 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
146b0 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
146c0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
146d0 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
146e0 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
146f0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
14700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14710 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14720 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
14730 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
14740 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
14750 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
14760 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
14770 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
14780 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
14790 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
147a0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
147b0 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
147c0 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
147d0 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
147e0 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
147f0 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
14800 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
14810 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
14820 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
14830 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
14840 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
14850 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
14860 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
14870 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
14880 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
14890 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
148a0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
148b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
148c0 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
148d0 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
148e0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 69 73 20 73  File->pLock is s
148f0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
14900 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
14910 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
14920 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14930 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
14940 20 6f 77 6e 73 20 74 68 65 20 70 46 69 6c 65 2e   owns the pFile.
14950 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 74 72 61  .  */.  rc = tra
14960 6e 73 66 65 72 4f 77 6e 65 72 73 68 69 70 28 70  nsferOwnership(p
14970 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
14980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14990 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
149a0 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ();.    return r
149b0 63 3b 0a 20 20 7d 0a 20 20 70 4c 6f 63 6b 20 3d  c;.  }.  pLock =
149c0 20 70 46 69 6c 65 2d 3e 70 4c 6f 63 6b 3b 0a 0a   pFile->pLock;..
149d0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
149e0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
149f0 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
14a00 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
14a10 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
14a20 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
14a30 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
14a40 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
14a50 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
14a60 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
14a70 3d 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65  =pLock->locktype
14a80 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 4c 6f   && .       (pLo
14a90 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
14aa0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
14ab0 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
14ac0 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
14ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14ae0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
14af0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
14b00 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
14b10 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
14b20 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
14b30 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
14b40 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
14b50 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
14b60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
14b70 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
14b80 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
14b90 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
14ba0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
14bb0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
14bd0 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
14be0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14bf0 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  CK || pLock->loc
14c00 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
14c10 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
14c20 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  ert( locktype==S
14c30 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
14c40 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14c50 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a  >locktype==0 );.
14c60 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
14c70 6b 2d 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20  k->cnt>0 );.    
14c80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
14c90 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
14ca0 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b     pLock->cnt++;
14cb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4f 70 65  .    pFile->pOpe
14cc0 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  n->nLock++;.    
14cd0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
14ce0 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
14cf0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
14d00 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
14d10 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
14d20 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
14d30 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
14d40 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14d50 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
14d60 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
14d70 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
14d80 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
14d90 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14da0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
14db0 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b 74  .      || (lockt
14dc0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14dd0 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f  OCK && pFile->lo
14de0 63 6b 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c  cktype<PENDING_L
14df0 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  OCK).  ){.    in
14e00 74 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61  t failed;.    fa
14e10 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
14e20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
14e30 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
14e40 47 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20  G_BYTE, 1, 1);. 
14e50 20 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b     if (failed) {
14e60 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
14e70 65 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  ed;.      goto a
14e80 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
14e90 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49   }.  }.  .  /* I
14ea0 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
14eb0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
14ec0 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
14ed0 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
14ee0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
14ef0 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
14f00 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
14f10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
14f20 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14f30 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
14f40 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
14f50 72 6e 6f 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  rno;.    long lk
14f60 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
14f70 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
14f80 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
14f90 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
14fa0 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20 20 20  ktype==0 );.    
14fb0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
14fc0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
14fd0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
14fe0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
14ff0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
15000 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
15010 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
15020 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
15030 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
15040 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
15050 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
15060 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
15070 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
15080 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15090 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
150a0 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
150b0 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
150c0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
150d0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
150e0 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
150f0 44 5f 46 49 52 53 54 2b 70 4c 6f 63 6b 2d 3e 73  D_FIRST+pLock->s
15100 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
15110 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
15120 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b  K_ERROR(lrc1) ){
15130 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f  .      lrc1Errno
15140 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
15150 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rno;.    }.    /
15160 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
15170 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
15180 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20  k */.    lrc2 = 
15190 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
151a0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
151b0 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
151c0 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20   1, 0);.    .   
151d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
151e0 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20  OR(lrc1) ) {.   
151f0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15200 72 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b  rno = lrc1Errno;
15210 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
15220 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15230 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15240 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
15250 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
15260 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
15270 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
15280 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
15290 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
152a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
152b0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
152c0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
152d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
152e0 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
152f0 4b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  K;.      pFile->
15300 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  pOpen->nLock++;.
15310 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74        pLock->cnt
15320 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
15330 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  lse if( locktype
15340 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
15350 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31   && pLock->cnt>1
15360 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
15370 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
15380 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
15390 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
153a0 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a  d in this.     *
153b0 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
153c0 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
153d0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
153e0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
153f0 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
15400 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
15410 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
15420 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
15430 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
15440 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
15450 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
15460 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
15470 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
15480 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
15490 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  y..    */.    in
154a0 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  t failed = 0;.  
154b0 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69    assert( 0!=pFi
154c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
154d0 20 20 20 20 69 66 20 28 6c 6f 63 6b 74 79 70 65      if (locktype
154e0 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   >= RESERVED_LOC
154f0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K && pFile->lock
15500 74 79 70 65 20 3c 20 52 45 53 45 52 56 45 44 5f  type < RESERVED_
15510 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
15520 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
15530 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
15540 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
15550 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
15560 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
15570 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
15580 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
15590 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
155a0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
155b0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
155c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
155d0 28 21 66 61 69 6c 65 64 20 26 26 20 6c 6f 63 6b  (!failed && lock
155e0 74 79 70 65 20 3d 3d 20 45 58 43 4c 55 53 49 56  type == EXCLUSIV
155f0 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
15600 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
15610 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
15620 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
15630 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
15640 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
15650 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
15660 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
15670 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
15680 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
15690 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
156a0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
156b0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
156c0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
156d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
156e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
156f0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
15700 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15720 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42 79 74 65  Lock->sharedByte
15730 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
15740 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
15750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15760 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
15770 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
15780 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
15790 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
157a0 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
157b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
157c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
157d0 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15800 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
15810 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
15820 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
15830 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15840 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
15870 52 53 54 20 2b 20 70 4c 6f 63 6b 2d 3e 73 68 61  RST + pLock->sha
15880 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29 20  redByte, 1, 1)) 
15890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
158a0 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69 73  Can't reestablis
158b0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
158c0 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27 74  k.  Sqlite can't
158d0 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a 20   deal, this is. 
158e0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 72           ** a cr
158f0 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72  itical I/O error
15900 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
15910 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28 66          rc = ((f
15920 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f 49  ailed & SQLITE_I
15930 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
15940 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
15950 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
15960 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
15970 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
15980 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
15990 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
159a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
159b0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
159c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
159d0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
159e0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
159f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
15a00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
15a20 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
15a30 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c 6f 63  cktype;.    pLoc
15a40 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  k->locktype = lo
15a50 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73 65 20  cktype;.  }else 
15a60 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
15a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
15a80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15a90 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
15aa0 43 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c  CK;.    pLock->l
15ab0 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
15ac0 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
15ad0 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
15ae0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15af0 0a 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43  .  OSTRACE4("LOC
15b00 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
15b10 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
15b20 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 6c  , locktypeName(l
15b30 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20 20  ocktype), .     
15b40 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
15b50 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
15b60 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
15b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
15b80 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15b90 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15ba0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15bb0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
15bc0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
15bd0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
15be0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
15bf0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
15c00 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
15c10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15c20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
15c30 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
15c40 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
15c50 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
15c60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15c80 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
15c90 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
15ca0 63 6b 74 79 70 65 29 20 7b 0a 20 20 69 6e 74 20  cktype) {.  int 
15cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15cc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15cd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15ce0 64 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  d;.  struct unix
15cf0 4c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b  LockInfo *pLock;
15d00 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
15d10 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
15d20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15d30 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15d40 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15d50 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
15d60 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
15d70 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
15d80 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
15d90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15da0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 37 28  e );.  OSTRACE7(
15db0 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
15dc0 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
15dd0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
15de0 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
15df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15e00 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
15e10 69 6c 65 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  ile->pLock->lock
15e20 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 70 4c 6f  type, pFile->pLo
15e30 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
15e40 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c  ));..  assert( l
15e50 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
15e60 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
15e70 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c  ile->locktype<=l
15e80 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15e90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ea0 0a 20 20 7d 0a 20 20 69 66 28 20 43 48 45 43 4b  .  }.  if( CHECK
15eb0 5f 54 48 52 45 41 44 49 44 28 70 46 69 6c 65 29  _THREADID(pFile)
15ec0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15ed0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
15ee0 54 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  T;.  }.  unixEnt
15ef0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c 6f  erMutex();.  pLo
15f00 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 70 4c 6f 63  ck = pFile->pLoc
15f10 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f  k;.  assert( pLo
15f20 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
15f30 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
15f40 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
15f50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15f60 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  Lock->locktype==
15f70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
15f80 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
15f90 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
15fa0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
15fb0 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
15fc0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
15fd0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
15fe0 20 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47   .#ifndef NDEBUG
15ff0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
16000 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
16010 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
16020 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
16030 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
16040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16050 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
16060 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
16070 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
16080 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
16090 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
160a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
160b0 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
160c0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
160d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
160e0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
160f0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
16100 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
16110 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
16120 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
16130 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
16140 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
16150 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
16160 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
16170 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
16180 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
16190 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
161a0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
161b0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
161c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
161d0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
161e0 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
161f0 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
16200 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
16210 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
16220 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
16230 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
16240 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
16250 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
16260 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
16270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16280 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
16290 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
162a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
162b0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
162c0 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c  ST, SHARED_SIZE,
162d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
162e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
162f0 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  (locktype==SHARE
16300 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
16310 3e 63 6e 74 3e 31 29 20 29 7b 0a 20 20 20 20 20  >cnt>1) ){.     
16320 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
16330 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
16340 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
16350 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
16360 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
16370 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
16380 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
16390 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20  yte;.        rc 
163a0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
163b0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
163c0 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42  ile, sharedLockB
163d0 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  yte, 1, 1);.    
163e0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
163f0 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20     skipShared = 
16400 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16420 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
16430 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45 4e 44 49  >locktype>=PENDI
16440 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
16450 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
16460 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16470 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
16480 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
16490 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
164a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
164b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
164c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
164d0 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
164e0 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
164f0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16500 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16510 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16520 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 1, 0);.      i
16530 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20  f( !rc ){ .     
16540 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
16550 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20  rved = 0; .     
16560 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16580 26 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  & (locktype==SHA
16590 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  RED_LOCK || pLoc
165a0 6b 2d 3e 63 6e 74 3e 31 29 29 7b 0a 20 20 20 20  k->cnt>1)){.    
165b0 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70    pLock->locktyp
165c0 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
165d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
165e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
165f0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  & locktype==NO_L
16600 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44  OCK ){..    /* D
16610 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
16620 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
16630 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
16640 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
16650 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
16660 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
16670 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
16680 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
16690 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
166a0 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
166b0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
166c0 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ong sharedLockBy
166d0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
166e0 54 2b 70 4c 6f 63 6b 2d 3e 73 68 61 72 65 64 42  T+pLock->sharedB
166f0 79 74 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  yte;.    pLock->
16700 63 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  cnt--;.    if( p
16710 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a  Lock->cnt==0 ){.
16720 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16730 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16740 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16750 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
16760 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16770 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16780 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
16790 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
167a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
167b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
167c0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
167d0 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
167e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
167f0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
16800 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
16810 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
16820 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
16830 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
16840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  OK ){.      stru
16870 63 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a  ct unixOpenCnt *
16880 70 4f 70 65 6e 20 3d 20 70 46 69 6c 65 2d 3e 70  pOpen = pFile->p
16890 4f 70 65 6e 3b 0a 20 20 20 20 20 20 20 20 0a 20  Open;.        . 
168a0 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63       pOpen->nLoc
168b0 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
168c0 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e  t( pOpen->nLock>
168d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
168e0 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  pOpen->nLock==0 
168f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16900 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
16910 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
16920 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
16930 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
16940 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16950 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 6c 6f  E_OK ) pFile->lo
16960 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70  cktype = locktyp
16970 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
16980 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
16990 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20   file & cleanup 
169a0 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63  AFP specific loc
169b0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f  king context .*/
169c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
169d0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
169e0 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
169f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16a00 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
16a10 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
16a20 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
16a30 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64      afpUnlock(id
16a40 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
16a50 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
16a60 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
16a70 3e 70 4f 70 65 6e 20 26 26 20 70 46 69 6c 65 2d  >pOpen && pFile-
16a80 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29 7b  >pOpen->nLock ){
16a90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16aa0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
16ab0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
16ac0 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
16ad0 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
16ae0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
16af0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
16b00 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
16b10 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
16b20 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
16b30 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
16b40 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20  Open->aPending. 
16b50 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
16b60 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
16b70 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   when.      ** t
16b80 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20  he last lock is 
16b90 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
16ba0 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64 69  /.      setPendi
16bb0 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  ngFd(pFile);.   
16bc0 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 4c 6f   }.    releaseLo
16bd0 63 6b 49 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 4c  ckInfo(pFile->pL
16be0 6f 63 6b 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ock);.    releas
16bf0 65 4f 70 65 6e 43 6e 74 28 70 46 69 6c 65 2d 3e  eOpenCnt(pFile->
16c00 70 4f 70 65 6e 29 3b 0a 20 20 20 20 73 71 6c 69  pOpen);.    sqli
16c10 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
16c20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
16c30 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
16c40 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20  nixFile(id);.   
16c50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16c60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16c70 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
16c80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16c90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16ca0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16cb0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
16cc0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
16cd0 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
16ce0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16cf0 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
16d00 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
16d10 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
16d20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
16d30 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
16d40 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
16d50 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
16d60 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
16d70 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
16d80 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
16d90 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
16da0 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
16db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dc0 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
16dd0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
16de0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
16e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
16ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16eb0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
16ec0 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
16ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
16ef0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
16f00 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
16f10 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
16f20 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
16f30 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16f40 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
16f50 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 6c 6f  ptor pFile to lo
16f60 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
16f70 65 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  e. ** must be ei
16f80 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
16f90 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a  SHARED_LOCK.. **
16fa0 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  . ** If the lock
16fb0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16fc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16fd0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16fe0 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20  r below. ** the 
16ff0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
17000 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
17010 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
17020 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .. */.static int
17030 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   nfsUnlock(sqlit
17040 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17050 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 72 65   locktype){.  re
17060 74 75 72 6e 20 5f 70 6f 73 69 78 55 6e 6c 6f 63  turn _posixUnloc
17070 6b 28 69 64 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  k(id, locktype, 
17080 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
17090 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
170a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
170b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
170c0 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
170d0 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
170e0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
170f0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17100 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
17110 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
17120 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
17130 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
17140 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
17150 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
17160 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
17170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17180 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
17190 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
171a0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17210 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
17220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17270 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
17280 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
17290 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
172b0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
172c0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
172d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
172e0 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
172f0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
17300 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
17310 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
17320 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
17330 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
17340 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
17350 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
17360 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
17370 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
17380 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
17390 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
173a0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
173b0 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
173c0 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
173d0 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
173e0 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
173f0 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
17400 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
17410 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
17420 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
17430 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
17440 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
17450 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17460 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17470 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
17480 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
17490 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
174a0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
174b0 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
174c0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
174d0 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
174e0 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
174f0 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
17500 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
17510 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
17520 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
17530 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
17540 41 44 0a 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f  AD.** any any fo
17550 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77  rm by default, w
17560 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  e will not attem
17570 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  pt to define _XO
17580 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53  PEN_SOURCE..** S
17590 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31  ee tickets #2741
175a0 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a   and #2681..**.*
175b0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
175c0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
175d0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
175e0 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72  read the lastErr
175f0 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  no value.** is s
17600 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  et before return
17610 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17620 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75  nt seekAndRead(u
17630 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c  nixFile *id, sql
17640 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
17650 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  t, void *pBuf, i
17660 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67  nt cnt){.  int g
17670 6f 74 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65  ot;.#if (!define
17680 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
17690 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
176a0 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
176b0 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
176c0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69   TIMER_START;.#i
176d0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
176e0 45 41 44 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  EAD).  got = pre
176f0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
17700 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
17710 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17720 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
17730 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
17740 52 45 41 44 36 34 29 0a 20 20 67 6f 74 20 3d 20  READ64).  got = 
17750 70 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  pread64(id->h, p
17760 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
17770 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
17780 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
17790 3b 0a 23 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66  ;.#else.  newOff
177a0 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
177b0 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
177c0 53 45 54 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  SET);.  Simulate
177d0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
177e0 65 74 2d 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65  et-- );.  if( ne
177f0 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20  wOffset!=offset 
17800 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66  ){.    if( newOf
17810 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
17820 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
17830 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
17840 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73   errno;.    }els
17850 65 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46  e{.      ((unixF
17860 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
17870 72 6e 6f 20 3d 20 30 3b 09 09 09 0a 20 20 20 20  rno = 0;....    
17880 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  }.    return -1;
17890 0a 20 20 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61  .  }.  got = rea
178a0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
178b0 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  nt);.#endif.  TI
178c0 4d 45 52 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67  MER_END;.  if( g
178d0 6f 74 3c 30 20 29 7b 0a 20 20 20 20 28 28 75 6e  ot<0 ){.    ((un
178e0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73  ixFile*)id)->las
178f0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
17900 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 35 28 22    }.  OSTRACE5("
17910 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
17920 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20   %7lld %llu\n", 
17930 69 64 2d 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73  id->h, got, offs
17940 65 74 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  et, TIMER_ELAPSE
17950 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  D);.  return got
17960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
17970 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
17980 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
17990 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
179a0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
179b0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
179c0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
179d0 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
179e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
179f0 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
17a00 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
17a10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17a20 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
17a30 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
17a40 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
17a50 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
17a60 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17a70 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
17a80 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
17a90 64 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  d );..  /* If th
17aa0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
17ab0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
17ac0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
17ad0 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
17ae0 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
17af0 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
17b00 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
17b10 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
17b20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
17b30 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
17b40 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
17b50 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
17b60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
17b70 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
17b80 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
17b90 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
17ba0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
17bb0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
17bc0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
17bd0 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
17be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17bf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
17c00 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
17c10 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
17c20 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
17c30 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
17c40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
17c50 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
17c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17c70 20 3d 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73   = 0; /* not a s
17c80 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
17c90 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
17ca0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
17cb0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
17cc0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
17cd0 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
17ce0 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
17cf0 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
17d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17d10 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
17d20 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
17d30 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e  e offset in id->
17d40 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64  offset then read
17d50 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20   cnt bytes into 
17d60 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pBuf..** Return 
17d70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17d80 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
17d90 64 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f  d.  Update the o
17da0 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ffset..**.** To 
17db0 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
17dc0 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
17dd0 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65  n a failed write
17de0 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
17df0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
17e00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17e20 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78  eekAndWrite(unix
17e30 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66  File *id, i64 of
17e40 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64  fset, const void
17e50 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29   *pBuf, int cnt)
17e60 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66  {.  int got;.#if
17e70 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
17e80 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
17e90 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
17ea0 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
17eb0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
17ec0 53 54 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e  START;.#if defin
17ed0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
17ee0 67 6f 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d  got = pwrite(id-
17ef0 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
17f00 66 66 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65  ffset);.#elif de
17f10 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
17f20 34 29 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74  4).  got = pwrit
17f30 65 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  e64(id->h, pBuf,
17f40 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23   cnt, offset);.#
17f50 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
17f60 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
17f70 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
17f80 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73  );.  if( newOffs
17f90 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20  et!=offset ){.  
17fa0 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20    if( newOffset 
17fb0 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28  == -1 ){.      (
17fc0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
17fd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
17fe0 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  o;.    }else{.  
17ff0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
18000 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  id)->lastErrno =
18010 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20   0;....    }.   
18020 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
18030 20 20 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64    got = write(id
18040 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b  ->h, pBuf, cnt);
18050 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
18060 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30  END;.  if( got<0
18070 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69   ){.    ((unixFi
18080 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72  le*)id)->lastErr
18090 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
180a0 0a 20 20 4f 53 54 52 41 43 45 35 28 22 57 52 49  .  OSTRACE5("WRI
180b0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
180c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
180d0 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
180e0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 3b   TIMER_ELAPSED);
180f0 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d  .  return got;.}
18100 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
18110 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
18120 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
18130 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18140 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
18150 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
18160 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
18170 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18180 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
18190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
181a0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
181b0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
181c0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
181d0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
181e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
181f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18200 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
18210 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
18220 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
18230 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
18240 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
18250 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
18260 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
18270 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
18280 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
18290 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
182a0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
182b0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
182c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
182d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
182e0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
182f0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
18300 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
18310 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
18320 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
18330 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
18340 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18350 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
18360 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
18370 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
18380 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
18390 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
183a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
183b0 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
183c0 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
183d0 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
183e0 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
183f0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
18400 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
18410 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
18420 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
18430 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
18440 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
18450 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
18460 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
18470 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
18480 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
18490 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
184a0 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
184b0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
184c0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
184d0 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
184e0 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
184f0 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
18500 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
18510 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
18520 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
18530 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
18540 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
18550 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
18560 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
18570 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
18580 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
185a0 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
185b0 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
185c0 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
185d0 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
185e0 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
185f0 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
18600 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
18610 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
18620 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
18630 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
18640 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20  .  while( amt>0 
18650 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  && (wrote = seek
18660 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
18670 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
18680 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
18690 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f   -= wrote;.    o
186a0 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a  ffset += wrote;.
186b0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
186c0 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
186d0 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65  ;.  }.  Simulate
186e0 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  IOError(( wrote=
186f0 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a  (-1), amt=1 ));.
18700 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
18710 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d  llError(( wrote=
18720 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69  0, amt=1 ));.  i
18730 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  f( amt>0 ){.    
18740 69 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20  if( wrote<0 ){. 
18750 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
18760 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
18770 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
18780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
18790 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
187a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
187b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  ->lastErrno = 0;
187c0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
187d0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
187e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
187f0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
18800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18810 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
18820 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
18830 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
18840 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
18850 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
18860 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
18870 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
18880 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
18890 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
188a0 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
188b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188c0 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
188d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
188e0 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
188f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
18900 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
18910 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
18920 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
18930 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
18940 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
18950 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
18960 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
18970 69 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29  ith the (slower)
18980 20 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20   fsync()..** If 
18990 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
189a0 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
189b0 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
189c0 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
189d0 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
189e0 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
189f0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a  async=fdatasync.
18a00 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
18a10 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64  fdatasync) && !d
18a20 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
18a30 29 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  ).# define fdata
18a40 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
18a50 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
18a60 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
18a70 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
18a80 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
18a90 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
18aa0 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
18ab0 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
18ac0 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
18ad0 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
18ae0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
18af0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
18b00 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
18b10 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
18b20 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b30 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
18b40 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
18b50 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
18b60 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
18b70 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
18b80 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
18b90 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
18ba0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
18bb0 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
18bc0 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
18bd0 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
18be0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
18bf0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
18c00 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
18c10 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
18c20 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
18c30 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
18c40 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
18c50 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
18c60 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
18c70 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
18c80 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
18c90 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
18ca0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
18cb0 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
18cc0 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
18cd0 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
18ce0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
18cf0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
18d00 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
18d10 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
18d20 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
18d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18d40 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
18d50 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
18d60 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
18d70 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
18d80 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
18d90 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
18da0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
18db0 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
18dc0 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
18dd0 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
18de0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
18df0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
18e00 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
18e10 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
18e20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
18e30 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
18e40 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
18e50 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
18e60 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
18e70 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
18e80 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
18e90 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
18ea0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
18eb0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
18ec0 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
18ed0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18ee0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
18ef0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
18f00 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
18f10 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
18f20 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
18f30 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
18f40 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
18f50 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
18f60 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
18f70 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
18f80 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
18f90 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
18fa0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
18fb0 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
18fc0 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
18fd0 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
18fe0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
18ff0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
19000 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
19010 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
19020 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
19030 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
19040 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
19050 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
19060 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
19070 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
19080 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
19090 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
190a0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
190b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
190c0 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
190d0 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
190e0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
190f0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
19100 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
19110 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
19120 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
19130 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
19140 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
19150 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
19160 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
19170 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
19180 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
19190 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
191a0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
191b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
191c0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
191d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
191e0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
191f0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
19200 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
19210 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
19220 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19230 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
19240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19250 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
19260 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
19270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
19280 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
19290 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
192a0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
192b0 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
192c0 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
192d0 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
192e0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
192f0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
19300 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
19310 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
19320 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19330 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
19340 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
19350 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
19360 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
19370 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
19380 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
19390 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
193a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
193b0 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
193c0 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
193d0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
193e0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
193f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
19400 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
19410 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
19420 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74  ){.    rc = fcnt
19430 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
19440 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
19450 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
19460 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
19470 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
19480 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
19490 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
194a0 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
194b0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
194c0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
194d0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
194e0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
194f0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
19500 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
19510 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
19520 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
19530 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
19540 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
19550 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
19560 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
19570 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
19580 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
19590 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
195a0 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
195b0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
195c0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
195d0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
195e0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
195f0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
19600 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
19610 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
19620 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
19630 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
19640 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
19650 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
19660 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
19670 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
19680 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
19690 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
196a0 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
196b0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
196c0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
196d0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
196e0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
196f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
19700 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
19710 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
19720 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
19730 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
19740 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
19750 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
19760 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
19770 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
19780 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
19790 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
197a0 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
197b0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
197c0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
197d0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
197e0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
197f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19800 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
19810 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
19820 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
19830 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
19840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
19850 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
19860 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
19870 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
19880 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
19890 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
198a0 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
198b0 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
198c0 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
198d0 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
198e0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
198f0 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
19900 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
19910 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
19920 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
19930 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
19940 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
19950 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
19960 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
19970 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
19980 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
19990 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
199a0 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
199b0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
199c0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
199d0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
199e0 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
199f0 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
19a00 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
19a10 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
19a20 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
19a30 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
19a40 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
19a50 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
19a60 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
19a70 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
19a80 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
19a90 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
19aa0 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
19ab0 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
19ac0 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
19ad0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
19ae0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
19af0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19b00 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
19b10 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
19b20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
19b30 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
19b40 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
19b50 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
19b60 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
19b70 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
19b80 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
19b90 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
19ba0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
19bb0 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
19bc0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
19bd0 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
19be0 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
19bf0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
19c00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
19c10 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
19c20 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
19c30 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
19c40 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
19c50 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
19c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
19c70 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
19c80 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
19c90 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
19ca0 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
19cb0 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
19cc0 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
19cd0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
19ce0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19cf0 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
19d00 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
19d10 54 52 41 43 45 32 28 22 53 59 4e 43 20 20 20 20  TRACE2("SYNC    
19d20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
19d30 68 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  h);.  rc = full_
19d40 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
19d50 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
19d60 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
19d70 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
19d80 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
19d90 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19da0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
19db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19dc0 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
19dd0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
19de0 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
19df0 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
19e00 43 45 34 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE4("DIRSYNC %-3
19e10 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
19e20 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
19e30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
19e40 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
19e50 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
19e60 69 73 46 75 6c 6c 73 79 6e 63 29 3b 0a 23 69 66  isFullsync);.#if
19e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
19e80 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20 20  BLE_DIRSYNC.    
19e90 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79  /* The directory
19ea0 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61 74   sync is only at
19eb0 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c 5f  tempted if full_
19ec0 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a 20  fsync is.    ** 
19ed0 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75 6e  turned off or un
19ee0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 61  available.  If a
19ef0 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63 75   full_fsync occu
19f00 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20 20  rred above,.    
19f10 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72 65  ** then the dire
19f20 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73 75  ctory sync is su
19f30 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20 2a  perfluous..    *
19f40 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56 45  /.    if( (!HAVE
19f50 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21 69  _FULLFSYNC || !i
19f60 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66 75  sFullsync) && fu
19f70 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
19f80 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20 20  dirfd,0,0) ){.  
19f90 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 2a       /*.       *
19fa0 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69 76  * We have receiv
19fb0 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f  ed multiple repo
19fc0 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20 72  rts of fsync() r
19fd0 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20  eturning.       
19fe0 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20 61  ** errors when a
19ff0 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63 74  pplied to direct
1a000 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69 6e  ories on certain
1a010 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a 20   file systems.. 
1a020 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c 65        ** A faile
1a030 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  d directory sync
1a040 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64 65   is not a big de
1a050 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d 73  al.  So it seems
1a060 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74 65  .       ** bette
1a070 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  r to ignore the 
1a080 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20 23  error.  Ticket #
1a090 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a 20  1657.       */. 
1a0a0 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e        /* pFile->
1a0b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a0c0 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a 20  o; */.       /* 
1a0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a0e0 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  ERR; */.    }.#e
1a0f0 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20 63  ndif.    err = c
1a100 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
1a110 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  d); /* Only need
1a120 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20 73   to sync once, s
1a130 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a 20  o close the */. 
1a140 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29 7b     if( err==0 ){
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a160 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e 20   directory when 
1a170 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a 20  we are done */. 
1a180 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72 66       pFile->dirf
1a190 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  d = -1;.    }els
1a1a0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
1a1b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
1a1c0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
1a1d0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
1a1e0 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOSE;.    }.  }.
1a1f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a200 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1a210 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1a220 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1a230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a240 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1a250 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1a260 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 72   nByte){.  int r
1a270 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  c;.  assert( id 
1a280 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a290 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1a2a0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1a2b0 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74 72  TE );.  rc = ftr
1a2c0 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69 6c  uncate(((unixFil
1a2d0 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66 5f  e*)id)->h, (off_
1a2e0 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  t)nByte);.  if( 
1a2f0 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78  rc ){.    ((unix
1a300 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
1a310 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1a320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a330 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a  IOERR_TRUNCATE;.
1a340 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66    }else{.#ifndef
1a350 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49   NDEBUG.    /* I
1a360 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1a370 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1a380 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1a390 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1a3a0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1a3b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a3c0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1a3d0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1a3e0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1a3f0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1a400 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1a410 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1a420 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1a430 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1a440 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1a450 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1a460 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1a470 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1a480 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1a490 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1a4a0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1a4b0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1a4c0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1a4d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 75    */.    if( ((u
1a4e0 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69 6e  nixFile*)id)->in
1a4f0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e  NormalWrite && n
1a500 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1a510 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a520 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a530 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1a540 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  f..    return SQ
1a550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
1a560 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
1a570 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1a580 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
1a590 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
1a5a0 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73  t unixFileSize(s
1a5b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1a5c0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1a5d0 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74  int rc;.  struct
1a5e0 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73   stat buf;.  ass
1a5f0 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20  ert( id );.  rc 
1a600 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46 69  = fstat(((unixFi
1a610 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
1a620 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
1a630 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
1a640 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1a650 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
1a660 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
1a670 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
1a680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1a690 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  AT;.  }.  *pSize
1a6a0 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
1a6b0 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69  .  /* When openi
1a6c0 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64  ng a zero-size d
1a6d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e  atabase, the fin
1a6e0 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 70 72 6f 63  dLockInfo() proc
1a6f0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1a700 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1a710 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1a720 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1a730 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1a740 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1a750 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1a760 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1a770 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1a780 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1a790 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1a7a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1a7b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1a7c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1a7d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1a7e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1a7f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1a800 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1a810 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1a820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1a830 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1a840 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1a850 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1a860 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1a870 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1a880 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1a890 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1a8a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1a8b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1a8c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1a8d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1a8e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1a8f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1a900 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1a910 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20  Information and 
1a920 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70  control of an op
1a930 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
1a940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1a950 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  ixFileControl(sq
1a960 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a970 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1a980 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f  rg){.  switch( o
1a990 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
1a9a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
1a9b0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
1a9c0 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e  int*)pArg = ((un
1a9d0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  ixFile*)id)->loc
1a9e0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74  ktype;.      ret
1a9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1aa00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1aa10 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  LITE_LAST_ERRNO:
1aa20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1aa30 70 41 72 67 20 3d 20 28 28 75 6e 69 78 46 69 6c  pArg = ((unixFil
1aa40 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e  e*)id)->lastErrn
1aa50 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
1aa60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1aa70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aa80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1aa90 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68   calls this meth
1aaa0 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61  od to signal tha
1aab0 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20  t it has done.  
1aac0 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
1aad0 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
1aae0 61 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f  abase is therefo
1aaf0 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  re unchanged and
1ab00 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65  .    ** it hence
1ab10 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1ab20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68  e transaction ch
1ab30 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20  ange counter to 
1ab40 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e  be.    ** unchan
1ab50 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ged..    */.    
1ab60 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ab70 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20  L_DB_UNCHANGED: 
1ab80 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69  {.      ((unixFi
1ab90 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74  le*)id)->dbUpdat
1aba0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  e = 0;.      ret
1abb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1abc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
1abd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1abe0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1abf0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ac00 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
1ac10 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
1ac20 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1ac30 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
1ac40 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
1ac50 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
1ac60 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
1ac70 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
1ac80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1ac90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1aca0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1acb0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20  PLE__) */.  }.  
1acc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1acd0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
1ace0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
1acf0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
1ad00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ad10 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
1ad20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
1ad30 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
1ad40 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
1ad50 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
1ad60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
1ad70 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
1ad80 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
1ad90 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
1ada0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
1adb0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
1adc0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
1add0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
1ade0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
1adf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
1ae00 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
1ae10 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
1ae20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
1ae30 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
1ae40 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
1ae50 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
1ae60 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
1ae70 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1ae80 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1ae90 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1aea0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1aeb0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1aec0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1aed0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1aee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1aef0 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1af00 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1af10 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ile. This is alw
1af20 61 79 73 20 30 20 66 6f 72 20 75 6e 69 78 2e 0a  ays 0 for unix..
1af30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1af40 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1af50 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
1af60 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  file *NotUsed){.
1af70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1af80 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
1af90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1afa0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
1afb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1afc0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
1afd0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
1afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aff0 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
1b000 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
1b010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1b080 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
1b090 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
1b0a0 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
1b0b0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1b0c0 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
1b0d0 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
1b0e0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
1b0f0 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
1b100 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
1b110 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
1b120 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
1b130 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
1b140 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1b150 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
1b160 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
1b170 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
1b180 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
1b190 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
1b1a0 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
1b1b0 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
1b1c0 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
1b1d0 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
1b1e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
1b1f0 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
1b200 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
1b210 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
1b220 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
1b230 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
1b240 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
1b250 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
1b260 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b270 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
1b280 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
1b290 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
1b2a0 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
1b2b0 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
1b2c0 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
1b2d0 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
1b2e0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
1b2f0 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
1b300 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
1b310 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
1b320 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 74   For finder-funt
1b330 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63  ion F, two objec
1b340 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a  ts are created:.
1b350 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65  **.**    (1) The
1b360 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e   real finder-fun
1b370 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d  ction named "FIm
1b380 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  pt()"..**.**    
1b390 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70  (2) A constant p
1b3a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66  ointer to this f
1b3b0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75  unction named ju
1b3c0 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  st "F"..**.**.**
1b3d0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
1b3e0 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75  e F pointer is u
1b3f0 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44  sed as the pAppD
1b400 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46  ata value for VF
1b410 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57  S.** objects.  W
1b420 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69  e have to do thi
1b430 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  s instead of let
1b440 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f  ting pAppData po
1b450 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20  int.** directly 
1b460 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75  at the finder-fu
1b470 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30  nction since C90
1b480 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61   rules prevent a
1b490 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62   void*.** from b
1b4a0 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75  e cast into a fu
1b4b0 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a  nction pointer..
1b4c0 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  **.**.** Each in
1b4d0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d  stance of this m
1b4e0 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74  acro generates t
1b4f0 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a  wo objects:.**.*
1b500 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e  *   *  A constan
1b510 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1b520 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c  hods object call
1b530 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73   METHOD that has
1b540 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
1b550 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20   methods CLOSE, 
1b560 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b  LOCK, UNLOCK, CK
1b570 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20  RESLOCK..**.**  
1b580 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f   *  An I/O metho
1b590 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  d finder functio
1b5a0 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20  n called FINDER 
1b5b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70  that returns a p
1b5c0 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74  ointer.**      t
1b5d0 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a  o the METHOD obj
1b5e0 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ect in the previ
1b5f0 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23  ous bullet..*/.#
1b600 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53  define IOMETHODS
1b610 28 46 49 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c  (FINDER, METHOD,
1b620 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
1b630 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20  LOCK, CKLOCK)   
1b640 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
1b650 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1b660 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
1b670 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1b6a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1b6c0 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
1b6f0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
1b700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1b710 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1b740 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1b760 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1b790 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
1b7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1b7b0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1b7e0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1b7f0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1b800 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1b830 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1b840 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
1b850 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
1b880 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
1b890 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
1b8a0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8e0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1b940 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1b990 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
1b9c0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
1b9d0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
1b9e0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
1ba10 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1ba20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
1ba30 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ba50 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
1ba60 61 72 61 63 74 65 72 69 73 74 69 63 73 20 20 20  aracteristics   
1ba70 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
1ba80 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1baa0 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  };              
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
1baf0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1bb00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1bb10 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e  FINDER##Impl(con
1bb20 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78  st char *z, unix
1bb30 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20  File *p){   \.  
1bb40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bb50 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41  (z); UNUSED_PARA
1bb60 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72             \.  r
1bb90 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20  eturn &METHOD;  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20            \.}   
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69           \.stati
1bc30 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
1bc40 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f  io_methods *(*co
1bc50 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73  nst FINDER)(cons
1bc60 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1bc70 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20   *p)    \.    = 
1bc80 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f  FINDER##Impl;../
1bc90 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c  *.** Here are al
1bca0 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  l of the sqlite3
1bcb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1bcc0 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20  cts for each of 
1bcd0 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73  the.** locking s
1bce0 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63  trategies.  Func
1bcf0 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
1bd00 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  n pointers to th
1bd10 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61  ese methods.** a
1bd20 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e  re also created.
1bd30 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  .*/.IOMETHODS(. 
1bd40 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20   posixIoFinder, 
1bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bd60 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
1bd70 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d  me */.  posixIoM
1bd80 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
1bd90 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
1bda0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
1bdb0 61 6d 65 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  ame */.  unixClo
1bdc0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
1bdd0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1bde0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
1bdf0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1be00 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1be10 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
1be20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1be30 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1be40 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
1be50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
1be60 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1be70 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1be80 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
1be90 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
1bea0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
1beb0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
1bec0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
1bed0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
1bee0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
1bef0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
1bf00 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
1bf10 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1bf20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
1bf30 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bf40 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1bf50 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
1bf60 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55  hod */.  nolockU
1bf70 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
1bf80 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
1bf90 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
1bfa0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1bfb0 6b 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  k   /* xCheckRes
1bfc0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
1bfd0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
1bfe0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
1bff0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
1c000 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
1c010 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
1c020 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
1c030 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
1c040 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
1c050 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f   name */.  dotlo
1c060 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
1c070 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
1c080 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c090 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
1c0a0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
1c0b0 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
1c0c0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
1c0d0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
1c0e0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
1c0f0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
1c100 6f 63 6b 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock  /* xCheckRe
1c110 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
1c120 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49  d */.)..#if SQLI
1c130 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c140 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
1c150 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53  XWORKS.IOMETHODS
1c160 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
1c170 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
1c180 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
1c190 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
1c1a0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1c1b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
1c1c0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
1c1d0 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63  t name */.  floc
1c1e0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
1c1f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1c200 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c210 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
1c220 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
1c230 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
1c240 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1c250 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
1c260 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
1c270 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
1c280 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
1c290 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
1c2a0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
1c2b0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49  #if OS_VXWORKS.I
1c2c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49  OMETHODS(.  semI
1c2d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
1c2e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
1c2f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
1c300 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c  .  semIoMethods,
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c320 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1c330 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
1c340 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20 20  /.  semClose,   
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c360 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
1c370 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20 20  /.  semLock,    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c390 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
1c3a0 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20 20  .  semUnlock,   
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
1c3d0 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73 65  /.  semCheckRese
1c3e0 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a  rvedLock      /*
1c3f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
1c400 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  ock method */.).
1c410 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1c420 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
1c430 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
1c440 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
1c450 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
1c460 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
1c470 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1c480 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1c490 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
1c4b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1c4c0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1c4d0 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
1c500 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
1c510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c520 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
1c530 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c550 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
1c560 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
1c570 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1c580 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1c590 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1c5a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
1c5b0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
1c5c0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
1c5d0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
1c5e0 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
1c5f0 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
1c600 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c610 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
1c620 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
1c630 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
1c640 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
1c650 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
1c660 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1c670 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
1c680 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
1c690 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
1c6a0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
1c6b0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
1c6c0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
1c6d0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
1c6e0 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
1c6f0 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
1c700 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
1c710 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
1c720 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
1c730 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
1c740 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1c750 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
1c760 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
1c770 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
1c780 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
1c790 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1c7a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1c7b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1c7c0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
1c7d0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
1c7e0 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1c7f0 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
1c800 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
1c810 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
1c820 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
1c830 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1c840 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
1c850 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
1c860 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1c870 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
1c880 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
1c890 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
1c8a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
1c8b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
1c8c0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
1c8d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1c8e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1c8f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  ject name */.  p
1c900 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
1c910 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
1c920 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
1c930 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
1c940 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1c950 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
1c960 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
1c970 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1c980 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
1c990 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
1c9a0 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78 43 68 65  dLock    /* xChe
1c9b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
1c9c0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
1c9d0 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
1c9e0 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
1c9f0 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
1ca00 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
1ca10 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
1ca20 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
1ca30 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1ca40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ca50 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
1ca60 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
1ca70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca80 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
1ca90 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
1caa0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
1cab0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
1cac0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
1cad0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 75  ject name */.  u
1cae0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
1caf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
1cb00 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
1cb10 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
1cb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1cb30 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
1cb40 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nfsUnlock,      
1cb50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1cb60 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1cb70 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1cb80 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20  vedLock      /* 
1cb90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1cba0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ck method */.).#
1cbb0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1cbc0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
1cbd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1cbe0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
1cbf0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
1cc00 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
1cc10 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
1cc20 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
1cc30 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
1cc40 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1cc50 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
1cc60 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
1cc70 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
1cc80 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
1cc90 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
1cca0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
1ccb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1ccc0 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
1ccd0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1cce0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1ccf0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1cd00 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1cd10 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1cd20 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1cd30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cd40 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1cd50 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1cd60 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
1cd70 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
1cd80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
1cd90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1cda0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
1cdb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1cdc0 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
1cdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1cde0 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
1cdf0 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
1ce00 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1ce10 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
1ce20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
1ce30 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
1ce40 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
1ce50 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
1ce60 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
1ce70 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
1ce80 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
1ce90 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
1cea0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
1ceb0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
1cec0 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
1ced0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
1cee0 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
1cef0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
1cf00 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
1cf10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1cf20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
1cf30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1cf40 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1cf50 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1cf60 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1cf70 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1cf80 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1cf90 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1cfa0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1cfb0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1cfc0 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1cfd0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1cfe0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1cff0 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
1d000 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
1d010 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
1d020 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
1d030 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
1d040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
1d050 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
1d060 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1d070 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
1d080 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
1d090 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
1d0a0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
1d0b0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
1d0c0 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
1d0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
1d0e0 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
1d0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d100 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
1d110 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
1d120 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
1d130 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
1d140 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
1d150 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
1d160 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
1d170 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
1d180 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
1d190 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
1d1a0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
1d1b0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
1d1c0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
1d1d0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
1d1e0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
1d1f0 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
1d200 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
1d210 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
1d220 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e 74 6c 28  CK;.  if( fcntl(
1d230 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  pNew->h, F_GETLK
1d240 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31  , &lockInfo)!=-1
1d250 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72   ) {.    if( str
1d260 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
1d270 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d  ypename, "nfs")=
1d280 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1d290 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  rn &nfsIoMethods
1d2a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
1d2b0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73       return &pos
1d2c0 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ixIoMethods;.   
1d2d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1d2e0 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49  return &dotlockI
1d2f0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a  oMethods;.  }.}.
1d300 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1d310 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d320 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f  .  *(*const auto
1d330 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f  lockIoFinder)(co
1d340 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
1d350 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49  le*) = autolockI
1d360 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
1d370 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
1d380 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1d390 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d3a0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1d3b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  f OS_VXWORKS && 
1d3c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1d3d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
1d3e0 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
1d3f0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1d400 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
1d410 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
1d420 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
1d430 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
1d440 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
1d450 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
1d460 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
1d470 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
1d480 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
1d490 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
1d4a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
1d4b0 6f 72 20 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e  or VXWorks only.
1d4c0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1d4d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1d4e0 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
1d4f0 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
1d500 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
1d510 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
1d520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d530 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
1d540 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
1d550 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
1d560 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
1d570 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
1d580 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
1d590 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
1d5a0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
1d5b0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
1d5c0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
1d5d0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
1d5e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
1d5f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1d600 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
1d610 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
1d620 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
1d630 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
1d640 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
1d650 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
1d660 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
1d670 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
1d680 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
1d690 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
1d6a0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
1d6b0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
1d6c0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
1d6d0 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
1d6e0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
1d6f0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
1d700 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
1d710 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63 6e  RDLCK;.  if( fcn
1d720 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
1d730 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
1d740 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75  =-1 ) {.    retu
1d750 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
1d760 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
1d770 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65   return &semIoMe
1d780 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
1d790 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1d7a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
1d7b0 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
1d7c0 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
1d7d0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
1d7e0 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
1d7f0 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
1d800 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
1d810 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1d820 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1d830 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
1d840 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
1d850 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 49 4f 20  pointer to a IO 
1d860 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
1d870 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
1d880 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
1d890 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
1d8a0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
1d8b0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
1d8c0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
1d8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d910 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d930 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
1d940 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d960 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
1d970 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
1d980 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1d990 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
1d9a0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
1d9b0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
1d9c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1d9d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d9e0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
1d9f0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1da00 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
1da10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
1da20 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
1da30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1da40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1da50 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
1da60 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
1da70 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1da80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1da90 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
1daa0 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  ened */.  int di
1dab0 72 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  rfd,            
1dac0 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 66    /* Directory f
1dad0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1dae0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1daf0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
1db00 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
1db10 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
1db20 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1db30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1db40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1db50 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
1db60 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63  d */.  int noLoc
1db70 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k,             /
1db80 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 69  * Omit locking i
1db90 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
1dba0 69 73 44 65 6c 65 74 65 20 20 20 20 20 20 20 20  isDelete        
1dbb0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1dbc0 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1dbd0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
1dbe0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1dbf0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
1dc00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
1dc10 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
1dc20 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
1dc30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1dc40 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 6f 63 6b  ert( pNew->pLock
1dc50 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  ==NULL );.  asse
1dc60 72 74 28 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 3d  rt( pNew->pOpen=
1dc70 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 50  =NULL );..  /* P
1dc80 61 72 61 6d 65 74 65 72 20 69 73 44 65 6c 65 74  arameter isDelet
1dc90 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6f  e is only used o
1dca0 6e 20 76 78 77 6f 72 6b 73 2e 20 45 78 70 72 65  n vxworks. Expre
1dcb0 73 73 20 74 68 69 73 20 65 78 70 6c 69 63 69 74  ss this explicit
1dcc0 6c 79 20 0a 20 20 2a 2a 20 68 65 72 65 20 74 6f  ly .  ** here to
1dcd0 20 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65   prevent compile
1dce0 72 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74  r warnings about
1dcf0 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65   unused paramete
1dd00 72 73 2e 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  rs..  */.  UNUSE
1dd10 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 65  D_PARAMETER(isDe
1dd20 6c 65 74 65 29 3b 0a 0a 20 20 4f 53 54 52 41 43  lete);..  OSTRAC
1dd30 45 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E3("OPEN    %-3d
1dd40 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
1dd50 6e 61 6d 65 29 3b 20 20 20 20 0a 20 20 70 4e 65  name);    .  pNe
1dd60 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77  w->h = h;.  pNew
1dd70 2d 3e 64 69 72 66 64 20 3d 20 64 69 72 66 64 3b  ->dirfd = dirfd;
1dd80 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  .  SET_THREADID(
1dd90 70 4e 65 77 29 3b 0a 20 20 70 4e 65 77 2d 3e 66  pNew);.  pNew->f
1dda0 69 6c 65 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 23  ileFlags = 0;..#
1ddb0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1ddc0 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
1ddd0 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
1dde0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1ddf0 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
1de00 20 20 20 20 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a      noLock = 1;.
1de10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1de20 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
1de30 66 0a 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20  f..  if( noLock 
1de40 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
1de50 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
1de60 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
1de70 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
1de80 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
1de90 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
1dea0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
1deb0 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
1dec0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1ded0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
1dee0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
1def0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
1df00 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
1df10 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
1df20 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
1df30 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
1df40 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
1df50 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
1df60 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
1df70 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
1df80 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
1df90 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
1dfa0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
1dfb0 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
1dfc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
1dfd0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
1dfe0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
1dff0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
1e000 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
1e010 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
1e020 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
1e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1e040 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
1e050 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
1e060 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
1e070 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
1e080 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
1e090 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 4c  ;.    rc = findL
1e0a0 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  ockInfo(pNew, &p
1e0b0 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65  New->pLock, &pNe
1e0c0 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20 20 69  w->pOpen);.    i
1e0d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e0e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1e0f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
1e100 20 69 6e 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   in findLockInfo
1e110 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69  (), close the fi
1e120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20  le descriptor.  
1e130 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
1e140 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61  ly, before relea
1e150 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20  sing the mutex. 
1e160 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 20 6d  findLockInfo() m
1e170 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
1e180 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
1e190 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
1e1a0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
1e1b0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
1e1c0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
1e1d0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
1e1e0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
1e1f0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
1e200 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
1e210 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
1e220 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
1e230 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
1e240 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1e250 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
1e260 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1e270 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
1e280 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
1e290 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
1e2a0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
1e2b0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
1e2c0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1e2d0 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 20  findLockInfo(). 
1e2e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1e2f0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
1e300 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
1e310 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
1e320 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
1e330 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
1e340 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
1e350 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
1e360 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
1e370 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1e380 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
1e390 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
1e3a0 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
1e3b0 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
1e3c0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
1e3d0 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
1e3e0 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
1e3f0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
1e400 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
1e410 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
1e420 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
1e430 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
1e440 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
1e450 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
1e460 2f 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29  /.      close(h)
1e470 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a  ;.      h = -1;.
1e480 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
1e490 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
1e4a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e4b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e4c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1e4d0 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  PLE__).  else if
1e4e0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
1e4f0 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  == &afpIoMethods
1e500 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c   ){.    /* AFP l
1e510 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
1e520 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
1e530 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
1e540 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
1e550 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
1e560 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
1e570 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
1e580 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e  xt *pCtx;.    pN
1e590 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
1e5a0 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69  xt = pCtx = sqli
1e5b0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
1e5c0 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
1e5d0 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
1e5e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1e600 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
1e610 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
1e620 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
1e630 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
1e640 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
1e650 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
1e660 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
1e670 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
1e680 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
1e690 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1e6a0 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
1e6b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
1e6c0 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
1e6d0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
1e6e0 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
1e6f0 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
1e700 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e  ();.      unixEn
1e710 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1e720 20 20 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49    rc = findLockI
1e730 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
1e740 3e 70 4c 6f 63 6b 2c 20 26 70 4e 65 77 2d 3e 70  >pLock, &pNew->p
1e750 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
1e760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e780 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
1e790 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
1e7a0 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b 0a        close(h);.
1e7b0 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
1e7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
1e7d0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
1e7e0 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
1e7f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
1e800 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
1e810 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
1e820 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
1e830 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
1e840 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
1e850 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
1e860 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
1e870 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
1e880 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
1e890 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
1e8a0 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
1e8b0 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
1e8c0 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d  me;.    nFilenam
1e8d0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
1e8e0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
1e8f0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
1e900 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
1e910 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d 65  malloc(nFilename
1e920 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
1e930 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
1e940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1e950 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1e960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1e970 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
1e980 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
1e990 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
1e9a0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
1e9b0 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
1e9c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
1e9d0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
1e9e0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
1e9f0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
1ea00 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
1ea10 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
1ea20 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
1ea30 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
1ea40 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
1ea50 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
1ea60 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
1ea70 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
1ea80 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
1ea90 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1eaa0 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
1eab0 64 4c 6f 63 6b 49 6e 66 6f 28 70 4e 65 77 2c 20  dLockInfo(pNew, 
1eac0 26 70 4e 65 77 2d 3e 70 4c 6f 63 6b 2c 20 26 70  &pNew->pLock, &p
1ead0 4e 65 77 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 20  New->pOpen);.   
1eae0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1eaf0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
1eb00 4f 70 65 6e 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c  Open->pSem==NULL
1eb10 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
1eb20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77  *zSemName = pNew
1eb30 2d 3e 70 4f 70 65 6e 2d 3e 61 53 65 6d 4e 61 6d  ->pOpen->aSemNam
1eb40 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
1eb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1eb60 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1eb70 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
1eb80 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
1ebb0 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
1ebc0 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
1ebd0 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
1ebe0 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
1ebf0 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
1ec00 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
1ec10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
1ec20 70 65 6e 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  pen->pSem = sem_
1ec30 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
1ec40 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
1ec50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1ec60 2d 3e 70 4f 70 65 6e 2d 3e 70 53 65 6d 20 3d 3d  ->pOpen->pSem ==
1ec70 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
1ec80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ec90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1eca0 20 20 70 4e 65 77 2d 3e 70 4f 70 65 6e 2d 3e 61    pNew->pOpen->a
1ecb0 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30  SemName[0] = '\0
1ecc0 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
1ecd0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
1ece0 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
1ecf0 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61 73  f.  .  pNew->las
1ed00 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66 20  tErrno = 0;.#if 
1ed10 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1ed20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ed30 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
1ed40 20 63 6c 6f 73 65 28 68 29 3b 0a 20 20 20 20 68   close(h);.    h
1ed50 20 3d 20 2d 31 3b 0a 20 20 20 20 75 6e 6c 69 6e   = -1;.    unlin
1ed60 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
1ed70 20 20 69 73 44 65 6c 65 74 65 20 3d 20 30 3b 0a    isDelete = 0;.
1ed80 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 69 73 44 65    }.  pNew->isDe
1ed90 6c 65 74 65 20 3d 20 69 73 44 65 6c 65 74 65 3b  lete = isDelete;
1eda0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
1edb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1edc0 20 20 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20     if( dirfd>=0 
1edd0 29 20 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20  ) close(dirfd); 
1ede0 2f 2a 20 73 69 6c 65 6e 74 20 6c 65 61 6b 20 69  /* silent leak i
1edf0 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
1ee00 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
1ee10 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f 73 65  if( h>=0 ) close
1ee20 28 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (h);.  }else{.  
1ee30 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20    pNew->pMethod 
1ee40 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b  = pLockingStyle;
1ee50 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  .    OpenCounter
1ee60 28 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (+1);.  }.  retu
1ee70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ee80 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1ee90 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1eea0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1eeb0 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1eec0 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1eed0 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1eee0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1eef0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1ef00 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1ef10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1ef20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1ef30 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1ef40 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1ef50 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1ef60 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1ef70 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1ef80 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1ef90 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1efa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1efb0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1efc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1efd0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1efe0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1eff0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1f000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f010 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1f020 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f030 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1f040 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1f050 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1f060 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1f070 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1f080 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1f090 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1f0a0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1f0b0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1f0c0 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1f0d0 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1f0e0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1f0f0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1f100 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1f110 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1f120 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
1f130 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1f140 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1f150 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1f160 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
1f170 45 43 0a 20 20 20 20 20 20 66 63 6e 74 6c 28 66  EC.      fcntl(f
1f180 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63 6e 74  d, F_SETFD, fcnt
1f190 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30  l(fd, F_GETFD, 0
1f1a0 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b  ) | FD_CLOEXEC);
1f1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
1f1c0 54 52 41 43 45 33 28 22 4f 50 45 4e 44 49 52 20  TRACE3("OPENDIR 
1f1d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1f1e0 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  zDirname);.    }
1f1f0 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64  .  }.  *pFd = fd
1f200 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d  ;.  return (fd>=
1f210 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49  0?SQLITE_OK:SQLI
1f220 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1f230 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
1f240 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
1f250 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
1f260 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
1f270 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
1f280 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1f290 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
1f2a0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
1f2b0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
1f2c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f2d0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
1f2e0 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
1f2f0 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1f300 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
1f310 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
1f320 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
1f330 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
1f340 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
1f350 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
1f360 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e   "/tmp",.     ".
1f370 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  ",.  };.  static
1f380 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f390 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
1f3a0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
1f3b0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
1f3c0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1f3d0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1f3e0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1f3f0 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  9";.  unsigned i
1f400 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
1f410 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
1f420 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
1f430 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   ".";..  /* It's
1f440 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1f450 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1f460 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1f470 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1f480 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1f490 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1f4a0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1f4b0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1f4c0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1f4d0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
1f4e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f4f0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1f500 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44  _IOERR );..  azD
1f510 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  irs[0] = sqlite3
1f520 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
1f530 0a 20 20 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61  .  if (NULL == a
1f540 7a 44 69 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20  zDirs[1]) {.    
1f550 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65  azDirs[1] = gete
1f560 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20  nv("TMPDIR");.  
1f570 7d 0a 20 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20  }.  .  for(i=0; 
1f580 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
1f590 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
1f5a0 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
1f5b0 28 20 61 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29  ( azDirs[i]==0 )
1f5c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f5d0 66 28 20 73 74 61 74 28 61 7a 44 69 72 73 5b 69  f( stat(azDirs[i
1f5e0 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69  ], &buf) ) conti
1f5f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f  nue;.    if( !S_
1f600 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64  ISDIR(buf.st_mod
1f610 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
1f620 20 20 20 69 66 28 20 61 63 63 65 73 73 28 61 7a     if( access(az
1f630 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29 20 63  Dirs[i], 07) ) c
1f640 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69  ontinue;.    zDi
1f650 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20  r = azDirs[i];. 
1f660 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
1f670 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1f680 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
1f690 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
1f6a0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
1f6b0 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
1f6c0 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
1f6d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1f6e0 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
1f6f0 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
1f700 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
1f710 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
1f720 29 20 2b 20 31 37 29 20 3e 3d 20 28 73 69 7a 65  ) + 17) >= (size
1f730 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
1f740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1f750 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
1f760 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f770 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
1f780 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
1f790 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
1f7a0 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
1f7b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
1f7c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
1f7d0 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
1f7e0 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
1f7f0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1f800 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
1f810 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
1f820 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
1f830 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
1f840 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
1f850 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
1f860 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  uf[j] = 0;.  }wh
1f870 69 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66  ile( access(zBuf
1f880 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ,0)==0 );.  retu
1f890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f8a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1f8b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1f8c0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1f8d0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75  PLE__)./*.** Rou
1f8e0 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72  tine to transfor
1f8f0 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74  m a unixFile int
1f900 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  o a proxy-lockin
1f910 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49  g unixFile..** I
1f920 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
1f930 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20   the proxy-lock 
1f940 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73  division, but us
1f950 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
1f960 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52  .** if SQLITE_PR
1f970 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
1f980 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  NG is defined..*
1f990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1f9a0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
1f9b0 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63  ile(unixFile*, c
1f9c0 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e  onst char*);.#en
1f9d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  dif../*.** Searc
1f9e0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
1f9f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fa00 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20  that was opened 
1fa10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fa20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  .** file (not a 
1fa30 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65  journal or maste
1fa40 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r-journal file) 
1fa50 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1fa60 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20  thname.** zPath 
1fa70 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e  with SQLITE_OPEN
1fa80 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68  _XXX flags match
1fa90 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64  ing those passed
1faa0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a   as the second.*
1fab0 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * argument to th
1fac0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1fad0 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64  ** Such a file d
1fae0 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78  escriptor may ex
1faf0 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73  ist if a databas
1fb00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
1fb10 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74   closed.** but t
1fb20 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
1fb30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f  le descriptor co
1fb40 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  uld not be close
1fb50 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a  d because some.*
1fb60 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  * other file des
1fb70 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
1fb80 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73  the same file is
1fb90 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d   holding a file-
1fba0 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74  lock..** Refer t
1fbb0 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68  o comments in th
1fbc0 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75  e unixClose() fu
1fbd0 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c  nction and the l
1fbe0 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a  engthy comment.*
1fbf0 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f  * describing "Po
1fc00 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
1fc10 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61  king" at the sta
1fc20 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20  rt of this file 
1fc30 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20  for .** further 
1fc40 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74  details. Also, t
1fc50 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a  icket #4018..**.
1fc60 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65  ** If a suitable
1fc70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1fc80 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
1fc90 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
1fca0 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69  If no.** such fi
1fcb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1fcc0 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20   located, -1 is 
1fcd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1fce0 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64  tic UnixUnusedFd
1fcf0 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64   *findReusableFd
1fd00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
1fd10 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  th, int flags){.
1fd20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1fd30 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  pUnused = 0;..  
1fd40 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68  /* Do not search
1fd50 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
1fd60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
1fd70 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62  n vxworks. Not b
1fd80 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f  ecause.  ** vxwo
1fd90 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65  rks would not be
1fda0 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63  nefit from the c
1fdb0 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c  hange (it might,
1fdc0 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29   we're not sure)
1fdd0 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75  ,.  ** but becau
1fde0 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73  se no way to tes
1fdf0 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  t it is currentl
1fe00 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20  y available. It 
1fe10 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20  is better .  ** 
1fe20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61  not to risk brea
1fe30 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70  king vxworks sup
1fe40 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b  port for the sak
1fe50 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73  e of such an obs
1fe60 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75  cure .  ** featu
1fe70 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f  re.  */.#if !OS_
1fe80 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
1fe90 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1feb0 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61  * Results of sta
1fec0 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f  t() call */..  /
1fed0 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
1fee0 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
1fef0 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
1ff00 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
1ff10 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
1ff20 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
1ff30 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
1ff40 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
1ff50 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
1ff60 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
1ff70 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
1ff80 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
1ff90 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
1ffa0 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
1ffb0 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
1ffc0 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
1ffd0 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
1ffe0 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
1fff0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
20000 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
20010 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
20020 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
20030 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
20040 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
20050 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
20060 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
20070 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
20080 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
20090 68 69 6e 67 20 66 6f 72 20 61 20 72 65 73 75 73  hing for a resus
200a0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
200b0 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
200c0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
200d0 73 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  stat(zPath, &sSt
200e0 61 74 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63  at) ){.    struc
200f0 74 20 75 6e 69 78 4f 70 65 6e 43 6e 74 20 2a 70  t unixOpenCnt *p
20100 4f 70 65 6e 3b 0a 0a 20 20 20 20 75 6e 69 78 45  Open;..    unixE
20110 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
20120 20 70 4f 70 65 6e 20 3d 20 6f 70 65 6e 4c 69 73   pOpen = openLis
20130 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4f  t;.    while( pO
20140 70 65 6e 20 26 26 20 28 70 4f 70 65 6e 2d 3e 66  pen && (pOpen->f
20150 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
20160 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
20180 70 4f 70 65 6e 2d 3e 66 69 6c 65 49 64 2e 69 6e  pOpen->fileId.in
20190 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  o!=sStat.st_ino)
201a0 20 29 7b 0a 20 20 20 20 20 20 20 70 4f 70 65 6e   ){.       pOpen
201b0 20 3d 20 70 4f 70 65 6e 2d 3e 70 4e 65 78 74 3b   = pOpen->pNext;
201c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
201d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 55 6e  Open ){.      Un
201e0 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
201f0 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
20200 4f 70 65 6e 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  Open->pUnused; *
20210 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
20220 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
20230 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
20240 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
20250 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
20260 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
20270 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
20280 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
20290 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
202a0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
202b0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
202c0 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
202d0 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
202e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
202f0 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a  he file zPath..*
20300 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79  * .** Previously
20310 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53 20  , the SQLite OS 
20320 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65 65  layer used three
20330 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c   functions in pl
20340 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f  ace of this.** o
20350 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ne:.**.**     sq
20360 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
20370 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73  rite();.**     s
20380 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
20390 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73  Only();.**     s
203a0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
203b0 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54  usive();.**.** T
203c0 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72 65  hese calls corre
203d0 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c  spond to the fol
203e0 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
203f0 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  ons of flags:.**
20400 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69 74  .**     ReadWrit
20410 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41 44  e() ->     (READ
20420 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29 0a  WRITE | CREATE).
20430 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28  **     ReadOnly(
20440 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44 4f  )  ->     (READO
20450 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65  NLY) .**     Ope
20460 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e 20  nExclusive() -> 
20470 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
20480 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45 29  ATE | EXCLUSIVE)
20490 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f  .**.** The old O
204a0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 61  penExclusive() a
204b0 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65 61  ccepted a boolea
204c0 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64 65  n argument - "de
204d0 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72  lFlag". If.** tr
204e0 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61 73  ue, the file was
204f0 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 62   configured to b
20500 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
20510 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
20520 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  .** file handle 
20530 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69 65  closed. To achie
20540 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66 65  ve the same effe
20550 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e 65  ct using this ne
20560 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c  w .** interface,
20570 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45 4f   add the DELETEO
20580 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20 74  NCLOSE flag to t
20590 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 61  hose specified a
205a0 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65  bove for .** Ope
205b0 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f  nExclusive()..*/
205c0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
205d0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
205e0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
205f0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
20600 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69  for which this i
20610 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74 68  s the xOpen meth
20620 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
20630 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
20640 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
20650 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 6f   of file to be o
20660 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
20670 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
20680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
20690 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
206a0 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a  o be filled in *
206b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73 20   /* Input flags 
206e0 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f  to control the o
206f0 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  pening */.  int 
20700 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
20710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
20720 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  ut flags returne
20730 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72 65  d to SQLite core
20740 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
20750 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65  e *p = (unixFile
20760 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20   *)pFile;.  int 
20770 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  fd = -1;        
20780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72 65  le descriptor re
207a0 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28 29  turned by open()
207b0 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 20   */.  int dirfd 
207c0 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
207d0 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
207e0 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
207f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  r */.  int openF
20800 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
20810 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
20820 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
20830 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
20840 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
20850 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
20860 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
20870 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
208a0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
208b0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
208c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
208d0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
208e0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
208f0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
20900 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
20910 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
20920 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
20930 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
20940 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
20950 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20960 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
20970 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
20980 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
20990 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
209a0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
209b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
209c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
209d0 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
209e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
209f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
20a00 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
20a10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
20a20 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
20a30 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
20a40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
20a50 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 0a  PROXY);.#endif..
20a60 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
20a70 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
20a80 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
20a90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
20aa0 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
20ab0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
20ac0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
20ad0 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
20ae0 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
20af0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
20b00 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
20b10 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
20b20 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
20b30 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
20b40 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 44 69 72  .  int isOpenDir
20b50 65 63 74 6f 72 79 20 3d 20 28 69 73 43 72 65 61  ectory = (isCrea
20b60 74 65 20 26 26 20 0a 20 20 20 20 20 20 28 65 54  te && .      (eT
20b70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
20b80 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
20b90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
20ba0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
20bb0 41 4c 29 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  AL).  );..  /* I
20bc0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
20bd0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
20be0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
20bf0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
20c00 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
20c10 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
20c20 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
20c30 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
20c40 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
20c50 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
20c60 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 20 20  _PATHNAME+1];.  
20c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
20c80 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
20c90 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
20ca0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
20cb0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
20cc0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
20cd0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
20ce0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
20cf0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
20d00 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
20d10 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
20d20 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
20d30 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
20d40 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
20d50 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
20d60 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
20d70 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
20d80 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
20d90 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
20da0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
20db0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
20dc0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
20dd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
20de0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
20df0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
20e00 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
20e10 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
20e20 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
20e30 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
20e40 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
20e50 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
20e60 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
20e70 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
20e80 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
20e90 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
20ea0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
20eb0 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
20ec0 61 6c 20 61 72 65 20 6e 65 76 65 72 20 61 75 74  al are never aut
20ed0 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  omatically.  ** 
20ee0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
20ef0 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
20f00 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
20f10 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f20 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f30 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f40 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
20f50 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
20f60 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
20f70 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
20f80 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
20f90 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
20fa0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
20fb0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
20fd0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 0a 20 20 2f  _JOURNAL );..  /
20fe0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
20ff0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
21000 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
21010 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
21020 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
21030 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21040 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
21050 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
21060 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
21070 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
21080 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
21090 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
210a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
210b0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
210c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
210d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
210e0 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
210f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
21100 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
21110 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
21120 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
21130 49 45 4e 54 5f 44 42 0a 20 20 29 3b 0a 0a 20 20  IENT_DB.  );..  
21140 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
21150 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
21160 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51  .  if( eType==SQ
21170 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
21180 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75  B ){.    UnixUnu
21190 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a  sedFd *pUnused;.
211a0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69      pUnused = fi
211b0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e 61  ndReusableFd(zNa
211c0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  me, flags);.    
211d0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
211e0 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65       fd = pUnuse
211f0 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65  d->fd;.    }else
21200 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  {.      pUnused 
21210 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
21220 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64  (sizeof(*pUnused
21230 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
21240 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
21250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21260 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
21270 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75     }.    p->pUnu
21280 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20  sed = pUnused;. 
21290 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
212a0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
212b0 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
212c0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
212d0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
212e0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
212f0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
21300 26 26 20 21 69 73 4f 70 65 6e 44 69 72 65 63 74  && !isOpenDirect
21310 6f 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  ory);.    rc = g
21320 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50  etTempname(MAX_P
21330 41 54 48 4e 41 4d 45 2b 31 2c 20 7a 54 6d 70 6e  ATHNAME+1, zTmpn
21340 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
21350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21370 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
21380 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
21390 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
213a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
213b0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
213c0 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58   passed to POSIX
213d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f   function.  ** o
213e0 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73  pen(). These mus
213f0 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20  t be calculated 
21400 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69  even if open() i
21410 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73  s not called, as
21420 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  .  ** they may b
21430 65 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  e stored as part
21440 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
21450 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20  dle and used by 
21460 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68  the .  ** 'conch
21470 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66   file' locking f
21480 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f  unctions later o
21490 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52  n.  */.  if( isR
214a0 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46  eadonly )  openF
214b0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
214c0 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ;.  if( isReadWr
214d0 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20  ite ) openFlags 
214e0 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28  |= O_RDWR;.  if(
214f0 20 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f   isCreate )    o
21500 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52  penFlags |= O_CR
21510 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63  EAT;.  if( isExc
21520 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61  lusive ) openFla
21530 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f  gs |= (O_EXCL|O_
21540 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65  NOFOLLOW);.  ope
21550 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52  nFlags |= (O_LAR
21560 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
21570 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  ;..  if( fd<0 ){
21580 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e  .    mode_t open
21590 4d 6f 64 65 20 3d 20 28 69 73 44 65 6c 65 74 65  Mode = (isDelete
215a0 3f 30 36 30 30 3a 53 51 4c 49 54 45 5f 44 45 46  ?0600:SQLITE_DEF
215b0 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
215c0 53 49 4f 4e 53 29 3b 0a 20 20 20 20 66 64 20 3d  SIONS);.    fd =
215d0 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65   open(zName, ope
215e0 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
215f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 34 28  );.    OSTRACE4(
21600 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73  "OPENX   %-3d %s
21610 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61   0%o\n", fd, zNa
21620 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a  me, openFlags);.
21630 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
21640 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
21650 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
21660 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a  !isExclusive ){.
21670 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
21680 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
21690 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
216a0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
216b0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
216c0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
216d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
216e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
216f0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
21700 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
21710 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
21720 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
21730 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
21740 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
21750 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
21760 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a 4e      fd = open(zN
21770 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ame, openFlags, 
21780 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d  openMode);.    }
21790 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
217a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
217b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
217c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
217d0 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
217e0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
217f0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
21800 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
21810 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
21820 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
21830 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
21840 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
21850 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
21860 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
21870 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
21880 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
21890 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
218a0 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
218b0 6c 73 65 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a  lse.    unlink(z
218c0 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Name);.#endif.  
218d0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  }.#if SQLITE_ENA
218e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
218f0 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d  E.  else{.    p-
21900 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65  >openFlags = ope
21910 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64  nFlags;.  }.#end
21920 69 66 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  if..  if( isOpen
21930 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  Directory ){.   
21940 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63 74   rc = openDirect
21950 6f 72 79 28 7a 50 61 74 68 2c 20 26 64 69 72 66  ory(zPath, &dirf
21960 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
21970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21980 20 20 20 2f 2a 20 49 74 20 69 73 20 73 61 66 65     /* It is safe
21990 20 74 6f 20 63 6c 6f 73 65 20 66 64 20 61 74 20   to close fd at 
219a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 65 63 61  this point, beca
219b0 75 73 65 20 69 74 20 69 73 20 67 75 61 72 61 6e  use it is guaran
219c0 74 65 65 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a  teed not.      *
219d0 2a 20 74 6f 20 62 65 20 6f 70 65 6e 20 6f 6e 20  * to be open on 
219e0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
219f0 20 49 66 20 69 74 20 77 65 72 65 20 6f 70 65 6e   If it were open
21a00 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 66   on a database f
21a10 69 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ile,.      ** it
21a20 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
21a30 66 65 20 74 6f 20 63 6c 6f 73 65 20 61 73 20 74  fe to close as t
21a40 68 69 73 20 77 6f 75 6c 64 20 72 65 6c 65 61 73  his would releas
21a50 65 20 61 6e 79 20 6c 6f 63 6b 73 20 68 65 6c 64  e any locks held
21a60 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
21a70 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 70 72   file by this pr
21a80 6f 63 65 73 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ocess.  */.     
21a90 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
21aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21ab0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  _DB );.      clo
21ac0 73 65 28 66 64 29 3b 20 20 20 20 20 20 20 20 20  se(fd);         
21ad0 20 20 20 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20      /* silently 
21ae0 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 61 6c  leak if fail, al
21af0 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
21b00 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  /.      goto ope
21b10 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
21b20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 46 44  }.  }..#ifdef FD
21b30 5f 43 4c 4f 45 58 45 43 0a 20 20 66 63 6e 74 6c  _CLOEXEC.  fcntl
21b40 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 66 63  (fd, F_SETFD, fc
21b50 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
21b60 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
21b70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c  );.#endif..  noL
21b80 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d 53 51 4c  ock = eType!=SQL
21b90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
21ba0 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ;..  .#if define
21bb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
21bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21bd0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
21be0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
21bf0 66 6f 3b 0a 20 20 69 66 28 20 66 73 74 61 74 66  fo;.  if( fstatf
21c00 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
21c10 3d 20 2d 31 20 29 7b 0a 20 20 20 20 28 28 75 6e  = -1 ){.    ((un
21c20 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
21c30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  lastErrno = errn
21c40 6f 3b 0a 20 20 20 20 69 66 28 20 64 69 72 66 64  o;.    if( dirfd
21c50 3e 3d 30 20 29 20 63 6c 6f 73 65 28 64 69 72 66  >=0 ) close(dirf
21c60 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  d); /* silently 
21c70 6c 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e  leak if fail, in
21c80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 6c   error */.    cl
21c90 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65  ose(fd); /* sile
21ca0 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69  ntly leak if fai
21cb0 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  l, in error */. 
21cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21cd0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
21ce0 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74   }.  if (0 == st
21cf0 72 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66  rncmp("msdos", f
21d00 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
21d10 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28  me, 5)) {.    ((
21d20 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29  unixFile*)pFile)
21d30 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c  ->fsFlags |= SQL
21d40 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
21d50 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  SDOS;.  }.#endif
21d60 0a 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .  .#if SQLITE_E
21d70 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21d80 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50  YLE.#if SQLITE_P
21d90 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
21da0 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78  ING.  isAutoProx
21db0 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 1;.#endif.  
21dc0 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20  if( isAutoProxy 
21dd0 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29  && (zPath!=NULL)
21de0 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26   && (!noLock) &&
21df0 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a   pVfs->xOpen ){.
21e00 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72      char *envfor
21e10 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  ce = getenv("SQL
21e20 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
21e30 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69  LOCKING");.    i
21e40 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b  nt useProxy = 0;
21e50 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ..    /* SQLITE_
21e60 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
21e70 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72  ING==1 means for
21e80 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70 72  ce always use pr
21e90 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20  oxy, 0 means .  
21ea0 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70    ** never use p
21eb0 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73  roxy, NULL means
21ec0 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e   use proxy for n
21ed0 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f  on-local files o
21ee0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
21ef0 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20   envforce!=NULL 
21f00 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  ){.      useProx
21f10 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63  y = atoi(envforc
21f20 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e)>0;.    }else{
21f30 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
21f40 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  atfs fsInfo;.   
21f50 20 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50     if( statfs(zP
21f60 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ath, &fsInfo) ==
21f70 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   -1 ){.        /
21f80 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
21f90 20 63 6c 6f 73 65 28 66 64 29 20 63 61 6c 6c 20   close(fd) call 
21fa0 69 73 20 73 75 62 2d 6f 70 74 69 6d 61 6c 2e 20  is sub-optimal. 
21fb0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
21fc0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  ed.        ** wi
21fd0 74 68 20 66 64 20 69 73 20 61 20 64 61 74 61 62  th fd is a datab
21fe0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  ase file, and th
21ff0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 63 6f  ere are other co
22000 6e 6e 65 63 74 69 6f 6e 73 20 6f 70 65 6e 0a 20  nnections open. 
22010 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 61         ** on tha
22020 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
22030 63 75 72 72 65 6e 74 6c 79 20 68 6f 6c 64 69 6e  currently holdin
22040 67 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  g advisory locks
22050 20 6f 6e 20 69 74 2c 0a 20 20 20 20 20 20 20 20   on it,.        
22060 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  ** then the call
22070 20 74 6f 20 63 6c 6f 73 65 28 29 20 77 69 6c 6c   to close() will
22080 20 63 61 6e 63 65 6c 20 74 68 6f 73 65 20 6c 6f   cancel those lo
22090 63 6b 73 2e 20 49 6e 20 70 72 61 63 74 69 63 65  cks. In practice
220a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 27  ,.        ** we'
220b0 72 65 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  re assuming that
220c0 20 73 74 61 74 66 73 28 29 20 64 6f 65 73 6e 27   statfs() doesn'
220d0 74 20 66 61 69 6c 20 76 65 72 79 20 6f 66 74 65  t fail very ofte
220e0 6e 2e 20 41 74 20 6c 65 61 73 74 0a 20 20 20 20  n. At least.    
220f0 20 20 20 20 2a 2a 20 6e 6f 74 20 77 68 69 6c 65      ** not while
22100 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
22110 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 62  riptors opened b
22120 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
22130 73 73 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ss on.        **
22140 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 61   the same file a
22150 72 65 20 77 6f 72 6b 69 6e 67 2e 20 20 2a 2f 0a  re working.  */.
22160 20 20 20 20 20 20 20 20 70 2d 3e 6c 61 73 74 45          p->lastE
22170 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
22180 20 20 20 20 20 20 69 66 28 20 64 69 72 66 64 3e        if( dirfd>
22190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
221a0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
221b0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
221c0 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
221d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
221e0 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
221f0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
22200 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20 65 72  k if fail, in er
22210 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ror */.        r
22220 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
22230 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 20  _ACCESS;.       
22240 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
22250 68 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  hed;.      }.   
22260 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
22270 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
22280 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
22290 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
222a0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
222b0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
222c0 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
222d0 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 6f  pFile, zPath, no
222e0 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29 3b  Lock, isDelete);
222f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
22300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22310 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72      rc = proxyTr
22320 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
22330 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
22340 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20  , ":auto:");.   
22350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22370 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43      /* Use unixC
22380 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70  lose to clean up
22390 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61   the resources a
223a0 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e  dded in fillInUn
223b0 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20  ixFile .        
223c0 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61    ** and clear a
223d0 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ll the structure
223e0 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  's references.  
223f0 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20  Specifically, . 
22400 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c           ** pFil
22410 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c  e->pMethods will
22420 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69   be NULL so sqli
22430 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20  te3OsClose will 
22440 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20  be a no-op .    
22450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22460 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69     unixClose(pFi
22470 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
22480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
224a0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
224b0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
224c0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d  #endif.  .  rc =
224d0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
224e0 70 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c  pVfs, fd, dirfd,
224f0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e   pFile, zPath, n
22500 6f 4c 6f 63 6b 2c 20 69 73 44 65 6c 65 74 65 29  oLock, isDelete)
22510 3b 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ;.open_finished:
22520 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
22540 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75  te3_free(p->pUnu
22550 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
22560 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
22570 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
22580 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
22590 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
225a0 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
225b0 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
225c0 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
225d0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
225e0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
225f0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
22600 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
22610 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
22620 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
22630 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
22640 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22650 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
22660 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
22670 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
22680 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226a0 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
226b0 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
226c0 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
226d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
226e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
226f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
22700 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
22710 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
22720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
22730 4c 45 54 45 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28  LETE);.  unlink(
22740 7a 50 61 74 68 29 3b 0a 23 69 66 6e 64 65 66 20  zPath);.#ifndef 
22750 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
22760 49 52 53 59 4e 43 0a 20 20 69 66 28 20 64 69 72  IRSYNC.  if( dir
22770 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  Sync ){.    int 
22780 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65  fd;.    rc = ope
22790 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68  nDirectory(zPath
227a0 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  , &fd);.    if( 
227b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
227d0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
227e0 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73 65 0a  fd)==-1 ).#else.
227f0 20 20 20 20 20 20 69 66 28 20 66 73 79 6e 63 28        if( fsync(
22800 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20 20 20  fd) ).#endif.   
22810 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20     {.        rc 
22820 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
22830 49 52 5f 46 53 59 4e 43 3b 0a 20 20 20 20 20 20  IR_FSYNC;.      
22840 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73  }.      if( clos
22850 65 28 66 64 29 26 26 21 72 63 20 29 7b 0a 20 20  e(fd)&&!rc ){.  
22860 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22870 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
22880 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
22890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
228a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
228b0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
228c0 61 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ance of or acces
228d0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
228e0 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
228f0 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
22900 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
22910 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
22920 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
22930 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
22940 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
22950 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
22960 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
22970 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
22980 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
22990 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
229a0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
229b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
229c0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
229d0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
229e0 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
229f0 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
22a00 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
22a10 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
22a20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
22a30 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
22a40 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
22a50 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
22a60 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
22a70 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
22a80 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
22a90 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
22aa0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
22ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
22ac0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
22ad0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
22ae0 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
22af0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
22b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22b10 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
22b20 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  n here */.){.  i
22b30 6e 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  nt amode = 0;.  
22b40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22b50 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
22b60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
22b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22b80 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73  R_ACCESS; );.  s
22b90 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
22ba0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bb0 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
22bc0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f       amode = F_O
22bd0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
22be0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22bf0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
22c00 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20  :.      amode = 
22c10 57 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20  W_OK|R_OK;.     
22c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
22c30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
22c40 45 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65  EAD:.      amode
22c50 20 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62   = R_OK;.      b
22c60 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
22c70 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
22c80 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
22c90 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
22ca0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 61  .  *pResOut = (a
22cb0 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d 6f  ccess(zPath, amo
22cc0 64 65 29 3d 3d 30 29 3b 0a 20 20 72 65 74 75 72  de)==0);.  retur
22cd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22ce0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
22cf0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
22d00 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
22d10 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
22d20 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
22d30 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
22d40 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
22d50 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
22d60 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
22d70 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
22d80 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
22d90 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
22da0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
22db0 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
22dc0 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
22dd0 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
22de0 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
22df0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
22e00 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
22e10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22e20 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
22e30 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
22e40 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
22e50 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
22e60 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22e70 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
22e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
22e90 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
22ea0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
22eb0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
22ec0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
22ef0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
22f00 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
22f10 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
22f20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
22f30 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 20   buffer */.){.. 
22f40 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
22f50 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
22f60 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
22f70 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
22f80 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
22f90 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
22fa0 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
22fb0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
22fc0 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
22fd0 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
22fe0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22ff0 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66  could fail if, f
23000 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a  or example, the.
23010 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72    ** current wor
23020 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68  king directory h
23030 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64  as been unlinked
23040 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
23050 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
23060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
23070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ..  assert( pVfs
23080 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41  ->mxPathname==MA
23090 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20  X_PATHNAME );.  
230a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
230b0 28 70 56 66 73 29 3b 0a 0a 20 20 7a 4f 75 74 5b  (pVfs);..  zOut[
230c0 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a  nOut-1] = '\0';.
230d0 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
230e0 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '/' ){.    sqlit
230f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
23100 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50  , zOut, "%s", zP
23110 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
23120 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
23130 20 69 66 28 20 67 65 74 63 77 64 28 7a 4f 75 74   if( getcwd(zOut
23140 2c 20 6e 4f 75 74 2d 31 29 3d 3d 30 20 29 7b 0a  , nOut-1)==0 ){.
23150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23160 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
23170 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  T;.    }.    nCw
23180 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
23190 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
231a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74  e3_snprintf(nOut
231b0 2d 6e 43 77 64 2c 20 26 7a 4f 75 74 5b 6e 43 77  -nCwd, &zOut[nCw
231c0 64 5d 2c 20 22 2f 25 73 22 2c 20 7a 50 61 74 68  d], "/%s", zPath
231d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
231e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
231f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23200 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
23210 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
23220 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
23230 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
23240 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
23250 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
23260 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23270 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
23280 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
23290 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  ry..*/.#include 
232a0 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63  <dlfcn.h>.static
232b0 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65   void *unixDlOpe
232c0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  n(sqlite3_vfs *N
232d0 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68  otUsed, const ch
232e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
232f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
23300 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
23310 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69  eturn dlopen(zFi
23320 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57  lename, RTLD_NOW
23330 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b   | RTLD_GLOBAL);
23340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
23350 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
23360 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  tion immediately
23370 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
23380 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a   unixDlSym() or.
23390 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20  ** unixDlOpen() 
233a0 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61  fails (returns a
233b0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20   null pointer). 
233c0 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c  If a more detail
233d0 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  ed error.** mess
233e0 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  age is available
233f0 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 20  , it is written 
23400 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e  to zBufOut. If n
23410 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  o error message.
23420 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ** is available,
23430 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74   zBufOut is left
23440 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20   unmodified and 
23450 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64 65  SQLite uses a de
23460 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d  fault.** error m
23470 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  essage..*/.stati
23480 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72  c void unixDlErr
23490 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
234a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
234b0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
234c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
234d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
234e0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
234f0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
23500 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
23510 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
23520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23530 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
23540 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
23550 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
23560 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
23570 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
23580 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
23590 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
235a0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
235b0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
235c0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
235d0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
235e0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
235f0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
23600 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
23610 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
23620 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
23630 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
23640 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
23650 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
23660 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
23670 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
23680 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23690 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
236a0 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
236b0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
236c0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
236d0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
236e0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
236f0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
23700 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
23710 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
23720 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
23730 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
23740 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
23750 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
23760 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
23770 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
23780 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
23790 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
237a0 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
237b0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
237c0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
237d0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
237e0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
237f0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
23800 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
23810 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
23820 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
23830 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
23840 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
23850 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
23860 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
23870 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
23880 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
23890 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
238a0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
238b0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
238c0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
238d0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
238e0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
238f0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
23900 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
23910 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
23920 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
23930 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
23940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
23950 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
23960 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
23970 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
23980 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
23990 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
239a0 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
239b0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
239c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
239d0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
239e0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
239f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
23a00 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
23a10 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
23a20 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
23a30 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
23a40 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
23a50 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
23a60 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
23a70 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
23a80 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
23a90 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
23aa0 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
23ab0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
23ac0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
23ad0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
23ae0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
23af0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
23b00 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
23b10 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
23b20 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
23b30 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
23b40 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
23b50 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
23b60 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
23b70 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
23b80 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
23b90 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
23ba0 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
23bb0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
23bc0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
23bd0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
23be0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
23bf0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
23c00 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
23c10 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
23c20 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
23c30 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
23c40 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
23c50 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
23c60 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
23c70 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
23c80 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
23c90 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
23ca0 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
23cb0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
23cc0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
23cd0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
23ce0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
23cf0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
23d00 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
23d10 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
23d20 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
23d30 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
23d40 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
23d50 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
23d60 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
23d70 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
23d80 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
23d90 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
23da0 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
23db0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
23dc0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
23dd0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
23de0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
23df0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
23e00 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
23e10 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
23e20 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
23e30 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
23e40 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
23e50 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
23e60 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
23e70 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
23e80 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
23e90 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
23ea0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
23eb0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
23ec0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
23ed0 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64 28     pid = getpid(
23ee0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23ef0 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
23f00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
23f10 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
23f20 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
23f30 7a 65 6f 66 28 70 69 64 29 3c 3d 28 73 69 7a 65  zeof(pid)<=(size
23f40 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20  _t)nBuf );.     
23f50 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74   nBuf = sizeof(t
23f60 29 20 2b 20 73 69 7a 65 6f 66 28 70 69 64 29 3b  ) + sizeof(pid);
23f70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23f80 20 20 6e 42 75 66 20 3d 20 72 65 61 64 28 66 64    nBuf = read(fd
23f90 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , zBuf, nBuf);. 
23fa0 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a       close(fd);.
23fb0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
23fc0 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a  .  return nBuf;.
23fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
23fe0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
23ff0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
24000 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
24010 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
24020 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
24030 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
24040 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
24050 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
24060 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
24070 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
24080 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
24090 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
240a0 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
240b0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
240c0 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
240d0 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
240e0 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
240f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
24100 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
24110 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
24120 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
24130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24140 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65  unixSleep(sqlite
24150 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
24160 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  int microseconds
24170 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
24180 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
24190 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76  pec sp;..  sp.tv
241a0 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f  _sec = microseco
241b0 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20  nds / 1000000;. 
241c0 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d   sp.tv_nsec = (m
241d0 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30  icroseconds % 10
241e0 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20  00000) * 1000;. 
241f0 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20   nanosleep(&sp, 
24200 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f  NULL);.  UNUSED_
24210 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
24220 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
24230 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66  roseconds;.#elif
24240 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53   defined(HAVE_US
24250 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
24260 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69  LEEP.  usleep(mi
24270 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  croseconds);.  U
24280 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24290 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
242a0 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
242b0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63  .#else.  int sec
242c0 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63  onds = (microsec
242d0 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30  onds+999999)/100
242e0 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65  0000;.  sleep(se
242f0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
24300 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
24310 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65  ed);.  return se
24320 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23  conds*1000000;.#
24330 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
24340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
24350 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
24360 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
24370 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
24380 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
24390 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
243a0 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
243b0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
243c0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
243d0 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
243e0 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
243f0 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
24400 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
24410 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
24420 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
24430 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
24440 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
24450 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
24460 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
24470 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
24480 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
24490 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
244a0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
244b0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
244c0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
244d0 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
244e0 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
244f0 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
24500 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
24510 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
24520 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
24530 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  t unixCurrentTim
24540 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
24550 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a  otUsed, double *
24560 70 72 4e 6f 77 29 7b 0a 23 69 66 20 64 65 66 69  prNow){.#if defi
24570 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
24580 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
24590 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
245a0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
245b0 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e   = (((sqlite3_in
245c0 74 36 34 29 74 29 2f 38 36 34 30 20 2b 20 32 34  t64)t)/8640 + 24
245d0 34 30 35 38 37 35 29 2f 31 30 3b 0a 23 65 6c 69  405875)/10;.#eli
245e0 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
245f0 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
24600 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
24610 70 72 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e  prNow = t/86400.
24620 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23  0 + 2440587.5;.#
24630 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
24640 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
24650 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
24660 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
24670 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
24680 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34 34 30 35    *prNow = 24405
24690 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74 76 5f 73  87.5 + sNow.tv_s
246a0 65 63 2f 38 36 34 30 30 2e 30 20 2b 20 73 4e 6f  ec/86400.0 + sNo
246b0 77 2e 74 76 5f 6e 73 65 63 2f 38 36 34 30 30 30  w.tv_nsec/864000
246c0 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6c 73  00000000.0;.#els
246d0 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  e.  struct timev
246e0 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65 74 74 69  al sNow;.  getti
246f0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
24700 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32 34  );.  *prNow = 24
24710 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e 74  40587.5 + sNow.t
24720 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b 20  v_sec/86400.0 + 
24730 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36 34  sNow.tv_usec/864
24740 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e 64  00000000.0;.#end
24750 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
24760 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
24770 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
24780 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
24790 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
247a0 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
247b0 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
247c0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
247d0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
247e0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  d);.  return 0;.
247f0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65  }../*.** We adde
24800 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72  d the xGetLastEr
24810 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74  ror() method wit
24820 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20  h the intention 
24830 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20  of providing.** 
24840 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c  better low-level
24850 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
24860 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
24870 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
24880 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
24890 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
248a0 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20  n.  But so far, 
248b0 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73  none of that has
248c0 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65   been implemente
248d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65  d.** in the core
248e0 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
248f0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
24900 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74  ed.  For now, it
24910 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20   is merely.** a 
24920 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f  place-holder..*/
24930 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24940 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
24950 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
24960 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c  d, int NotUsed2,
24970 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29   char *NotUsed3)
24980 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24990 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
249a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
249b0 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55  R(NotUsed2);.  U
249c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
249d0 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74  NotUsed3);.  ret
249e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
249f0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
24a00 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24a10 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d   unixShm unixShm
24a20 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
24a30 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 75 6e 69   unixShmFile uni
24a40 78 53 68 6d 46 69 6c 65 3b 0a 0a 2f 2a 0a 2a 2a  xShmFile;../*.**
24a50 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
24a60 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
24a70 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
24a80 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
24a90 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
24aa0 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
24ab0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
24ac0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
24ad0 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
24ae0 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
24af0 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e  d has its own un
24b00 69 78 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62  ixFile object, b
24b10 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70  ut they all.** p
24b20 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
24b30 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
24b40 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74  s object.  In ot
24b50 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a  her words, each.
24b60 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69  ** log-summary i
24b70 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e  s opened only on
24b80 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
24b90 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  **.** unixMutexH
24ba0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
24bb0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
24bc0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
24bd0 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
24be0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
24bf0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
24c00 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
24c10 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
24c20 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
24c30 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
24c40 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
24c50 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
24c60 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
24c70 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
24c80 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
24c90 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
24ca0 68 65 72 20 75 6e 69 78 53 68 6d 46 69 6c 65 2e  her unixShmFile.
24cb0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
24cc0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 46 69 6c  ld or unixShmFil
24cd0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
24ce0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
24cf0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
24d00 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
24d10 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
24d20 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
24d30 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
24d40 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 7b 0a 20   unixShmFile {. 
24d50 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
24d60 49 64 20 66 69 64 3b 20 20 20 20 20 2f 2a 20 55  Id fid;     /* U
24d70 6e 69 71 75 65 20 66 69 6c 65 20 69 64 65 6e 74  nique file ident
24d80 69 66 69 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ifier */.  sqlit
24d90 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
24da0 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
24db0 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
24dc0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
24dd0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 42 75  3_mutex *mutexBu
24de0 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f  f;   /* Mutex to
24df0 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d 20 2a   access zBuf[] *
24e00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
24e10 78 20 2a 6d 75 74 65 78 52 65 63 6f 76 3b 20 2f  x *mutexRecov; /
24e20 2a 20 54 68 65 20 52 45 43 4f 56 45 52 20 6d 75  * The RECOVER mu
24e30 74 65 78 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tex */.  char *z
24e40 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
24e50 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
24e60 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
24e70 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
24e80 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
24e90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
24ea0 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d 61 70 3b 20  */.  int szMap; 
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6d  /* Size of the m
24ed0 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 69  apping of file i
24ee0 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  nto memory */.  
24ef0 63 68 61 72 20 2a 70 4d 4d 61 70 42 75 66 3b 20  char *pMMapBuf; 
24f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
24f10 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6d 6d  ere currently mm
24f20 61 70 70 65 64 28 29 2e 20 20 4e 55 4c 4c 20 69  apped().  NULL i
24f30 66 20 75 6e 6d 61 70 70 65 64 20 2a 2f 0a 20 20  f unmapped */.  
24f40 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
24f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24f60 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d 20  mber of unixShm 
24f70 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
24f80 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e   to this */.  un
24f90 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  ixShm *pFirst;  
24fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
24fb0 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
24fc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
24fd0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c   */.  unixShmFil
24fe0 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
24ff0 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
25000 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53 68 6d 46   of all unixShmF
25010 69 6c 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ile objects */.#
25020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25030 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b  UG.  u8 exclMask
25040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25050 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
25060 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
25070 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
25080 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
25090 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
250a0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
250b0 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250d0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75  Next available u
250e0 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  nixShm.id value 
250f0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
25100 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
25110 61 79 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53 68  ay of all unixSh
25120 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mFile objects..*
25130 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 4d 75 74  *.** The unixMut
25140 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
25150 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
25160 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
25170 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
25180 74 69 63 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  tic unixShmFile 
25190 2a 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74  *unixShmFileList
251a0 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
251b0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
251c0 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
251d0 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
251e0 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
251f0 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
25200 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
25210 2a 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e 70 46 69  *.** unixShm.pFi
25220 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
25230 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65 61  e held while rea
25240 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
25250 74 68 65 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e 70  the.** unixShm.p
25260 4e 65 78 74 20 61 6e 64 20 75 6e 69 78 53 68 6d  Next and unixShm
25270 2e 6c 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74  .locks[] element
25280 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  s..**.** The uni
25290 78 53 68 6d 2e 70 46 69 6c 65 20 65 6c 65 6d 65  xShm.pFile eleme
252a0 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  nt is initialize
252b0 64 20 77 68 65 6e 20 74 68 65 20 6f 62 6a 65 63  d when the objec
252c0 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  t is created.** 
252d0 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
252e0 20 74 68 65 72 65 61 66 74 65 72 2e 0a 2a 2f 0a   thereafter..*/.
252f0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
25300 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  .  unixShmFile *
25310 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  pFile;        /*
25320 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25330 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65  unixShmFile obje
25340 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
25350 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
25360 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
25370 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
25380 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2f 0a   unixShmFile */.
25390 20 20 75 38 20 6c 6f 63 6b 53 74 61 74 65 3b 20    u8 lockState; 
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253b0 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20 73 74 61  Current lock sta
253c0 74 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4c  te */.  u8 readL
253d0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
253e0 20 20 20 2f 2a 20 57 68 69 63 68 20 6f 66 20 74     /* Which of t
253f0 68 65 20 74 77 6f 20 72 65 61 64 2d 6c 6f 63 6b  he two read-lock
25400 20 73 74 61 74 65 73 20 74 6f 20 75 73 65 20 2a   states to use *
25410 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25430 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
25440 67 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c  g the unixShmFil
25450 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20  e mutex */.  u8 
25460 68 61 73 4d 75 74 65 78 42 75 66 3b 20 20 20 20  hasMutexBuf;    
25470 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25480 69 66 20 68 6f 6c 64 69 6e 67 20 70 46 69 6c 65  if holding pFile
25490 2d 3e 6d 75 74 65 78 42 75 66 20 2a 2f 0a 20 20  ->mutexBuf */.  
254a0 75 38 20 68 61 73 4d 75 74 65 78 52 65 63 6f 76  u8 hasMutexRecov
254b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
254c0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 70 46  ue if holding pF
254d0 69 6c 65 2d 3e 6d 75 74 65 78 52 65 63 6f 76 20  ile->mutexRecov 
254e0 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61  */.  u8 sharedMa
254f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
25500 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
25510 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
25520 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25540 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
25550 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
25560 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25570 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
255a0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
255b0 74 73 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  ts unixShmFile *
255c0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
255d0 2a 2a 20 53 69 7a 65 20 69 6e 63 72 65 6d 65 6e  ** Size incremen
255e0 74 20 62 79 20 77 68 69 63 68 20 73 68 61 72 65  t by which share
255f0 64 20 6d 65 6d 6f 72 79 20 67 72 6f 77 73 0a 2a  d memory grows.*
25600 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
25610 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 20 20  _UNIX_SHM_INCR  
25620 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  4096../*.** Cons
25630 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
25640 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
25650 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
25660 20 20 20 20 20 33 32 20 20 20 20 20 20 20 20 2f       32        /
25670 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66  * Byte offset of
25680 20 74 68 65 20 66 69 72 73 74 20 6c 6f 63 6b 20   the first lock 
25690 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
256a0 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 20 20  UNIX_SHM_MUTEX  
256b0 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a 20     0x01      /* 
256c0 4d 61 73 6b 20 66 6f 72 20 4d 55 54 45 58 20 6c  Mask for MUTEX l
256d0 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ock */.#define U
256e0 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 20  NIX_SHM_DMS     
256f0 20 20 30 78 30 34 20 20 20 20 20 20 2f 2a 20 4d    0x04      /* M
25700 61 73 6b 20 66 6f 72 20 44 65 61 64 2d 4d 61 6e  ask for Dead-Man
25710 2d 53 77 69 74 63 68 20 6c 6f 63 6b 20 2a 2f 0a  -Switch lock */.
25720 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d  #define UNIX_SHM
25730 5f 41 20 20 20 20 20 20 20 20 20 30 78 31 30 20  _A         0x10 
25740 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f 72       /* Mask for
25750 20 72 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 2e 2e   region locks...
25760 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
25770 5f 53 48 4d 5f 42 20 20 20 20 20 20 20 20 20 30  _SHM_B         0
25780 78 32 30 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  x20.#define UNIX
25790 5f 53 48 4d 5f 43 20 20 20 20 20 20 20 20 20 30  _SHM_C         0
257a0 78 34 30 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  x40.#define UNIX
257b0 5f 53 48 4d 5f 44 20 20 20 20 20 20 20 20 20 30  _SHM_D         0
257c0 78 38 30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  x80..#ifdef SQLI
257d0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
257e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
257f0 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
25800 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 73 74  ted string in st
25810 61 74 69 63 20 6d 65 6d 6f 72 79 20 74 68 61 74  atic memory that
25820 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 61 20  .** describes a 
25830 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e 20 20 54  locking mask.  T
25840 68 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66 20  he string is of 
25850 74 68 65 20 66 6f 72 6d 20 22 4d 53 41 42 43 44  the form "MSABCD
25860 22 20 77 69 74 68 0a 2a 2a 20 65 61 63 68 20 63  " with.** each c
25870 68 61 72 61 63 74 65 72 20 72 65 70 72 65 73 65  haracter represe
25880 6e 74 69 6e 67 20 61 20 6c 6f 63 6b 2e 20 20 22  nting a lock.  "
25890 4d 22 20 66 6f 72 20 4d 55 54 45 58 2c 20 22 53  M" for MUTEX, "S
258a0 22 20 66 6f 72 20 44 4d 53 2c 20 0a 2a 2a 20 61  " for DMS, .** a
258b0 6e 64 20 22 41 22 20 74 68 72 6f 75 67 68 20 22  nd "A" through "
258c0 44 22 20 66 6f 72 20 74 68 65 20 72 65 67 69 6f  D" for the regio
258d0 6e 20 6c 6f 63 6b 73 2e 20 20 49 66 20 61 20 6c  n locks.  If a l
258e0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 74 68 65  ock is held, the
258f0 0a 2a 2a 20 6c 65 74 74 65 72 20 69 73 20 73 68  .** letter is sh
25900 6f 77 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f 63  own.  If the loc
25910 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 2c 20 74  k is not held, t
25920 68 65 20 6c 65 74 74 65 72 20 69 73 20 63 6f 6e  he letter is con
25930 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 22 2e 22  verted.** to "."
25940 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25950 74 69 6e 65 20 69 73 20 66 6f 72 20 64 65 62 75  tine is for debu
25960 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f  gging purposes o
25970 6e 6c 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  nly and does not
25980 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 61 20   appear.** in a 
25990 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
259a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
259b0 74 20 63 68 61 72 20 2a 75 6e 69 78 53 68 6d 4c  t char *unixShmL
259c0 6f 63 6b 53 74 72 69 6e 67 28 75 38 20 6d 61 73  ockString(u8 mas
259d0 6b 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  k){.  static cha
259e0 72 20 7a 42 75 66 5b 34 38 5d 3b 0a 20 20 73 74  r zBuf[48];.  st
259f0 61 74 69 63 20 69 6e 74 20 69 42 75 66 20 3d 20  atic int iBuf = 
25a00 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  0;.  char *z;.. 
25a10 20 7a 20 3d 20 26 7a 42 75 66 5b 69 42 75 66 5d   z = &zBuf[iBuf]
25a20 3b 0a 20 20 69 42 75 66 20 2b 3d 20 38 3b 0a 20  ;.  iBuf += 8;. 
25a30 20 69 66 28 20 69 42 75 66 3e 3d 73 69 7a 65 6f   if( iBuf>=sizeo
25a40 66 28 7a 42 75 66 29 20 29 20 69 42 75 66 20 3d  f(zBuf) ) iBuf =
25a50 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d 20 28 6d   0;..  z[0] = (m
25a60 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 4d  ask & UNIX_SHM_M
25a70 55 54 45 58 29 20 3f 20 27 4d 27 20 3a 20 27 2e  UTEX) ? 'M' : '.
25a80 27 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 6d 61 73  ';.  z[1] = (mas
25a90 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  k & UNIX_SHM_DMS
25aa0 29 20 20 20 3f 20 27 53 27 20 3a 20 27 2e 27 3b  )   ? 'S' : '.';
25ab0 0a 20 20 7a 5b 32 5d 20 3d 20 28 6d 61 73 6b 20  .  z[2] = (mask 
25ac0 26 20 55 4e 49 58 5f 53 48 4d 5f 41 29 20 20 20  & UNIX_SHM_A)   
25ad0 20 20 3f 20 27 41 27 20 3a 20 27 2e 27 3b 0a 20    ? 'A' : '.';. 
25ae0 20 7a 5b 33 5d 20 3d 20 28 6d 61 73 6b 20 26 20   z[3] = (mask & 
25af0 55 4e 49 58 5f 53 48 4d 5f 42 29 20 20 20 20 20  UNIX_SHM_B)     
25b00 3f 20 27 42 27 20 3a 20 27 2e 27 3b 0a 20 20 7a  ? 'B' : '.';.  z
25b10 5b 34 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e  [4] = (mask & UN
25b20 49 58 5f 53 48 4d 5f 43 29 20 20 20 20 20 3f 20  IX_SHM_C)     ? 
25b30 27 43 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 35  'C' : '.';.  z[5
25b40 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49 58  ] = (mask & UNIX
25b50 5f 53 48 4d 5f 44 29 20 20 20 20 20 3f 20 27 44  _SHM_D)     ? 'D
25b60 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 36 5d 20  ' : '.';.  z[6] 
25b70 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  = 0;.  return z;
25b80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25b90 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
25ba0 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
25bb0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
25bc0 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 69 64 65  or all bytes ide
25bd0 6e 74 69 66 69 65 64 20 69 6e 20 6c 6f 63 6b 4d  ntified in lockM
25be0 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b 4d  ask..**.** lockM
25bf0 61 73 6b 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ask might contai
25c00 6e 20 6d 75 6c 74 69 70 6c 65 20 62 69 74 73 20  n multiple bits 
25c10 62 75 74 20 61 6c 6c 20 62 69 74 73 20 61 72 65  but all bits are
25c20 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
25c30 6f 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e  o be contiguous.
25c40 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
25c50 63 6b 20 69 66 20 74 68 65 20 55 4e 49 58 5f 53  ck if the UNIX_S
25c60 48 4d 5f 4d 55 54 45 58 20 62 69 74 20 69 73 20  HM_MUTEX bit is 
25c70 73 65 74 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  set and are non-
25c80 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
25c90 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
25ca0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
25cb0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68  emLock(.  unixSh
25cc0 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  mFile *pFile,   
25cd0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
25ce0 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
25cf0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
25d00 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
25d10 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
25d20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b  F_UNLCK, F_RDLCK
25d30 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a  , or F_WRLCK */.
25d40 20 20 75 38 20 6c 6f 63 6b 4d 61 73 6b 20 20 20    u8 lockMask   
25d50 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
25d60 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
25d70 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
25d80 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
25d90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
25da0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
25db0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
25dc0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 4f 70 3b 20  /.  int lockOp; 
25dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25de0 20 6f 70 63 6f 64 65 20 66 6f 72 20 66 63 6e 74   opcode for fcnt
25df0 6c 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  l() */.  int i; 
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e10 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
25e20 65 20 6c 6f 63 6b 69 6e 67 20 62 79 74 65 20 72  e locking byte r
25e30 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ange */.  int rc
25e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e50 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
25e60 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 20  orm fcntl() */. 
25e70 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
25e80 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
25e90 66 20 62 69 74 73 20 69 6e 20 6c 6f 63 6b 4d 61  f bits in lockMa
25ea0 73 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  sk */..  /* Acce
25eb0 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
25ec0 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20  mFile object is 
25ed0 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
25ee0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
25ef0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25f00 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
25f10 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
25f20 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
25f30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
25f40 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
25f50 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ers */.  memset(
25f60 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
25f70 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  );.  f.l_type = 
25f80 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c 5f  lockType;.  f.l_
25f90 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
25fa0 54 3b 0a 20 20 69 66 28 20 28 6c 6f 63 6b 4d 61  T;.  if( (lockMa
25fb0 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 4d 55  sk & UNIX_SHM_MU
25fc0 54 45 58 29 21 3d 30 20 26 26 20 6c 6f 63 6b 54  TEX)!=0 && lockT
25fd0 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
25fe0 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53      lockOp = F_S
25ff0 45 54 4c 4b 57 3b 0a 20 20 20 20 4f 53 54 52 41  ETLKW;.    OSTRA
26000 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 72 65  CE(("SHM-LOCK re
26010 71 75 65 73 74 69 6e 67 20 62 6c 6f 63 6b 69 6e  questing blockin
26020 67 20 6c 6f 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d  g lock\n"));.  }
26030 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70  else{.    lockOp
26040 20 3d 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a   = F_SETLK;.  }.
26050 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66  .  /* Find the f
26060 69 72 73 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b  irst bit in lock
26070 4d 61 73 6b 20 74 68 61 74 20 69 73 20 73 65 74  Mask that is set
26080 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d   */.  for(i=0, m
26090 61 73 6b 3d 30 78 30 31 3b 20 6d 61 73 6b 21 3d  ask=0x01; mask!=
260a0 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d  0 && (lockMask&m
260b0 61 73 6b 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c  ask)==0; mask <<
260c0 3d 20 31 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61 73  = 1, i++){}.  as
260d0 73 65 72 74 28 20 6d 61 73 6b 21 3d 30 20 29 3b  sert( mask!=0 );
260e0 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 69  .  f.l_start = i
260f0 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 3b 0a  +UNIX_SHM_BASE;.
26100 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a    f.l_len = 1;..
26110 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20    /* Extend the 
26120 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 66 6f  locking range fo
26130 72 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61  r each additiona
26140 6c 20 62 69 74 20 74 68 61 74 20 69 73 20 73 65  l bit that is se
26150 74 20 2a 2f 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20  t */.  mask <<= 
26160 31 3b 0a 20 20 77 68 69 6c 65 28 20 6d 61 73 6b  1;.  while( mask
26170 21 3d 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b  !=0 && (lockMask
26180 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
26190 20 20 20 66 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20     f.l_len++;.  
261a0 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20    mask <<= 1;.  
261b0 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  }..  /* Verify t
261c0 68 61 74 20 61 6c 6c 20 62 69 74 73 20 73 65 74  hat all bits set
261d0 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 61 72 65   in lockMask are
261e0 20 63 6f 6e 74 69 67 75 6f 75 73 20 2a 2f 0a 20   contiguous */. 
261f0 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d 30   assert( mask==0
26200 20 7c 7c 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20   || (lockMask & 
26210 7e 28 6d 61 73 6b 20 7c 20 28 6d 61 73 6b 2d 31  ~(mask | (mask-1
26220 29 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  )))==0 );..  /* 
26230 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
26240 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
26250 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 70 46  .  rc = fcntl(pF
26260 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20  ile->h, lockOp, 
26270 26 66 29 3b 0a 20 20 72 63 20 3d 20 28 72 63 21  &f);.  rc = (rc!
26280 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f  =(-1)) ? SQLITE_
26290 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  OK : SQLITE_BUSY
262a0 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
262b0 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
262c0 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
262d0 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
262e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
262f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
26300 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 69 66 28  -LOCK "));.  if(
26310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26320 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
26330 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
26340 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
26350 6e 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20  nlock ok"));.   
26360 20 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61     pFile->exclMa
26370 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b  sk &= ~lockMask;
26380 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
26390 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63  aredMask &= ~loc
263a0 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  kMask;.    }else
263b0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
263c0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
263d0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
263e0 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20  ock ok"));.     
263f0 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b   pFile->exclMask
26400 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20   &= ~lockMask;. 
26410 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
26420 65 64 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61  edMask |= lockMa
26430 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  sk;.    }else{. 
26440 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
26450 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
26460 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
26470 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22  ("write-lock ok"
26480 29 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ));.      pFile-
26490 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63  >exclMask |= loc
264a0 6b 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 46 69  kMask;.      pFi
264b0 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  le->sharedMask &
264c0 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
264d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
264e0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
264f0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  UNLCK ){.      O
26500 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20  STRACE(("unlock 
26510 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d  failed"));.    }
26520 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
26530 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
26540 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
26550 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  ad-lock failed")
26560 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26570 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
26580 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
26590 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
265a0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 66 61 69 6c  "write-lock fail
265b0 65 64 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ed"));.    }.  }
265c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20  .  OSTRACE((" - 
265d0 63 68 61 6e 67 65 20 72 65 71 75 65 73 74 65 64  change requested
265e0 20 25 73 20 2d 20 61 66 74 65 72 77 61 72 64 73   %s - afterwards
265f0 20 25 73 3a 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %s:%s\n",.     
26600 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63        unixShmLoc
26610 6b 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b  kString(lockMask
26620 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e  ),.           un
26630 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28  ixShmLockString(
26640 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73  pFile->sharedMas
26650 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75  k),.           u
26660 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67  nixShmLockString
26670 28 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b  (pFile->exclMask
26680 29 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  )));.#endif..  r
26690 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20  eturn rc;       
266a0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63   .}../*.** For c
266b0 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 75 6e 6c  onnection p, unl
266c0 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  ock all of the l
266d0 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64 20  ocks identified 
266e0 62 79 20 74 68 65 20 75 6e 6c 6f 63 6b 4d 61 73  by the unlockMas
266f0 6b 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a  k.** parameter..
26700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
26710 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20 75  ixShmUnlock(.  u
26720 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c  nixShmFile *pFil
26730 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e,   /* The unde
26740 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
26750 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  mory file */.  u
26760 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20 20  nixShm *p,      
26770 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
26780 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e 6c  ection to be unl
26790 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75 6e  ocked */.  u8 un
267a0 6c 6f 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20  lockMask        
267b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
267c0 73 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65 64  s to be unlocked
267d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
267e0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
267f0 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  code */.  unixSh
26800 6d 20 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f  m *pX; /* For lo
26810 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
26820 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
26830 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d 61  ns */.  u8 allMa
26840 73 6b 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66  sk;  /* Union of
26850 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
26860 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
26870 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
26880 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
26890 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a   unixShmFile obj
268a0 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
268b0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
268c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
268d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
268e0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b  pFile->mutex) );
268f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 6c  ..  /* Compute l
26900 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
26910 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
26920 20 2a 2f 0a 20 20 61 6c 6c 4d 61 73 6b 20 3d 20   */.  allMask = 
26930 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c  0;.  for(pX=pFil
26940 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
26950 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
26960 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
26970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
26980 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
26990 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
269a0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
269b0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 6c 6c 4d 61  ==0 );.    allMa
269c0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
269d0 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
269e0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
269f0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
26a00 0a 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d 61  .  if( (unlockMa
26a10 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 21 3d 75  sk & allMask)!=u
26a20 6e 6c 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20 20 20  nlockMask ){.   
26a30 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
26a40 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46  temLock(pFile, F
26a50 5f 55 4e 4c 43 4b 2c 20 75 6e 6c 6f 63 6b 4d 61  _UNLCK, unlockMa
26a60 73 6b 20 26 20 7e 61 6c 6c 4d 61 73 6b 29 3b 0a  sk & ~allMask);.
26a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
26a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
26a90 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20  ..  /* Undo the 
26aa0 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
26ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26ac0 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 78 63  OK ){.    p->exc
26ad0 6c 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b  lMask &= ~unlock
26ae0 4d 61 73 6b 3b 0a 20 20 20 20 70 2d 3e 73 68 61  Mask;.    p->sha
26af0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f  redMask &= ~unlo
26b00 63 6b 4d 61 73 6b 3b 0a 20 20 7d 20 0a 20 20 72  ckMask;.  } .  r
26b10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26b20 2a 2a 20 47 65 74 20 72 65 61 64 65 72 20 6c 6f  ** Get reader lo
26b30 63 6b 73 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69  cks for connecti
26b40 6f 6e 20 70 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b  on p on all lock
26b50 73 20 69 6e 20 74 68 65 20 72 65 61 64 4d 61 73  s in the readMas
26b60 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  k parameter..*/.
26b70 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
26b80 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 0a 20 20  hmSharedLock(.  
26b90 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
26ba0 6c 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  le,   /* The und
26bb0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
26bc0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
26bd0 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20  unixShm *p,     
26be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
26bf0 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65 74 20 74  nection to get t
26c00 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  he shared locks 
26c10 2a 2f 0a 20 20 75 38 20 72 65 61 64 4d 61 73 6b  */.  u8 readMask
26c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26c30 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
26c40 6b 73 20 74 6f 20 62 65 20 61 63 71 75 69 72 65  ks to be acquire
26c50 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
26c60 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
26c70 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
26c80 78 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46  xShm *pX;   /* F
26c90 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
26ca0 61 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  all sibling conn
26cb0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20  ections */.  u8 
26cc0 61 6c 6c 53 68 61 72 65 64 3b 20 20 2f 2a 20 55  allShared;  /* U
26cd0 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
26ce0 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
26cf0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
26d00 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
26d10 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 46   to the unixShmF
26d20 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ile object is se
26d30 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
26d40 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
26d50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
26d60 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
26d70 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  tex) );..  /* Fi
26d80 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
26d90 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
26da0 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
26db0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
26dc0 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 73  s..  ** If any s
26dd0 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68  ibling already h
26de0 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
26df0 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64  e lock, go ahead
26e00 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
26e10 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
26e20 2a 2f 0a 20 20 61 6c 6c 53 68 61 72 65 64 20 3d  */.  allShared =
26e30 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69   0;.  for(pX=pFi
26e40 6c 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  le->pFirst; pX; 
26e50 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
26e60 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
26e70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
26e80 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
26e90 20 72 65 61 64 4d 61 73 6b 29 21 3d 30 20 29 20   readMask)!=0 ) 
26ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
26eb0 53 59 3b 0a 20 20 20 20 61 6c 6c 53 68 61 72 65  SY;.    allShare
26ec0 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
26ed0 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ask;.  }..  /* G
26ee0 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  et shared locks 
26ef0 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
26f00 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72  vel, if necessar
26f10 79 20 2a 2f 0a 20 20 69 66 28 20 28 7e 61 6c 6c  y */.  if( (~all
26f20 53 68 61 72 65 64 29 20 26 20 72 65 61 64 4d 61  Shared) & readMa
26f30 73 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  sk ){.    rc = u
26f40 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
26f50 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c  (pFile, F_RDLCK,
26f60 20 72 65 61 64 4d 61 73 6b 29 3b 0a 20 20 7d 65   readMask);.  }e
26f70 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
26f80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
26f90 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
26fa0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
26fb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 73  E_OK ){.    p->s
26fd0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 72 65 61  haredMask |= rea
26fe0 64 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  dMask;.  }.  ret
26ff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27000 20 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   For connection 
27010 70 2c 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73  p, get an exclus
27020 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20  ive lock on all 
27030 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64  locks identified
27040 20 69 6e 0a 2a 2a 20 74 68 65 20 77 72 69 74 65   in.** the write
27050 4d 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a  Mask parameter..
27060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27070 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f  ixShmExclusiveLo
27080 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  ck(.  unixShmFil
27090 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
270a0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
270b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
270c0 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
270d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
270e0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
270f0 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
27100 73 69 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  sive locks */.  
27110 75 38 20 77 72 69 74 65 4d 61 73 6b 20 20 20 20  u8 writeMask    
27120 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
27130 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
27140 73 20 74 6f 20 62 65 20 61 63 71 75 69 72 65 64  s to be acquired
27150 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
27160 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
27170 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78  t code */.  unix
27180 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f  Shm *pX;   /* Fo
27190 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
271a0 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  ll sibling conne
271b0 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ctions */..  /* 
271c0 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
271d0 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74  ixShmFile object
271e0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
271f0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
27200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27210 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
27220 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  le->mutex) );.. 
27230 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
27240 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
27250 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
27260 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
27270 74 68 69 73 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20  this.  ** lock. 
27280 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
27290 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
272a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
272b0 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e    for(pX=pFile->
272c0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
272d0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
272e0 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
272f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58  nue;.    if( (pX
27300 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 77 72 69  ->exclMask & wri
27310 74 65 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74  teMask)!=0 ) ret
27320 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
27330 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73 68  .    if( (pX->sh
27340 61 72 65 64 4d 61 73 6b 20 26 20 77 72 69 74 65  aredMask & write
27350 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72  Mask)!=0 ) retur
27360 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
27370 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
27380 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
27390 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
273a0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
273b0 75 63 63 65 73 73 66 75 6c 0a 20 20 2a 2a 20 61  uccessful.  ** a
273c0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
273d0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
273e0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
273f0 20 2a 2f 0a 20 20 72 63 20 3d 20 75 6e 69 78 53   */.  rc = unixS
27400 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69  hmSystemLock(pFi
27410 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 77 72 69  le, F_WRLCK, wri
27420 74 65 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20 72  teMask);.  if( r
27430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27440 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
27450 6b 20 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b 3b  k &= ~writeMask;
27460 0a 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  .    p->exclMask
27470 20 7c 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a 20   |= writeMask;. 
27480 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27490 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  }../*.** Purge t
274a0 68 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69  he unixShmFileLi
274b0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
274c0 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
274d0 53 68 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30 2e  ShmFile.nRef==0.
274e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
274f0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
27500 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
27510 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
27520 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
27530 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
27540 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
27550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
27560 6e 69 78 53 68 6d 50 75 72 67 65 28 76 6f 69 64  nixShmPurge(void
27570 29 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65  ){.  unixShmFile
27580 20 2a 2a 70 70 3b 0a 20 20 75 6e 69 78 53 68 6d   **pp;.  unixShm
27590 46 69 6c 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  File *p;.  asser
275a0 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
275b0 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 75 6e  () );.  pp = &un
275c0 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 3b 0a 20  ixShmFileList;. 
275d0 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
275e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
275f0 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
27600 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78      if( p->mutex
27610 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
27620 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
27630 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
27640 74 65 78 42 75 66 20 29 20 73 71 6c 69 74 65 33  texBuf ) sqlite3
27650 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
27660 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20 20 20  utexBuf);.      
27670 69 66 28 20 70 2d 3e 6d 75 74 65 78 52 65 63 6f  if( p->mutexReco
27680 76 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  v ) sqlite3_mute
27690 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 52  x_free(p->mutexR
276a0 65 63 6f 76 29 3b 0a 20 20 20 20 20 20 69 66 28  ecov);.      if(
276b0 20 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65   p->h>=0 ) close
276c0 28 70 2d 3e 68 29 3b 0a 20 20 20 20 20 20 2a 70  (p->h);.      *p
276d0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
276e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
276f0 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
27700 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
27710 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
27720 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
27730 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
27740 65 61 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ea.  This implem
27750 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d  entation uses mm
27760 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  apped files..**.
27770 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
27780 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
27790 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
277a0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
277b0 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
277c0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
277d0 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
277e0 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
277f0 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
27800 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
27810 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
27820 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
27830 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
27840 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
27850 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4f 70  ic int unixShmOp
27860 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
27870 73 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54  s *pVfs,    /* T
27880 68 65 20 56 46 53 20 2a 2f 0a 20 20 63 6f 6e 73  he VFS */.  cons
27890 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
278a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
278b0 65 20 74 6f 20 6d 6d 61 70 20 2a 2f 0a 20 20 73  e to mmap */.  s
278c0 71 6c 69 74 65 33 5f 73 68 6d 20 2a 2a 70 53 68  qlite3_shm **pSh
278d0 6d 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  m    /* Write th
278e0 65 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  e unixShm object
278f0 20 63 72 65 61 74 65 64 20 68 65 72 65 20 2a 2f   created here */
27900 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  .){.  struct uni
27910 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
27920 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27930 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
27940 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
27950 75 63 74 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  uct unixShmFile 
27960 2a 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  *pFile = 0;     
27970 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
27980 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
27990 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
279c0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63   code */.  struc
279d0 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 64  t unixFileId fid
279e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
279f0 20 55 6e 69 78 20 66 69 6c 65 20 69 64 65 6e 74   Unix file ident
27a00 69 66 69 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  ifier */.  struc
27a10 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a30 20 52 65 73 75 6c 74 20 66 72 6f 6d 20 73 74 61   Result from sta
27a40 74 28 29 20 61 6e 20 66 73 74 61 74 28 29 20 2a  t() an fstat() *
27a50 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
27a60 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
27a70 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
27a80 62 6a 65 63 74 20 2a 2f 0a 20 20 70 20 3d 20 73  bject */.  p = s
27a90 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
27aa0 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
27ab0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
27ac0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27ad0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
27ae0 7a 65 6f 66 28 2a 70 29 29 3b 0a 0a 20 20 2f 2a  zeof(*p));..  /*
27af0 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
27b00 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
27b10 74 69 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65  ting unixShmFile
27b20 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
27b30 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
27b40 74 63 68 69 6e 67 20 75 6e 69 78 53 68 6d 46 69  tching unixShmFi
27b50 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  le currently exi
27b60 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
27b70 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 75 6e  w one..  */.  un
27b80 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
27b90 20 20 72 63 20 3d 20 73 74 61 74 28 7a 4e 61 6d    rc = stat(zNam
27ba0 65 2c 20 26 73 53 74 61 74 29 3b 0a 20 20 69 66  e, &sStat);.  if
27bb0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  ( rc==0 ){.    m
27bc0 65 6d 73 65 74 28 26 66 69 64 2c 20 30 2c 20 73  emset(&fid, 0, s
27bd0 69 7a 65 6f 66 28 66 69 64 29 29 3b 0a 20 20 20  izeof(fid));.   
27be0 20 66 69 64 2e 64 65 76 20 3d 20 73 53 74 61 74   fid.dev = sStat
27bf0 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20 66 69 64  .st_dev;.    fid
27c00 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73 74 5f  .ino = sStat.st_
27c10 69 6e 6f 3b 0a 20 20 20 20 66 6f 72 28 70 46 69  ino;.    for(pFi
27c20 6c 65 20 3d 20 75 6e 69 78 53 68 6d 46 69 6c 65  le = unixShmFile
27c30 4c 69 73 74 3b 20 70 46 69 6c 65 3b 20 70 46 69  List; pFile; pFi
27c40 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e 65 78 74 29  le=pFile->pNext)
27c50 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  {.      if( memc
27c60 6d 70 28 26 70 46 69 6c 65 2d 3e 66 69 64 2c 20  mp(&pFile->fid, 
27c70 26 66 69 64 2c 20 73 69 7a 65 6f 66 28 66 69 64  &fid, sizeof(fid
27c80 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ))==0 ) break;. 
27c90 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
27ca0 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  File==0 ){.    i
27cb0 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  nt nName = strle
27cc0 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 46  n(zName);.    pF
27cd0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
27ce0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 46  lloc( sizeof(*pF
27cf0 69 6c 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ile) + nName + 1
27d00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   );.    if( pFil
27d10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
27d20 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
27d30 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
27d40 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
27d50 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
27d60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69  , 0, sizeof(*pFi
27d70 6c 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  le));.    pFile-
27d80 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
27d90 61 72 2a 29 26 70 46 69 6c 65 5b 31 5d 3b 0a 20  ar*)&pFile[1];. 
27da0 20 20 20 6d 65 6d 63 70 79 28 70 46 69 6c 65 2d     memcpy(pFile-
27db0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4e 61 6d  >zFilename, zNam
27dc0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
27dd0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
27de0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4e 65 78 74      pFile->pNext
27df0 20 3d 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c 69   = unixShmFileLi
27e00 73 74 3b 0a 20 20 20 20 75 6e 69 78 53 68 6d 46  st;.    unixShmF
27e10 69 6c 65 4c 69 73 74 20 3d 20 70 46 69 6c 65 3b  ileList = pFile;
27e20 0a 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74  ..    pFile->mut
27e30 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
27e40 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
27e50 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
27e60 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75 74 65   if( pFile->mute
27e70 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
27e80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
27e90 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
27ea0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
27eb0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78      pFile->mutex
27ec0 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  Buf = sqlite3_mu
27ed0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
27ee0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
27ef0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 75 74    if( pFile->mut
27f00 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  exBuf==0 ){.    
27f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27f20 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
27f30 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
27f40 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d    }.    pFile->m
27f50 75 74 65 78 52 65 63 6f 76 20 3d 20 73 71 6c 69  utexRecov = sqli
27f60 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
27f70 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
27f80 54 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  T);.    if( pFil
27f90 65 2d 3e 6d 75 74 65 78 52 65 63 6f 76 3d 3d 30  e->mutexRecov==0
27fa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
27fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
27fc0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
27fd0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
27fe0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 6f 70 65 6e   pFile->h = open
27ff0 28 7a 4e 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f  (zName, O_RDWR|O
28000 5f 43 52 45 41 54 2c 20 30 36 36 34 29 3b 0a 20  _CREAT, 0664);. 
28010 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3c     if( pFile->h<
28020 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
28030 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28040 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
28050 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
28060 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 66     }..    rc = f
28070 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
28080 73 53 74 61 74 29 3b 0a 20 20 20 20 69 66 28 20  sStat);.    if( 
28090 72 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  rc ){.      rc =
280a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
280b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
280c0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
280d0 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
280e0 3e 66 69 64 2e 64 65 76 20 3d 20 73 53 74 61 74  >fid.dev = sStat
280f0 2e 73 74 5f 64 65 76 3b 0a 20 20 20 20 70 46 69  .st_dev;.    pFi
28100 6c 65 2d 3e 66 69 64 2e 69 6e 6f 20 3d 20 73 53  le->fid.ino = sS
28110 74 61 74 2e 73 74 5f 69 6e 6f 3b 0a 0a 20 20 20  tat.st_ino;..   
28120 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
28130 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
28140 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
28150 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
28160 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
28170 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
28180 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
28190 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
281a0 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
281b0 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f  emLock(pFile, F_
281c0 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
281d0 4d 55 54 45 58 29 20 29 7b 0a 20 20 20 20 20 20  MUTEX) ){.      
281e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
281f0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 67 6f  R_LOCK;.      go
28200 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
28220 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
28230 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c  (pFile, F_WRLCK,
28240 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3d 3d   UNIX_SHM_DMS)==
28250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28260 20 20 20 69 66 28 20 66 74 72 75 6e 63 61 74 65     if( ftruncate
28270 28 70 46 69 6c 65 2d 3e 68 2c 20 30 29 20 29 7b  (pFile->h, 0) ){
28280 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28290 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
282a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
282b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
282c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
282d0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
282e0 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  pFile, F_RDLCK, 
282f0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3b 0a 20  UNIX_SHM_DMS);. 
28300 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d     }.    unixShm
28310 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65  SystemLock(pFile
28320 2c 20 46 5f 55 4e 4c 43 4b 2c 20 55 4e 49 58 5f  , F_UNLCK, UNIX_
28330 53 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20 20  SHM_MUTEX);.    
28340 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
28350 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
28360 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
28370 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
28380 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
28390 78 53 68 6d 46 69 6c 65 20 2a 2f 0a 20 20 70 2d  xShmFile */.  p-
283a0 3e 70 46 69 6c 65 20 3d 20 70 46 69 6c 65 3b 0a  >pFile = pFile;.
283b0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69    p->pNext = pFi
283c0 6c 65 2d 3e 70 46 69 72 73 74 3b 0a 23 69 66 64  le->pFirst;.#ifd
283d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
283e0 20 20 70 2d 3e 69 64 20 3d 20 70 46 69 6c 65 2d    p->id = pFile-
283f0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
28400 6e 64 69 66 0a 20 20 70 46 69 6c 65 2d 3e 70 46  ndif.  pFile->pF
28410 69 72 73 74 20 3d 20 70 3b 0a 20 20 70 46 69 6c  irst = p;.  pFil
28420 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 2a 70 53  e->nRef++;.  *pS
28430 68 6d 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 68  hm = (sqlite3_sh
28440 6d 2a 29 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76  m*)p;.  unixLeav
28450 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
28460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
28470 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
28480 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
28490 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
284a0 69 78 53 68 6d 50 75 72 67 65 28 29 3b 0a 20 20  ixShmPurge();.  
284b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
284c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
284d0 70 46 69 6c 65 29 3b 0a 20 20 2a 70 53 68 6d 20  pFile);.  *pShm 
284e0 3d 20 30 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = 0;.  unixLeave
284f0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
28500 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
28510 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
28520 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
28530 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
28540 6e 74 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65 28  nt unixShmClose(
28550 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68  sqlite3_shm *pSh
28560 61 72 65 64 4d 65 6d 29 7b 0a 20 20 75 6e 69 78  aredMem){.  unix
28570 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
28580 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
28590 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
285a0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69  d */.  unixShmFi
285b0 6c 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 2f 2a  le *pFile;    /*
285c0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
285d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
285e0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
285f0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
28600 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
28610 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
28620 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
28630 20 70 53 68 61 72 65 64 4d 65 6d 3d 3d 30 20 29   pSharedMem==0 )
28640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28650 4b 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  K;.  p = (struct
28660 20 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65   unixShm*)pShare
28670 64 4d 65 6d 3b 0a 20 20 70 46 69 6c 65 20 3d 20  dMem;.  pFile = 
28680 70 2d 3e 70 46 69 6c 65 3b 0a 0a 20 20 2f 2a 20  p->pFile;..  /* 
28690 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
286a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 65 69 6e 67  connection being
286b0 20 63 6c 6f 73 65 64 20 68 6f 6c 64 73 20 6e 6f   closed holds no
286c0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 73 73 65   locks */.  asse
286d0 72 74 28 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 3d  rt( p->exclMask=
286e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
286f0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3d 3d 30  p->sharedMask==0
28700 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65   );..  /* Remove
28710 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
28720 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
28730 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
28740 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
28750 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
28760 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ex_enter(pFile->
28770 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
28780 3d 26 70 46 69 6c 65 2d 3e 70 46 69 72 73 74 3b  =&pFile->pFirst;
28790 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
287a0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
287b0 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
287c0 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
287d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
287e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
287f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  (p);.  sqlite3_m
28800 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65  utex_leave(pFile
28810 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
28820 49 66 20 70 46 69 6c 65 2d 3e 6e 52 65 66 20 68  If pFile->nRef h
28830 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
28840 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
28850 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
28860 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
28870 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
28880 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
28890 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6e 52 65  sert( pFile->nRe
288a0 66 3e 30 20 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  f>0 );.  pFile->
288b0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 46  nRef--;.  if( pF
288c0 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ile->nRef==0 ){.
288d0 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
288e0 28 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  ();.  }.  unixLe
288f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
28900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
28920 61 6e 64 2f 6f 72 20 63 68 61 6e 67 65 73 20 74  and/or changes t
28930 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 75  he size of the u
28940 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
28950 65 20 66 6f 72 0a 2a 2a 20 61 20 73 68 61 72 65  e for.** a share
28960 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
28970 2e 20 20 54 68 65 20 72 65 71 53 69 7a 65 20 70  .  The reqSize p
28980 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
28990 6e 65 77 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74  new size.** of t
289a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  he underlying st
289b0 6f 72 61 67 65 2c 20 6f 72 20 2d 31 20 74 6f 20  orage, or -1 to 
289c0 64 6f 20 6a 75 73 74 20 61 20 71 75 65 72 79 2e  do just a query.
289d0 20 20 54 68 65 20 73 69 7a 65 0a 2a 2a 20 6f 66    The size.** of
289e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
289f0 73 74 6f 72 61 67 65 20 28 61 66 74 65 72 20 72  storage (after r
28a00 65 73 69 7a 69 6e 67 20 69 66 20 72 65 73 69 7a  esizing if resiz
28a10 69 6e 67 20 6f 63 63 75 72 73 29 20 69 73 0a 2a  ing occurs) is.*
28a20 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  * written into p
28a30 4e 65 77 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  NewSize..**.** T
28a40 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
28a50 20 6e 6f 74 20 28 6e 65 63 65 73 73 61 72 69 6c   not (necessaril
28a60 79 29 20 63 68 61 6e 67 65 20 74 68 65 20 73 69  y) change the si
28a70 7a 65 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e  ze of the mappin
28a80 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 75 6e 64  g .** of the und
28a90 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 20  erlying storage 
28aa0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 55 73  into memory.  Us
28ab0 65 20 78 53 68 6d 47 65 74 28 29 20 74 6f 20 63  e xShmGet() to c
28ac0 68 61 6e 67 65 0a 2a 2a 20 74 68 65 20 6d 61 70  hange.** the map
28ad0 70 69 6e 67 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  ping size..**.**
28ae0 20 54 68 65 20 72 65 71 53 69 7a 65 20 70 61 72   The reqSize par
28af0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6d 69  ameter is the mi
28b00 6e 69 6d 75 6d 20 73 69 7a 65 20 72 65 71 75 65  nimum size reque
28b10 73 74 65 64 2e 20 20 54 68 65 20 69 6d 70 6c 65  sted.  The imple
28b20 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 20  mentation.** is 
28b30 66 72 65 65 20 74 6f 20 65 78 70 61 6e 64 20 74  free to expand t
28b40 68 65 20 73 74 6f 72 61 67 65 20 74 6f 20 73 6f  he storage to so
28b50 6d 65 20 6c 61 72 67 65 72 20 61 6d 6f 75 6e 74  me larger amount
28b60 20 69 66 20 69 74 20 63 68 6f 6f 73 65 73 2e 0a   if it chooses..
28b70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
28b80 69 78 53 68 6d 53 69 7a 65 28 0a 20 20 73 71 6c  ixShmSize(.  sql
28b90 69 74 65 33 5f 73 68 6d 20 2a 70 53 68 61 72 65  ite3_shm *pShare
28ba0 64 4d 65 6d 2c 20 20 2f 2a 20 50 6f 69 6e 74 65  dMem,  /* Pointe
28bb0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 75 6e  r returned by un
28bc0 69 78 53 68 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20  ixShmOpen() */. 
28bd0 20 69 6e 74 20 72 65 71 53 69 7a 65 2c 20 20 20   int reqSize,   
28be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
28bf0 71 75 65 73 74 65 64 20 73 69 7a 65 2e 20 20 2d  quested size.  -
28c00 31 20 66 6f 72 20 71 75 65 72 79 20 6f 6e 6c 79  1 for query only
28c10 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77 53   */.  int *pNewS
28c20 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
28c30 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a  /* Write new siz
28c40 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e here */.){.  u
28c50 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28 75 6e 69  nixShm *p = (uni
28c60 78 53 68 6d 2a 29 70 53 68 61 72 65 64 4d 65 6d  xShm*)pSharedMem
28c70 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  ;.  unixShmFile 
28c80 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c  *pFile = p->pFil
28c90 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
28ca0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63  LITE_OK;.  struc
28cb0 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 0a 20  t stat sStat;.. 
28cc0 20 69 66 28 20 72 65 71 53 69 7a 65 3e 3d 30 20   if( reqSize>=0 
28cd0 29 7b 0a 20 20 20 20 72 65 71 53 69 7a 65 20 3d  ){.    reqSize =
28ce0 20 28 72 65 71 53 69 7a 65 20 2b 20 53 51 4c 49   (reqSize + SQLI
28cf0 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52  TE_UNIX_SHM_INCR
28d00 20 2d 20 31 29 2f 53 51 4c 49 54 45 5f 55 4e 49   - 1)/SQLITE_UNI
28d10 58 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20 20 20 20  X_SHM_INCR;.    
28d20 72 65 71 53 69 7a 65 20 2a 3d 20 53 51 4c 49 54  reqSize *= SQLIT
28d30 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 3b  E_UNIX_SHM_INCR;
28d40 0a 20 20 20 20 72 63 20 3d 20 66 74 72 75 6e 63  .    rc = ftrunc
28d50 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 72 65  ate(pFile->h, re
28d60 71 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  qSize);.  }.  if
28d70 28 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e 68  ( fstat(pFile->h
28d80 2c 20 26 73 53 74 61 74 29 3d 3d 30 20 29 7b 0a  , &sStat)==0 ){.
28d90 20 20 20 20 2a 70 4e 65 77 53 69 7a 65 20 3d 20      *pNewSize = 
28da0 28 69 6e 74 29 73 53 74 61 74 2e 73 74 5f 73 69  (int)sStat.st_si
28db0 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
28dc0 20 2a 70 4e 65 77 53 69 7a 65 20 3d 20 30 3b 0a   *pNewSize = 0;.
28dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28de0 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 72 65 74  IOERR;.  }.  ret
28df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
28e00 2a 20 4d 61 70 20 74 68 65 20 73 68 61 72 65 64  * Map the shared
28e10 20 73 74 6f 72 61 67 65 20 69 6e 74 6f 20 6d 65   storage into me
28e20 6d 6f 72 79 2e 20 20 54 68 65 20 6d 69 6e 69 6d  mory.  The minim
28e30 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  um size of the.*
28e40 2a 20 6d 61 70 70 69 6e 67 20 73 68 6f 75 6c 64  * mapping should
28e50 20 62 65 20 72 65 71 4d 61 70 53 69 7a 65 20 69   be reqMapSize i
28e60 66 20 72 65 71 4d 61 70 53 69 7a 65 20 69 73 20  f reqMapSize is 
28e70 70 6f 73 69 74 69 76 65 2e 20 20 49 66 0a 2a 2a  positive.  If.**
28e80 20 72 65 71 4d 61 70 53 69 7a 65 20 69 73 20 7a   reqMapSize is z
28e90 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
28ea0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
28eb0 69 6f 6e 20 63 61 6e 20 63 68 6f 6f 73 65 0a 2a  ion can choose.*
28ec0 2a 20 77 68 61 74 65 76 65 72 20 6d 61 70 70 69  * whatever mappi
28ed0 6e 67 20 73 69 7a 65 20 69 73 20 63 6f 6e 76 65  ng size is conve
28ee0 6e 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  nient..**.** *pp
28ef0 42 75 66 20 69 73 20 6d 61 64 65 20 74 6f 20 70  Buf is made to p
28f00 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 65 6d 6f  oint to the memo
28f10 72 79 20 77 68 69 63 68 20 69 73 20 61 20 6d 61  ry which is a ma
28f20 70 70 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a 20  pping of the.** 
28f30 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61  underlying stora
28f40 67 65 2e 20 20 54 68 69 73 20 73 65 67 6d 65 6e  ge.  This segmen
28f50 74 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 75 6e  t is locked.  un
28f60 69 78 53 68 6d 52 65 6c 65 61 73 65 28 29 0a 2a  ixShmRelease().*
28f70 2a 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  * must be called
28f80 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
28f90 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e 65  lock..**.** *pNe
28fa0 77 4d 61 70 53 69 7a 65 20 69 73 20 73 65 74 20  wMapSize is set 
28fb0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
28fc0 68 65 20 6d 61 70 70 69 6e 67 2e 0a 2a 2a 0a 2a  he mapping..**.*
28fd0 2a 20 2a 70 70 42 75 66 20 61 6e 64 20 2a 70 4e  * *ppBuf and *pN
28fe0 65 77 4d 61 70 53 69 7a 65 20 6d 69 67 68 74 20  ewMapSize might 
28ff0 62 65 20 4e 55 4c 4c 20 61 6e 64 20 7a 65 72 6f  be NULL and zero
29000 20 69 66 20 6e 6f 20 73 70 61 63 65 20 68 61 73   if no space has
29010 0a 2a 2a 20 79 65 74 20 62 65 65 6e 20 61 6c 6c  .** yet been all
29020 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 75 6e  ocated to the un
29030 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65  derlying storage
29040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29050 75 6e 69 78 53 68 6d 47 65 74 28 0a 20 20 73 71  unixShmGet(.  sq
29060 6c 69 74 65 33 5f 73 68 6d 20 2a 70 53 68 61 72  lite3_shm *pShar
29070 65 64 4d 65 6d 2c 20 2f 2a 20 50 6f 69 6e 74 65  edMem, /* Pointe
29080 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 75 6e  r returned by un
29090 69 78 53 68 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20  ixShmOpen() */. 
290a0 20 69 6e 74 20 72 65 71 4d 61 70 53 69 7a 65 2c   int reqMapSize,
290b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
290c0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 6d  uested size of m
290d0 61 70 70 69 6e 67 2e 20 2d 31 20 6d 65 61 6e 73  apping. -1 means
290e0 20 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 20   don't care */. 
290f0 20 69 6e 74 20 2a 70 4e 65 77 4d 61 70 53 69 7a   int *pNewMapSiz
29100 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  e,        /* Wri
29110 74 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 6d  te new size of m
29120 61 70 70 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20  apping here */. 
29130 20 76 6f 69 64 20 2a 2a 70 70 42 75 66 20 20 20   void **ppBuf   
29140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
29150 74 65 20 6d 61 70 70 69 6e 67 20 62 75 66 66 65  te mapping buffe
29160 72 20 6f 72 69 67 69 6e 20 68 65 72 65 20 2a 2f  r origin here */
29170 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  .){.  unixShm *p
29180 20 3d 20 28 75 6e 69 78 53 68 6d 2a 29 70 53 68   = (unixShm*)pSh
29190 61 72 65 64 4d 65 6d 3b 0a 20 20 75 6e 69 78 53  aredMem;.  unixS
291a0 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  hmFile *pFile = 
291b0 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20  p->pFile;.  int 
291c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
291d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
291e0 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75  _enter(pFile->mu
291f0 74 65 78 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  texBuf);.  sqlit
29200 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
29210 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  File->mutex);.  
29220 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70  if( pFile->szMap
29230 3d 3d 30 20 7c 7c 20 72 65 71 4d 61 70 53 69 7a  ==0 || reqMapSiz
29240 65 3e 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 20 29  e>pFile->szMap )
29250 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 75 61 6c  {.    int actual
29260 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 75 6e  Size;.    if( un
29270 69 78 53 68 6d 53 69 7a 65 28 70 53 68 61 72 65  ixShmSize(pShare
29280 64 4d 65 6d 2c 20 2d 31 2c 20 26 61 63 74 75 61  dMem, -1, &actua
29290 6c 53 69 7a 65 29 3d 3d 53 51 4c 49 54 45 5f 4f  lSize)==SQLITE_O
292a0 4b 0a 20 20 20 20 20 26 26 20 72 65 71 4d 61 70  K.     && reqMap
292b0 53 69 7a 65 3c 61 63 74 75 61 6c 53 69 7a 65 0a  Size<actualSize.
292c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 71      ){.      req
292d0 4d 61 70 53 69 7a 65 20 3d 20 61 63 74 75 61 6c  MapSize = actual
292e0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
292f0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70  if( pFile->pMMap
29300 42 75 66 20 29 7b 0a 20 20 20 20 20 20 6d 75 6e  Buf ){.      mun
29310 6d 61 70 28 70 46 69 6c 65 2d 3e 70 4d 4d 61 70  map(pFile->pMMap
29320 42 75 66 2c 20 70 46 69 6c 65 2d 3e 73 7a 4d 61  Buf, pFile->szMa
29330 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  p);.    }.    pF
29340 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3d 20  ile->pMMapBuf = 
29350 6d 6d 61 70 28 30 2c 20 72 65 71 4d 61 70 53 69  mmap(0, reqMapSi
29360 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  ze, PROT_READ|PR
29370 4f 54 5f 57 52 49 54 45 2c 20 4d 41 50 5f 53 48  OT_WRITE, MAP_SH
29380 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20  ARED,.          
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 70 46 69 6c 65 2d 3e 68 2c 20 30 29 3b 0a 20   pFile->h, 0);. 
293b0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 20     pFile->szMap 
293c0 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75  = pFile->pMMapBu
293d0 66 20 3f 20 72 65 71 4d 61 70 53 69 7a 65 20 3a  f ? reqMapSize :
293e0 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 4d   0;.  }.  *pNewM
293f0 61 70 53 69 7a 65 20 3d 20 70 46 69 6c 65 2d 3e  apSize = pFile->
29400 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75 66 20  szMap;.  *ppBuf 
29410 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75  = pFile->pMMapBu
29420 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
29430 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e  ex_leave(pFile->
29440 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
29450 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29460 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 68  lease the lock h
29470 65 6c 64 20 6f 6e 20 74 68 65 20 73 68 61 72 65  eld on the share
29480 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
29490 20 74 6f 20 74 68 61 74 20 6f 74 68 65 72 0a 2a   to that other.*
294a0 2a 20 74 68 72 65 61 64 73 20 61 72 65 20 66 72  * threads are fr
294b0 65 65 20 74 6f 20 72 65 73 69 7a 65 20 69 74 20  ee to resize it 
294c0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
294d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
294e0 53 68 6d 52 65 6c 65 61 73 65 28 73 71 6c 69 74  ShmRelease(sqlit
294f0 65 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d  e3_shm *pSharedM
29500 65 6d 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  em){.  unixShm *
29510 70 20 3d 20 28 75 6e 69 78 53 68 6d 2a 29 70 53  p = (unixShm*)pS
29520 68 61 72 65 64 4d 65 6d 3b 0a 20 20 75 6e 69 78  haredMem;.  unix
29530 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  ShmFile *pFile =
29540 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20 73 71 6c   p->pFile;.  sql
29550 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
29560 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66  (pFile->mutexBuf
29570 29 3b 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  );  .  return SQ
29580 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29590 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  * Symbolic names
295a0 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65 73   for LOCK states
295b0 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
295c0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
295d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
295e0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
295f0 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  zLkName[] = {.  
29600 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41  "UNLOCK",.  "REA
29610 44 22 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c  D",.  "READ_FULL
29620 22 2c 0a 20 20 22 57 52 49 54 45 22 2c 0a 20 20  ",.  "WRITE",.  
29630 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48  "PENDING",.  "CH
29640 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45  ECKPOINT",.  "RE
29650 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66  COVER".};.#endif
29660 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
29670 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
29680 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
29690 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
296a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
296b0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
296c0 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d  _shm *pSharedMem
296d0 2c 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 66  ,   /* Pointer f
296e0 72 6f 6d 20 75 6e 69 78 53 68 6d 4f 70 65 6e 28  rom unixShmOpen(
296f0 29 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  ) */.  int desir
29700 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
29710 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c 49    /* One of SQLI
29720 54 45 5f 53 48 4d 5f 78 78 78 78 78 20 6c 6f 63  TE_SHM_xxxxx loc
29730 6b 69 6e 67 20 73 74 61 74 65 73 20 2a 2f 0a 20  king states */. 
29740 20 69 6e 74 20 2a 70 47 6f 74 4c 6f 63 6b 20 20   int *pGotLock  
29750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29760 68 65 20 6c 6f 63 6b 20 79 6f 75 20 61 63 74 75  he lock you actu
29770 61 6c 6c 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a 20  ally got */.){. 
29780 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 28 75   unixShm *p = (u
29790 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65 64 4d  nixShm*)pSharedM
297a0 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  em;.  unixShmFil
297b0 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46  e *pFile = p->pF
297c0 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
297d0 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
297e0 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  ..  /* Note that
297f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
29800 5f 46 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45  _FULL and SQLITE
29810 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 61 72 65  _SHM_PENDING are
29820 20 6e 65 76 65 72 0a 20 20 2a 2a 20 64 69 72 65   never.  ** dire
29830 63 74 6c 79 20 72 65 71 75 65 73 74 65 64 3b 20  ctly requested; 
29840 74 68 65 79 20 61 72 65 20 73 69 64 65 20 65 66  they are side ef
29850 66 65 63 74 73 20 66 72 6f 6d 20 72 65 71 75 65  fects from reque
29860 73 74 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 49 54  sting.  ** SQLIT
29870 45 5f 53 48 4d 5f 52 45 41 44 20 61 6e 64 20 53  E_SHM_READ and S
29880 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
29890 4f 49 4e 54 2c 20 72 65 73 70 65 63 74 69 76 65  OINT, respective
298a0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ly..  */.  asser
298b0 74 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  t( desiredLock==
298c0 53 51 4c 49 54 45 5f 53 48 4d 5f 51 55 45 52 59  SQLITE_SHM_QUERY
298d0 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72  .       || desir
298e0 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
298f0 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20 20 20  HM_UNLOCK.      
29900 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
29910 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44  =SQLITE_SHM_READ
29920 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72  .       || desir
29930 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
29940 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  HM_WRITE.       
29950 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  || desiredLock==
29960 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b  SQLITE_SHM_CHECK
29970 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20  POINT.       || 
29980 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
29990 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20  ITE_SHM_RECOVER 
299a0 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
299b0 64 69 72 65 63 74 6c 79 20 69 66 20 74 68 69 73  directly if this
299c0 20 69 73 20 6a 75 73 74 20 61 20 6c 6f 63 6b 20   is just a lock 
299d0 73 74 61 74 65 20 71 75 65 72 79 2c 20 6f 72 20  state query, or 
299e0 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 6e  if.  ** the conn
299f0 65 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  ection is alread
29a00 79 20 69 6e 20 74 68 65 20 64 65 73 69 72 65 64  y in the desired
29a10 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 0a   locking state..
29a20 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 69 72    */.  if( desir
29a30 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
29a40 48 4d 5f 51 55 45 52 59 0a 20 20 20 7c 7c 20 64  HM_QUERY.   || d
29a50 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 70 2d 3e 6c  esiredLock==p->l
29a60 6f 63 6b 53 74 61 74 65 0a 20 20 20 7c 7c 20 28  ockState.   || (
29a70 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
29a80 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 26 26 20  ITE_SHM_READ && 
29a90 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
29aa0 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55  LITE_SHM_READ_FU
29ab0 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 4f 53 54  LL).  ){.    OST
29ac0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
29ad0 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
29ae0 20 72 65 71 75 65 73 74 20 25 73 20 61 6e 64 20   request %s and 
29af0 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  got %s\n",.     
29b00 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
29b10 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d  etpid(), azLkNam
29b20 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 2c 20  e[desiredLock], 
29b30 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63 6b  azLkName[p->lock
29b40 53 74 61 74 65 5d 29 29 3b 0a 20 20 20 20 69 66  State]));.    if
29b50 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70 47  ( pGotLock ) *pG
29b60 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63 6b  otLock = p->lock
29b70 53 74 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72  State;.    retur
29b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29b90 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
29ba0 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
29bb0 20 70 69 64 2d 25 64 20 72 65 71 75 65 73 74 20   pid-%d request 
29bc0 25 73 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20  %s->%s\n",.     
29bd0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65         p->id, ge
29be0 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65  tpid(), azLkName
29bf0 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 2c 20  [p->lockState], 
29c00 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65 64  azLkName[desired
29c10 4c 6f 63 6b 5d 29 29 3b 0a 20 20 73 71 6c 69 74  Lock]));.  sqlit
29c20 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
29c30 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  File->mutex);.  
29c40 73 77 69 74 63 68 28 20 64 65 73 69 72 65 64 4c  switch( desiredL
29c50 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ock ){.    case 
29c60 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
29c70 4b 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K: {.      asser
29c80 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 21  t( p->lockState!
29c90 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f  =SQLITE_SHM_RECO
29ca0 56 45 52 20 29 3b 0a 20 20 20 20 20 20 75 6e 69  VER );.      uni
29cb0 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65  xShmUnlock(pFile
29cc0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c  , p, UNIX_SHM_A|
29cd0 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f  UNIX_SHM_B|UNIX_
29ce0 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44  SHM_C|UNIX_SHM_D
29cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
29d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70  LITE_OK;.      p
29d10 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
29d20 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3b  LITE_SHM_UNLOCK;
29d30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29d40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
29d50 49 54 45 5f 53 48 4d 5f 52 45 41 44 3a 20 7b 0a  ITE_SHM_READ: {.
29d60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63        if( p->loc
29d70 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
29d80 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
29d90 20 20 20 20 20 69 6e 74 20 6e 41 74 74 65 6d 70       int nAttemp
29da0 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
29db0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
29dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
29dd0 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
29de0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  E_SHM_UNLOCK );.
29df0 20 20 20 20 20 20 20 20 66 6f 72 28 6e 41 74 74          for(nAtt
29e00 65 6d 70 74 3d 30 3b 20 6e 41 74 74 65 6d 70 74  empt=0; nAttempt
29e10 3c 35 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  <5 && rc==SQLITE
29e20 5f 42 55 53 59 3b 20 6e 41 74 74 65 6d 70 74 2b  _BUSY; nAttempt+
29e30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  +){.          rc
29e40 20 3d 20 75 6e 69 78 53 68 6d 53 68 61 72 65 64   = unixShmShared
29e50 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  Lock(pFile, p, U
29e60 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49 58 5f 53  NIX_SHM_A|UNIX_S
29e70 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20 20  HM_B);.         
29e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29e90 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
29ea0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
29eb0 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65  SharedLock(pFile
29ec0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 29  , p, UNIX_SHM_D)
29ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29f00 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
29f10 70 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 53 51  p->readLock = SQ
29f20 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55  LITE_SHM_READ_FU
29f30 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
29f40 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
29f50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  e{.            u
29f60 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69  nixShmUnlock(pFi
29f70 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f  le, p, UNIX_SHM_
29f80 42 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  B);.            
29f90 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 70  p->lockState = p
29fa0 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 53 51 4c  ->readLock = SQL
29fb0 49 54 45 5f 53 48 4d 5f 52 45 41 44 3b 0a 20 20  ITE_SHM_READ;.  
29fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29fd0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
29fe0 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  if( p->lockState
29ff0 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49  ==SQLITE_SHM_WRI
2a000 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  TE ){.        rc
2a010 20 3d 20 75 6e 69 78 53 68 6d 53 68 61 72 65 64   = unixShmShared
2a020 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  Lock(pFile, p, U
2a030 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20 20  NIX_SHM_A);.    
2a040 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63      unixShmUnloc
2a050 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58  k(pFile, p, UNIX
2a060 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f  _SHM_C|UNIX_SHM_
2a070 44 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  D);.        p->l
2a080 6f 63 6b 53 74 61 74 65 20 3d 20 70 2d 3e 72 65  ockState = p->re
2a090 61 64 4c 6f 63 6b 20 3d 20 53 51 4c 49 54 45 5f  adLock = SQLITE_
2a0a0 53 48 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20 20  SHM_READ;.      
2a0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
2a0c0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74  ssert( p->lockSt
2a0d0 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
2a0e0 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20  RECOVER );.     
2a0f0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b     unixShmUnlock
2a100 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2a110 53 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20 20  SHM_MUTEX);.    
2a120 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2a130 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d  x_leave(pFile->m
2a140 75 74 65 78 52 65 63 6f 76 29 3b 0a 20 20 20 20  utexRecov);.    
2a150 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
2a160 20 3d 20 70 2d 3e 72 65 61 64 4c 6f 63 6b 3b 0a   = p->readLock;.
2a170 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a180 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2a190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a1a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2a1b0 54 45 5f 53 48 4d 5f 57 52 49 54 45 3a 20 7b 0a  TE_SHM_WRITE: {.
2a1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2a1d0 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
2a1e0 54 45 5f 53 48 4d 5f 52 45 41 44 20 0a 20 20 20  TE_SHM_READ .   
2a1f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
2a200 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
2a210 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c  TE_SHM_READ_FULL
2a220 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 75   );.      rc = u
2a230 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c  nixShmExclusiveL
2a240 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e  ock(pFile, p, UN
2a250 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48  IX_SHM_C|UNIX_SH
2a260 4d 5f 44 29 3b 0a 20 20 20 20 20 20 69 66 28 20  M_D);.      if( 
2a270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a280 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
2a290 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53  State = SQLITE_S
2a2a0 48 4d 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  HM_WRITE;.      
2a2b0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2a2c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2a2d0 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f  LITE_SHM_CHECKPO
2a2e0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  INT: {.      ass
2a2f0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  ert( p->lockStat
2a300 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  e==SQLITE_SHM_UN
2a310 4c 4f 43 4b 0a 20 20 20 20 20 20 20 20 20 20 20  LOCK.           
2a320 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  || p->lockState=
2a330 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44  =SQLITE_SHM_PEND
2a340 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ING.           |
2a350 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  | p->lockState==
2a360 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56  SQLITE_SHM_RECOV
2a370 45 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ER );.      if( 
2a380 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
2a390 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52  LITE_SHM_RECOVER
2a3a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
2a3b0 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65 2c  ShmUnlock(pFile,
2a3c0 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54   p, UNIX_SHM_MUT
2a3d0 45 58 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EX);.        sql
2a3e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2a3f0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 52 65 63  (pFile->mutexRec
2a400 6f 76 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ov);.        p->
2a410 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49  lockState = SQLI
2a420 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e  TE_SHM_CHECKPOIN
2a430 54 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  T;.        rc = 
2a440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2a450 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
2a460 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
2a470 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
2a480 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2a490 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63  xShmExclusiveLoc
2a4a0 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58  k(pFile, p, UNIX
2a4b0 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f 53 48 4d 5f  _SHM_B|UNIX_SHM_
2a4c0 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
2a4d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a4e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  .          p->lo
2a4f0 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckState = SQLITE
2a500 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  _SHM_PENDING;.  
2a510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a520 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63        if( p->loc
2a530 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
2a540 48 4d 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20  HM_PENDING ){.  
2a550 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2a560 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  hmExclusiveLock(
2a570 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53  pFile, p, UNIX_S
2a580 48 4d 5f 41 29 3b 0a 20 20 20 20 20 20 20 20 69  HM_A);.        i
2a590 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
2a5b0 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c  >lockState = SQL
2a5c0 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49  ITE_SHM_CHECKPOI
2a5d0 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NT;.        }.  
2a5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2a5f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
2a600 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
2a610 73 65 72 74 28 20 64 65 73 69 72 65 64 4c 6f 63  sert( desiredLoc
2a620 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  k==SQLITE_SHM_RE
2a630 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20 61  COVER );.      a
2a640 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74  ssert( p->lockSt
2a650 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
2a660 52 45 41 44 0a 20 20 20 20 20 20 20 20 20 20 20  READ.           
2a670 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  || p->lockState=
2a680 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44  =SQLITE_SHM_READ
2a690 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20 20 20 20  _FULL.          
2a6a0 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65   || p->lockState
2a6b0 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  ==SQLITE_SHM_CHE
2a6c0 43 4b 50 4f 49 4e 54 20 29 3b 0a 20 20 20 20 20  CKPOINT );.     
2a6d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2a6e0 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75 74 65  eave(pFile->mute
2a6f0 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
2a700 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46  3_mutex_enter(pF
2a710 69 6c 65 2d 3e 6d 75 74 65 78 52 65 63 6f 76 29  ile->mutexRecov)
2a720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2a730 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c  mutex_enter(pFil
2a740 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2a750 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63   rc = unixShmExc
2a760 6c 75 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65  lusiveLock(pFile
2a770 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55  , p, UNIX_SHM_MU
2a780 54 45 58 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TEX);.      if( 
2a790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a7a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
2a7b0 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53  State = SQLITE_S
2a7c0 48 4d 5f 52 45 43 4f 56 45 52 3b 0a 20 20 20 20  HM_RECOVER;.    
2a7d0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
2a7e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
2a7f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2a800 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a  (pFile->mutex);.
2a810 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
2a820 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
2a830 69 64 2d 25 64 20 67 6f 74 20 25 73 5c 6e 22 2c  id-%d got %s\n",
2a840 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
2a850 64 2c 20 67 65 74 70 69 64 28 29 2c 20 61 7a 4c  d, getpid(), azL
2a860 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61  kName[p->lockSta
2a870 74 65 5d 29 29 3b 0a 20 20 69 66 28 20 70 47 6f  te]));.  if( pGo
2a880 74 4c 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63  tLock ) *pGotLoc
2a890 6b 20 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  k = p->lockState
2a8a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a8b0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2a8c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
2a8d0 65 67 6d 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  egment from the 
2a8e0 73 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  system..*/.stati
2a8f0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 44 65 6c  c int unixShmDel
2a900 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
2a910 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
2a920 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 72 65 74  r *zName){.  ret
2a930 75 72 6e 20 70 56 66 73 2d 3e 78 44 65 6c 65 74  urn pVfs->xDelet
2a940 65 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 30  e(pVfs, zName, 0
2a950 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  );.}.../*.******
2a960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a970 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65  ** End of sqlite
2a980 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
2a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
2aa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
2aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa60 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78  ***** Begin Prox
2aa70 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
2aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
2aaa0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2aab0 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e  s a "uber-lockin
2aac0 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69  g-method" in thi
2aad0 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65  s sense:  It use
2aae0 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c  s the.** other l
2aaf0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2ab00 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b  n secondary lock
2ab10 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c   files.  Proxy l
2ab20 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d  ocking is a.** m
2ab30 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74  eta-layer over t
2ab40 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74  op of the primit
2ab50 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ive locking impl
2ab60 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20  emented above.  
2ab70 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73  For.** this reas
2ab80 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
2ab90 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
2aba0 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e   of proxy lockin
2abb0 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a  g is deferred.**
2abc0 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74   until late in t
2abd0 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20 61  he file (here) a
2abe0 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
2abf0 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64  other I/O method
2ac00 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64  s have.** been d
2ac10 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74  efined - so that
2ac20 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
2ac30 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61  ocking methods a
2ac40 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  re available.** 
2ac50 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20 68  as services to h
2ac60 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d 70  elp with the imp
2ac70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  lementation of p
2ac80 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a  roxy locking..**
2ac90 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  .****.**.** The 
2aca0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20  default locking 
2acb0 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74  schemes in SQLit
2acc0 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65  e use byte-range
2acd0 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a   locks on the.**
2ace0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2acf0 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66  o coordinate saf
2ad00 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63  e, concurrent ac
2ad10 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2ad20 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20   readers.** and 
2ad30 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f  writers [http://
2ad40 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69  sqlite.org/locki
2ad50 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65  ngv3.html].  The
2ad60 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69   five file locki
2ad70 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e  ng.** states (UN
2ad80 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c  LOCKED, PENDING,
2ad90 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
2ada0 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61 72  D, EXCLUSIVE) ar
2adb0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a  e implemented.**
2adc0 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20 26   as POSIX read &
2add0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65   write locks ove
2ade0 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c  r fixed set of l
2adf0 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73  ocations (via fs
2ae00 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20  ctl),.** on AFP 
2ae10 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63  and SMB only exc
2ae20 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67  lusive byte-rang
2ae30 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69  e locks are avai
2ae40 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a  lable via fsctl.
2ae50 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a  ** with _IOWR('z
2ae60 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
2ae70 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20  teRangeLockPB2) 
2ae80 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d  to track the sam
2ae90 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54  e 5 states..** T
2aea0 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52  o simulate a F_R
2aeb0 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72  DLCK on the shar
2aec0 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50  ed range, on AFP
2aed0 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65   a randomly sele
2aee0 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20  cted.** address 
2aef0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  in the shared ra
2af00 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
2af10 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
2af20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68  the entire.** sh
2af30 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2af40 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55  ken for an EXCLU
2af50 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a  SIVE lock):.**.*
2af60 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42  *      PENDING_B
2af70 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30 30  YTE        0x400
2af80 30 30 30 30 30 09 09 20 20 20 09 0a 2a 2a 20 20  00000..   ..**  
2af90 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
2afa0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
2afb0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
2afc0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
2afd0 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
2afe0 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
2aff0 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
2b000 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
2b010 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
2b020 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
2b030 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
2b040 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
2b050 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
2b060 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
2b070 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
2b080 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
2b090 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2b0a0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
2b0b0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
2b0c0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
2b0d0 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
2b0e0 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
2b0f0 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
2b100 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
2b110 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
2b120 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
2b130 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
2b140 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
2b150 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
2b160 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
2b170 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
2b180 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
2b190 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
2b1a0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
2b1b0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
2b1c0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
2b1d0 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
2b1e0 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
2b1f0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
2b200 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
2b210 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
2b220 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
2b230 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
2b240 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
2b250 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
2b260 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
2b270 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
2b280 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
2b290 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
2b2a0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
2b2b0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
2b2c0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
2b2d0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
2b2e0 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
2b2f0 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
2b300 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
2b310 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
2b320 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
2b330 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
2b340 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
2b350 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
2b360 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
2b370 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
2b380 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
2b390 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
2b3a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b3b0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
2b3c0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
2b3d0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
2b3e0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 53 45 54  name, SQLITE_SET
2b3f0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a  _LOCKPROXYFILE,.
2b400 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b410 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f           <proxy_
2b420 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22  path> | ":auto:"
2b430 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66  );.**  sqlite3_f
2b440 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2b450 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 47  dbname, SQLITE_G
2b460 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
2b470 2c 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29  , &<proxy_path>)
2b480 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
2b490 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
2b4a0 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
2b4b0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2b4c0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
2b4d0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
2b4e0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
2b4f0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
2b500 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
2b510 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
2b520 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
2b530 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
2b540 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
2b550 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
2b560 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
2b570 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
2b580 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
2b590 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
2b5a0 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
2b5b0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
2b5c0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
2b5d0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
2b5e0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
2b5f0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
2b600 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
2b610 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
2b620 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
2b630 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
2b640 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
2b650 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
2b660 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
2b670 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
2b680 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
2b690 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
2b6a0 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
2b6b0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
2b6c0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
2b6d0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
2b6e0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
2b6f0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
2b700 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
2b710 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
2b720 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
2b730 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
2b740 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
2b750 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
2b760 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
2b770 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
2b780 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
2b790 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
2b7a0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
2b7b0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
2b7c0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
2b7d0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
2b7e0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
2b7f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
2b800 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
2b810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2b820 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
2b830 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
2b840 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
2b850 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
2b860 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
2b870 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
2b880 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
2b890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b8a0 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
2b8b0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
2b8c0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
2b8d0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
2b8e0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
2b8f0 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
2b900 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
2b910 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
2b920 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
2b930 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
2b940 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
2b950 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
2b960 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
2b970 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
2b980 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
2b990 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
2b9a0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2b9b0 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
2b9c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
2b9d0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
2b9e0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
2b9f0 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
2ba00 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
2ba10 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
2ba20 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
2ba30 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
2ba40 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
2ba50 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
2ba60 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
2ba70 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
2ba80 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
2ba90 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
2baa0 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
2bab0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2bac0 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
2bad0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
2bae0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
2baf0 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
2bb00 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 27  ot exist, or it'
2bb10 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
2bb20 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
2bb30 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
2bb40 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
2bb50 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
2bb60 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
2bb70 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
2bb80 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
2bb90 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
2bba0 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
2bbb0 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
2bbc0 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
2bbd0 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
2bbe0 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
2bbf0 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
2bc00 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
2bc10 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
2bc20 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
2bc30 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
2bc40 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
2bc50 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
2bc60 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2bc70 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2bc80 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
2bc90 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
2bca0 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
2bcb0 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
2bcc0 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
2bcd0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
2bce0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
2bcf0 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
2bd00 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
2bd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bd20 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
2bd30 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
2bd40 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
2bd50 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
2bd60 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
2bd70 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
2bd80 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
2bd90 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
2bda0 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
2bdb0 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
2bdc0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
2bdd0 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
2bde0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
2bdf0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
2be00 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
2be10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2be20 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
2be30 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
2be40 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
2be50 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
2be60 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
2be70 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
2be80 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
2be90 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
2bea0 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
2beb0 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
2bec0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
2bed0 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
2bee0 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
2bef0 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
2bf00 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2bf10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2bf20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
2bf30 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
2bf40 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
2bf50 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
2bf60 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
2bf70 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
2bf80 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
2bf90 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
2bfa0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
2bfb0 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2bfc0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
2bfd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
2bfe0 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
2bff0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
2c000 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
2c010 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
2c020 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
2c030 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
2c040 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
2c050 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
2c060 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
2c070 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
2c080 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
2c090 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
2c0a0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
2c0b0 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
2c0c0 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
2c0d0 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
2c0e0 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
2c0f0 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
2c100 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
2c110 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
2c120 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
2c130 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
2c140 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
2c150 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
2c160 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
2c170 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
2c180 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
2c190 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
2c1a0 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
2c1b0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
2c1c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
2c1d0 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
2c1e0 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
2c1f0 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
2c200 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
2c210 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2c220 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
2c230 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
2c240 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
2c250 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
2c260 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
2c270 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
2c280 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
2c290 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
2c2a0 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
2c2b0 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
2c2c0 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
2c2d0 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
2c2e0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
2c2f0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2c300 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
2c310 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
2c320 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
2c330 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2c340 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
2c350 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
2c360 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2c370 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
2c380 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
2c390 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
2c3a0 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
2c3b0 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
2c3c0 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
2c3d0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
2c3e0 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
2c3f0 69 63 69 74 79 20 63 61 6c 6c 69 6e 67 20 74 68  icity calling th
2c400 65 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  e SQLITE_SET_LOC
2c410 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
2c420 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
2c430 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
2c440 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
2c450 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
2c460 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
2c470 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
2c480 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
2c490 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
2c4a0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
2c4b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2c4c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2c4d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
2c4e0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
2c4f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
2c500 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
2c510 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
2c520 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
2c530 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
2c540 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
2c550 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
2c560 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2c570 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
2c580 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
2c590 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
2c5a0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
2c5b0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
2c5c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
2c5d0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
2c5e0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
2c5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2c600 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
2c610 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2c620 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
2c630 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
2c640 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
2c650 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
2c660 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
2c670 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
2c680 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
2c690 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
2c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
2c6c0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
2c6d0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
2c6e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
2c6f0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
2c700 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
2c710 6c 65 73 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  less */.  void *
2c720 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
2c730 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
2c740 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
2c750 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
2c760 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
2c770 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
2c780 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
2c790 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2c7a0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
2c7b0 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
2c7c0 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
2c7d0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
2c7e0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
2c7f0 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
2c800 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
2c810 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
2c820 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
2c830 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
2c840 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
2c850 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
2c860 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
2c870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2c880 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
2c890 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
2c8a0 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
2c8b0 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
2c8c0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
2c8d0 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
2c8e0 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
2c8f0 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
2c900 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
2c910 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
2c920 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
2c930 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
2c940 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
2c950 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
2c960 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
2c970 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
2c980 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
2c990 20 4f 53 54 52 41 43 45 34 28 22 47 45 54 4c 4f   OSTRACE4("GETLO
2c9a0 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
2c9b0 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
2c9c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2c9d0 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
2c9e0 6f 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  o, getpid());.  
2c9f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ca00 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
2ca10 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
2ca20 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
2ca30 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
2ca40 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
2ca50 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
2ca60 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
2ca70 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
2ca80 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2ca90 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
2caa0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
2cab0 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
2cac0 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
2cad0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
2cae0 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
2caf0 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
2cb00 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
2cb10 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
2cb20 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
2cb30 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
2cb40 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 6d 61 78 4c  & (i+len+7)<maxL
2cb50 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  en; i++){.    ch
2cb60 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d  ar c = dbPath[i]
2cb70 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65  ;.    lPath[i+le
2cb80 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f  n] = (c=='/')?'_
2cb90 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68  ':c;.  }.  lPath
2cba0 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20  [i+len]='\0';.  
2cbb0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
2cbc0 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29  :auto:", maxLen)
2cbd0 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 47 45  ;.  OSTRACE3("GE
2cbe0 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  TLOCKPATH  proxy
2cbf0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2cc00 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20  d=%d\n", lPath, 
2cc10 67 65 74 70 69 64 28 29 29 3b 0a 20 20 72 65 74  getpid());.  ret
2cc20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2cc30 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65  ../* . ** Create
2cc40 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  s the lock file 
2cc50 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e 67 20  and any missing 
2cc60 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e 20 6c  directories in l
2cc70 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74  ockPath. */.stat
2cc80 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
2cc90 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  teLockPath(const
2cca0 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29   char *lockPath)
2ccb0 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a  {.  int i, len;.
2ccc0 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58 50 41    char buf[MAXPA
2ccd0 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74  THLEN];.  int st
2cce0 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73  art = 0;.  .  as
2ccf0 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e  sert(lockPath!=N
2cd00 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74  ULL);.  /* try t
2cd10 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74 68 65  o create all the
2cd20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 64 69   intermediate di
2cd30 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c  rectories */.  l
2cd40 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2cd50 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20 62 75  (lockPath);.  bu
2cd60 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[0] = lockPath[
2cd70 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20  0];.  for( i=1; 
2cd80 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20  i<len; i++ ){.  
2cd90 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69    if( lockPath[i
2cda0 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69 20 2d  ] == '/' && (i -
2cdb0 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b 0a 20   start > 0) ){. 
2cdc0 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64       /* only mkd
2cdd0 69 72 20 69 66 20 6c 65 61 66 20 64 69 72 20 21  ir if leaf dir !
2cde0 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20  = "." or "/" or 
2cdf0 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20 69 66  ".." */.      if
2ce00 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28  ( i-start>2 || (
2ce10 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20 62 75  i-start==1 && bu
2ce20 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20  f[start] != '.' 
2ce30 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
2ce40 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20 20 20   '/') .         
2ce50 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32 20 26  || (i-start==2 &
2ce60 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20  & buf[start] != 
2ce70 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74  '.' && buf[start
2ce80 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20  +1] != '.') ){. 
2ce90 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c         buf[i]='\
2cea0 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0';.        if( 
2ceb0 6d 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54  mkdir(buf, SQLIT
2cec0 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
2ced0 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20  IR_PERMISSIONS) 
2cee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2cef0 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
2cf00 20 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45        if( err!=E
2cf10 45 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20  EXIST ) {.      
2cf20 20 20 20 20 20 20 4f 53 54 52 41 43 45 35 28 22        OSTRACE5("
2cf30 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
2cf40 46 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20  FAILED creating 
2cf50 25 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %s, ".          
2cf60 20 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27             "'%s'
2cf70 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
2cf80 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%s pid=%d\n",. 
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f      buf, strerro
2cfb0 72 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68  r(err), lockPath
2cfc0 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 20  , getpid());.   
2cfd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2cfe0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
2cff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d000 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
2d010 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
2d020 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
2d030 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
2d040 45 33 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E3("CREATELOCKPA
2d050 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
2d060 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
2d070 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74 70  , lockPath, getp
2d080 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
2d090 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2d0a0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
2d0b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
2d0c0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
2d0d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2d0e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
2d0f0 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
2d100 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
2d110 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
2d120 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
2d130 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2d140 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
2d150 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
2d160 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2d170 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
2d180 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
2d190 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2d1a0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
2d1b0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
2d1c0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
2d1d0 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
2d1e0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
2d1f0 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
2d200 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
2d210 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
2d220 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
2d230 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
2d240 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
2d250 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
2d260 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
2d270 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
2d280 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
2d290 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
2d2a0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
2d2b0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
2d2c0 20 69 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b   int dirfd = -1;
2d2d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
2d2e0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
2d2f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
2d300 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
2d310 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
2d320 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
2d330 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
2d340 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
2d350 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
2d360 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
2d370 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
2d380 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
2d390 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
2d3a0 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
2d3b0 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
2d3c0 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
2d3d0 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
2d3e0 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2d3f0 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
2d400 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
2d410 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
2d420 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
2d430 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
2d440 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
2d450 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
2d460 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
2d470 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
2d480 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
2d490 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2d4a0 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
2d4b0 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
2d4c0 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2d4d0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
2d4e0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2d4f0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
2d500 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2d510 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
2d520 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2d530 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d540 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2d550 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
2d560 29 7b 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e  ){.    fd = open
2d570 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2d580 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2d590 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
2d5a0 53 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d  S);.    terrno =
2d5b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
2d5c0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  fd<0 && errno==E
2d5d0 4e 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66  NOENT && islockf
2d5e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ile ){.      if(
2d5f0 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
2d600 50 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51  Path(path) == SQ
2d610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d620 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61 74     fd = open(pat
2d630 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51  h, openFlags, SQ
2d640 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2d650 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
2d660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d670 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2d680 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20      openFlags = 
2d690 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64  O_RDONLY;.    fd
2d6a0 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70   = open(path, op
2d6b0 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2d6c0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2d6d0 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2d6e0 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2d6f0 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
2d700 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
2d710 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
2d720 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2d730 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
2d740 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
2d750 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
2d760 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d770 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
2d780 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
2d790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d7a0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
2d7b0 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
2d7c0 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
2d7d0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
2d7e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d7f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2d800 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
2d810 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
2d820 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
2d830 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e  alloc(sizeof(*pN
2d840 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
2d850 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
2d860 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2d870 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
2d880 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
2d890 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
2d8a0 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
2d8b0 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
2d8c0 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2d8d0 67 73 3b 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70  gs;.  dummyVfs.p
2d8e0 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  AppData = (void*
2d8f0 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2d900 65 72 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  er;.  pUnused->f
2d910 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
2d920 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
2d930 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
2d940 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
2d950 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
2d960 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
2d970 56 66 73 2c 20 66 64 2c 20 64 69 72 66 64 2c 20  Vfs, fd, dirfd, 
2d980 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70  (sqlite3_file*)p
2d990 4e 65 77 2c 20 70 61 74 68 2c 20 30 2c 20 30 29  New, path, 0, 0)
2d9a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2d9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
2d9c0 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
2d9d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d9e0 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74  K;.  }.end_creat
2d9f0 65 5f 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 63  e_proxy:    .  c
2da00 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c  lose(fd); /* sil
2da10 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66  ently leak fd if
2da20 20 65 72 72 6f 72 2c 20 77 65 27 72 65 20 61 6c   error, we're al
2da30 72 65 61 64 79 20 69 6e 20 65 72 72 6f 72 20 2a  ready in error *
2da40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
2da50 28 70 4e 65 77 29 3b 0a 20 20 73 71 6c 69 74 65  (pNew);.  sqlite
2da60 33 5f 66 72 65 65 28 70 55 6e 75 73 65 64 29 3b  3_free(pUnused);
2da70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2da80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2da90 45 53 54 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20  EST./* simulate 
2daa0 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62  multiple hosts b
2dab0 79 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75  y creating uniqu
2dac0 65 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61  e hostid file pa
2dad0 74 68 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ths */.int sqlit
2dae0 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20  e3_hostid_num = 
2daf0 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  0;.#endif..#defi
2db00 6e 65 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  ne PROXY_HOSTIDL
2db10 45 4e 20 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e  EN    16  /* con
2db20 63 68 20 66 69 6c 65 20 68 6f 73 74 20 69 64 20  ch file host id 
2db30 6c 65 6e 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65  length */../* ge
2db40 74 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69  t the host ID vi
2db50 61 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c  a gethostuuid(),
2db60 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f   pHostID must po
2db70 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53  int to PROXY_HOS
2db80 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73  TIDLEN .** bytes
2db90 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d   of writable mem
2dba0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
2dbb0 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49  nt proxyGetHostI
2dbc0 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  D(unsigned char 
2dbd0 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70  *pHostID, int *p
2dbe0 45 72 72 6f 72 29 7b 0a 20 20 73 74 72 75 63 74  Error){.  struct
2dbf0 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
2dc00 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
2dc10 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
2dc20 20 20 0a 20 20 61 73 73 65 72 74 28 50 52 4f 58    .  assert(PROX
2dc30 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73  Y_HOSTIDLEN == s
2dc40 69 7a 65 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a  izeof(uuid_t));.
2dc50 20 20 6d 65 6d 73 65 74 28 70 48 6f 73 74 49 44    memset(pHostID
2dc60 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49  , 0, PROXY_HOSTI
2dc70 44 4c 45 4e 29 3b 0a 20 20 69 66 28 20 67 65 74  DLEN);.  if( get
2dc80 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44  hostuuid(pHostID
2dc90 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20  , &timeout) ){. 
2dca0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
2dcb0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 45 72 72  no;.    if( pErr
2dcc0 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  or ){.      *pEr
2dcd0 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20 7d  ror = err;.    }
2dce0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2dcf0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 69  TE_IOERR;.  }.#i
2dd00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2dd10 0a 20 20 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d  .  /* simulate m
2dd20 75 6c 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79  ultiple hosts by
2dd30 20 63 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65   creating unique
2dd40 20 68 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74   hostid file pat
2dd50 68 73 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  hs */.  if( sqli
2dd60 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21  te3_hostid_num !
2dd70 3d 20 30 29 7b 0a 20 20 20 20 70 48 6f 73 74 49  = 0){.    pHostI
2dd80 44 5b 30 5d 20 3d 20 28 63 68 61 72 29 28 70 48  D[0] = (char)(pH
2dd90 6f 73 74 49 44 5b 30 5d 20 2b 20 28 63 68 61 72  ostID[0] + (char
2dda0 29 28 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )(sqlite3_hostid
2ddb0 5f 6e 75 6d 20 26 20 30 78 46 46 29 29 3b 0a 20  _num & 0xFF));. 
2ddc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72   }.#endif.  .  r
2ddd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2dde0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68  .}../* The conch
2ddf0 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
2de00 68 65 20 68 65 61 64 65 72 2c 20 68 6f 73 74 20  he header, host 
2de10 69 64 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  id and lock file
2de20 20 70 61 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e   path. */.#defin
2de30 65 20 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  e PROXY_CONCHVER
2de40 53 49 4f 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79  SION 2   /* 1-by
2de50 74 65 20 68 65 61 64 65 72 2c 20 31 36 2d 62 79  te header, 16-by
2de60 74 65 20 68 6f 73 74 20 69 64 2c 20 70 61 74 68  te host id, path
2de70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
2de80 59 5f 48 45 41 44 45 52 4c 45 4e 20 20 20 20 31  Y_HEADERLEN    1
2de90 20 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65     /* conch file
2dea0 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 2a   header length *
2deb0 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
2dec0 50 41 54 48 49 4e 44 45 58 20 20 20 20 28 50 52  PATHINDEX    (PR
2ded0 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52  OXY_HEADERLEN+PR
2dee0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23  OXY_HOSTIDLEN).#
2def0 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58  define PROXY_MAX
2df00 43 4f 4e 43 48 4c 45 4e 20 20 28 50 52 4f 58 59  CONCHLEN  (PROXY
2df10 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
2df20 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41  _HOSTIDLEN+MAXPA
2df30 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54  THLEN)../* .** T
2df40 61 6b 65 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e  akes an open con
2df50 63 68 20 66 69 6c 65 2c 20 63 6f 70 69 65 73 20  ch file, copies 
2df60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20  the contents to 
2df70 61 20 6e 65 77 20 70 61 74 68 20 61 6e 64 20 74  a new path and t
2df80 68 65 6e 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74  hen moves .** it
2df90 20 62 61 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c   back.  The newl
2dfa0 79 20 63 72 65 61 74 65 64 20 66 69 6c 65 27 73  y created file's
2dfb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2dfc0 20 69 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20   is assigned to 
2dfd0 74 68 65 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c  the.** conch fil
2dfe0 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
2dff0 66 69 6e 61 6c 6c 79 20 74 68 65 20 6f 72 69 67  finally the orig
2e000 69 6e 61 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20  inal conch file 
2e010 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 0a 2a  descriptor is .*
2e020 2a 20 63 6c 6f 73 65 64 2e 20 20 52 65 74 75 72  * closed.  Retur
2e030 6e 73 20 7a 65 72 6f 20 69 66 20 73 75 63 63 65  ns zero if succe
2e040 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssful..*/.static
2e050 20 69 6e 74 20 70 72 6f 78 79 42 72 65 61 6b 43   int proxyBreakC
2e060 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  onchLock(unixFil
2e070 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74  e *pFile, uuid_t
2e080 20 6d 79 48 6f 73 74 49 44 29 7b 0a 20 20 70 72   myHostID){.  pr
2e090 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2e0a0 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
2e0b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e0c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
2e0d0 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
2e0e0 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
2e0f0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
2e100 3b 0a 20 20 63 68 61 72 20 74 50 61 74 68 5b 4d  ;.  char tPath[M
2e110 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68  AXPATHLEN];.  ch
2e120 61 72 20 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58  ar buf[PROXY_MAX
2e130 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61  CONCHLEN];.  cha
2e140 72 20 2a 63 50 61 74 68 20 3d 20 70 43 74 78 2d  r *cPath = pCtx-
2e150 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a  >conchFilePath;.
2e160 20 20 73 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e    size_t readLen
2e170 20 3d 20 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70   = 0;.  size_t p
2e180 61 74 68 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68  athLen = 0;.  ch
2e190 61 72 20 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20  ar errmsg[64] = 
2e1a0 22 22 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  "";.  int fd = -
2e1b0 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31  1;.  int rc = -1
2e1c0 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65 20 61  ;..  /* create a
2e1d0 20 6e 65 77 20 70 61 74 68 20 62 79 20 72 65 70   new path by rep
2e1e0 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c 69 6e  lace the trailin
2e1f0 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74 68 20  g '-conch' with 
2e200 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61  '-break' */.  pa
2e210 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28  thLen = strlcpy(
2e220 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20 4d 41  tPath, cPath, MA
2e230 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28  XPATHLEN);.  if(
2e240 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48   pathLen>MAXPATH
2e250 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36  LEN || pathLen<6
2e260 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72 6c 63   || .     (strlc
2e270 70 79 28 26 74 50 61 74 68 5b 70 61 74 68 4c 65  py(&tPath[pathLe
2e280 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36  n-5], "break", 6
2e290 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20 20 73  ) != 5) ){.    s
2e2a0 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
2e2b0 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
2e2c0 25 64 29 22 2c 20 28 69 6e 74 29 70 61 74 68 4c  %d)", (int)pathL
2e2d0 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  en);.    goto en
2e2e0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
2e2f0 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63  .  /* read the c
2e300 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  onch content */.
2e310 20 20 72 65 61 64 4c 65 6e 20 3d 20 70 72 65 61    readLen = prea
2e320 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
2e330 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
2e340 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
2e350 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
2e360 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
2e370 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
2e380 20 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c 65   "read error (le
2e390 6e 20 25 64 29 22 2c 20 28 69 6e 74 29 72 65 61  n %d)", (int)rea
2e3a0 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
2e3b0 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
2e3c0 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
2e3d0 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
2e3e0 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
2e3f0 20 2a 2f 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28   */.  fd = open(
2e400 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
2e410 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20  _CREAT|O_EXCL), 
2e420 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2e430 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2e440 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
2e450 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2e460 73 67 2c 20 22 63 72 65 61 74 65 20 66 61 69 6c  sg, "create fail
2e470 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2e480 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2e490 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2e4a0 69 66 28 20 70 77 72 69 74 65 28 66 64 2c 20 62  if( pwrite(fd, b
2e4b0 75 66 2c 20 72 65 61 64 4c 65 6e 2c 20 30 29 20  uf, readLen, 0) 
2e4c0 21 3d 20 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20  != readLen ){.  
2e4d0 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67    sprintf(errmsg
2e4e0 2c 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20  , "write failed 
2e4f0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
2e500 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2e510 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
2e520 20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63   rename(tPath, c
2e530 50 61 74 68 29 20 29 7b 0a 20 20 20 20 73 70 72  Path) ){.    spr
2e540 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72 65  intf(errmsg, "re
2e550 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
2e560 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
2e570 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
2e580 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
2e590 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
2e5a0 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
2e5b0 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
2e5c0 50 61 74 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63  Path);.  close(c
2e5d0 6f 6e 63 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  onchFile->h);.  
2e5e0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
2e5f0 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
2e600 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
2e610 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
2e620 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
2e630 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
2e640 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
2e650 20 75 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a   unlink(tPath);.
2e660 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b        close(fd);
2e670 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
2e680 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c  tf(stderr, "fail
2e690 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61 6c  ed to break stal
2e6a0 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73  e lock on %s, %s
2e6b0 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72 6d  \n", cPath, errm
2e6c0 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sg);.  }.  retur
2e6d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2e6e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2e6f0 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
2e700 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b 20   file and break 
2e710 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20  a stale lock if 
2e720 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20  the .** host id 
2e730 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74  matches..*/.stat
2e740 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63  ic int proxyConc
2e750 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2e760 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2e770 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b  HostID, int lock
2e780 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  Type){.  proxyLo
2e790 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2e7a0 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
2e7b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
2e7c0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
2e7d0 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
2e7e0 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
2e7f0 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69  ->conchFile;.  i
2e800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e810 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73 20  K;.  int nTries 
2e820 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74 69  = 0;.  struct ti
2e830 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54  mespec conchModT
2e840 69 6d 65 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20  ime;.  .  do {. 
2e850 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2e860 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2e870 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2e880 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2e890 54 79 70 65 29 3b 0a 20 20 20 20 6e 54 72 69 65  Type);.    nTrie
2e8a0 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28 20 72 63  s ++;.    if( rc
2e8b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2e8c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2e8d0 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20 28 62 75   lock failed (bu
2e8e0 73 79 29 3a 0a 20 20 20 20 20 20 20 2a 20 31 73  sy):.       * 1s
2e8f0 74 20 74 72 79 3a 20 67 65 74 20 74 68 65 20 6d  t try: get the m
2e900 6f 64 20 74 69 6d 65 20 6f 66 20 74 68 65 20 63  od time of the c
2e910 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e 35 73 20  onch, wait 0.5s 
2e920 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 0a  and try again. .
2e930 20 20 20 20 20 20 20 2a 20 32 6e 64 20 74 72 79         * 2nd try
2e940 3a 20 66 61 69 6c 20 69 66 20 74 68 65 20 6d 6f  : fail if the mo
2e950 64 20 74 69 6d 65 20 63 68 61 6e 67 65 64 20 6f  d time changed o
2e960 72 20 68 6f 73 74 20 69 64 20 69 73 20 64 69 66  r host id is dif
2e970 66 65 72 65 6e 74 2c 20 77 61 69 74 20 0a 20 20  ferent, wait .  
2e980 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
2e990 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
2e9a0 61 67 61 69 6e 0a 20 20 20 20 20 20 20 2a 20 33  again.       * 3
2e9b0 72 64 20 74 72 79 3a 20 62 72 65 61 6b 20 74 68  rd try: break th
2e9c0 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68  e lock unless th
2e9d0 65 20 6d 6f 64 20 74 69 6d 65 20 68 61 73 20 63  e mod time has c
2e9e0 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 20 20 2a  hanged..       *
2e9f0 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  /.      struct s
2ea00 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 69  tat buf;.      i
2ea10 66 28 20 66 73 74 61 74 28 63 6f 6e 63 68 46 69  f( fstat(conchFi
2ea20 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
2ea30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
2ea40 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2ea50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ea60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
2ea70 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
2ea80 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
2ea90 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
2eaa0 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
2eab0 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
2eac0 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
2ead0 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
2eae0 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
2eaf0 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
2eb00 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
2eb10 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
2eb20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2eb30 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
2eb40 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
2eb50 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
2eb60 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
2eb70 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
2eb80 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
2eb90 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
2eba0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
2ebb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
2ebc0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
2ebd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2ebe0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
2ebf0 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
2ec00 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
2ec10 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
2ec20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
2ec30 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65   pread(conchFile
2ec40 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59  ->h, tBuf, PROXY
2ec50 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29  _MAXCONCHLEN, 0)
2ec60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
2ec70 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  n<0 ){.         
2ec80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2ec90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
2eca0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ecb0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
2ecc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ecd0 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50   if( len>PROXY_P
2ece0 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66  ATHINDEX && tBuf
2ecf0 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]==(char)PROXY
2ed00 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a  _CONCHVERSION){.
2ed10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
2ed20 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
2ed30 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  k if the host id
2ed40 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a   doesn't match *
2ed50 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2ed60 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b  0!=memcmp(&tBuf[
2ed70 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
2ed80 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
2ed90 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a  Y_HOSTIDLEN) ){.
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2edb0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
2edc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2edd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ede0 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
2edf0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eak the lock on 
2ee00 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20  short read or a 
2ee10 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68  version mismatch
2ee20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
2ee30 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
2ee40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ee50 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30      usleep(10000
2ee60 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30  000); /* wait 10
2ee70 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
2ee80 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20   lock again */. 
2ee90 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2eea0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
2eeb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2eec0 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20  Tries==3 );.    
2eed0 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72    if( 0==proxyBr
2eee0 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  eakConchLock(pFi
2eef0 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b  le, myHostID) ){
2ef00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2ef10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2ef20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45   if( lockType==E
2ef30 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
2ef40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ef50 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
2ef60 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
2ef70 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
2ef80 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
2ef90 3b 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;          .    
2efa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2efb0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
2efc0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
2efd0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
2efe0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2eff0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b  )conchFile, lock
2f000 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Type);.        }
2f010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f020 20 7d 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51   } while( rc==SQ
2f030 4c 49 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72  LITE_BUSY && nTr
2f040 69 65 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65  ies<3 );.  .  re
2f050 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
2f060 61 6b 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62  akes the conch b
2f070 79 20 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65  y taking a share
2f080 64 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20  d lock and read 
2f090 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e  the contents con
2f0a0 63 68 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50  ch, if .** lockP
2f0b0 61 74 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ath is non-NULL,
2f0c0 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64   the host ID and
2f0d0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20   lock file path 
2f0e0 6d 75 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e  must match.  A N
2f0f0 55 4c 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68  ULL .** lockPath
2f100 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2f110 6c 6f 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20  lockPath in the 
2f120 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20  conch file will 
2f130 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20 0a  be used if the .
2f140 2a 2a 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63  ** host IDs matc
2f150 68 2c 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b  h, or a new lock
2f160 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65   path will be ge
2f170 6e 65 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69  nerated automati
2f180 63 61 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72  cally .** and wr
2f190 69 74 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e  itten to the con
2f1a0 63 68 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ch file..*/.stat
2f1b0 69 63 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65  ic int proxyTake
2f1c0 43 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a  Conch(unixFile *
2f1d0 70 46 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c  pFile){.  proxyL
2f1e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2f1f0 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
2f200 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
2f210 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
2f220 78 74 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43  xt; .  .  if( pC
2f230 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30  tx->conchHeld!=0
2f240 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2f250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2f260 65 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  e{.    unixFile 
2f270 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
2f280 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
2f290 20 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49    uuid_t myHostI
2f2a0 44 3b 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f  D;.    int pErro
2f2b0 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  r = 0;.    char 
2f2c0 72 65 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41  readBuf[PROXY_MA
2f2d0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
2f2e0 63 68 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41  char lockPath[MA
2f2f0 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63  XPATHLEN];.    c
2f300 68 61 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74  har *tempLockPat
2f310 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  h = NULL;.    in
2f320 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f330 3b 0a 20 20 20 20 69 6e 74 20 63 72 65 61 74 65  ;.    int create
2f340 43 6f 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Conch = 0;.    i
2f350 6e 74 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d  nt hostIdMatch =
2f360 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64   0;.    int read
2f370 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Len = 0;.    int
2f380 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20   tryOldLockPath 
2f390 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72  = 0;.    int for
2f3a0 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20  ceNewLockPath = 
2f3b0 30 3b 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52  0;.    .    OSTR
2f3c0 41 43 45 34 28 22 54 41 4b 45 43 4f 4e 43 48 20  ACE4("TAKECONCH 
2f3d0 20 25 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25   %d for %s pid=%
2f3e0 64 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d  d\n", conchFile-
2f3f0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
2f400 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
2f410 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f  yPath ? pCtx->lo
2f420 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a  ckProxyPath : ":
2f430 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64 28  auto:"), getpid(
2f440 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72  ));..    rc = pr
2f450 6f 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48  oxyGetHostID(myH
2f460 6f 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b  ostID, &pError);
2f470 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
2f480 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
2f490 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
2f4a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72  >lastErrno = pEr
2f4b0 72 6f 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ror;.      goto 
2f4c0 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2f4d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72     }.    rc = pr
2f4e0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  oxyConchLock(pFi
2f4f0 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48  le, myHostID, SH
2f500 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2f510 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f520 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2f530 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2f540 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64     }.    /* read
2f550 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f   the existing co
2f560 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nch file */.    
2f570 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e  readLen = seekAn
2f580 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a  dRead((unixFile*
2f590 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72  )conchFile, 0, r
2f5a0 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  eadBuf, PROXY_MA
2f5b0 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20  XCONCHLEN);.    
2f5c0 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b  if( readLen<0 ){
2f5d0 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72  .      /* I/O er
2f5e0 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73  ror: lastErrno s
2f5f0 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
2f600 64 20 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65  d */.      pFile
2f610 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f  ->lastErrno = co
2f620 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  nchFile->lastErr
2f630 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
2f640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
2f650 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
2f660 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
2f670 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65  }else if( readLe
2f680 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52  n<=(PROXY_HEADER
2f690 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44  LEN+PROXY_HOSTID
2f6a0 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  LEN) || .       
2f6b0 20 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d        readBuf[0]
2f6c0 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  !=(char)PROXY_CO
2f6d0 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  NCHVERSION ){.  
2f6e0 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72      /* a short r
2f6f0 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66  ead or version f
2f700 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d  ormat mismatch m
2f710 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
2f720 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20  create a new .  
2f730 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c      ** conch fil
2f740 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
2f750 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d     createConch =
2f760 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   1;.    }.    /*
2f770 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20   if the host id 
2f780 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20  matches and the 
2f790 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64  lock path alread
2f7a0 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
2f7b0 63 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27  conch.    ** we'
2f7c0 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
2f7d0 65 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66  e path there, if
2f7e0 20 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74   we can't open t
2f7f0 68 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20  hat path, we'll 
2f800 0a 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69  .    ** retry wi
2f810 74 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65  th a new auto-ge
2f820 6e 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20  nerated path .  
2f830 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a    */.    do { /*
2f840 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64   in case we need
2f850 20 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f   to try again fo
2f860 72 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65  r an :auto: name
2f870 64 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a  d lock file */..
2f880 20 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74        if( !creat
2f890 65 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65  eConch && !force
2f8a0 4e 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20  NewLockPath ){. 
2f8b0 20 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74         hostIdMat
2f8c0 63 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65  ch = !memcmp(&re
2f8d0 61 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  adBuf[PROXY_HEAD
2f8e0 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
2f8f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f910 20 20 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49       PROXY_HOSTI
2f920 44 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f  DLEN);.        /
2f930 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68  * if the conch h
2f940 61 73 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20  as data compare 
2f950 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a  the contents */.
2f960 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
2f970 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2f980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2f990 20 66 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20   for auto-named 
2f9a0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c  local lock file,
2f9b0 20 6a 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   just check the 
2f9c0 68 6f 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c  host ID and we'l
2f9d0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l.           ** 
2f9e0 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  use the local lo
2f9f0 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 68 61  ck file path tha
2fa00 74 27 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  t's already in t
2fa10 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
2fa20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2fa30 20 68 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a   hostIdMatch ){.
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
2fa50 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65  _t pathLen = (re
2fa60 61 64 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41  adLen - PROXY_PA
2fa70 54 48 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20  THINDEX);.      
2fa80 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
2fa90 20 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d     if( pathLen>=
2faa0 4d 41 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20  MAXPATHLEN ){.  
2fab0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
2fac0 4c 65 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31  Len=MAXPATHLEN-1
2fad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2faf0 70 79 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65  py(lockPath, &re
2fb00 61 64 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48  adBuf[PROXY_PATH
2fb10 49 4e 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29  INDEX], pathLen)
2fb20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  ;.            lo
2fb30 63 6b 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20  ckPath[pathLen] 
2fb40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2fb50 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20   tempLockPath = 
2fb60 6c 6f 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20  lockPath;.      
2fb70 20 20 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b        tryOldLock
2fb80 50 61 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  Path = 1;.      
2fb90 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
2fba0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
2fbb0 63 6b 20 70 61 74 68 20 69 66 20 74 68 65 20 63  ck path if the c
2fbc0 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
2fbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2fbe0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
2fbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
2fc10 6f 73 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20  ostIdMatch.     
2fc20 20 20 20 20 20 20 20 20 20 20 26 26 20 21 73 74            && !st
2fc30 72 6e 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b  rncmp(pCtx->lock
2fc40 50 72 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64  ProxyPath, &read
2fc50 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
2fc60 44 45 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  DEX],.          
2fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc80 20 72 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50   readLen-PROXY_P
2fc90 41 54 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20  ATHINDEX).      
2fca0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2fcb0 2a 20 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64  * conch host and
2fcc0 20 6c 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68   lock path match
2fcd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
2fce0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
2fcf0 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
2fd00 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
2fd10 20 20 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63    /* if the conc
2fd20 68 20 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65  h isn't writable
2fd30 20 61 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74   and doesn't mat
2fd40 63 68 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b  ch, we can't tak
2fd50 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  e it */.      if
2fd60 28 20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  ( (conchFile->op
2fd70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20  enFlags&O_RDWR) 
2fd80 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
2fd90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
2fda0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2fdb0 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
2fdc0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2fdd0 20 20 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65     /* either the
2fde0 20 63 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61   conch didn't ma
2fdf0 74 63 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74  tch or we need t
2fe00 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  o create a new o
2fe10 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ne */.      if( 
2fe20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
2fe30 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
2fe40 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68  proxyGetLockPath
2fe50 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c  (pCtx->dbPath, l
2fe60 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ockPath, MAXPATH
2fe70 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LEN);.        te
2fe80 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63  mpLockPath = loc
2fe90 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f  kPath;.        /
2fea0 2a 20 63 72 65 61 74 65 20 61 20 63 6f 70 79 20  * create a copy 
2feb0 6f 66 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  of the lock path
2fec0 20 5f 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63   _only_ if the c
2fed0 6f 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f  onch is taken */
2fee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2fef0 20 20 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20        /* update 
2ff00 63 6f 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20  conch with host 
2ff10 61 6e 64 20 70 61 74 68 20 28 74 68 69 73 20 77  and path (this w
2ff20 69 6c 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65  ill fail if othe
2ff30 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
2ff40 2a 2a 20 68 61 73 20 61 20 73 68 61 72 65 64 20  ** has a shared 
2ff50 6c 6f 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69  lock already), i
2ff60 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
2ff70 74 63 68 65 73 2c 20 75 73 65 20 74 68 65 20 62  tches, use the b
2ff80 69 67 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63  ig.      ** stic
2ff90 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
2ffa0 20 20 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46    futimes(conchF
2ffb0 69 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20  ile->h, NULL);. 
2ffc0 20 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d       if( hostIdM
2ffd0 61 74 63 68 20 26 26 20 21 63 72 65 61 74 65 43  atch && !createC
2ffe0 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  onch ){.        
2fff0 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  if( conchFile->p
30000 4c 6f 63 6b 20 26 26 20 63 6f 6e 63 68 46 69 6c  Lock && conchFil
30010 65 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20  e->pLock->cnt>1 
30020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
30030 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
30040 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
30050 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
30060 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
30070 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
30080 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
30090 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
300a0 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
300b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
300c0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
300d0 20 7d 20 65 6c 73 65 20 7b 20 20 20 20 20 20 20   } else {       
300e0 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 72 63     .          rc
300f0 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63   = proxyConchLoc
30100 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
30110 44 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  D, EXCLUSIVE_LOC
30120 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
30130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30140 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
30150 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
30160 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
30170 29 63 6f 6e 63 68 46 69 6c 65 2c 20 45 58 43 4c  )conchFile, EXCL
30180 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
30190 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
301a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
301b0 20 20 20 20 20 20 20 20 63 68 61 72 20 77 72 69          char wri
301c0 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 4d  teBuffer[PROXY_M
301d0 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20  AXCONCHLEN];.   
301e0 20 20 20 20 20 69 6e 74 20 77 72 69 74 65 53 69       int writeSi
301f0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
30200 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 42 75  .        writeBu
30210 66 66 65 72 5b 30 5d 20 3d 20 28 63 68 61 72 29  ffer[0] = (char)
30220 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
30230 4f 4e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ON;.        memc
30240 70 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  py(&writeBuffer[
30250 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
30260 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
30270 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
30280 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
30290 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 21 3d 4e  lockProxyPath!=N
302a0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
302b0 20 73 74 72 6c 63 70 79 28 26 77 72 69 74 65 42   strlcpy(&writeB
302c0 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41 54 48  uffer[PROXY_PATH
302d0 49 4e 44 45 58 5d 2c 20 70 43 74 78 2d 3e 6c 6f  INDEX], pCtx->lo
302e0 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 4d 41 58  ckProxyPath, MAX
302f0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
30300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30310 20 20 20 73 74 72 6c 63 70 79 28 26 77 72 69 74     strlcpy(&writ
30320 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50 41  eBuffer[PROXY_PA
30330 54 48 49 4e 44 45 58 5d 2c 20 74 65 6d 70 4c 6f  THINDEX], tempLo
30340 63 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  ckPath, MAXPATHL
30350 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EN);.        }. 
30360 20 20 20 20 20 20 20 77 72 69 74 65 53 69 7a 65         writeSize
30370 20 3d 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44   = PROXY_PATHIND
30380 45 58 20 2b 20 73 74 72 6c 65 6e 28 26 77 72 69  EX + strlen(&wri
30390 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 50  teBuffer[PROXY_P
303a0 41 54 48 49 4e 44 45 58 5d 29 3b 0a 20 20 20 20  ATHINDEX]);.    
303b0 20 20 20 20 66 74 72 75 6e 63 61 74 65 28 63 6f      ftruncate(co
303c0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 77 72 69 74  nchFile->h, writ
303d0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
303e0 72 63 20 3d 20 75 6e 69 78 57 72 69 74 65 28 28  rc = unixWrite((
303f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 63  sqlite3_file *)c
30400 6f 6e 63 68 46 69 6c 65 2c 20 77 72 69 74 65 42  onchFile, writeB
30410 75 66 66 65 72 2c 20 77 72 69 74 65 53 69 7a 65  uffer, writeSize
30420 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 73  , 0);.        fs
30430 79 6e 63 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ync(conchFile->h
30440 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  );.        /* If
30450 20 77 65 20 63 72 65 61 74 65 64 20 61 20 6e 65   we created a ne
30460 77 20 63 6f 6e 63 68 20 66 69 6c 65 20 28 6e 6f  w conch file (no
30470 74 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 74  t just updated t
30480 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
30490 20 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61   .         ** va
304a0 6c 69 64 20 63 6f 6e 63 68 20 66 69 6c 65 29 2c  lid conch file),
304b0 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
304c0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  e permissions of
304d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
304e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
304f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30500 45 5f 4f 4b 20 26 26 20 63 72 65 61 74 65 43 6f  E_OK && createCo
30510 6e 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nch ){.         
30520 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
30530 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
30540 65 72 72 20 3d 20 66 73 74 61 74 28 70 46 69 6c  err = fstat(pFil
30550 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 20  e->h, &buf);.   
30560 20 20 20 20 20 20 20 69 66 28 20 65 72 72 3d 3d         if( err==
30570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
30580 20 6d 6f 64 65 5f 74 20 63 6d 6f 64 65 20 3d 20   mode_t cmode = 
30590 62 75 66 2e 73 74 5f 6d 6f 64 65 26 28 53 5f 49  buf.st_mode&(S_I
305a0 52 55 53 52 7c 53 5f 49 57 55 53 52 20 7c 20 53  RUSR|S_IWUSR | S
305b0 5f 49 52 47 52 50 7c 53 5f 49 57 47 52 50 20 7c  _IRGRP|S_IWGRP |
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305e0 20 20 20 20 20 20 20 20 20 53 5f 49 52 4f 54 48           S_IROTH
305f0 7c 53 5f 49 57 4f 54 48 29 3b 0a 20 20 20 20 20  |S_IWOTH);.     
30600 20 20 20 20 20 20 20 2f 2a 20 74 72 79 20 74 6f         /* try to
30610 20 6d 61 74 63 68 20 74 68 65 20 64 61 74 61 62   match the datab
30620 61 73 65 20 66 69 6c 65 20 52 2f 57 20 70 65 72  ase file R/W per
30630 6d 69 73 73 69 6f 6e 73 2c 20 69 67 6e 6f 72 65  missions, ignore
30640 20 66 61 69 6c 75 72 65 20 2a 2f 0a 23 69 66 6e   failure */.#ifn
30650 64 65 66 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  def SQLITE_PROXY
30660 5f 44 45 42 55 47 0a 20 20 20 20 20 20 20 20 20  _DEBUG.         
30670 20 20 20 66 63 68 6d 6f 64 28 63 6f 6e 63 68 46     fchmod(conchF
30680 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65 29 3b 0a  ile->h, cmode);.
30690 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
306a0 20 20 69 66 28 20 66 63 68 6d 6f 64 28 63 6f 6e    if( fchmod(con
306b0 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64 65  chFile->h, cmode
306c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
306d0 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d        int code =
306e0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
306f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
30700 64 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f  derr, "fchmod %o
30710 20 46 41 49 4c 45 44 20 77 69 74 68 20 25 64 20   FAILED with %d 
30720 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6d 6f               cmo
30740 64 65 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  de, code, strerr
30750 6f 72 28 63 6f 64 65 29 29 3b 0a 20 20 20 20 20  or(code));.     
30760 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70                fp
30780 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
30790 63 68 6d 6f 64 20 25 6f 20 53 55 43 43 45 44 45  chmod %o SUCCEDE
307a0 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b 0a 20 20 20  D\n",cmode);.   
307b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
307c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
307d0 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 64 65          int code
307e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
307f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
30800 64 65 72 72 2c 20 22 53 54 41 54 20 46 41 49 4c  derr, "STAT FAIL
30810 45 44 5b 25 64 5d 20 77 69 74 68 20 25 64 20 25  ED[%d] with %d %
30820 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
30830 20 20 20 20 20 20 20 20 20 20 20 65 72 72 2c 20             err, 
30840 63 6f 64 65 2c 20 73 74 72 65 72 72 6f 72 28 63  code, strerror(c
30850 6f 64 65 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ode));.#endif.  
30860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30880 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65    conchFile->pMe
30890 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73  thod->xUnlock((s
308a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
308b0 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c  chFile, SHARED_L
308c0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  OCK);.      .   
308d0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3a 0a   end_takeconch:.
308e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22        OSTRACE2("
308f0 54 52 41 4e 53 50 52 4f 58 59 3a 20 43 4c 4f 53  TRANSPROXY: CLOS
30900 45 20 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  E  %d\n", pFile-
30910 3e 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  >h);.      if( r
30920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30930 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
30940 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
30950 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 23  pFile->h>=0 ){.#
30960 69 66 64 65 66 20 53 54 52 49 43 54 5f 43 4c 4f  ifdef STRICT_CLO
30970 53 45 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20  SE_ERROR.       
30980 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69     if( close(pFi
30990 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 20 20  le->h) ){.      
309a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
309b0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
309c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
309d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
309e0 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 20 20 20  CLOSE;.         
309f0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
30a00 20 20 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e     close(pFile->
30a10 68 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20  h); /* silently 
30a20 6c 65 61 6b 20 66 64 20 69 66 20 66 61 69 6c 20  leak fd if fail 
30a30 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  */.#endif.      
30a40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 69 6c    }.        pFil
30a50 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20  e->h = -1;.     
30a60 20 20 20 69 6e 74 20 66 64 20 3d 20 6f 70 65 6e     int fd = open
30a70 28 70 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 70  (pCtx->dbPath, p
30a80 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 2c  File->openFlags,
30a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30aa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
30ab0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
30ac0 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 20  SSIONS);.       
30ad0 20 4f 53 54 52 41 43 45 32 28 22 54 52 41 4e 53   OSTRACE2("TRANS
30ae0 50 52 4f 58 59 3a 20 4f 50 45 4e 20 20 25 64 5c  PROXY: OPEN  %d\
30af0 6e 22 2c 20 66 64 29 3b 0a 20 20 20 20 20 20 20  n", fd);.       
30b00 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
30b10 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
30b20 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 7d   = fd;.        }
30b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30b40 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
30b50 45 4e 5f 42 4b 50 54 3b 20 2f 2a 20 53 51 4c 49  EN_BKPT; /* SQLI
30b60 54 45 5f 42 55 53 59 3f 20 70 72 6f 78 79 54 61  TE_BUSY? proxyTa
30b70 6b 65 43 6f 6e 63 68 20 63 61 6c 6c 65 64 0a 20  keConch called. 
30b80 20 20 20 20 20 20 20 20 20 20 64 75 72 69 6e 67            during
30b90 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
30ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30bb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30bc0 54 45 5f 4f 4b 20 26 26 20 21 70 43 74 78 2d 3e  TE_OK && !pCtx->
30bd0 6c 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20  lockProxy ){.   
30be0 20 20 20 20 20 63 68 61 72 20 2a 70 61 74 68 20       char *path 
30bf0 3d 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3f  = tempLockPath ?
30c00 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3a 20   tempLockPath : 
30c10 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
30c20 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ath;.        rc 
30c30 3d 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  = proxyCreateUni
30c40 78 46 69 6c 65 28 70 61 74 68 2c 20 26 70 43 74  xFile(path, &pCt
30c50 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2c 20 31 29  x->lockProxy, 1)
30c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
30c80 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
30c90 26 26 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74  && tryOldLockPat
30ca0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  h ){.          /
30cb0 2a 20 77 65 20 63 6f 75 6c 64 6e 27 74 20 63 72  * we couldn't cr
30cc0 65 61 74 65 20 74 68 65 20 70 72 6f 78 79 20 6c  eate the proxy l
30cd0 6f 63 6b 20 66 69 6c 65 20 77 69 74 68 20 74 68  ock file with th
30ce0 65 20 6f 6c 64 20 6c 6f 63 6b 20 66 69 6c 65 20  e old lock file 
30cf0 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 20  path.           
30d00 2a 2a 20 73 6f 20 74 72 79 20 61 67 61 69 6e 20  ** so try again 
30d10 76 69 61 20 61 75 74 6f 2d 6e 61 6d 69 6e 67 20  via auto-naming 
30d20 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  .           */. 
30d30 20 20 20 20 20 20 20 20 20 66 6f 72 63 65 4e 65           forceNe
30d40 77 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b 0a 20  wLockPath = 1;. 
30d50 20 20 20 20 20 20 20 20 20 74 72 79 4f 6c 64 4c           tryOldL
30d60 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  ockPath = 0;.   
30d70 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
30d80 20 2f 2a 20 67 6f 20 62 61 63 6b 20 74 6f 20 74   /* go back to t
30d90 68 65 20 64 6f 20 7b 7d 20 77 68 69 6c 65 20 73  he do {} while s
30da0 74 61 72 74 20 70 6f 69 6e 74 2c 20 74 72 79 20  tart point, try 
30db0 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20  again */.       
30dc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30dd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
30df0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 20   Need to make a 
30e00 63 6f 70 79 20 6f 66 20 70 61 74 68 20 69 66 20  copy of path if 
30e10 77 65 20 65 78 74 72 61 63 74 65 64 20 74 68 65  we extracted the
30e20 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
30e30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 63  ** from the conc
30e40 68 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 61  h file or the pa
30e50 74 68 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  th was allocated
30e60 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 0a 20 20   on the stack.  
30e70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30e80 20 20 69 66 28 20 74 65 6d 70 4c 6f 63 6b 50 61    if( tempLockPa
30e90 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  th ){.          
30ea0 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
30eb0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ath = sqlite3DbS
30ec0 74 72 44 75 70 28 30 2c 20 74 65 6d 70 4c 6f 63  trDup(0, tempLoc
30ed0 6b 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  kPath);.        
30ee0 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63    if( !pCtx->loc
30ef0 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20 20  kProxyPath ){.  
30f00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
30f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
30f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30f30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30f40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
30f60 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20  tx->conchHeld = 
30f70 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
30f80 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 6c 6f      if( pCtx->lo
30f90 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64  ckProxy->pMethod
30fa0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
30fb0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  s ){.          a
30fc0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
30fd0 20 2a 61 66 70 43 74 78 3b 0a 20 20 20 20 20 20   *afpCtx;.      
30fe0 20 20 20 20 61 66 70 43 74 78 20 3d 20 28 61 66      afpCtx = (af
30ff0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
31000 2a 29 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  *)pCtx->lockProx
31010 79 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  y->lockingContex
31020 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 70  t;.          afp
31030 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 70 43  Ctx->dbPath = pC
31040 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
31050 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
31060 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
31070 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70      conchFile->p
31080 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
31090 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
310a0 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43  onchFile, NO_LOC
310b0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
310c0 20 20 4f 53 54 52 41 43 45 33 28 22 54 41 4b 45    OSTRACE3("TAKE
310d0 43 4f 4e 43 48 20 20 25 64 20 25 73 5c 6e 22 2c  CONCH  %d %s\n",
310e0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 72   conchFile->h, r
310f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 22 6f 6b  c==SQLITE_OK?"ok
31100 22 3a 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  ":"failed");.   
31110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31120 20 20 7d 20 77 68 69 6c 65 20 28 31 29 3b 20 2f    } while (1); /
31130 2a 20 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65  * in case we nee
31140 64 20 74 6f 20 72 65 74 72 79 20 74 68 65 20 3a  d to retry the :
31150 61 75 74 6f 3a 20 6c 6f 63 6b 20 66 69 6c 65 20  auto: lock file 
31160 2d 20 77 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  - we should neve
31170 72 20 67 65 74 20 68 65 72 65 20 65 78 63 65 70  r get here excep
31180 74 20 76 69 61 20 74 68 65 20 27 63 6f 6e 74 69  t via the 'conti
31190 6e 75 65 27 20 63 61 6c 6c 2e 20 2a 2f 0a 20 20  nue' call. */.  
311a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 46  }.}../*.** If pF
311b0 69 6c 65 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b  ile holds a lock
311c0 20 6f 6e 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   on a conch file
311d0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 74  , then release t
311e0 68 61 74 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  hat lock..*/.sta
311f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 52 65 6c  tic int proxyRel
31200 65 61 73 65 43 6f 6e 63 68 28 75 6e 69 78 46 69  easeConch(unixFi
31210 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
31220 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
31230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
31240 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 63  routine return c
31250 6f 64 65 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  ode */.  proxyLo
31260 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
31270 74 78 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  tx;  /* The lock
31280 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
31290 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 2a  the proxy lock *
312a0 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f  /.  unixFile *co
312b0 6e 63 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  nchFile;        
312c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
312d0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  onch file */..  
312e0 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
312f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
31300 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
31310 65 78 74 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  ext;.  conchFile
31320 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
31330 6c 65 3b 0a 20 20 4f 53 54 52 41 43 45 34 28 22  le;.  OSTRACE4("
31340 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20 25 64  RELEASECONCH  %d
31350 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
31360 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
31370 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 43 74  .           (pCt
31380 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
31390 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   ? pCtx->lockPro
313a0 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a  xyPath : ":auto:
313b0 22 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  "), .           
313c0 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 66 28  getpid());.  if(
313d0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
313e0 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  >0 ){.    rc = c
313f0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
31400 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
31410 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
31420 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ile, NO_LOCK);. 
31430 20 7d 0a 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68   }.  pCtx->conch
31440 48 65 6c 64 20 3d 20 30 3b 0a 20 20 4f 53 54 52  Held = 0;.  OSTR
31450 41 43 45 33 28 22 52 45 4c 45 41 53 45 43 4f 4e  ACE3("RELEASECON
31460 43 48 20 20 25 64 20 25 73 5c 6e 22 2c 20 63 6f  CH  %d %s\n", co
31470 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
31480 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51 4c 49         (rc==SQLI
31490 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
314a0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
314b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
314c0 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
314d0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
314e0 6c 65 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20  le, compute the 
314f0 6e 61 6d 65 20 6f 66 20 69 74 73 20 63 6f 6e 63  name of its conc
31500 68 20 66 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65  h file..** Store
31510 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e   the conch filen
31520 61 6d 65 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ame in memory ob
31530 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
31540 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
31550 20 4d 61 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74   Make *pConchPat
31560 68 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  h point to the n
31570 65 77 20 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  ew name.  Return
31580 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
31590 63 63 65 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49  ccess.** or SQLI
315a0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62  TE_NOMEM if unab
315b0 6c 65 20 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d  le to obtain mem
315c0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ory..**.** The c
315d0 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
315e0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
315f0 67 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  g that the alloc
31600 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73  ated memory.** s
31610 70 61 63 65 20 69 73 20 65 76 65 6e 74 75 61 6c  pace is eventual
31620 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
31630 2a 70 43 6f 6e 63 68 50 61 74 68 20 69 73 20 73  *pConchPath is s
31640 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20  et to NULL if a 
31650 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
31660 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
31670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
31680 6f 78 79 43 72 65 61 74 65 43 6f 6e 63 68 50 61  oxyCreateConchPa
31690 74 68 6e 61 6d 65 28 63 68 61 72 20 2a 64 62 50  thname(char *dbP
316a0 61 74 68 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e  ath, char **pCon
316b0 63 68 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  chPath){.  int i
316c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
316d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
316e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
316f0 74 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  t len = (int)str
31700 6c 65 6e 28 64 62 50 61 74 68 29 3b 20 2f 2a 20  len(dbPath); /* 
31710 4c 65 6e 67 74 68 20 6f 66 20 64 61 74 61 62 61  Length of databa
31720 73 65 20 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62  se filename - db
31730 50 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a  Path */.  char *
31740 63 6f 6e 63 68 50 61 74 68 3b 20 20 20 20 20 20  conchPath;      
31750 20 20 20 20 20 20 20 20 2f 2a 20 62 75 66 66 65          /* buffe
31760 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 63 6f  r in which to co
31770 6e 73 74 72 75 63 74 20 63 6f 6e 63 68 20 6e 61  nstruct conch na
31780 6d 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  me */..  /* Allo
31790 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
317a0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d  he conch filenam
317b0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
317c0 20 74 68 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a   the name to.  *
317d0 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * the name of th
317e0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
317f0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20  ase file. */  . 
31800 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 3d 20 63   *pConchPath = c
31810 6f 6e 63 68 50 61 74 68 20 3d 20 28 63 68 61 72  onchPath = (char
31820 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
31830 63 28 6c 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66  c(len + 8);.  if
31840 28 20 63 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29  ( conchPath==0 )
31850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
31860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
31870 20 6d 65 6d 63 70 79 28 63 6f 6e 63 68 50 61 74   memcpy(conchPat
31880 68 2c 20 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31  h, dbPath, len+1
31890 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69  );.  .  /* now i
318a0 6e 73 65 72 74 20 61 20 22 2e 22 20 62 65 66 6f  nsert a "." befo
318b0 72 65 20 74 68 65 20 6c 61 73 74 20 2f 20 63 68  re the last / ch
318c0 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72  aracter */.  for
318d0 28 20 69 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d  ( i=(len-1); i>=
318e0 30 3b 20 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66  0; i-- ){.    if
318f0 28 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d  ( conchPath[i]==
31900 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  '/' ){.      i++
31910 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31920 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68     }.  }.  conch
31930 50 61 74 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77  Path[i]='.';.  w
31940 68 69 6c 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a  hile ( i<len ){.
31950 20 20 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b      conchPath[i+
31960 31 5d 3d 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20  1]=dbPath[i];.  
31970 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
31980 20 61 70 70 65 6e 64 20 74 68 65 20 22 2d 63 6f   append the "-co
31990 6e 63 68 22 20 73 75 66 66 69 78 20 74 6f 20 74  nch" suffix to t
319a0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d  he file */.  mem
319b0 63 70 79 28 26 63 6f 6e 63 68 50 61 74 68 5b 69  cpy(&conchPath[i
319c0 2b 31 5d 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37  +1], "-conch", 7
319d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
319e0 74 29 73 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61  t)strlen(conchPa
319f0 74 68 29 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a  th) == len+7 );.
31a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
31a10 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65  _OK;.}.../* Take
31a20 73 20 61 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67  s a fully config
31a30 75 72 65 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69  ured proxy locki
31a40 6e 67 2d 73 74 79 6c 65 20 75 6e 69 78 20 66 69  ng-style unix fi
31a50 6c 65 20 61 6e 64 20 73 77 69 74 63 68 65 73 0a  le and switches.
31a60 2a 2a 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ** the local loc
31a70 6b 20 66 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a  k file path .*/.
31a80 73 74 61 74 69 63 20 69 6e 74 20 73 77 69 74 63  static int switc
31a90 68 4c 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 75  hLockProxyPath(u
31aa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
31ab0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
31ac0 29 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  ) {.  proxyLocki
31ad0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
31ae0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
31af0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
31b00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31b10 20 63 68 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d   char *oldPath =
31b20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
31b30 50 61 74 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Path;.  int rc =
31b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
31b50 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
31b60 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  pe!=NO_LOCK ){. 
31b70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31b80 5f 42 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20  _BUSY;.  }  ..  
31b90 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
31ba0 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73 20   if the path is 
31bb0 4e 55 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20  NULL, :auto: or 
31bc0 6d 61 74 63 68 65 73 20 74 68 65 20 65 78 69 73  matches the exis
31bd0 74 69 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69  ting path */.  i
31be0 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
31bf0 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
31c00 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
31c10 6f 3a 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64  o:") ||.    (old
31c20 50 61 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70  Path && !strncmp
31c30 28 6f 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20  (oldPath, path, 
31c40 4d 41 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a  MAXPATHLEN)) ){.
31c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31c60 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
31c70 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63     unixFile *loc
31c80 6b 50 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c  kProxy = pCtx->l
31c90 6f 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43  ockProxy;.    pC
31ca0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55  tx->lockProxy=NU
31cb0 4c 4c 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f  LL;.    pCtx->co
31cc0 6e 63 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20  nchHeld = 0;.   
31cd0 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d   if( lockProxy!=
31ce0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63  NULL ){.      rc
31cf0 3d 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74  =lockProxy->pMet
31d00 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
31d10 69 74 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b  ite3_file *)lock
31d20 50 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66  Proxy);.      if
31d30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
31d50 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b  free(lockProxy);
31d60 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31d70 65 33 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29  e3_free(oldPath)
31d80 3b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  ;.    pCtx->lock
31d90 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
31da0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 70  te3DbStrDup(0, p
31db0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72  ath);.  }.  .  r
31dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31dd0 2a 2a 20 70 46 69 6c 65 20 69 73 20 61 20 66 69  ** pFile is a fi
31de0 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
31df0 20 6f 70 65 6e 65 64 20 62 79 20 61 20 70 72 69   opened by a pri
31e00 6f 72 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20  or xOpen call.  
31e10 64 62 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73  dbPath.** is a s
31e20 74 72 69 6e 67 20 62 75 66 66 65 72 20 61 74 20  tring buffer at 
31e30 6c 65 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e  least MAXPATHLEN
31e40 2b 31 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  +1 characters in
31e50 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
31e60 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74  s routine find t
31e70 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f  he filename asso
31e80 63 69 61 74 65 64 20 77 69 74 68 20 70 46 69 6c  ciated with pFil
31e90 65 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a  e and writes it.
31ea0 2a 2a 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a  ** int dbPath..*
31eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
31ec0 78 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e  xyGetDbPathForUn
31ed0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
31ee0 2a 70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62  *pFile, char *db
31ef0 50 61 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e  Path){.#if defin
31f00 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
31f10 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  if( pFile->pMeth
31f20 6f 64 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68  od == &afpIoMeth
31f30 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66  ods ){.    /* af
31f40 70 20 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20  p style keeps a 
31f50 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31f60 20 64 62 20 70 61 74 68 20 69 6e 20 74 68 65 20   db path in the 
31f70 66 69 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a  filePath field .
31f80 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74      ** of the st
31f90 72 75 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ruct */.    asse
31fa0 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
31fb0 28 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f  (char*)pFile->lo
31fc0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d  ckingContext)<=M
31fd0 41 58 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20  AXPATHLEN );.   
31fe0 20 73 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c   strlcpy(dbPath,
31ff0 20 28 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e   ((afpLockingCon
32000 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  text *)pFile->lo
32010 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64  ckingContext)->d
32020 62 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  bPath, MAXPATHLE
32030 4e 29 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e  N);.  } else.#en
32040 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  dif.  if( pFile-
32050 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74  >pMethod == &dot
32060 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
32070 0a 20 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b  .    /* dot lock
32080 20 73 74 79 6c 65 20 75 73 65 73 20 74 68 65 20   style uses the 
32090 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  locking context 
320a0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74  to store the dot
320b0 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c   lock.    ** fil
320c0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
320d0 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28  t len = strlen((
320e0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
320f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20  ckingContext) - 
32100 73 74 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53  strlen(DOTLOCK_S
32110 55 46 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63  UFFIX);.    memc
32120 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61 72  py(dbPath, (char
32130 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
32140 67 43 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20  gContext, len + 
32150 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
32160 20 2f 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   /* all other st
32170 79 6c 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63  yles use the loc
32180 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20  king context to 
32190 73 74 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c  store the db fil
321a0 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73  e path */.    as
321b0 73 65 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68  sert( strlen((ch
321c0 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
321d0 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50  ngContext)<=MAXP
321e0 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74  ATHLEN );.    st
321f0 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28 63  rlcpy(dbPath, (c
32200 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  har *)pFile->loc
32210 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58  kingContext, MAX
32220 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20  PATHLEN);.  }.  
32230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73  ;.}../*.** Takes
32250 20 61 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c   an already fill
32260 65 64 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20  ed in unix file 
32270 61 6e 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f  and alters it so
32280 20 61 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   all file lockin
32290 67 20 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65  g .** will be pe
322a0 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c  rformed on the l
322b0 6f 63 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ocal proxy lock 
322c0 66 69 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  file.  The follo
322d0 77 69 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61  wing fields.** a
322e0 72 65 20 70 72 65 73 65 72 76 65 64 20 69 6e 20  re preserved in 
322f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
32300 65 78 74 20 73 6f 20 74 68 61 74 20 74 68 65 79  ext so that they
32310 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
32320 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69   and .** the uni
32330 78 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 70  x structure prop
32340 65 72 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20  erly cleaned up 
32350 61 74 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a  at close time:.*
32360 2a 20 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  *  ->lockingCont
32370 65 78 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f  ext.**  ->pMetho
32380 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d.*/.static int 
32390 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
323a0 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  ixFile(unixFile 
323b0 2a 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68  *pFile, const ch
323c0 61 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72  ar *path) {.  pr
323d0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
323e0 74 20 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20  t *pCtx;.  char 
323f0 64 62 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  dbPath[MAXPATHLE
32400 4e 2b 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  N+1];       /* N
32410 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
32420 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
32430 61 72 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c  ar *lockPath=NUL
32440 4c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  L;.  int rc = SQ
32450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66  LITE_OK;.  .  if
32460 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
32470 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  e!=NO_LOCK ){.  
32480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32490 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78  BUSY;.  }.  prox
324a0 79 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69  yGetDbPathForUni
324b0 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50  xFile(pFile, dbP
324c0 61 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74  ath);.  if( !pat
324d0 68 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c  h || path[0]=='\
324e0 30 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61  0' || !strcmp(pa
324f0 74 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b  th, ":auto:") ){
32500 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55  .    lockPath=NU
32510 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
32520 20 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20   lockPath=(char 
32530 2a 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20  *)path;.  }.  . 
32540 20 4f 53 54 52 41 43 45 34 28 22 54 52 41 4e 53   OSTRACE4("TRANS
32550 50 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73  PROXY  %d for %s
32560 20 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   pid=%d\n", pFil
32570 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
32580 20 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63   (lockPath ? loc
32590 6b 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22  kPath : ":auto:"
325a0 29 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 0a 20  ), getpid());.. 
325b0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
325c0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
325d0 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70  pCtx) );.  if( p
325e0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ctx==0 ){.    re
325f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
32600 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
32610 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCtx, 0, sizeof(
32620 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d  *pCtx));..  rc =
32630 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
32640 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68  hPathname(dbPath
32650 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
32660 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72  lePath);.  if( r
32670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32680 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
32690 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74  eateUnixFile(pCt
326a0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
326b0 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
326c0 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
326d0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
326e0 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  PEN && ((pFile->
326f0 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
32700 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20  ) == 0) ){.     
32710 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f   /* if (a) the o
32720 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f  pen flags are no
32730 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68  t O_RDWR, (b) th
32740 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68  e conch isn't th
32750 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ere, and.      *
32760 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73  * (c) the file s
32770 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e  ystem is read-on
32780 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20  ly, then enable 
32790 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73  no-locking acces
327a0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c  s..      ** Ugh,
327b0 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d   since O_RDONLY=
327c0 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20  =0x0000 we test 
327d0 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63  for !O_RDWR sinc
327e0 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72  e unixOpen asser
327f0 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ts.      ** that
32800 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20   openFlags will 
32810 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66  have only one of
32820 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52   O_RDONLY or O_R
32830 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  DWR..      */.  
32840 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66      struct statf
32850 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
32860 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63  struct stat conc
32870 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  hInfo;.      int
32880 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b   goLockless = 0;
32890 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ..      if( stat
328a0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
328b0 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
328c0 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
328d0 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
328e0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
328f0 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
32900 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
32910 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
32920 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
32930 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
32940 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
32950 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
32960 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
32970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32980 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
32990 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
329a0 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
329b0 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
329c0 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
329d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
329e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
329f0 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
32a00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
32a10 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
32a20 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
32a30 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
32a40 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
32a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
32a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32a70 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
32a80 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
32a90 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
32aa0 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
32ab0 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
32ac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
32ad0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
32ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32af0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
32b00 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
32b10 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
32b20 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
32b30 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
32b40 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
32b50 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
32b60 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
32b70 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
32b80 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
32b90 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
32ba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
32bb0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
32bc0 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
32bd0 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
32be0 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
32bf0 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
32c00 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
32c10 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
32c20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
32c30 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
32c40 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
32c50 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
32c60 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
32c70 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
32c80 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
32c90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32ca0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
32cb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
32cc0 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f  e3_free(pCtx->lo
32cd0 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
32ce0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
32cf0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
32d00 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
32d10 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
32d20 7d 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54 52  }.  OSTRACE3("TR
32d30 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
32d40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
32d50 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
32d60 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
32d70 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
32d80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
32d90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32da0 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65 33   handles sqlite3
32db0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20  _file_control() 
32dc0 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20 73  calls that are s
32dd0 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70 72  pecific.** to pr
32de0 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  oxy locking..*/.
32df0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
32e00 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
32e10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
32e20 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
32e30 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  ){.  switch( op 
32e40 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
32e50 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
32e60 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  FILE: {.      un
32e70 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
32e80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
32e90 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
32ea0 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78  pMethod == &prox
32eb0 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  yIoMethods ){.  
32ec0 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
32ed0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
32ee0 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
32ef0 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c  ontext*)pFile->l
32f00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
32f10 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b 65         proxyTake
32f20 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
32f30 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
32f40 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b  lockProxyPath ){
32f50 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f 6e  .          *(con
32f60 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67 20  st char **)pArg 
32f70 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
32f80 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 7d  yPath;.        }
32f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
32fa0 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29  *(const char **)
32fb0 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20 28  pArg = ":auto: (
32fc0 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20 20  not held)";.    
32fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c      }.      } el
32fe0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28 63  se {.        *(c
32ff0 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72  onst char **)pAr
33000 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
33010 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
33020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
33030 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
33040 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
33050 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 46  E: {.      unixF
33060 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
33070 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20  ixFile*)id;.    
33080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33090 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20  E_OK;.      int 
330a0 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20 28  isProxyStyle = (
330b0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
330c0 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
330d0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  s);.      if( pA
330e0 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f 6e  rg==NULL || (con
330f0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d 3d  st char *)pArg==
33100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
33110 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29 7b   isProxyStyle ){
33120 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75  .          /* tu
33130 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63  rn off proxy loc
33140 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70 6f  king - not suppo
33150 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  rted */.        
33160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
33170 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52 4f  ROR /*SQLITE_PRO
33180 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d 49  TOCOL? SQLITE_MI
33190 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20 20  SUSE?*/;.       
331a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
331b0 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
331c0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61 6c  oxy locking - al
331d0 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f 50  ready off - NOOP
331e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
331f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
33220 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50 61  st char *proxyPa
33230 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
33240 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20   *)pArg;.       
33250 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79 6c   if( isProxyStyl
33260 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
33270 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33280 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20 20  xt *pCtx = .    
33290 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c 6f          (proxyLo
332a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70 46  ckingContext*)pF
332b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
332c0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ext;.          i
332d0 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67 2c  f( !strcmp(pArg,
332e0 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20 20   ":auto:") .    
332f0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78 2d         || (pCtx-
33300 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 26  >lockProxyPath &
33310 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
33320 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d 3e   !strncmp(pCtx->
33330 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20 70  lockProxyPath, p
33340 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41 54  roxyPath, MAXPAT
33350 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20 20  HLEN)).         
33360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33380 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
33390 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
333a0 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  = switchLockProx
333b0 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72 6f  yPath(pFile, pro
333c0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
333d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
333e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
333f0 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20 66   turn on proxy f
33400 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ile locking */. 
33410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72           rc = pr
33420 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
33430 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f 78  File(pFile, prox
33440 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  yPath);.        
33450 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33470 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
33480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
33490 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c 20  );  /* The call 
334a0 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e 6c  assures that onl
334b0 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73 20  y valid opcodes 
334c0 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20 20  are sent */.    
334d0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
334e0 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e 20  CHED*/.  return 
334f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a  SQLITE_ERROR;.}.
33500 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  ./*.** Within th
33510 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68 65  is division (the
33520 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
33530 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
33540 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 73  ) the procedures
33550 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 70  .** above this p
33560 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74 69  oint are all uti
33570 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f 63  lities.  The loc
33580 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f 64  k-related method
33590 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f 78  s of the.** prox
335a0 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  y-locking sqlite
335b0 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a 65  3_io_method obje
335c0 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a 0a  ct follow..*/...
335d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
335e0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
335f0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
33600 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
33610 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
33620 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
33630 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
33640 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
33650 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
33660 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
33670 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
33680 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
33690 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
336a0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
336b0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
336c0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
336d0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
336e0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
336f0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
33700 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
33710 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
33720 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
33730 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
33740 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
33750 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
33760 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
33770 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
33780 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
33790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
337a0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
337b0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
337c0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
337d0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
337e0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
337f0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
33800 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
33810 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
33820 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33830 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
33840 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  roxy->pMethod->x
33850 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
33860 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
33870 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74 29  )proxy, pResOut)
33880 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a 20  ;.    }else{ /* 
33890 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
338a0 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
338b0 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20 20     pResOut=0;.  
338c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
338d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
338e0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
338f0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
33900 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
33910 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
33920 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
33930 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
33940 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
33950 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
33960 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
33970 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
33980 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
33990 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
339a0 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
339b0 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
339c0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
339d0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
339e0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
339f0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
33a00 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
33a10 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
33a20 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
33a30 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
33a40 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
33a50 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
33a60 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
33a70 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
33a80 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
33a90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
33aa0 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
33ab0 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
33ac0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
33ad0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
33ae0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
33af0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
33b00 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
33b10 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
33b20 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
33b30 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
33b40 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
33b50 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
33b60 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
33b70 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
33b80 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
33b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
33ba0 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
33bb0 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65  a lock.  Use the
33bc0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
33bd0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  ().** routine to
33be0 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67   lower a locking
33bf0 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69   level..*/.stati
33c00 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28  c int proxyLock(
33c10 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
33c20 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20  , int locktype) 
33c30 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
33c40 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
33c50 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
33c60 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70  proxyTakeConch(p
33c70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  File);.  if( rc=
33c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33c90 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
33ca0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
33cb0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33cc0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
33cd0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
33ce0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
33cf0 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  eld>0 ){.      u
33d00 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d  nixFile *proxy =
33d10 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
33d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f  ;.      rc = pro
33d30 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f  xy->pMethod->xLo
33d40 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
33d50 2a 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70  *)proxy, locktyp
33d60 65 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e);.      pFile-
33d70 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78  >locktype = prox
33d80 79 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  y->locktype;.   
33d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
33da0 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
33db0 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
33dc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
33dd0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c   rc;.}.../*.** L
33de0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
33df0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
33e00 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
33e10 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
33e20 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
33e30 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
33e40 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
33e50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
33e60 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
33e70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
33e80 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
33e90 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
33ea0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
33eb0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
33ec0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
33ed0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
33ee0 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
33ef0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
33f00 6e 74 20 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 20  nt locktype) {. 
33f10 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
33f20 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
33f30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 72 6f  ;.  int rc = pro
33f40 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69 6c  xyTakeConch(pFil
33f50 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
33f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
33f70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
33f80 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
33f90 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
33fa0 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
33fb0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 69 66 28  Context;.    if(
33fc0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
33fd0 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78  >0 ){.      unix
33fe0 46 69 6c 65 20 2a 70 72 6f 78 79 20 3d 20 70 43  File *proxy = pC
33ff0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
34000 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 2d       rc = proxy-
34010 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
34020 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
34030 29 70 72 6f 78 79 2c 20 6c 6f 63 6b 74 79 70 65  )proxy, locktype
34040 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
34050 6c 6f 63 6b 74 79 70 65 20 3d 20 70 72 6f 78 79  locktype = proxy
34060 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
34070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
34080 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69 73  conchHeld < 0 is
34090 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20   lockless */.   
340a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
340b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
340c0 73 65 20 61 20 66 69 6c 65 20 74 68 61 74 20 75  se a file that u
340d0 73 65 73 20 70 72 6f 78 79 20 6c 6f 63 6b 73 2e  ses proxy locks.
340e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
340f0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
34100 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
34110 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
34120 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
34130 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
34140 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
34150 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
34160 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
34170 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
34180 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
34190 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
341a0 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
341b0 6b 50 72 6f 78 79 3b 0a 20 20 20 20 75 6e 69 78  kProxy;.    unix
341c0 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20  File *conchFile 
341d0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
341e0 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e;.    int rc = 
341f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a  SQLITE_OK;.    .
34200 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 72 6f 78      if( lockProx
34210 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
34220 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68  lockProxy->pMeth
34230 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c  od->xUnlock((sql
34240 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
34250 72 6f 78 79 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  roxy, NO_LOCK);.
34260 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34280 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e  rc = lockProxy->
34290 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28  pMethod->xClose(
342a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 6c  (sqlite3_file*)l
342b0 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
342c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
342d0 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   rc;.      sqlit
342e0 65 33 5f 66 72 65 65 28 6c 6f 63 6b 50 72 6f 78  e3_free(lockProx
342f0 79 29 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e  y);.      pCtx->
34300 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 30 3b 0a 20  lockProxy = 0;. 
34310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6f 6e     }.    if( con
34320 63 68 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  chFile ){.      
34330 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
34340 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eld ){.        r
34350 63 20 3d 20 70 72 6f 78 79 52 65 6c 65 61 73 65  c = proxyRelease
34360 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
34370 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
34380 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34390 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e  }.      rc = con
343a0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
343b0 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33  >xClose((sqlite3
343c0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
343d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
343e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
343f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
34400 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
34410 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
34420 65 65 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  ee(pCtx->lockPro
34430 78 79 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  xyPath);.    sql
34440 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
34450 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
34460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34470 28 70 43 74 78 2d 3e 64 62 50 61 74 68 29 3b 0a  (pCtx->dbPath);.
34480 20 20 20 20 2f 2a 20 72 65 73 74 6f 72 65 20 74      /* restore t
34490 68 65 20 6f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  he original lock
344a0 69 6e 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20  ing context and 
344b0 70 4d 65 74 68 6f 64 20 74 68 65 6e 20 63 6c 6f  pMethod then clo
344c0 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 70 46 69  se it */.    pFi
344d0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
344e0 78 74 20 3d 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  xt = pCtx->oldLo
344f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
34500 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
34510 20 3d 20 70 43 74 78 2d 3e 70 4f 6c 64 4d 65 74   = pCtx->pOldMet
34520 68 6f 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  hod;.    sqlite3
34530 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20 20  _free(pCtx);.   
34540 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70   return pFile->p
34550 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 69  Method->xClose(i
34560 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
34570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
34580 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
34590 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
345a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
345b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
345c0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
345d0 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 69 73  locking style is
345e0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 75 73   intended for us
345f0 65 20 77 69 74 68 20 41 46 50 20 66 69 6c 65 73  e with AFP files
34600 79 73 74 65 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73  ystems..** And s
34610 69 6e 63 65 20 41 46 50 20 69 73 20 6f 6e 6c 79  ince AFP is only
34620 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 4d 61   supported on Ma
34630 63 4f 53 58 2c 20 74 68 65 20 70 72 6f 78 79 20  cOSX, the proxy 
34640 6c 6f 63 6b 69 6e 67 20 69 73 20 61 6c 73 6f 0a  locking is also.
34650 2a 2a 20 72 65 73 74 72 69 63 74 65 64 20 74 6f  ** restricted to
34660 20 4d 61 63 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a   MacOSX..** .**.
34670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34680 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
34690 72 6f 78 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  roxy lock implem
346a0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
346b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
346c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
346d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
346e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
346f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
34710 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
34720 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
34730 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
34740 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
34750 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 61  tine registers a
34760 6c 6c 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ll VFS implement
34770 61 74 69 6f 6e 73 20 66 6f 72 20 75 6e 69 78 2d  ations for unix-
34780 6c 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a  like operating.*
34790 2a 20 73 79 73 74 65 6d 73 2e 20 20 54 68 69 73  * systems.  This
347a0 20 72 6f 75 74 69 6e 65 2c 20 61 6e 64 20 74 68   routine, and th
347b0 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  e sqlite3_os_end
347c0 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  () routine that 
347d0 66 6f 6c 6c 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75  follows,.** shou
347e0 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
347f0 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
34800 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 76 69  file that are vi
34810 73 69 62 6c 65 20 66 72 6f 6d 20 6f 74 68 65 72  sible from other
34820 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  .** files..**.**
34830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
34840 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 64 75 72   called once dur
34850 69 6e 67 20 53 51 4c 69 74 65 20 69 6e 69 74 69  ing SQLite initi
34860 61 6c 69 7a 61 74 69 6f 6e 20 61 6e 64 20 62 79  alization and by
34870 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 74 68 72   a.** single thr
34880 65 61 64 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ead.  The memory
34890 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 6e 64 20   allocation and 
348a0 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
348b0 20 68 61 76 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63   have not.** nec
348c0 65 73 73 61 72 69 6c 79 20 62 65 65 6e 20 69 6e  essarily been in
348d0 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
348e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
348f0 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 74 68  alled, and so th
34900 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74  ey.** should not
34910 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74   be used..*/.int
34920 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
34930 28 76 6f 69 64 29 7b 20 0a 20 20 2f 2a 20 0a 20  (void){ .  /* . 
34940 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
34950 67 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 73 20  g macro defines 
34960 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 66  an initializer f
34970 6f 72 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 66  or an sqlite3_vf
34980 73 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20 54  s object..  ** T
34990 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
349a0 46 53 20 69 73 20 4e 41 4d 45 2e 20 20 54 68 65  FS is NAME.  The
349b0 20 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70   pAppData is a p
349c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
349d0 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ter.  ** to the 
349e0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
349f0 6e 2e 20 20 28 70 41 70 70 44 61 74 61 20 69 73  n.  (pAppData is
34a00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
34a10 70 6f 69 6e 74 65 72 20 62 65 63 61 75 73 65 0a  pointer because.
34a20 20 20 2a 2a 20 73 69 6c 6c 79 20 43 39 30 20 72    ** silly C90 r
34a30 75 6c 65 73 20 70 72 6f 68 69 62 69 74 20 61 20  ules prohibit a 
34a40 76 6f 69 64 2a 20 66 72 6f 6d 20 62 65 69 6e 67  void* from being
34a50 20 63 61 73 74 20 74 6f 20 61 20 66 75 6e 63 74   cast to a funct
34a60 69 6f 6e 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ion pointer.  **
34a70 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
34a80 74 6f 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  to go through th
34a90 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 70  e intermediate p
34aa0 6f 69 6e 74 65 72 20 74 6f 20 61 76 6f 69 64 20  ointer to avoid 
34ab0 70 72 6f 62 6c 65 6d 73 0a 20 20 2a 2a 20 77 68  problems.  ** wh
34ac0 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74  en compiling wit
34ad0 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
34ae0 72 73 20 6f 6e 20 47 43 43 2e 29 0a 20 20 2a 2a  rs on GCC.).  **
34af0 0a 20 20 2a 2a 20 54 68 65 20 46 49 4e 44 45 52  .  ** The FINDER
34b00 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
34b10 69 73 20 6d 61 63 72 6f 20 69 73 20 74 68 65 20  is macro is the 
34b20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 6f 69 6e  name of the poin
34b30 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
34b40 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 2e  finder-function.
34b50 20 20 54 68 65 20 66 69 6e 64 65 72 2d 66 75 6e    The finder-fun
34b60 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
34b70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 20  pointer to the. 
34b80 20 2a 2a 20 73 71 6c 69 74 65 5f 69 6f 5f 6d 65   ** sqlite_io_me
34b90 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 74 68 61  thods object tha
34ba0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
34bb0 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67   desired locking
34bc0 0a 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 73 2e  .  ** behaviors.
34bd0 20 20 53 65 65 20 74 68 65 20 64 69 76 69 73 69    See the divisi
34be0 6f 6e 20 61 62 6f 76 65 20 74 68 61 74 20 63 6f  on above that co
34bf0 6e 74 61 69 6e 73 20 74 68 65 20 49 4f 4d 45 54  ntains the IOMET
34c00 48 4f 44 53 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  HODS.  ** macro 
34c10 66 6f 72 20 61 64 64 69 74 69 6f 6e 20 69 6e 66  for addition inf
34c20 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 66 69 6e 64  ormation on find
34c30 65 72 2d 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  er-functions..  
34c40 2a 2a 0a 20 20 2a 2a 20 4d 6f 73 74 20 66 69 6e  **.  ** Most fin
34c50 64 65 72 73 20 73 69 6d 70 6c 79 20 72 65 74 75  ders simply retu
34c60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
34c70 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
34c80 69 6f 5f 6d 65 74 68 6f 64 73 0a 20 20 2a 2a 20  io_methods.  ** 
34c90 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 74 68 65  object.  But the
34ca0 20 22 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   "autolockIoFind
34cb0 65 72 22 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  er" available on
34cc0 20 4d 61 63 4f 53 58 20 64 6f 65 73 20 61 20 6c   MacOSX does a l
34cd0 69 74 74 6c 65 0a 20 20 2a 2a 20 6d 6f 72 65 20  ittle.  ** more 
34ce0 74 68 61 6e 20 74 68 61 74 3b 20 69 74 20 6c 6f  than that; it lo
34cf0 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
34d00 79 73 74 65 6d 20 74 79 70 65 20 74 68 61 74 20  ystem type that 
34d10 68 6f 73 74 73 20 74 68 65 20 0a 20 20 2a 2a 20  hosts the .  ** 
34d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
34d30 64 20 74 72 69 65 73 20 74 6f 20 63 68 6f 6f 73  d tries to choos
34d40 65 20 61 6e 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  e an locking met
34d50 68 6f 64 20 61 70 70 72 6f 70 72 69 61 74 65 20  hod appropriate 
34d60 66 6f 72 0a 20 20 2a 2a 20 74 68 61 74 20 66 69  for.  ** that fi
34d70 6c 65 73 79 73 74 65 6d 20 74 69 6d 65 2e 0a 20  lesystem time.. 
34d80 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 55 4e   */.  #define UN
34d90 49 58 56 46 53 28 56 46 53 4e 41 4d 45 2c 20 46  IXVFS(VFSNAME, F
34da0 49 4e 44 45 52 29 20 7b 20 20 20 20 20 20 20 20  INDER) {        
34db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34dc0 5c 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  \.    2,        
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
34de0 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34e00 20 20 20 20 73 69 7a 65 6f 66 28 75 6e 69 78 46      sizeof(unixF
34e10 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
34e20 73 46 69 6c 65 20 2a 2f 20 20 20 20 20 20 20 20  sFile */        
34e30 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
34e40 20 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20    MAX_PATHNAME, 
34e50 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
34e60 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20  hname */        
34e70 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
34e80 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
34e90 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
34ea0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
34eb0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 56 46          \.    VF
34ec0 53 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 20  SNAME,          
34ed0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20      /* zName */ 
34ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ef0 20 20 20 20 20 20 5c 0a 20 20 20 20 28 76 6f 69        \.    (voi
34f00 64 2a 29 26 46 49 4e 44 45 52 2c 20 20 20 20 20  d*)&FINDER,     
34f10 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
34f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f30 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 4f 70      \.    unixOp
34f40 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
34f50 2f 2a 20 78 4f 70 65 6e 20 2a 2f 20 20 20 20 20  /* xOpen */     
34f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f70 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 65 6c 65    \.    unixDele
34f80 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
34f90 20 78 44 65 6c 65 74 65 20 2a 2f 20 20 20 20 20   xDelete */     
34fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fb0 5c 0a 20 20 20 20 75 6e 69 78 41 63 63 65 73 73  \.    unixAccess
34fc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
34fd0 41 63 63 65 73 73 20 2a 2f 20 20 20 20 20 20 20  Access */       
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
34ff0 20 20 20 20 75 6e 69 78 46 75 6c 6c 50 61 74 68      unixFullPath
35000 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
35010 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 20 20 20  llPathname */   
35020 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35030 20 20 75 6e 69 78 44 6c 4f 70 65 6e 2c 20 20 20    unixDlOpen,   
35040 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
35050 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  en */           
35060 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35070 75 6e 69 78 44 6c 45 72 72 6f 72 2c 20 20 20 20  unixDlError,    
35080 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
35090 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
350a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
350b0 69 78 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  ixDlSym,        
350c0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
350d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350e0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
350f0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
35100 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
35110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35120 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 52 61      \.    unixRa
35130 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
35140 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
35150 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35160 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 6c 65 65    \.    unixSlee
35170 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
35180 20 78 53 6c 65 65 70 20 2a 2f 20 20 20 20 20 20   xSleep */      
35190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351a0 5c 0a 20 20 20 20 75 6e 69 78 43 75 72 72 65 6e  \.    unixCurren
351b0 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
351c0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 20 20  CurrentTime */  
351d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
351e0 20 20 20 20 75 6e 69 78 47 65 74 4c 61 73 74 45      unixGetLastE
351f0 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
35200 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 20 20 20  tLastError */   
35210 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35220 20 20 75 6e 69 78 53 68 6d 4f 70 65 6e 2c 20 20    unixShmOpen,  
35230 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4f          /* xShmO
35240 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  pen */          
35250 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35260 75 6e 69 78 53 68 6d 53 69 7a 65 2c 20 20 20 20  unixShmSize,    
35270 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 53 69 7a        /* xShmSiz
35280 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35290 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
352a0 69 78 53 68 6d 47 65 74 2c 20 20 20 20 20 20 20  ixShmGet,       
352b0 20 20 20 20 2f 2a 20 78 53 68 6d 47 65 74 20 2a      /* xShmGet *
352c0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
352d0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
352e0 53 68 6d 52 65 6c 65 61 73 65 2c 20 20 20 20 20  ShmRelease,     
352f0 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73 65    /* xShmRelease
35300 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35310 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20      \.    0,    
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35330 2f 2a 20 78 53 68 6d 50 75 73 68 20 2a 2f 20 20  /* xShmPush */  
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35350 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20    \.    0,      
35360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35370 20 78 53 68 6d 50 75 6c 6c 20 2a 2f 20 20 20 20   xShmPull */    
35380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35390 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63  \.    unixShmLoc
353a0 6b 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  k,          /* x
353b0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
353d0 20 20 20 20 75 6e 69 78 53 68 6d 43 6c 6f 73 65      unixShmClose
353e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68  ,         /* xSh
353f0 6d 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20  mClose */       
35400 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
35410 20 20 75 6e 69 78 53 68 6d 44 65 6c 65 74 65 2c    unixShmDelete,
35420 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 44          /* xShmD
35430 65 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20  elete */        
35440 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
35450 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
35460 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
35470 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35480 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c          \.    0,
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354a0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
354b0 69 6d 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20  imeInt64 */     
354c0 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f        \.  }..  /
354d0 2a 0a 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75  *.  ** All defau
354e0 6c 74 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69  lt VFSes for uni
354f0 78 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  x are contained 
35500 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
35510 20 61 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a   array..  **.  *
35520 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
35530 73 71 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78  sqlite3_vfs.pNex
35540 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56  t field of the V
35550 46 53 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64  FS object is mod
35560 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ified.  ** by th
35570 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68  e SQLite core wh
35580 65 6e 20 74 68 65 20 56 46 53 20 69 73 20 72 65  en the VFS is re
35590 67 69 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68  gistered.  So th
355a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
355b0 20 61 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65   array cannot be
355c0 20 63 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73   const..  */.  s
355d0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
355e0 73 20 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66  s aVfs[] = {.#if
355f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
35600 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
35610 28 4f 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64  (OS_VXWORKS || d
35620 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
35630 29 29 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  )).    UNIXVFS("
35640 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  unix",          
35650 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
35660 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e   ),.#else.    UN
35670 49 58 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20  IXVFS("unix",   
35680 20 20 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69         posixIoFi
35690 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20  nder ),.#endif. 
356a0 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78     UNIXVFS("unix
356b0 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f  -none",     nolo
356c0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20  ckIoFinder ),.  
356d0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
356e0 64 6f 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f  dotfile",  dotlo
356f0 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ckIoFinder ),.#i
35700 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
35710 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
35720 61 6d 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46  amedsem", semIoF
35730 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a  inder ),.#endif.
35740 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
35750 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
35760 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
35770 78 2d 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73  x-posix",    pos
35780 69 78 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69  ixIoFinder ),.#i
35790 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  f !OS_VXWORKS.  
357a0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
357b0 66 6c 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b  flock",    flock
357c0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64  IoFinder ),.#end
357d0 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  if.#endif.#if SQ
357e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
357f0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
35800 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
35810 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69      UNIXVFS("uni
35820 78 2d 61 66 70 22 2c 20 20 20 20 20 20 61 66 70  x-afp",      afp
35830 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
35840 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66  UNIXVFS("unix-nf
35850 73 22 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69  s",      nfsIoFi
35860 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58  nder ),.    UNIX
35870 56 46 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22  VFS("unix-proxy"
35880 2c 20 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  ,    proxyIoFind
35890 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  er ),.#endif.  }
358a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
358b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
358c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
358d0 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
358e0 6c 6c 20 56 46 53 65 73 20 64 65 66 69 6e 65 64  ll VFSes defined
358f0 20 69 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61   in the aVfs[] a
35900 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  rray */.  for(i=
35910 30 3b 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66  0; i<(sizeof(aVf
35920 73 29 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  s)/sizeof(sqlite
35930 33 5f 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20  3_vfs)); i++){. 
35940 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
35950 65 67 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d  egister(&aVfs[i]
35960 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
35970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35980 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64   .}../*.** Shutd
35990 6f 77 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e  own the operatin
359a0 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
359b0 63 65 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f  ce..**.** Some o
359c0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73  perating systems
359d0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
359e0 6f 20 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69  o some cleanup i
359f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a  n this routine,.
35a00 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79  ** to release dy
35a10 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
35a20 74 65 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75  ted objects.  Bu
35a30 74 20 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a  t not on unix..*
35a40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
35a50 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e  s a no-op for un
35a60 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
35a70 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b  e3_os_end(void){
35a80 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
35a90 45 5f 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69  E_OK; .}. .#endi
35aa0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55  f /* SQLITE_OS_U
35ab0 4e 49 58 20 2a 2f 0a                             NIX */.