/ Hex Artifact Content
Login

Artifact d003631afe10f2cbbf0f4eb4ea72122e0522bbc7:


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 23 69 66 6e 64 65  urn 0;.}..#ifnde
249f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
24a00 4c 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  L../* Forward re
24a10 66 65 72 65 6e 63 65 20 2a 2f 0a 74 79 70 65 64  ference */.typed
24a20 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
24a30 6d 20 75 6e 69 78 53 68 6d 3b 0a 74 79 70 65 64  m unixShm;.typed
24a40 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  ef struct unixSh
24a50 6d 46 69 6c 65 20 75 6e 69 78 53 68 6d 46 69 6c  mFile unixShmFil
24a60 65 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  e;../*.** Object
24a70 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
24a80 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  nt a single file
24a90 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70   opened and mmap
24aa0 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a  ped to provide.*
24ab0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  * shared memory.
24ac0 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20    When multiple 
24ad0 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
24ae0 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a  rence the same.*
24af0 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65  * log-summary, e
24b00 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69  ach thread has i
24b10 74 73 20 6f 77 6e 20 75 6e 69 78 46 69 6c 65 20  ts own unixFile 
24b20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
24b30 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
24b40 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
24b50 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
24b60 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
24b70 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
24b80 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
24b90 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
24ba0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 75  process..**.** u
24bb0 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
24bc0 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
24bd0 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
24be0 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
24bf0 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
24c00 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
24c10 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
24c20 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
24c30 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
24c40 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
24c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
24c60 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
24c70 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
24c80 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
24c90 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
24ca0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
24cb0 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69  **.** Either uni
24cc0 78 53 68 6d 46 69 6c 65 2e 6d 75 74 65 78 20 6d  xShmFile.mutex m
24cd0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75  ust be held or u
24ce0 6e 69 78 53 68 6d 46 69 6c 65 2e 6e 52 65 66 3d  nixShmFile.nRef=
24cf0 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75  =0 and.** unixMu
24d00 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
24d10 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
24d20 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
24d30 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
24d40 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
24d50 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 64  **.** To avoid d
24d60 65 61 64 6c 6f 63 6b 73 2c 20 6d 75 74 65 78 20  eadlocks, mutex 
24d70 61 6e 64 20 6d 75 74 65 78 42 75 66 20 61 72 65  and mutexBuf are
24d80 20 61 6c 77 61 79 73 20 72 65 6c 65 61 73 65 64   always released
24d90 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65 76 65 72   in the.** rever
24da0 73 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  se order that th
24db0 65 79 20 61 72 65 20 61 63 71 75 69 72 65 64 2e  ey are acquired.
24dc0 20 20 6d 75 74 65 78 42 75 66 20 69 73 20 61 6c    mutexBuf is al
24dd0 77 61 79 73 20 61 63 71 75 69 72 65 64 0a 2a 2a  ways acquired.**
24de0 20 66 69 72 73 74 20 61 6e 64 20 72 65 6c 65 61   first and relea
24df0 73 65 64 20 6c 61 73 74 2e 20 20 54 68 69 73 20  sed last.  This 
24e00 69 6e 76 61 72 69 61 6e 74 20 69 73 20 63 68 65  invariant is che
24e10 63 6b 20 62 79 20 61 73 73 65 72 74 69 6e 67 0a  ck by asserting.
24e20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ** sqlite3_mutex
24e30 5f 6e 6f 74 68 65 6c 64 28 29 20 6f 6e 20 6d 75  _notheld() on mu
24e40 74 65 78 20 77 68 65 6e 65 76 65 72 20 6d 75 74  tex whenever mut
24e50 65 78 42 75 66 20 69 73 20 61 63 71 75 69 72 65  exBuf is acquire
24e60 64 20 6f 72 0a 2a 2a 20 72 65 6c 65 61 73 65 64  d or.** released
24e70 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
24e80 53 68 6d 46 69 6c 65 20 7b 0a 20 20 73 74 72 75  ShmFile {.  stru
24e90 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
24ea0 64 3b 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65  d;     /* Unique
24eb0 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 72   file identifier
24ec0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
24ed0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
24ee0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
24ef0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
24f00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
24f10 65 78 20 2a 6d 75 74 65 78 42 75 66 3b 20 20 20  ex *mutexBuf;   
24f20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
24f30 73 73 20 7a 42 75 66 5b 5d 20 2a 2f 0a 20 20 63  ss zBuf[] */.  c
24f40 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
24f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24f60 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
24f70 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f90 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
24fa0 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
24fb0 7a 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  zMap;           
24fc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
24fd0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6f 66 20   the mapping of 
24fe0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
24ff0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4d 4d 61   */.  char *pMMa
25000 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
25010 20 2f 2a 20 57 68 65 72 65 20 63 75 72 72 65 6e   /* Where curren
25020 74 6c 79 20 6d 6d 61 70 70 65 64 28 29 2e 20 20  tly mmapped().  
25030 4e 55 4c 4c 20 69 66 20 75 6e 6d 61 70 70 65 64  NULL if unmapped
25040 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
25070 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
25080 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
25090 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
250a0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
250b0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
250c0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
250d0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78  o this */.  unix
250e0 53 68 6d 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20  ShmFile *pNext; 
250f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
25100 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  n list of all un
25110 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74  ixShmFile object
25120 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
25130 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
25140 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
25150 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
25160 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
25170 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
25180 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
25190 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
251a0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
251b0 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
251c0 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
251d0 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
251e0 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
251f0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
25200 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
25210 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
25220 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65  unixShmFile obje
25230 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  cts..**.** The u
25240 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  nixMutexHeld() m
25250 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
25260 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
25270 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
25280 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 53 68  */.static unixSh
25290 6d 46 69 6c 65 20 2a 75 6e 69 78 53 68 6d 46 69  mFile *unixShmFi
252a0 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
252b0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
252c0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
252d0 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
252e0 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
252f0 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
25300 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
25310 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 53  ion..**.** unixS
25320 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20  hm.pFile->mutex 
25330 6d 75 73 74 20 62 65 20 68 65 6c 64 20 77 68 69  must be held whi
25340 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
25350 69 74 69 6e 67 20 74 68 65 0a 2a 2a 20 75 6e 69  iting the.** uni
25360 78 53 68 6d 2e 70 4e 65 78 74 20 61 6e 64 20 75  xShm.pNext and u
25370 6e 69 78 53 68 6d 2e 6c 6f 63 6b 73 5b 5d 20 65  nixShm.locks[] e
25380 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54  lements..**.** T
25390 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65  he unixShm.pFile
253a0 20 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e 69 74   element is init
253b0 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 65  ialized when the
253c0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
253d0 65 64 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  ed.** and is rea
253e0 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
253f0 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  r..*/.struct uni
25400 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d  xShm {.  unixShm
25410 46 69 6c 65 20 2a 70 46 69 6c 65 3b 20 20 20 20  File *pFile;    
25420 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
25430 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c  lying unixShmFil
25440 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e  e object */.  un
25450 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  ixShm *pNext;   
25460 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
25470 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74 68   unixShm with th
25480 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 46 69  e same unixShmFi
25490 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 53  le */.  u8 lockS
254a0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
254b0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
254c0 63 6b 20 73 74 61 74 65 20 2a 2f 0a 20 20 75 38  ck state */.  u8
254d0 20 72 65 61 64 4c 6f 63 6b 3b 20 20 20 20 20 20   readLock;      
254e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
254f0 68 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65 61  h of the two rea
25500 64 2d 6c 6f 63 6b 20 73 74 61 74 65 73 20 74 6f  d-lock states to
25510 20 75 73 65 20 2a 2f 0a 20 20 75 38 20 68 61 73   use */.  u8 has
25520 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
25530 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
25540 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
25550 53 68 6d 46 69 6c 65 20 6d 75 74 65 78 20 2a 2f  ShmFile mutex */
25560 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75  .  u8 hasMutexBu
25570 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
25580 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
25590 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66   pFile->mutexBuf
255a0 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d   */.  u8 sharedM
255b0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
255c0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
255d0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
255e0 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25600 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
25610 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
25620 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25630 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25650 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
25660 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
25670 69 74 73 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  its unixShmFile 
25680 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
25690 0a 2a 2a 20 53 69 7a 65 20 69 6e 63 72 65 6d 65  .** Size increme
256a0 6e 74 20 62 79 20 77 68 69 63 68 20 73 68 61 72  nt by which shar
256b0 65 64 20 6d 65 6d 6f 72 79 20 67 72 6f 77 73 0a  ed memory grows.
256c0 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  */.#define SQLIT
256d0 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 20  E_UNIX_SHM_INCR 
256e0 20 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   4096../*.** Con
256f0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
25700 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
25710 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
25720 20 20 20 20 20 20 33 32 20 20 20 20 20 20 20 20        32        
25730 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
25740 66 20 74 68 65 20 66 69 72 73 74 20 6c 6f 63 6b  f the first lock
25750 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
25760 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45 58 20   UNIX_SHM_MUTEX 
25770 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f 2a      0x01      /*
25780 20 4d 61 73 6b 20 66 6f 72 20 4d 55 54 45 58 20   Mask for MUTEX 
25790 6c 6f 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lock */.#define 
257a0 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
257b0 20 20 20 30 78 30 34 20 20 20 20 20 20 2f 2a 20     0x04      /* 
257c0 4d 61 73 6b 20 66 6f 72 20 44 65 61 64 2d 4d 61  Mask for Dead-Ma
257d0 6e 2d 53 77 69 74 63 68 20 6c 6f 63 6b 20 2a 2f  n-Switch lock */
257e0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
257f0 4d 5f 41 20 20 20 20 20 20 20 20 20 30 78 31 30  M_A         0x10
25800 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 66 6f        /* Mask fo
25810 72 20 72 65 67 69 6f 6e 20 6c 6f 63 6b 73 2e 2e  r region locks..
25820 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  . */.#define UNI
25830 58 5f 53 48 4d 5f 42 20 20 20 20 20 20 20 20 20  X_SHM_B         
25840 30 78 32 30 0a 23 64 65 66 69 6e 65 20 55 4e 49  0x20.#define UNI
25850 58 5f 53 48 4d 5f 43 20 20 20 20 20 20 20 20 20  X_SHM_C         
25860 30 78 34 30 0a 23 64 65 66 69 6e 65 20 55 4e 49  0x40.#define UNI
25870 58 5f 53 48 4d 5f 44 20 20 20 20 20 20 20 20 20  X_SHM_D         
25880 30 78 38 30 0a 0a 23 69 66 64 65 66 20 53 51 4c  0x80..#ifdef SQL
25890 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
258a0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
258b0 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
258c0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 73  ated string in s
258d0 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 74 68 61  tatic memory tha
258e0 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 61  t.** describes a
258f0 20 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e 20 20   locking mask.  
25900 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66  The string is of
25910 20 74 68 65 20 66 6f 72 6d 20 22 4d 53 41 42 43   the form "MSABC
25920 44 22 20 77 69 74 68 0a 2a 2a 20 65 61 63 68 20  D" with.** each 
25930 63 68 61 72 61 63 74 65 72 20 72 65 70 72 65 73  character repres
25940 65 6e 74 69 6e 67 20 61 20 6c 6f 63 6b 2e 20 20  enting a lock.  
25950 22 4d 22 20 66 6f 72 20 4d 55 54 45 58 2c 20 22  "M" for MUTEX, "
25960 53 22 20 66 6f 72 20 44 4d 53 2c 20 0a 2a 2a 20  S" for DMS, .** 
25970 61 6e 64 20 22 41 22 20 74 68 72 6f 75 67 68 20  and "A" through 
25980 22 44 22 20 66 6f 72 20 74 68 65 20 72 65 67 69  "D" for the regi
25990 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49 66 20 61 20  on locks.  If a 
259a0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 74 68  lock is held, th
259b0 65 0a 2a 2a 20 6c 65 74 74 65 72 20 69 73 20 73  e.** letter is s
259c0 68 6f 77 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f  hown.  If the lo
259d0 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 2c 20  ck is not held, 
259e0 74 68 65 20 6c 65 74 74 65 72 20 69 73 20 63 6f  the letter is co
259f0 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 22 2e  nverted.** to ".
25a00 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
25a10 75 74 69 6e 65 20 69 73 20 66 6f 72 20 64 65 62  utine is for deb
25a20 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 20  ugging purposes 
25a30 6f 6e 6c 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f  only and does no
25a40 74 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 61  t appear.** in a
25a50 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
25a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
25a70 73 74 20 63 68 61 72 20 2a 75 6e 69 78 53 68 6d  st char *unixShm
25a80 4c 6f 63 6b 53 74 72 69 6e 67 28 75 38 20 6d 61  LockString(u8 ma
25a90 73 6b 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  sk){.  static ch
25aa0 61 72 20 7a 42 75 66 5b 34 38 5d 3b 0a 20 20 73  ar zBuf[48];.  s
25ab0 74 61 74 69 63 20 69 6e 74 20 69 42 75 66 20 3d  tatic int iBuf =
25ac0 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a   0;.  char *z;..
25ad0 20 20 7a 20 3d 20 26 7a 42 75 66 5b 69 42 75 66    z = &zBuf[iBuf
25ae0 5d 3b 0a 20 20 69 42 75 66 20 2b 3d 20 38 3b 0a  ];.  iBuf += 8;.
25af0 20 20 69 66 28 20 69 42 75 66 3e 3d 73 69 7a 65    if( iBuf>=size
25b00 6f 66 28 7a 42 75 66 29 20 29 20 69 42 75 66 20  of(zBuf) ) iBuf 
25b10 3d 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d 20 28  = 0;..  z[0] = (
25b20 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f  mask & UNIX_SHM_
25b30 4d 55 54 45 58 29 20 3f 20 27 4d 27 20 3a 20 27  MUTEX) ? 'M' : '
25b40 2e 27 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 6d 61  .';.  z[1] = (ma
25b50 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  sk & UNIX_SHM_DM
25b60 53 29 20 20 20 3f 20 27 53 27 20 3a 20 27 2e 27  S)   ? 'S' : '.'
25b70 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28 6d 61 73 6b  ;.  z[2] = (mask
25b80 20 26 20 55 4e 49 58 5f 53 48 4d 5f 41 29 20 20   & UNIX_SHM_A)  
25b90 20 20 20 3f 20 27 41 27 20 3a 20 27 2e 27 3b 0a     ? 'A' : '.';.
25ba0 20 20 7a 5b 33 5d 20 3d 20 28 6d 61 73 6b 20 26    z[3] = (mask &
25bb0 20 55 4e 49 58 5f 53 48 4d 5f 42 29 20 20 20 20   UNIX_SHM_B)    
25bc0 20 3f 20 27 42 27 20 3a 20 27 2e 27 3b 0a 20 20   ? 'B' : '.';.  
25bd0 7a 5b 34 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55  z[4] = (mask & U
25be0 4e 49 58 5f 53 48 4d 5f 43 29 20 20 20 20 20 3f  NIX_SHM_C)     ?
25bf0 20 27 43 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b   'C' : '.';.  z[
25c00 35 5d 20 3d 20 28 6d 61 73 6b 20 26 20 55 4e 49  5] = (mask & UNI
25c10 58 5f 53 48 4d 5f 44 29 20 20 20 20 20 3f 20 27  X_SHM_D)     ? '
25c20 44 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 36 5d  D' : '.';.  z[6]
25c30 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
25c40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
25c50 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
25c60 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78  *.** Apply posix
25c70 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
25c80 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 69 64  for all bytes id
25c90 65 6e 74 69 66 69 65 64 20 69 6e 20 6c 6f 63 6b  entified in lock
25ca0 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b  Mask..**.** lock
25cb0 4d 61 73 6b 20 6d 69 67 68 74 20 63 6f 6e 74 61  Mask might conta
25cc0 69 6e 20 6d 75 6c 74 69 70 6c 65 20 62 69 74 73  in multiple bits
25cd0 20 62 75 74 20 61 6c 6c 20 62 69 74 73 20 61 72   but all bits ar
25ce0 65 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  e guaranteed.** 
25cf0 74 6f 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  to be contiguous
25d00 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c  ..**.** Locks bl
25d10 6f 63 6b 20 69 66 20 74 68 65 20 55 4e 49 58 5f  ock if the UNIX_
25d20 53 48 4d 5f 4d 55 54 45 58 20 62 69 74 20 69 73  SHM_MUTEX bit is
25d30 20 73 65 74 20 61 6e 64 20 61 72 65 20 6e 6f 6e   set and are non
25d40 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
25d50 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
25d60 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
25d70 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  temLock(.  unixS
25d80 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  hmFile *pFile,  
25d90 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
25da0 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
25db0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
25dc0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b  nt */.  int lock
25dd0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Type,         /*
25de0 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43   F_UNLCK, F_RDLC
25df0 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f  K, or F_WRLCK */
25e00 0a 20 20 75 38 20 6c 6f 63 6b 4d 61 73 6b 20 20  .  u8 lockMask  
25e10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
25e20 68 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  h bytes to lock 
25e30 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
25e40 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
25e50 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
25e60 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
25e70 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
25e80 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 4f 70 3b  */.  int lockOp;
25e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25ea0 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 66 63 6e  e opcode for fcn
25eb0 74 6c 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  tl() */.  int i;
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
25ee0 68 65 20 6c 6f 63 6b 69 6e 67 20 62 79 74 65 20  he locking byte 
25ef0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  range */.  int r
25f00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
25f10 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
25f20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a  form fcntl() */.
25f30 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20    u8 mask;      
25f40 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
25f50 6f 66 20 62 69 74 73 20 69 6e 20 6c 6f 63 6b 4d  of bits in lockM
25f60 61 73 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  ask */..  /* Acc
25f70 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
25f80 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73  hmFile object is
25f90 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
25fa0 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61  he caller */.  a
25fb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25fc0 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d  utex_held(pFile-
25fd0 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65  >mutex) || pFile
25fe0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
25ff0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
26000 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
26010 74 65 72 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ters */.  memset
26020 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  (&f, 0, sizeof(f
26030 29 29 3b 0a 20 20 66 2e 6c 5f 74 79 70 65 20 3d  ));.  f.l_type =
26040 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 66 2e 6c   lockType;.  f.l
26050 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
26060 45 54 3b 0a 20 20 69 66 28 20 28 6c 6f 63 6b 4d  ET;.  if( (lockM
26070 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 4d  ask & UNIX_SHM_M
26080 55 54 45 58 29 21 3d 30 20 26 26 20 6c 6f 63 6b  UTEX)!=0 && lock
26090 54 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type!=F_UNLCK ){
260a0 0a 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46 5f  .    lockOp = F_
260b0 53 45 54 4c 4b 57 3b 0a 20 20 20 20 4f 53 54 52  SETLKW;.    OSTR
260c0 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 72  ACE(("SHM-LOCK r
260d0 65 71 75 65 73 74 69 6e 67 20 62 6c 6f 63 6b 69  equesting blocki
260e0 6e 67 20 6c 6f 63 6b 5c 6e 22 29 29 3b 0a 20 20  ng lock\n"));.  
260f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 4f  }else{.    lockO
26100 70 20 3d 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 7d  p = F_SETLK;.  }
26110 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
26120 66 69 72 73 74 20 62 69 74 20 69 6e 20 6c 6f 63  first bit in loc
26130 6b 4d 61 73 6b 20 74 68 61 74 20 69 73 20 73 65  kMask that is se
26140 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20  t */.  for(i=0, 
26150 6d 61 73 6b 3d 30 78 30 31 3b 20 6d 61 73 6b 21  mask=0x01; mask!
26160 3d 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 26  =0 && (lockMask&
26170 6d 61 73 6b 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c  mask)==0; mask <
26180 3c 3d 20 31 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61  <= 1, i++){}.  a
26190 73 73 65 72 74 28 20 6d 61 73 6b 21 3d 30 20 29  ssert( mask!=0 )
261a0 3b 0a 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20  ;.  f.l_start = 
261b0 69 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 3b  i+UNIX_SHM_BASE;
261c0 0a 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  .  f.l_len = 1;.
261d0 0a 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65  .  /* Extend the
261e0 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 66   locking range f
261f0 6f 72 20 65 61 63 68 20 61 64 64 69 74 69 6f 6e  or each addition
26200 61 6c 20 62 69 74 20 74 68 61 74 20 69 73 20 73  al bit that is s
26210 65 74 20 2a 2f 0a 20 20 6d 61 73 6b 20 3c 3c 3d  et */.  mask <<=
26220 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6d 61 73   1;.  while( mas
26230 6b 21 3d 30 20 26 26 20 28 6c 6f 63 6b 4d 61 73  k!=0 && (lockMas
26240 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
26250 20 20 20 20 66 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20      f.l_len++;. 
26260 20 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20     mask <<= 1;. 
26270 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20   }..  /* Verify 
26280 74 68 61 74 20 61 6c 6c 20 62 69 74 73 20 73 65  that all bits se
26290 74 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b 20 61 72  t in lockMask ar
262a0 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 2a 2f 0a  e contiguous */.
262b0 20 20 61 73 73 65 72 74 28 20 6d 61 73 6b 3d 3d    assert( mask==
262c0 30 20 7c 7c 20 28 6c 6f 63 6b 4d 61 73 6b 20 26  0 || (lockMask &
262d0 20 7e 28 6d 61 73 6b 20 7c 20 28 6d 61 73 6b 2d   ~(mask | (mask-
262e0 31 29 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  1)))==0 );..  /*
262f0 20 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73   Acquire the sys
26300 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a  tem-level lock *
26310 2f 0a 20 20 72 63 20 3d 20 66 63 6e 74 6c 28 70  /.  rc = fcntl(p
26320 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 4f 70 2c  File->h, lockOp,
26330 20 26 66 29 3b 0a 20 20 72 63 20 3d 20 28 72 63   &f);.  rc = (rc
26340 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
26350 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
26360 59 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  Y;..  /* Update 
26370 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
26380 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
26390 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
263a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
263b0 47 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  G.  OSTRACE(("SH
263c0 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 69 66  M-LOCK "));.  if
263d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
263e0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
263f0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
26400 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
26410 75 6e 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20  unlock ok"));.  
26420 20 20 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d      pFile->exclM
26430 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b  ask &= ~lockMask
26440 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
26450 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f  haredMask &= ~lo
26460 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73  ckMask;.    }els
26470 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
26480 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
26490 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
264a0 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20  lock ok"));.    
264b0 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73    pFile->exclMas
264c0 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a  k &= ~lockMask;.
264d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
264e0 72 65 64 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d  redMask |= lockM
264f0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
26500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
26510 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
26520 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
26530 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6b  (("write-lock ok
26540 22 29 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  "));.      pFile
26550 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6c 6f  ->exclMask |= lo
26560 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20 20 70 46  ckMask;.      pF
26570 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ile->sharedMask 
26580 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20  &= ~lockMask;.  
26590 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
265a0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
265b0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
265c0 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
265d0 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20   failed"));.    
265e0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
265f0 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
26600 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
26610 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
26620 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
26630 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
26640 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
26650 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
26660 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 66 61 69  ("write-lock fai
26670 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  led"));.    }.  
26680 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d  }.  OSTRACE((" -
26690 20 63 68 61 6e 67 65 20 72 65 71 75 65 73 74 65   change requeste
266a0 64 20 25 73 20 2d 20 61 66 74 65 72 77 61 72 64  d %s - afterward
266b0 73 20 25 73 3a 25 73 5c 6e 22 2c 0a 20 20 20 20  s %s:%s\n",.    
266c0 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4c 6f         unixShmLo
266d0 63 6b 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73  ckString(lockMas
266e0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 75  k),.           u
266f0 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e 67  nixShmLockString
26700 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61  (pFile->sharedMa
26710 73 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sk),.           
26720 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72 69 6e  unixShmLockStrin
26730 67 28 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73  g(pFile->exclMas
26740 6b 29 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  k)));.#endif..  
26750 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20 20  return rc;      
26760 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20    .}../*.** For 
26770 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 75 6e  connection p, un
26780 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
26790 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65 64  locks identified
267a0 20 62 79 20 74 68 65 20 75 6e 6c 6f 63 6b 4d 61   by the unlockMa
267b0 73 6b 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e  sk.** parameter.
267c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
267d0 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20  nixShmUnlock(.  
267e0 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
267f0 6c 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  le,   /* The und
26800 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
26810 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
26820 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20 20  unixShm *p,     
26830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
26840 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e  nection to be un
26850 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75  locked */.  u8 u
26860 6e 6c 6f 63 6b 4d 61 73 6b 20 20 20 20 20 20 20  nlockMask       
26870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
26880 6b 73 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65  ks to be unlocke
26890 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
268a0 3b 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74  ;      /* Result
268b0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53   code */.  unixS
268c0 68 6d 20 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c  hm *pX; /* For l
268d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
268e0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
268f0 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d  ons */.  u8 allM
26900 61 73 6b 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  ask;  /* Union o
26910 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
26920 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
26930 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
26940 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
26950 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62  e unixShmFile ob
26960 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
26970 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
26980 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
26990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
269a0 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29  (pFile->mutex) )
269b0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
269c0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
269d0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
269e0 73 20 2a 2f 0a 20 20 61 6c 6c 4d 61 73 6b 20 3d  s */.  allMask =
269f0 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69   0;.  for(pX=pFi
26a00 6c 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  le->pFirst; pX; 
26a10 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
26a20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
26a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
26a40 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
26a50 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
26a60 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
26a70 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 6c 6c 4d  )==0 );.    allM
26a80 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
26a90 64 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dMask;.  }..  /*
26aa0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74   Unlock the syst
26ab0 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a  em-level locks *
26ac0 2f 0a 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d  /.  if( (unlockM
26ad0 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 21 3d  ask & allMask)!=
26ae0 75 6e 6c 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20 20  unlockMask ){.  
26af0 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
26b00 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  stemLock(pFile, 
26b10 46 5f 55 4e 4c 43 4b 2c 20 75 6e 6c 6f 63 6b 4d  F_UNLCK, unlockM
26b20 61 73 6b 20 26 20 7e 61 6c 6c 4d 61 73 6b 29 3b  ask & ~allMask);
26b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
26b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26b50 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  }..  /* Undo the
26b60 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
26b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 78  _OK ){.    p->ex
26b90 63 6c 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63  clMask &= ~unloc
26ba0 6b 4d 61 73 6b 3b 0a 20 20 20 20 70 2d 3e 73 68  kMask;.    p->sh
26bb0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 75 6e 6c  aredMask &= ~unl
26bc0 6f 63 6b 4d 61 73 6b 3b 0a 20 20 7d 20 0a 20 20  ockMask;.  } .  
26bd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26be0 0a 2a 2a 20 47 65 74 20 72 65 61 64 65 72 20 6c  .** Get reader l
26bf0 6f 63 6b 73 20 66 6f 72 20 63 6f 6e 6e 65 63 74  ocks for connect
26c00 69 6f 6e 20 70 20 6f 6e 20 61 6c 6c 20 6c 6f 63  ion p on all loc
26c10 6b 73 20 69 6e 20 74 68 65 20 72 65 61 64 4d 61  ks in the readMa
26c20 73 6b 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  sk parameter..*/
26c30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26c40 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 0a 20  ShmSharedLock(. 
26c50 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46   unixShmFile *pF
26c60 69 6c 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e  ile,   /* The un
26c70 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
26c80 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
26c90 20 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20 20 20   unixShm *p,    
26ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
26cb0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65 74 20  nnection to get 
26cc0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  the shared locks
26cd0 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4d 61 73   */.  u8 readMas
26ce0 6b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  k           /* M
26cf0 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
26d00 63 6b 73 20 74 6f 20 62 65 20 61 63 71 75 69 72  cks to be acquir
26d10 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
26d20 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  c;        /* Res
26d30 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
26d40 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20  ixShm *pX;   /* 
26d50 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
26d60 20 61 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e   all sibling con
26d70 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 38  nections */.  u8
26d80 20 61 6c 6c 53 68 61 72 65 64 3b 20 20 2f 2a 20   allShared;  /* 
26d90 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
26da0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
26db0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
26dc0 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  " */..  /* Acces
26dd0 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68 6d  s to the unixShm
26de0 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20 73  File object is s
26df0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
26e00 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
26e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
26e20 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
26e30 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
26e40 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
26e50 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
26e60 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
26e70 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
26e80 6e 73 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20  ns..  ** If any 
26e90 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
26ea0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
26eb0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
26ec0 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  d and return.  *
26ed0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  * SQLITE_BUSY.. 
26ee0 20 2a 2f 0a 20 20 61 6c 6c 53 68 61 72 65 64 20   */.  allShared 
26ef0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46  = 0;.  for(pX=pF
26f00 69 6c 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ile->pFirst; pX;
26f10 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
26f20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
26f30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26f40 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
26f50 26 20 72 65 61 64 4d 61 73 6b 29 21 3d 30 20 29  & readMask)!=0 )
26f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
26f70 55 53 59 3b 0a 20 20 20 20 61 6c 6c 53 68 61 72  USY;.    allShar
26f80 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
26f90 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Mask;.  }..  /* 
26fa0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
26fb0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
26fc0 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
26fd0 72 79 20 2a 2f 0a 20 20 69 66 28 20 28 7e 61 6c  ry */.  if( (~al
26fe0 6c 53 68 61 72 65 64 29 20 26 20 72 65 61 64 4d  lShared) & readM
26ff0 61 73 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ask ){.    rc = 
27000 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
27010 6b 28 70 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b  k(pFile, F_RDLCK
27020 2c 20 72 65 61 64 4d 61 73 6b 29 3b 0a 20 20 7d  , readMask);.  }
27030 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
27040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
27050 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
27060 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
27070 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
27080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
27090 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 72 65  sharedMask |= re
270a0 61 64 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65  adMask;.  }.  re
270b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
270c0 2a 20 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  * For connection
270d0 20 70 2c 20 67 65 74 20 61 6e 20 65 78 63 6c 75   p, get an exclu
270e0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c  sive lock on all
270f0 20 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65   locks identifie
27100 64 20 69 6e 0a 2a 2a 20 74 68 65 20 77 72 69 74  d in.** the writ
27110 65 4d 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e  eMask parameter.
27120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27130 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c  nixShmExclusiveL
27140 6f 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 46 69  ock(.  unixShmFi
27150 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  le *pFile,    /*
27160 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27170 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
27180 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
27190 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
271a0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
271b0 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
271c0 75 73 69 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  usive locks */. 
271d0 20 75 38 20 77 72 69 74 65 4d 61 73 6b 20 20 20   u8 writeMask   
271e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
271f0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
27200 6b 73 20 74 6f 20 62 65 20 61 63 71 75 69 72 65  ks to be acquire
27210 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
27220 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
27230 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69  lt code */.  uni
27240 78 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46  xShm *pX;   /* F
27250 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
27260 61 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  all sibling conn
27270 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a  ections */..  /*
27280 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
27290 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63  nixShmFile objec
272a0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
272b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
272c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
272d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
272e0 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  ile->mutex) );..
272f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
27300 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
27310 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
27320 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
27330 20 74 68 69 73 0a 20 20 2a 2a 20 6c 6f 63 6b 2e   this.  ** lock.
27340 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
27350 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
27360 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
27370 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d  .  for(pX=pFile-
27380 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
27390 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
273a0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
273b0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
273c0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 77 72  X->exclMask & wr
273d0 69 74 65 4d 61 73 6b 29 21 3d 30 20 29 20 72 65  iteMask)!=0 ) re
273e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
273f0 3b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73  ;.    if( (pX->s
27400 68 61 72 65 64 4d 61 73 6b 20 26 20 77 72 69 74  haredMask & writ
27410 65 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75  eMask)!=0 ) retu
27420 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
27430 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68    }..  /* Get th
27440 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
27450 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
27460 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
27470 73 75 63 63 65 73 73 66 75 6c 0a 20 20 2a 2a 20  successful.  ** 
27480 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
27490 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
274a0 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
274b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 75 6e 69 78    */.  rc = unix
274c0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46  ShmSystemLock(pF
274d0 69 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 77 72  ile, F_WRLCK, wr
274e0 69 74 65 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20  iteMask);.  if( 
274f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27500 0a 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61  .    p->sharedMa
27510 73 6b 20 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b  sk &= ~writeMask
27520 3b 0a 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73  ;.    p->exclMas
27530 6b 20 7c 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a  k |= writeMask;.
27540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  .}../*.** Purge 
27560 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 4c  the unixShmFileL
27570 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
27580 65 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69  entries with uni
27590 78 53 68 6d 46 69 6c 65 2e 6e 52 65 66 3d 3d 30  xShmFile.nRef==0
275a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
275b0 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
275c0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
275d0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
275e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
275f0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
27600 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
27610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27620 75 6e 69 78 53 68 6d 50 75 72 67 65 28 76 6f 69  unixShmPurge(voi
27630 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  d){.  unixShmFil
27640 65 20 2a 2a 70 70 3b 0a 20 20 75 6e 69 78 53 68  e **pp;.  unixSh
27650 6d 46 69 6c 65 20 2a 70 3b 0a 20 20 61 73 73 65  mFile *p;.  asse
27660 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
27670 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 75  d() );.  pp = &u
27680 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 3b 0a  nixShmFileList;.
27690 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
276a0 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
276b0 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
276c0 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
276d0 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x ) sqlite3_mute
276e0 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
276f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
27700 75 74 65 78 42 75 66 20 29 20 73 71 6c 69 74 65  utexBuf ) sqlite
27710 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
27720 6d 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20 20  mutexBuf);.     
27730 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 20 63   if( p->h>=0 ) c
27740 6c 6f 73 65 28 70 2d 3e 68 29 3b 0a 20 20 20 20  lose(p->h);.    
27750 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
27760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27770 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
27780 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
27790 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
277a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
277b0 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
277c0 79 20 61 72 65 61 2e 20 20 54 68 69 73 20 69 6d  y area.  This im
277d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
277e0 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e  s mmapped files.
277f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
27800 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
27810 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
27820 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
27830 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
27840 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
27850 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
27860 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
27870 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
27880 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
27890 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
278a0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
278b0 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
278c0 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  der cleared..*/.
278d0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
278e0 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  hmOpen(.  sqlite
278f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
27900 2f 2a 20 54 68 65 20 56 46 53 20 2a 2f 0a 20 20  /* The VFS */.  
27910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
27920 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
27930 20 66 69 6c 65 20 74 6f 20 6d 6d 61 70 20 2a 2f   file to mmap */
27940 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a  .  sqlite3_shm *
27950 2a 70 53 68 6d 20 20 20 20 2f 2a 20 57 72 69 74  *pShm    /* Writ
27960 65 20 74 68 65 20 75 6e 69 78 53 68 6d 20 6f 62  e the unixShm ob
27970 6a 65 63 74 20 63 72 65 61 74 65 64 20 68 65 72  ject created her
27980 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
27990 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
279b0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
279c0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
279d0 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46   struct unixShmF
279e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 30 3b 20  ile *pFile = 0; 
279f0 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
27a00 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
27a10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
27a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27a40 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73  sult code */.  s
27a50 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
27a60 20 66 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   fid;           
27a70 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 69    /* Unix file i
27a80 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20 20 73  dentifier */.  s
27a90 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
27aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ab0 20 20 2f 2a 20 52 65 73 75 6c 74 20 66 72 6f 6d    /* Result from
27ac0 20 73 74 61 74 28 29 20 61 6e 20 66 73 74 61 74   stat() an fstat
27ad0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  () */..  /* Allo
27ae0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
27af0 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
27b00 68 6d 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70  hm object */.  p
27b10 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
27b20 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
27b30 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
27b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
27b50 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
27b60 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 0a  , sizeof(*p));..
27b70 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65    /* Look to see
27b80 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
27b90 65 78 69 73 74 69 6e 67 20 75 6e 69 78 53 68 6d  existing unixShm
27ba0 46 69 6c 65 20 74 68 61 74 20 63 61 6e 20 62 65  File that can be
27bb0 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
27bc0 6f 20 6d 61 74 63 68 69 6e 67 20 75 6e 69 78 53  o matching unixS
27bd0 68 6d 46 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  hmFile currently
27be0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
27bf0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
27c00 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
27c10 28 29 3b 0a 20 20 72 63 20 3d 20 73 74 61 74 28  ();.  rc = stat(
27c20 7a 4e 61 6d 65 2c 20 26 73 53 74 61 74 29 3b 0a  zName, &sStat);.
27c30 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
27c40 20 20 20 6d 65 6d 73 65 74 28 26 66 69 64 2c 20     memset(&fid, 
27c50 30 2c 20 73 69 7a 65 6f 66 28 66 69 64 29 29 3b  0, sizeof(fid));
27c60 0a 20 20 20 20 66 69 64 2e 64 65 76 20 3d 20 73  .    fid.dev = s
27c70 53 74 61 74 2e 73 74 5f 64 65 76 3b 0a 20 20 20  Stat.st_dev;.   
27c80 20 66 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74   fid.ino = sStat
27c90 2e 73 74 5f 69 6e 6f 3b 0a 20 20 20 20 66 6f 72  .st_ino;.    for
27ca0 28 70 46 69 6c 65 20 3d 20 75 6e 69 78 53 68 6d  (pFile = unixShm
27cb0 46 69 6c 65 4c 69 73 74 3b 20 70 46 69 6c 65 3b  FileList; pFile;
27cc0 20 70 46 69 6c 65 3d 70 46 69 6c 65 2d 3e 70 4e   pFile=pFile->pN
27cd0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
27ce0 6d 65 6d 63 6d 70 28 26 70 46 69 6c 65 2d 3e 66  memcmp(&pFile->f
27cf0 69 64 2c 20 26 66 69 64 2c 20 73 69 7a 65 6f 66  id, &fid, sizeof
27d00 28 66 69 64 29 29 3d 3d 30 20 29 20 62 72 65 61  (fid))==0 ) brea
27d10 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
27d20 66 28 20 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( pFile==0 ){. 
27d30 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73     int nName = s
27d40 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
27d50 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
27d60 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
27d70 28 2a 70 46 69 6c 65 29 20 2b 20 6e 4e 61 6d 65  (*pFile) + nName
27d80 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
27d90 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
27da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27db0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
27dc0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
27dd0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
27de0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
27df0 2a 70 46 69 6c 65 29 29 3b 0a 20 20 20 20 70 46  *pFile));.    pF
27e00 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ile->zFilename =
27e10 20 28 63 68 61 72 2a 29 26 70 46 69 6c 65 5b 31   (char*)&pFile[1
27e20 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 46  ];.    memcpy(pF
27e30 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ile->zFilename, 
27e40 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
27e50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
27e60 2d 31 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70  -1;.    pFile->p
27e70 4e 65 78 74 20 3d 20 75 6e 69 78 53 68 6d 46 69  Next = unixShmFi
27e80 6c 65 4c 69 73 74 3b 0a 20 20 20 20 75 6e 69 78  leList;.    unix
27e90 53 68 6d 46 69 6c 65 4c 69 73 74 20 3d 20 70 46  ShmFileList = pF
27ea0 69 6c 65 3b 0a 0a 20 20 20 20 70 46 69 6c 65 2d  ile;..    pFile-
27eb0 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
27ec0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
27ed0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
27ee0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
27ef0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
27f00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27f10 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
27f20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
27f30 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d    }.    pFile->m
27f40 75 74 65 78 42 75 66 20 3d 20 73 71 6c 69 74 65  utexBuf = sqlite
27f50 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
27f60 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
27f70 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
27f80 3e 6d 75 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a  >mutexBuf==0 ){.
27f90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27fa0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
27fb0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
27fc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69  ;.    }..    pFi
27fd0 6c 65 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 4e 61  le->h = open(zNa
27fe0 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
27ff0 41 54 2c 20 30 36 36 34 29 3b 0a 20 20 20 20 69  AT, 0664);.    i
28000 66 28 20 70 46 69 6c 65 2d 3e 68 3c 30 20 29 7b  f( pFile->h<0 ){
28010 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28020 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
28030 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
28040 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
28050 0a 0a 20 20 20 20 72 63 20 3d 20 66 73 74 61 74  ..    rc = fstat
28060 28 70 46 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61  (pFile->h, &sSta
28070 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
28080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
28090 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
280a0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
280b0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
280c0 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 69 64  }.    pFile->fid
280d0 2e 64 65 76 20 3d 20 73 53 74 61 74 2e 73 74 5f  .dev = sStat.st_
280e0 64 65 76 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  dev;.    pFile->
280f0 66 69 64 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e  fid.ino = sStat.
28100 73 74 5f 69 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  st_ino;..    /* 
28110 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28120 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
28130 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
28140 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
28150 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
28160 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
28170 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
28180 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
28190 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
281a0 63 6b 28 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43  ck(pFile, F_WRLC
281b0 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55 54 45  K, UNIX_SHM_MUTE
281c0 58 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  X) ){.      rc =
281d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
281e0 43 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  CK;.      goto s
281f0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
28200 20 7d 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53   }.    if( unixS
28210 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69  hmSystemLock(pFi
28220 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49  le, F_WRLCK, UNI
28230 58 5f 53 48 4d 5f 44 4d 53 29 3d 3d 53 51 4c 49  X_SHM_DMS)==SQLI
28240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
28250 66 28 20 66 74 72 75 6e 63 61 74 65 28 70 46 69  f( ftruncate(pFi
28260 6c 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20  le->h, 0) ){.   
28270 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28280 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a  _IOERR;.      }.
28290 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
282a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
282b0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
282c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c  mSystemLock(pFil
282d0 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
282e0 5f 53 48 4d 5f 44 4d 53 29 3b 0a 20 20 20 20 7d  _SHM_DMS);.    }
282f0 0a 20 20 20 20 75 6e 69 78 53 68 6d 53 79 73 74  .    unixShmSyst
28300 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f  emLock(pFile, F_
28310 55 4e 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  UNLCK, UNIX_SHM_
28320 4d 55 54 45 58 29 3b 0a 20 20 20 20 69 66 28 20  MUTEX);.    if( 
28330 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
28340 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
28350 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
28360 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
28370 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
28380 46 69 6c 65 20 2a 2f 0a 20 20 70 2d 3e 70 46 69  File */.  p->pFi
28390 6c 65 20 3d 20 70 46 69 6c 65 3b 0a 20 20 70 2d  le = pFile;.  p-
283a0 3e 70 4e 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e  >pNext = pFile->
283b0 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53  pFirst;.#ifdef S
283c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
283d0 3e 69 64 20 3d 20 70 46 69 6c 65 2d 3e 6e 65 78  >id = pFile->nex
283e0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
283f0 0a 20 20 70 46 69 6c 65 2d 3e 70 46 69 72 73 74  .  pFile->pFirst
28400 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e   = p;.  pFile->n
28410 52 65 66 2b 2b 3b 0a 20 20 2a 70 53 68 6d 20 3d  Ref++;.  *pShm =
28420 20 28 73 71 6c 69 74 65 33 5f 73 68 6d 2a 29 70   (sqlite3_shm*)p
28430 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
28440 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ex();.  return S
28450 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
28460 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
28470 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
28480 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68  en_err:.  unixSh
28490 6d 50 75 72 67 65 28 29 3b 0a 20 20 73 71 6c 69  mPurge();.  sqli
284a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
284b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
284c0 65 29 3b 0a 20 20 2a 70 53 68 6d 20 3d 20 30 3b  e);.  *pShm = 0;
284d0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
284e0 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
284f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
28500 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6f 6e 20 74   a connectioon t
28510 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
28520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28530 6e 69 78 53 68 6d 43 6c 6f 73 65 28 73 71 6c 69  nixShmClose(sqli
28540 74 65 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64  te3_shm *pShared
28550 4d 65 6d 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  Mem){.  unixShm 
28560 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
28570 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
28580 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
28590 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a  .  unixShmFile *
285a0 70 46 69 6c 65 3b 20 20 20 20 2f 2a 20 54 68 65  pFile;    /* The
285b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
285c0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
285d0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
285e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
285f0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
28600 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
28610 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53 68  ns */..  if( pSh
28620 61 72 65 64 4d 65 6d 3d 3d 30 20 29 20 72 65 74  aredMem==0 ) ret
28630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28640 20 70 20 3d 20 28 73 74 72 75 63 74 20 75 6e 69   p = (struct uni
28650 78 53 68 6d 2a 29 70 53 68 61 72 65 64 4d 65 6d  xShm*)pSharedMem
28660 3b 0a 20 20 70 46 69 6c 65 20 3d 20 70 2d 3e 70  ;.  pFile = p->p
28670 46 69 6c 65 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  File;..  /* Veri
28680 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  fy that the conn
28690 65 63 74 69 6f 6e 20 62 65 69 6e 67 20 63 6c 6f  ection being clo
286a0 73 65 64 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f 63  sed holds no loc
286b0 6b 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ks */.  assert( 
286c0 70 2d 3e 65 78 63 6c 4d 61 73 6b 3d 3d 30 20 29  p->exclMask==0 )
286d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
286e0 68 61 72 65 64 4d 61 73 6b 3d 3d 30 20 29 3b 0a  haredMask==0 );.
286f0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
28700 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
28710 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
28720 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
28730 20 77 69 74 68 20 70 46 69 6c 65 20 2a 2f 0a 20   with pFile */. 
28740 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
28750 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65  nter(pFile->mute
28760 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 46  x);.  for(pp=&pF
28770 69 6c 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ile->pFirst; (*p
28780 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
28790 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
287a0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
287b0 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
287c0 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
287d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
287e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
287f0 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
28800 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
28810 46 69 6c 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  File->nRef has r
28820 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
28830 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
28840 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
28850 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
28860 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
28870 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
28880 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3e 30 20  ( pFile->nRef>0 
28890 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65 66  );.  pFile->nRef
288a0 2d 2d 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  --;.  if( pFile-
288b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
288c0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 29 3b 0a  unixShmPurge();.
288d0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
288e0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
288f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28900 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 61 6e 64 2f  /*.** Query and/
28910 6f 72 20 63 68 61 6e 67 65 73 20 74 68 65 20 73  or changes the s
28920 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72  ize of the under
28930 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 20 66 6f  lying storage fo
28940 72 0a 2a 2a 20 61 20 73 68 61 72 65 64 2d 6d 65  r.** a shared-me
28950 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 20 20 54  mory segment.  T
28960 68 65 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d  he reqSize param
28970 65 74 65 72 20 69 73 20 74 68 65 20 6e 65 77 20  eter is the new 
28980 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20 75  size.** of the u
28990 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
289a0 65 2c 20 6f 72 20 2d 31 20 74 6f 20 64 6f 20 6a  e, or -1 to do j
289b0 75 73 74 20 61 20 71 75 65 72 79 2e 20 20 54 68  ust a query.  Th
289c0 65 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65  e size.** of the
289d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
289e0 61 67 65 20 28 61 66 74 65 72 20 72 65 73 69 7a  age (after resiz
289f0 69 6e 67 20 69 66 20 72 65 73 69 7a 69 6e 67 20  ing if resizing 
28a00 6f 63 63 75 72 73 29 20 69 73 0a 2a 2a 20 77 72  occurs) is.** wr
28a10 69 74 74 65 6e 20 69 6e 74 6f 20 70 4e 65 77 53  itten into pNewS
28a20 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
28a30 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
28a40 20 28 6e 65 63 65 73 73 61 72 69 6c 79 29 20 63   (necessarily) c
28a50 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
28a60 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 0a 2a  f the mapping .*
28a70 2a 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  * of the underly
28a80 69 6e 67 20 73 74 6f 72 61 67 65 20 69 6e 74 6f  ing storage into
28a90 20 6d 65 6d 6f 72 79 2e 20 20 55 73 65 20 78 53   memory.  Use xS
28aa0 68 6d 47 65 74 28 29 20 74 6f 20 63 68 61 6e 67  hmGet() to chang
28ab0 65 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67  e.** the mapping
28ac0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
28ad0 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74   reqSize paramet
28ae0 65 72 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  er is the minimu
28af0 6d 20 73 69 7a 65 20 72 65 71 75 65 73 74 65 64  m size requested
28b00 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
28b10 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 66 72 65 65  ation.** is free
28b20 20 74 6f 20 65 78 70 61 6e 64 20 74 68 65 20 73   to expand the s
28b30 74 6f 72 61 67 65 20 74 6f 20 73 6f 6d 65 20 6c  torage to some l
28b40 61 72 67 65 72 20 61 6d 6f 75 6e 74 20 69 66 20  arger amount if 
28b50 69 74 20 63 68 6f 6f 73 65 73 2e 0a 2a 2f 0a 73  it chooses..*/.s
28b60 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
28b70 6d 53 69 7a 65 28 0a 20 20 73 71 6c 69 74 65 33  mSize(.  sqlite3
28b80 5f 73 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d  _shm *pSharedMem
28b90 2c 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 72 65  ,  /* Pointer re
28ba0 74 75 72 6e 65 64 20 62 79 20 75 6e 69 78 53 68  turned by unixSh
28bb0 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  mOpen() */.  int
28bc0 20 72 65 71 53 69 7a 65 2c 20 20 20 20 20 20 20   reqSize,       
28bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73         /* Reques
28be0 74 65 64 20 73 69 7a 65 2e 20 20 2d 31 20 66 6f  ted size.  -1 fo
28bf0 72 20 71 75 65 72 79 20 6f 6e 6c 79 20 2a 2f 0a  r query only */.
28c00 20 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 20    int *pNewSize 
28c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
28c20 72 69 74 65 20 6e 65 77 20 73 69 7a 65 20 68 65  rite new size he
28c30 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  re */.){.  unixS
28c40 68 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d  hm *p = (unixShm
28c50 2a 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20  *)pSharedMem;.  
28c60 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
28c70 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20  le = p->pFile;. 
28c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28c90 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74 20 73 74  _OK;.  struct st
28ca0 61 74 20 73 53 74 61 74 3b 0a 0a 20 20 69 66 28  at sStat;..  if(
28cb0 20 72 65 71 53 69 7a 65 3e 3d 30 20 29 7b 0a 20   reqSize>=0 ){. 
28cc0 20 20 20 72 65 71 53 69 7a 65 20 3d 20 28 72 65     reqSize = (re
28cd0 71 53 69 7a 65 20 2b 20 53 51 4c 49 54 45 5f 55  qSize + SQLITE_U
28ce0 4e 49 58 5f 53 48 4d 5f 49 4e 43 52 20 2d 20 31  NIX_SHM_INCR - 1
28cf0 29 2f 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53 48  )/SQLITE_UNIX_SH
28d00 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72 65 71 53  M_INCR;.    reqS
28d10 69 7a 65 20 2a 3d 20 53 51 4c 49 54 45 5f 55 4e  ize *= SQLITE_UN
28d20 49 58 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20 20 20  IX_SHM_INCR;.   
28d30 20 72 63 20 3d 20 66 74 72 75 6e 63 61 74 65 28   rc = ftruncate(
28d40 70 46 69 6c 65 2d 3e 68 2c 20 72 65 71 53 69 7a  pFile->h, reqSiz
28d50 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 73  e);.  }.  if( fs
28d60 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 73  tat(pFile->h, &s
28d70 53 74 61 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Stat)==0 ){.    
28d80 2a 70 4e 65 77 53 69 7a 65 20 3d 20 28 69 6e 74  *pNewSize = (int
28d90 29 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3b 0a  )sStat.st_size;.
28da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e    }else{.    *pN
28db0 65 77 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  ewSize = 0;.    
28dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
28dd0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
28de0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61  rc;.}.../*.** Ma
28df0 70 20 74 68 65 20 73 68 61 72 65 64 20 73 74 6f  p the shared sto
28e00 72 61 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  rage into memory
28e10 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
28e20 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 61  ize of the.** ma
28e30 70 70 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20  pping should be 
28e40 72 65 71 4d 61 70 53 69 7a 65 20 69 66 20 72 65  reqMapSize if re
28e50 71 4d 61 70 53 69 7a 65 20 69 73 20 70 6f 73 69  qMapSize is posi
28e60 74 69 76 65 2e 20 20 49 66 0a 2a 2a 20 72 65 71  tive.  If.** req
28e70 4d 61 70 53 69 7a 65 20 69 73 20 7a 65 72 6f 20  MapSize is zero 
28e80 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  or negative, the
28e90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28ea0 63 61 6e 20 63 68 6f 6f 73 65 0a 2a 2a 20 77 68  can choose.** wh
28eb0 61 74 65 76 65 72 20 6d 61 70 70 69 6e 67 20 73  atever mapping s
28ec0 69 7a 65 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e  ize is convenien
28ed0 74 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20  t..**.** *ppBuf 
28ee0 69 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  is made to point
28ef0 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 77   to the memory w
28f00 68 69 63 68 20 69 73 20 61 20 6d 61 70 70 69 6e  hich is a mappin
28f10 67 20 6f 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  g of the.** unde
28f20 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 20  rlying storage. 
28f30 20 41 20 6d 75 74 65 78 20 69 73 20 61 63 71 75   A mutex is acqu
28f40 69 72 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20  ired to prevent 
28f50 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a  other threads.**
28f60 20 66 72 6f 6d 20 72 75 6e 6e 69 6e 67 20 77 68   from running wh
28f70 69 6c 65 20 2a 70 70 42 75 66 20 69 73 20 69 6e  ile *ppBuf is in
28f80 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
28f90 20 70 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74   prevent other t
28fa0 68 72 65 61 64 73 0a 2a 2a 20 72 65 6d 61 70 70  hreads.** remapp
28fb0 69 6e 67 20 2a 70 70 42 75 66 20 6f 75 74 20 66  ing *ppBuf out f
28fc0 72 6f 6d 20 75 6e 64 65 72 20 74 68 69 73 20 74  rom under this t
28fd0 68 72 65 61 64 2e 20 20 54 68 65 20 75 6e 69 78  hread.  The unix
28fe0 53 68 6d 52 65 6c 65 61 73 65 28 29 0a 2a 2a 20  ShmRelease().** 
28ff0 63 61 6c 6c 20 77 69 6c 6c 20 72 65 6c 65 61 73  call will releas
29000 65 20 74 68 65 20 6d 75 74 65 78 2e 20 20 48 6f  e the mutex.  Ho
29010 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 6c 6f  wever, if the lo
29020 63 6b 20 73 74 61 74 65 20 69 73 20 43 48 45 43  ck state is CHEC
29030 4b 50 4f 49 4e 54 2c 0a 2a 2a 20 74 68 65 20 6d  KPOINT,.** the m
29040 75 74 65 78 20 69 73 20 6e 6f 74 20 61 63 71 75  utex is not acqu
29050 69 72 65 64 20 62 65 63 61 75 73 65 20 43 48 45  ired because CHE
29060 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20 6e 65 76  CKPOINT will nev
29070 65 72 20 72 65 6d 61 70 20 74 68 65 0a 2a 2a 20  er remap the.** 
29080 62 75 66 66 65 72 2e 20 20 52 45 43 4f 56 45 52  buffer.  RECOVER
29090 20 6d 69 67 68 74 20 72 65 6d 61 70 2c 20 74 68   might remap, th
290a0 6f 75 67 68 2c 20 73 6f 20 43 48 45 43 4b 50 4f  ough, so CHECKPO
290b0 49 4e 54 20 77 69 6c 6c 20 61 63 71 75 69 72 65  INT will acquire
290c0 0a 2a 2a 20 74 68 65 20 6d 75 74 65 78 20 69 66  .** the mutex if
290d0 20 61 6e 64 20 77 68 65 6e 20 69 74 20 70 72 6f   and when it pro
290e0 6d 6f 74 65 73 20 74 6f 20 52 45 43 4f 56 45 52  motes to RECOVER
290f0 2e 0a 2a 2a 0a 2a 2a 20 52 45 43 4f 56 45 52 20  ..**.** RECOVER 
29100 6e 65 65 64 73 20 74 6f 20 62 65 20 61 74 6f 6d  needs to be atom
29110 69 63 2e 20 20 54 68 65 20 73 61 6d 65 20 6d 75  ic.  The same mu
29120 74 65 78 20 74 68 61 74 20 70 72 65 76 65 6e 74  tex that prevent
29130 73 20 2a 70 70 42 75 66 20 66 72 6f 6d 0a 2a 2a  s *ppBuf from.**
29140 20 62 65 69 6e 67 20 72 65 6d 61 70 70 65 64 20   being remapped 
29150 61 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 6d 6f  also prevents mo
29160 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 68 72 65  re than one thre
29170 61 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 69 6e  ad from being in
29180 0a 2a 2a 20 52 45 43 4f 56 45 52 20 61 74 20 61  .** RECOVER at a
29190 20 74 69 6d 65 2e 20 20 42 75 74 2c 20 52 45 43   time.  But, REC
291a0 4f 56 45 52 20 73 6f 6d 65 74 69 6d 65 73 20 77  OVER sometimes w
291b0 61 6e 74 73 20 74 6f 20 72 65 6d 61 70 20 69 74  ants to remap it
291c0 73 65 6c 66 2e 0a 2a 2a 20 54 6f 20 70 72 65 76  self..** To prev
291d0 65 6e 74 20 52 45 43 4f 56 45 52 20 66 72 6f 6d  ent RECOVER from
291e0 20 6c 6f 73 69 6e 67 20 69 74 73 20 6c 6f 63 6b   losing its lock
291f0 20 77 68 69 6c 65 20 72 65 6d 61 70 70 69 6e 67   while remapping
29200 2c 20 74 68 65 0a 2a 2a 20 6d 75 74 65 78 20 69  , the.** mutex i
29210 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 20 62  s not released b
29220 79 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65  y unixShmRelease
29230 28 29 20 77 68 65 6e 20 69 6e 20 52 45 43 4f 56  () when in RECOV
29240 45 52 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e 65 77 4d  ER..**.** *pNewM
29250 61 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  apSize is set to
29260 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
29270 20 6d 61 70 70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   mapping..**.** 
29280 2a 70 70 42 75 66 20 61 6e 64 20 2a 70 4e 65 77  *ppBuf and *pNew
29290 4d 61 70 53 69 7a 65 20 6d 69 67 68 74 20 62 65  MapSize might be
292a0 20 4e 55 4c 4c 20 61 6e 64 20 7a 65 72 6f 20 69   NULL and zero i
292b0 66 20 6e 6f 20 73 70 61 63 65 20 68 61 73 0a 2a  f no space has.*
292c0 2a 20 79 65 74 20 62 65 65 6e 20 61 6c 6c 6f 63  * yet been alloc
292d0 61 74 65 64 20 74 6f 20 74 68 65 20 75 6e 64 65  ated to the unde
292e0 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 0a  rlying storage..
292f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
29300 69 78 53 68 6d 47 65 74 28 0a 20 20 73 71 6c 69  ixShmGet(.  sqli
29310 74 65 33 5f 73 68 6d 20 2a 70 53 68 61 72 65 64  te3_shm *pShared
29320 4d 65 6d 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  Mem, /* Pointer 
29330 72 65 74 75 72 6e 65 64 20 62 79 20 75 6e 69 78  returned by unix
29340 53 68 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  ShmOpen() */.  i
29350 6e 74 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 20  nt reqMapSize,  
29360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65          /* Reque
29370 73 74 65 64 20 73 69 7a 65 20 6f 66 20 6d 61 70  sted size of map
29380 70 69 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20 64  ping. -1 means d
29390 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 20 20 69  on't care */.  i
293a0 6e 74 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 2c  nt *pNewMapSize,
293b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
293c0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 6d 61 70   new size of map
293d0 70 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 76  ping here */.  v
293e0 6f 69 64 20 2a 2a 70 70 42 75 66 20 20 20 20 20  oid **ppBuf     
293f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
29400 20 6d 61 70 70 69 6e 67 20 62 75 66 66 65 72 20   mapping buffer 
29410 6f 72 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29  origin here */.)
29420 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  {.  unixShm *p =
29430 20 28 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72   (unixShm*)pShar
29440 65 64 4d 65 6d 3b 0a 20 20 75 6e 69 78 53 68 6d  edMem;.  unixShm
29450 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d  File *pFile = p-
29460 3e 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  >pFile;.  int rc
29470 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29480 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74   if( p->lockStat
29490 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48  e!=SQLITE_SHM_CH
294a0 45 43 4b 50 4f 49 4e 54 20 26 26 20 70 2d 3e 68  ECKPOINT && p->h
294b0 61 73 4d 75 74 65 78 42 75 66 3d 3d 30 20 29 7b  asMutexBuf==0 ){
294c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
294d0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
294e0 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
294f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
29500 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c  mutex_enter(pFil
29510 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20 20  e->mutexBuf);.  
29520 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66    p->hasMutexBuf
29530 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
29540 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
29550 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  pFile->mutex);. 
29560 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 4d 61   if( pFile->szMa
29570 70 3d 3d 30 20 7c 7c 20 72 65 71 4d 61 70 53 69  p==0 || reqMapSi
29580 7a 65 3e 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 20  ze>pFile->szMap 
29590 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 75 61  ){.    int actua
295a0 6c 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 75  lSize;.    if( u
295b0 6e 69 78 53 68 6d 53 69 7a 65 28 70 53 68 61 72  nixShmSize(pShar
295c0 65 64 4d 65 6d 2c 20 2d 31 2c 20 26 61 63 74 75  edMem, -1, &actu
295d0 61 6c 53 69 7a 65 29 3d 3d 53 51 4c 49 54 45 5f  alSize)==SQLITE_
295e0 4f 4b 0a 20 20 20 20 20 26 26 20 72 65 71 4d 61  OK.     && reqMa
295f0 70 53 69 7a 65 3c 61 63 74 75 61 6c 53 69 7a 65  pSize<actualSize
29600 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
29610 71 4d 61 70 53 69 7a 65 20 3d 20 61 63 74 75 61  qMapSize = actua
29620 6c 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  lSize;.    }.   
29630 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 4d 61   if( pFile->pMMa
29640 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 6d 75  pBuf ){.      mu
29650 6e 6d 61 70 28 70 46 69 6c 65 2d 3e 70 4d 4d 61  nmap(pFile->pMMa
29660 70 42 75 66 2c 20 70 46 69 6c 65 2d 3e 73 7a 4d  pBuf, pFile->szM
29670 61 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ap);.    }.    p
29680 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75 66 20 3d  File->pMMapBuf =
29690 20 6d 6d 61 70 28 30 2c 20 72 65 71 4d 61 70 53   mmap(0, reqMapS
296a0 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50  ize, PROT_READ|P
296b0 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41 50 5f 53  ROT_WRITE, MAP_S
296c0 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20  HARED,.         
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296e0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 30 29 3b 0a    pFile->h, 0);.
296f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 4d 61 70      pFile->szMap
29700 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42   = pFile->pMMapB
29710 75 66 20 3f 20 72 65 71 4d 61 70 53 69 7a 65 20  uf ? reqMapSize 
29720 3a 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 4e 65 77  : 0;.  }.  *pNew
29730 4d 61 70 53 69 7a 65 20 3d 20 70 46 69 6c 65 2d  MapSize = pFile-
29740 3e 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75 66  >szMap;.  *ppBuf
29750 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42   = pFile->pMMapB
29760 75 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  uf;.  sqlite3_mu
29770 74 65 78 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d  tex_leave(pFile-
29780 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
29790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
297a0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
297b0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 68 61 72  held on the shar
297c0 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed memory segmen
297d0 74 20 74 6f 20 74 68 61 74 20 6f 74 68 65 72 0a  t to that other.
297e0 2a 2a 20 74 68 72 65 61 64 73 20 61 72 65 20 66  ** threads are f
297f0 72 65 65 20 74 6f 20 72 65 73 69 7a 65 20 69 74  ree to resize it
29800 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
29810 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
29820 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
29830 79 20 68 65 6c 64 2c 20 74 68 69 73 20 72 6f 75  y held, this rou
29840 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
29850 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ss no-op..**.** 
29860 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
29870 6d 6f 72 79 20 6f 62 6a 65 63 74 20 69 73 20 69  mory object is i
29880 6e 20 6c 6f 63 6b 20 73 74 61 74 65 20 52 45 43  n lock state REC
29890 4f 56 45 52 2c 20 74 68 65 6e 20 77 65 20 64 6f  OVER, then we do
298a0 20 6e 6f 74 0a 2a 2a 20 72 65 61 6c 6c 79 20 77   not.** really w
298b0 61 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 74  ant to release t
298c0 68 65 20 6c 6f 63 6b 2c 20 73 6f 20 69 6e 20 74  he lock, so in t
298d0 68 61 74 20 63 61 73 65 20 74 6f 6f 2c 20 74 68  hat case too, th
298e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
298f0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
29900 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
29910 65 6c 65 61 73 65 28 73 71 6c 69 74 65 33 5f 73  elease(sqlite3_s
29920 68 6d 20 2a 70 53 68 61 72 65 64 4d 65 6d 29 7b  hm *pSharedMem){
29930 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
29940 28 75 6e 69 78 53 68 6d 2a 29 70 53 68 61 72 65  (unixShm*)pShare
29950 64 4d 65 6d 3b 0a 20 20 69 66 28 20 70 2d 3e 68  dMem;.  if( p->h
29960 61 73 4d 75 74 65 78 42 75 66 20 26 26 20 70 2d  asMutexBuf && p-
29970 3e 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49  >lockState!=SQLI
29980 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29  TE_SHM_RECOVER )
29990 7b 0a 20 20 20 20 75 6e 69 78 53 68 6d 46 69 6c  {.    unixShmFil
299a0 65 20 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46  e *pFile = p->pF
299b0 69 6c 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ile;.    assert(
299c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
299d0 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  otheld(pFile->mu
299e0 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
299f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
29a00 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 29  pFile->mutexBuf)
29a10 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65  ;.    p->hasMute
29a20 78 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xBuf = 0;.  }.  
29a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6d 62 6f  ;.}../*.** Symbo
29a50 6c 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 4c 4f  lic names for LO
29a60 43 4b 20 73 74 61 74 65 73 20 75 73 65 64 20 66  CK states used f
29a70 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
29a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29a90 45 42 55 47 0a 73 74 61 74 69 63 20 63 6f 6e 73  EBUG.static cons
29aa0 74 20 63 68 61 72 20 2a 61 7a 4c 6b 4e 61 6d 65  t char *azLkName
29ab0 5b 5d 20 3d 20 7b 0a 20 20 22 55 4e 4c 4f 43 4b  [] = {.  "UNLOCK
29ac0 22 2c 0a 20 20 22 52 45 41 44 22 2c 0a 20 20 22  ",.  "READ",.  "
29ad0 52 45 41 44 5f 46 55 4c 4c 22 2c 0a 20 20 22 57  READ_FULL",.  "W
29ae0 52 49 54 45 22 2c 0a 20 20 22 50 45 4e 44 49 4e  RITE",.  "PENDIN
29af0 47 22 2c 0a 20 20 22 43 48 45 43 4b 50 4f 49 4e  G",.  "CHECKPOIN
29b00 54 22 2c 0a 20 20 22 52 45 43 4f 56 45 52 22 0a  T",.  "RECOVER".
29b10 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  };.#endif.../*.*
29b20 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
29b30 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
29b40 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
29b50 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
29b60 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
29b70 20 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 2a 70    sqlite3_shm *p
29b80 53 68 61 72 65 64 4d 65 6d 2c 20 20 20 2f 2a 20  SharedMem,   /* 
29b90 50 6f 69 6e 74 65 72 20 66 72 6f 6d 20 75 6e 69  Pointer from uni
29ba0 78 53 68 6d 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  xShmOpen() */.  
29bb0 69 6e 74 20 64 65 73 69 72 65 64 4c 6f 63 6b 2c  int desiredLock,
29bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
29bd0 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  e of SQLITE_SHM_
29be0 78 78 78 78 78 20 6c 6f 63 6b 69 6e 67 20 73 74  xxxxx locking st
29bf0 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ates */.  int *p
29c00 47 6f 74 4c 6f 63 6b 20 20 20 20 20 20 20 20 20  GotLock         
29c10 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b       /* The lock
29c20 20 79 6f 75 20 61 63 74 75 61 6c 6c 79 20 67 6f   you actually go
29c30 74 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  t */.){.  unixSh
29c40 6d 20 2a 70 20 3d 20 28 75 6e 69 78 53 68 6d 2a  m *p = (unixShm*
29c50 29 70 53 68 61 72 65 64 4d 65 6d 3b 0a 20 20 75  )pSharedMem;.  u
29c60 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c  nixShmFile *pFil
29c70 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20 20  e = p->pFile;.  
29c80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29c90 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 2f 2a 20  PROTOCOL;..  /* 
29ca0 4e 6f 74 65 20 74 68 61 74 20 53 51 4c 49 54 45  Note that SQLITE
29cb0 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 61  _SHM_READ_FULL a
29cc0 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45  nd SQLITE_SHM_PE
29cd0 4e 44 49 4e 47 20 61 72 65 20 6e 65 76 65 72 0a  NDING are never.
29ce0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 72 65    ** directly re
29cf0 71 75 65 73 74 65 64 3b 20 74 68 65 79 20 61 72  quested; they ar
29d00 65 20 73 69 64 65 20 65 66 66 65 63 74 73 20 66  e side effects f
29d10 72 6f 6d 20 72 65 71 75 65 73 74 69 6e 67 0a 20  rom requesting. 
29d20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52   ** SQLITE_SHM_R
29d30 45 41 44 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  EAD and SQLITE_S
29d40 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20 72  HM_CHECKPOINT, r
29d50 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
29d60 2f 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  /.  assert( desi
29d70 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
29d80 53 48 4d 5f 51 55 45 52 59 0a 20 20 20 20 20 20  SHM_QUERY.      
29d90 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
29da0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
29db0 43 4b 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73  CK.       || des
29dc0 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
29dd0 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20 20  _SHM_READ.      
29de0 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
29df0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54  =SQLITE_SHM_WRIT
29e00 45 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69  E.       || desi
29e10 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
29e20 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 0a 20  SHM_CHECKPOINT. 
29e30 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64        || desired
29e40 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
29e50 5f 52 45 43 4f 56 45 52 20 29 3b 0a 0a 20 20 2f  _RECOVER );..  /
29e60 2a 20 52 65 74 75 72 6e 20 64 69 72 65 63 74 6c  * Return directl
29e70 79 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  y if this is jus
29e80 74 20 61 20 6c 6f 63 6b 20 73 74 61 74 65 20 71  t a lock state q
29e90 75 65 72 79 2c 20 6f 72 20 69 66 0a 20 20 2a 2a  uery, or if.  **
29ea0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
29eb0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
29ec0 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e  e desired lockin
29ed0 67 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  g state..  */.  
29ee0 69 66 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d  if( desiredLock=
29ef0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 51 55 45 52  =SQLITE_SHM_QUER
29f00 59 0a 20 20 20 7c 7c 20 64 65 73 69 72 65 64 4c  Y.   || desiredL
29f10 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63 6b 53 74 61 74  ock==p->lockStat
29f20 65 0a 20 20 20 7c 7c 20 28 64 65 73 69 72 65 64  e.   || (desired
29f30 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
29f40 5f 52 45 41 44 20 26 26 20 70 2d 3e 6c 6f 63 6b  _READ && p->lock
29f50 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48  State==SQLITE_SH
29f60 4d 5f 52 45 41 44 5f 46 55 4c 4c 29 0a 20 20 29  M_READ_FULL).  )
29f70 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
29f80 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
29f90 64 2c 20 70 69 64 2d 25 64 20 72 65 71 75 65 73  d, pid-%d reques
29fa0 74 20 25 73 20 61 6e 64 20 67 6f 74 20 25 73 5c  t %s and got %s\
29fb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29fc0 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29   p->id, getpid()
29fd0 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72  , azLkName[desir
29fe0 65 64 4c 6f 63 6b 5d 2c 20 61 7a 4c 6b 4e 61 6d  edLock], azLkNam
29ff0 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29  e[p->lockState])
2a000 29 3b 0a 20 20 20 20 69 66 28 20 70 47 6f 74 4c  );.    if( pGotL
2a010 6f 63 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20  ock ) *pGotLock 
2a020 3d 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a  = p->lockState;.
2a030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a040 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  E_OK;.  }..  OST
2a050 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
2a060 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
2a070 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25 73 5c   request %s->%s\
2a080 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2a090 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28 29 2c  p->id, getpid(),
2a0a0 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63   azLkName[p->loc
2a0b0 6b 53 74 61 74 65 5d 2c 20 61 7a 4c 6b 4e 61 6d  kState], azLkNam
2a0c0 65 5b 64 65 73 69 72 65 64 4c 6f 63 6b 5d 29 29  e[desiredLock]))
2a0d0 3b 0a 20 20 0a 20 20 69 66 28 20 64 65 73 69 72  ;.  .  if( desir
2a0e0 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
2a0f0 48 4d 5f 52 45 43 4f 56 45 52 20 26 26 20 21 70  HM_RECOVER && !p
2a100 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 29 7b  ->hasMutexBuf ){
2a110 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2a120 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
2a130 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
2a140 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
2a150 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c  mutex_enter(pFil
2a160 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20 20  e->mutexBuf);.  
2a170 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66    p->hasMutexBuf
2a180 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
2a190 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2a1a0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  pFile->mutex);. 
2a1b0 20 73 77 69 74 63 68 28 20 64 65 73 69 72 65 64   switch( desired
2a1c0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65  Lock ){.    case
2a1d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
2a1e0 43 4b 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  CK: {.      asse
2a1f0 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  rt( p->lockState
2a200 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43  !=SQLITE_SHM_REC
2a210 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20 75 6e  OVER );.      un
2a220 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c  ixShmUnlock(pFil
2a230 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41  e, p, UNIX_SHM_A
2a240 7c 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e 49 58  |UNIX_SHM_B|UNIX
2a250 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f  _SHM_C|UNIX_SHM_
2a260 44 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  D);.      rc = S
2a270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2a280 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53  p->lockState = S
2a290 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
2a2a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2a2b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2a2c0 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3a 20 7b  LITE_SHM_READ: {
2a2d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f  .      if( p->lo
2a2e0 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2a2f0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
2a300 20 20 20 20 20 20 69 6e 74 20 6e 41 74 74 65 6d        int nAttem
2a310 70 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  pt;.        rc =
2a320 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2a330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2a340 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
2a350 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 3b  TE_SHM_UNLOCK );
2a360 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 41 74  .        for(nAt
2a370 74 65 6d 70 74 3d 30 3b 20 6e 41 74 74 65 6d 70  tempt=0; nAttemp
2a380 74 3c 35 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  t<5 && rc==SQLIT
2a390 45 5f 42 55 53 59 3b 20 6e 41 74 74 65 6d 70 74  E_BUSY; nAttempt
2a3a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ++){.          r
2a3b0 63 20 3d 20 75 6e 69 78 53 68 6d 53 68 61 72 65  c = unixShmShare
2a3c0 64 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20  dLock(pFile, p, 
2a3d0 55 4e 49 58 5f 53 48 4d 5f 41 7c 55 4e 49 58 5f  UNIX_SHM_A|UNIX_
2a3e0 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20  SHM_B);.        
2a3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a400 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
2a410 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
2a420 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c  mSharedLock(pFil
2a430 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  e, p, UNIX_SHM_D
2a440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a470 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
2a480 20 70 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 53   p->readLock = S
2a490 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46  QLITE_SHM_READ_F
2a4a0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ULL;.           
2a4b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2a4c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a4d0 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46  unixShmUnlock(pF
2a4e0 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ile, p, UNIX_SHM
2a4f0 5f 42 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _B);.           
2a500 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20   p->lockState = 
2a510 70 2d 3e 72 65 61 64 4c 6f 63 6b 20 3d 20 53 51  p->readLock = SQ
2a520 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 3b 0a 20  LITE_SHM_READ;. 
2a530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a540 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2a550 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74   if( p->lockStat
2a560 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52  e==SQLITE_SHM_WR
2a570 49 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ITE ){.        r
2a580 63 20 3d 20 75 6e 69 78 53 68 6d 53 68 61 72 65  c = unixShmShare
2a590 64 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20  dLock(pFile, p, 
2a5a0 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20 20  UNIX_SHM_A);.   
2a5b0 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f       unixShmUnlo
2a5c0 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2a5d0 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d  X_SHM_C|UNIX_SHM
2a5e0 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  _D);.        p->
2a5f0 6c 6f 63 6b 53 74 61 74 65 20 3d 20 70 2d 3e 72  lockState = p->r
2a600 65 61 64 4c 6f 63 6b 20 3d 20 53 51 4c 49 54 45  eadLock = SQLITE
2a610 5f 53 48 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20  _SHM_READ;.     
2a620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a630 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53  assert( p->lockS
2a640 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
2a650 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20  _RECOVER );.    
2a660 20 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63      unixShmUnloc
2a670 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58  k(pFile, p, UNIX
2a680 5f 53 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20  _SHM_MUTEX);.   
2a690 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
2a6a0 65 20 3d 20 70 2d 3e 72 65 61 64 4c 6f 63 6b 3b  e = p->readLock;
2a6b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a6c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2a6d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2a6e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2a6f0 49 54 45 5f 53 48 4d 5f 57 52 49 54 45 3a 20 7b  ITE_SHM_WRITE: {
2a700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a710 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2a720 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 0a 20 20  ITE_SHM_READ .  
2a730 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2a740 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
2a750 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c  ITE_SHM_READ_FUL
2a760 4c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  L );.      rc = 
2a770 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65  unixShmExclusive
2a780 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  Lock(pFile, p, U
2a790 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58 5f 53  NIX_SHM_C|UNIX_S
2a7a0 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 69 66 28  HM_D);.      if(
2a7b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a7c0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  {.        p->loc
2a7d0 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kState = SQLITE_
2a7e0 53 48 4d 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  SHM_WRITE;.     
2a7f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
2a800 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2a810 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
2a820 4f 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  OINT: {.      as
2a830 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61  sert( p->lockSta
2a840 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55  te==SQLITE_SHM_U
2a850 4e 4c 4f 43 4b 0a 20 20 20 20 20 20 20 20 20 20  NLOCK.          
2a860 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65   || p->lockState
2a870 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e  ==SQLITE_SHM_PEN
2a880 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  DING.           
2a890 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  || p->lockState=
2a8a0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f  =SQLITE_SHM_RECO
2a8b0 56 45 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28  VER );.      if(
2a8c0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
2a8d0 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45  QLITE_SHM_RECOVE
2a8e0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69  R ){.        uni
2a8f0 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65  xShmUnlock(pFile
2a900 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 4d 55  , p, UNIX_SHM_MU
2a910 54 45 58 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  TEX);.        p-
2a920 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c  >lockState = SQL
2a930 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49  ITE_SHM_CHECKPOI
2a940 4e 54 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  NT;.        rc =
2a950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a960 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2a970 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
2a980 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
2a990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
2a9a0 69 78 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f  ixShmExclusiveLo
2a9b0 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49  ck(pFile, p, UNI
2a9c0 58 5f 53 48 4d 5f 42 7c 55 4e 49 58 5f 53 48 4d  X_SHM_B|UNIX_SHM
2a9d0 5f 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _C);.        if(
2a9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a9f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6c  {.          p->l
2aa00 6f 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54  ockState = SQLIT
2aa10 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 3b 0a 20  E_SHM_PENDING;. 
2aa20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2aa30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f  .      if( p->lo
2aa40 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
2aa50 53 48 4d 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20  SHM_PENDING ){. 
2aa60 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2aa70 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ShmExclusiveLock
2aa80 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2aa90 53 48 4d 5f 41 29 3b 0a 20 20 20 20 20 20 20 20  SHM_A);.        
2aaa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
2aac0 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
2aad0 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f  LITE_SHM_CHECKPO
2aae0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  INT;.        }. 
2aaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2ab00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
2ab10 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
2ab20 73 73 65 72 74 28 20 64 65 73 69 72 65 64 4c 6f  ssert( desiredLo
2ab30 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  ck==SQLITE_SHM_R
2ab40 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20  ECOVER );.      
2ab50 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53  assert( p->lockS
2ab60 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
2ab70 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 20 20  _READ.          
2ab80 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65   || p->lockState
2ab90 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  ==SQLITE_SHM_REA
2aba0 44 5f 46 55 4c 4c 0a 20 20 20 20 20 20 20 20 20  D_FULL.         
2abb0 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74 61 74    || p->lockStat
2abc0 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48  e==SQLITE_SHM_CH
2abd0 45 43 4b 50 4f 49 4e 54 20 29 3b 0a 20 20 20 20  ECKPOINT );.    
2abe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2abf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
2ac00 6c 65 2d 3e 6d 75 74 65 78 42 75 66 29 20 29 3b  le->mutexBuf) );
2ac10 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
2ac20 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ShmExclusiveLock
2ac30 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
2ac40 53 48 4d 5f 4d 55 54 45 58 29 3b 0a 20 20 20 20  SHM_MUTEX);.    
2ac50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ac60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2ac70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
2ac80 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52  LITE_SHM_RECOVER
2ac90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2aca0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2acb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2acc0 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
2acd0 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  tex);.  OSTRACE(
2ace0 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64  ("SHM-LOCK shmid
2acf0 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20  -%d, pid-%d got 
2ad00 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
2ad10 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69 64 28    p->id, getpid(
2ad20 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c  ), azLkName[p->l
2ad30 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 69  ockState]));.  i
2ad40 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70  f( pGotLock ) *p
2ad50 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63  GotLock = p->loc
2ad60 6b 53 74 61 74 65 3b 0a 20 20 72 65 74 75 72 6e  kState;.  return
2ad70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
2ad80 6c 65 74 65 20 61 20 73 68 61 72 65 64 2d 6d 65  lete a shared-me
2ad90 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 66 72 6f  mory segment fro
2ada0 6d 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 2a 2f  m the system..*/
2adb0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2adc0 53 68 6d 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ShmDelete(sqlite
2add0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
2ade0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
2adf0 0a 20 20 72 65 74 75 72 6e 20 70 56 66 73 2d 3e  .  return pVfs->
2ae00 78 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4e  xDelete(pVfs, zN
2ae10 61 6d 65 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6c 73  ame, 0);.}..#els
2ae20 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
2ae30 68 6d 4f 70 65 6e 20 20 20 20 30 0a 23 20 64 65  hmOpen    0.# de
2ae40 66 69 6e 65 20 75 6e 69 78 53 68 6d 53 69 7a 65  fine unixShmSize
2ae50 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
2ae60 6e 69 78 53 68 6d 47 65 74 20 20 20 20 20 30 0a  nixShmGet     0.
2ae70 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2ae80 52 65 6c 65 61 73 65 20 30 0a 23 20 64 65 66 69  Release 0.# defi
2ae90 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
2aea0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2aeb0 78 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 20  xShmClose   0.# 
2aec0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 44 65  define unixShmDe
2aed0 6c 65 74 65 20 20 30 0a 23 65 6e 64 69 66 20 2f  lete  0.#endif /
2aee0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
2aef0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
2af00 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
2af20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
2af30 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
2af40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af50 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2af60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2afa0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2afb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2afe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aff0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2b000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
2b010 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67  in Proxy Locking
2b020 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2b030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b040 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f  *.**.** Proxy lo
2b050 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72  cking is a "uber
2b060 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22  -locking-method"
2b070 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20   in this sense: 
2b080 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20   It uses the.** 
2b090 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65  other locking me
2b0a0 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61  thods on seconda
2b0b0 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20  ry lock files.  
2b0c0 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
2b0d0 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72   a.** meta-layer
2b0e0 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65   over top of the
2b0f0 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
2b100 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  ng implemented a
2b110 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  bove.  For.** th
2b120 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
2b130 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
2b140 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79  lements of proxy
2b150 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65   locking is defe
2b160 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61  rred.** until la
2b170 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28  te in the file (
2b180 68 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20  here) after all 
2b190 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f  of the other I/O
2b1a0 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a   methods have.**
2b1b0 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20   been defined - 
2b1c0 73 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d  so that the prim
2b1d0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  itive locking me
2b1e0 74 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61  thods are availa
2b1f0 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63  ble.** as servic
2b200 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20  es to help with 
2b210 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2b220 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  on of proxy lock
2b230 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a  ing..**.****.**.
2b240 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c  ** The default l
2b250 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69  ocking schemes i
2b260 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74  n SQLite use byt
2b270 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e  e-range locks on
2b280 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2b290 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e   file to coordin
2b2a0 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72  ate safe, concur
2b2b0 72 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d  rent access by m
2b2c0 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a  ultiple readers.
2b2d0 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b  ** and writers [
2b2e0 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
2b2f0 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c  g/lockingv3.html
2b300 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c  ].  The five fil
2b310 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61  e locking.** sta
2b320 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50  tes (UNLOCKED, P
2b330 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20  ENDING, SHARED, 
2b340 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53  RESERVED, EXCLUS
2b350 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  IVE) are impleme
2b360 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58  nted.** as POSIX
2b370 20 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f   read & write lo
2b380 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73  cks over fixed s
2b390 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20  et of locations 
2b3a0 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20  (via fsctl),.** 
2b3b0 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f  on AFP and SMB o
2b3c0 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79  nly exclusive by
2b3d0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
2b3e0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61  re available via
2b3f0 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f   fsctl.** with _
2b400 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
2b410 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
2b420 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20  ckPB2) to track 
2b430 74 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65  the same 5 state
2b440 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74  s..** To simulat
2b450 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74  e a F_RDLCK on t
2b460 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c  he shared range,
2b470 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d   on AFP a random
2b480 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  ly selected.** a
2b490 64 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68  ddress in the sh
2b4a0 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61  ared range is ta
2b4b0 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44  ken for a SHARED
2b4c0 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72   lock, the entir
2b4d0 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67  e.** shared rang
2b4e0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
2b4f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2b500 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45  ):.**.**      PE
2b510 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20  NDING_BYTE      
2b520 20 20 30 78 34 30 30 30 30 30 30 30 09 09 20 20    0x40000000..  
2b530 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52   ..**      RESER
2b540 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30  VED_BYTE       0
2b550 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20  x40000001.**    
2b560 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20    SHARED_RANGE  
2b570 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32        0x40000002
2b580 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a   -> 0x40000200.*
2b590 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
2b5a0 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  well on the loca
2b5b0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62  l file system, b
2b5c0 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c  ut shows a nearl
2b5d0 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f  y 100x.** slowdo
2b5e0 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f  wn in read perfo
2b5f0 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65  rmance on AFP be
2b600 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c  cause the AFP cl
2b610 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a  ient disables.**
2b620 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20   the read cache 
2b630 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20  when byte-range 
2b640 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e  locks are presen
2b650 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65  t.  Enabling the
2b660 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65   read.** cache e
2b670 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63  xposes a cache c
2b680 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d  oherency problem
2b690 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2b6a0 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20   on all OS X.** 
2b6b0 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72  supported networ
2b6c0 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20  k file systems. 
2b6d0 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74   NFS and AFP bot
2b6e0 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a  h observe the.**
2b6f0 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73   close-to-open s
2b700 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73  emantics for ens
2b710 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65  uring cache cohe
2b720 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f  rency.** [http:/
2b730 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65  /nfs.sourceforge
2b740 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77  .net/#faq_a8], w
2b750 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66  hich does not ef
2b760 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64  fectively.** add
2b770 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65  ress the require
2b780 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72  ments for concur
2b790 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63  rent database ac
2b7a0 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65  cess by multiple
2b7b0 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20  .** readers and 
2b7c0 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70  writers.** [http
2b7d0 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f  ://www.nabble.co
2b7e0 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d  m/SQLite-on-NFS-
2b7f0 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d  cache-coherency-
2b800 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d  td15655701.html]
2b810 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65  ..**.** To addre
2b820 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ss the performan
2b830 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68  ce and cache coh
2b840 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70  erency issues, p
2b850 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
2b860 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65  g.** changes the
2b870 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63   way database ac
2b880 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c  cess is controll
2b890 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61  ed by limiting a
2b8a0 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69  ccess to a.** si
2b8b0 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74  ngle host at a t
2b8c0 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66  ime and moving f
2b8d0 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66  ile locks off of
2b8e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b8f0 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61  le.** and onto a
2b900 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74   proxy file on t
2b910 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
2b920 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a  stem.  .**.**.**
2b930 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63   Using proxy loc
2b940 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ks.** ----------
2b950 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20  -------.**.** C 
2b960 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69  APIs.**.**  sqli
2b970 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2b980 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c  (db, dbname, SQL
2b990 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
2b9a0 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20  YFILE,.**       
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22  <proxy_path> | "
2b9d0 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71  :auto:");.**  sq
2b9e0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2b9f0 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
2ba00 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
2ba10 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f 78 79  OXYFILE, &<proxy
2ba20 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a  _path>);.**.**.*
2ba30 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a  * SQL pragmas.**
2ba40 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
2ba50 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
2ba60 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61  y_file=<proxy_pa
2ba70 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20  th> | :auto:.** 
2ba80 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
2ba90 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
2baa0 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79  le.**.** Specify
2bab0 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61  ing ":auto:" mea
2bac0 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ns that if there
2bad0 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65   is a conch file
2bae0 20 77 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67   with a matching
2baf0 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69  .** host ID in i
2bb00 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70 61 74  t, the proxy pat
2bb10 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
2bb20 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
2bb30 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61  , otherwise.** a
2bb40 20 70 72 6f 78 79 20 70 61 74 68 20 62 61 73 65   proxy path base
2bb50 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20  d on the user's 
2bb60 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61  temp dir.** (via
2bb70 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52   confstr(_CS_DAR
2bb80 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
2bb90 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20  R,...)) will be 
2bba0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
2bbb0 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c  actual proxy fil
2bbc0 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61  e name is genera
2bbd0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d  ted from the nam
2bbe0 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68  e and path of th
2bbf0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
2bc00 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
2bc10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f  :.**.**       Fo
2bc20 72 20 64 61 74 61 62 61 73 65 20 70 61 74 68 20  r database path 
2bc30 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64  "/Users/me/foo.d
2bc40 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65  b" .**       The
2bc50 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20   lock path will 
2bc60 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c  be "<tmpdir>/sql
2bc70 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73  iteplocks/_Users
2bc80 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a  _me_foo.db:auto:
2bc90 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20  ").**.** Once a 
2bca0 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f  lock proxy is co
2bcb0 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61 20 64  nfigured for a d
2bcc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2bcd0 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a  on, it can not.*
2bce0 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f  * be removed, ho
2bcf0 77 65 76 65 72 20 69 74 20 6d 61 79 20 62 65 20  wever it may be 
2bd00 73 77 69 74 63 68 65 64 20 74 6f 20 61 20 64 69  switched to a di
2bd10 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61  fferent proxy pa
2bd20 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62  th via.** the ab
2bd30 6f 76 65 20 41 50 49 73 20 28 61 73 73 75 6d 69  ove APIs (assumi
2bd40 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  ng the conch fil
2bd50 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68  e is not being h
2bd60 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a  eld by another.*
2bd70 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20  * connection or 
2bd80 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a  process). .**.**
2bd90 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f  .** How proxy lo
2bda0 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d  cking works.** -
2bdb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bdc0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f  ------.**.** Pro
2bdd0 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  xy file locking 
2bde0 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79  relies primarily
2bdf0 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70   on two new supp
2be00 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a  orting files: .*
2be10 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20  *.**   *  conch 
2be20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63  file to limit ac
2be30 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
2be40 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73  base file to a s
2be50 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20  ingle host.**   
2be60 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a     at a time.**.
2be70 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69  **   *  proxy fi
2be80 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61 20 70  le to act as a p
2be90 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61 64 76  roxy for the adv
2bea0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d  isory locks norm
2beb0 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b  ally.**      tak
2bec0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
2bed0 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  se.**.** The con
2bee0 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65  ch file - to use
2bef0 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73   a proxy file, s
2bf00 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72 73 74  qlite must first
2bf10 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68   "hold the conch
2bf20 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61  ".** by taking a
2bf30 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73  n sqlite-style s
2bf40 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
2bf50 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65  e conch file, re
2bf60 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  ading the.** con
2bf70 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72  tents and compar
2bf80 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73 20 75  ing the host's u
2bf90 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20 28 73  nique host ID (s
2bfa0 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f  ee below) and lo
2bfb0 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68  ck.** proxy path
2bfc0 20 61 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c   against the val
2bfd0 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
2bfe0 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f  e conch.  The co
2bff0 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73  nch file is.** s
2c000 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d  tored in the sam
2c010 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 74  e directory as t
2c020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c030 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61   and the file na
2c040 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e  me.** is pattern
2c050 65 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ed after the dat
2c060 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2c070 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61  as ".<databasena
2c080 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49  me>-conch"..** I
2c090 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
2c0a0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2c0b0 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65 6e 74   or it's content
2c0c0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
2c0d0 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e  he.** host ID an
2c0e0 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74 68 2c  d/or proxy path,
2c0f0 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
2c100 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f 20 61  s escalated to a
2c110 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c  n exclusive.** l
2c120 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f 6e 63  ock and the conc
2c130 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20  h file contents 
2c140 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
2c150 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20  the host ID and 
2c160 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e  proxy.** path an
2c170 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f  d the lock is do
2c180 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 73 68  wngraded to a sh
2c190 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e  ared lock again.
2c1a0 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a    If the conch.*
2c1b0 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  * is held by ano
2c1c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 28 77 69  ther process (wi
2c1d0 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  th a shared lock
2c1e0 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ), the exclusive
2c1f0 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61   lock.** will fa
2c200 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55  il and SQLITE_BU
2c210 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
2c220 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
2c230 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d  file - a single-
2c240 62 79 74 65 20 66 69 6c 65 20 75 73 65 64 20 66  byte file used f
2c250 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72 79 20  or all advisory 
2c260 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f  file locks.** no
2c270 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20  rmally taken on 
2c280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c290 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  e.   This allows
2c2a0 20 66 6f 72 20 73 61 66 65 20 73 68 61 72 69 6e   for safe sharin
2c2b0 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  g.** of the data
2c2c0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 6d 75  base file for mu
2c2d0 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
2c2e0 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20 74 68  nd writers on th
2c2f0 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28  e same.** host (
2c300 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75 72 65  the conch ensure
2c310 73 20 74 68 61 74 20 74 68 65 79 20 61 6c 6c 20  s that they all 
2c320 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  use the same loc
2c330 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a  al lock file)..*
2c340 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e 67 20  *.** Requesting 
2c350 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64  the lock proxy d
2c360 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74  oes not immediat
2c370 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63 6f 6e  ely take the con
2c380 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c  ch, it is.** onl
2c390 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  y taken when the
2c3a0 20 66 69 72 73 74 20 72 65 71 75 65 73 74 20 74   first request t
2c3b0 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73 65 20  o lock database 
2c3c0 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20 20 0a  file is made.  .
2c3d0 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  ** This matches 
2c3e0 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 6f 66  the semantics of
2c3f0 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e 61 6c   the traditional
2c400 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   locking behavio
2c410 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e  r, where.** open
2c420 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
2c430 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
2c440 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  ile does not tak
2c450 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a  e a lock on it..
2c460 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 6c 6f  ** The shared lo
2c470 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66  ck and an open f
2c480 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
2c490 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e  re maintained un
2c4a0 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e  til .** the conn
2c4b0 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 61  ection to the da
2c4c0 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73 65 64  tabase is closed
2c4d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  . .**.** The pro
2c4e0 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  xy file and the 
2c4f0 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20 6e 65  lock file are ne
2c500 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f 20 74  ver deleted so t
2c510 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a  hey only need.**
2c520 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 74   to be created t
2c530 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
2c540 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a  ey are used..**.
2c550 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
2c560 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d   options.** ----
2c570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c580 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f  -.**.**  SQLITE_
2c590 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
2c5a0 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  KING.**.**      
2c5b0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   Database files 
2c5c0 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d  accessed on non-
2c5d0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
2c5e0 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  ms are.**       
2c5f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f  automatically co
2c600 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70 72 6f  nfigured for pro
2c610 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b  xy locking, lock
2c620 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20   files are.**   
2c630 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61      named automa
2c640 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20 74 68  tically using th
2c650 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a  e same logic as.
2c660 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  **       PRAGMA 
2c670 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
2c680 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a  ":auto:".**    .
2c690 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f 58 59  **  SQLITE_PROXY
2c6a0 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20  _DEBUG.**.**    
2c6b0 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65 20 6c     Enables the l
2c6c0 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f 72 20  ogging of error 
2c6d0 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e 67 20  messages during 
2c6e0 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20  host id file.** 
2c6f0 20 20 20 20 20 20 72 65 74 72 69 65 76 61 6c 20        retrieval 
2c700 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a  and creation.**.
2c710 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  **  LOCKPROXYDIR
2c720 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65  .**.**       Ove
2c730 72 72 69 64 65 73 20 74 68 65 20 64 65 66 61 75  rrides the defau
2c740 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75 73 65  lt directory use
2c750 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79  d for lock proxy
2c760 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20   files that.**  
2c770 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64 20 61       are named a
2c780 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76 69 61  utomatically via
2c790 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20 73 65   the ":auto:" se
2c7a0 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c  tting.**.**  SQL
2c7b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58  ITE_DEFAULT_PROX
2c7c0 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53  YDIR_PERMISSIONS
2c7d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50 65 72  .**.**       Per
2c7e0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73 65 20  missions to use 
2c7f0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  when creating a 
2c800 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 73 74  directory for st
2c810 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20  oring the.**    
2c820 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69     lock proxy fi
2c830 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77  les, only used w
2c840 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  hen LOCKPROXYDIR
2c850 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20   is not set..** 
2c860 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73     .**    .** As
2c870 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65   mentioned above
2c880 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20  , when compiled 
2c890 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52 45 46  with SQLITE_PREF
2c8a0 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
2c8b0 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74 68 65  ,.** setting the
2c8c0 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
2c8d0 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52  iable SQLITE_FOR
2c8e0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
2c8f0 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f   to 1 will.** fo
2c900 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  rce proxy lockin
2c910 67 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72  g to be used for
2c920 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20   every database 
2c930 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64  file opened, and
2c940 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65   0.** will force
2c950 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f 78 79   automatic proxy
2c960 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 64   locking to be d
2c970 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20  isabled for all 
2c980 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2c990 73 20 28 65 78 70 6c 69 63 69 74 79 20 63 61 6c  s (explicity cal
2c9a0 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ling the SQLITE_
2c9b0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
2c9c0 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
2c9d0 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
2c9e0 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
2c9f0 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
2ca00 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
2ca10 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
2ca20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
2ca30 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
2ca40 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
2ca50 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2ca60 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2ca70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2ca80 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
2ca90 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2caa0 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
2cab0 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
2cac0 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
2cad0 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
2cae0 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
2caf0 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
2cb00 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2cb10 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
2cb20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
2cb30 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
2cb40 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
2cb50 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2cb60 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
2cb70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
2cb80 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
2cb90 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
2cba0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2cbb0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
2cbc0 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
2cbd0 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
2cbe0 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
2cbf0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
2cc00 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
2cc10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2cc20 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
2cc30 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2cc40 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
2cc50 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2cc60 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
2cc70 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
2cc80 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2cc90 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
2cca0 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
2ccb0 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
2ccc0 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e   void *oldLockin
2ccd0 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a  gContext;     /*
2cce0 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e   Original lockin
2ccf0 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74  gcontext to rest
2cd00 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  ore on close */.
2cd10 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
2cd20 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64  hods const *pOld
2cd30 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f  Method;     /* O
2cd40 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68  riginal I/O meth
2cd50 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f  ods for close */
2cd60 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  .};../* .** The 
2cd70 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
2cd80 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74  path for the dat
2cd90 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20  abase at dbPath 
2cda0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2cdb0 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68  lPath, .** which
2cdc0 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76   must point to v
2cdd0 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d  alid, writable m
2cde0 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75  emory large enou
2cdf0 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20  gh for a maxLen 
2ce00 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70  length.** file p
2ce10 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ath. .*/.static 
2ce20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b  int proxyGetLock
2ce30 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
2ce40 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c  *dbPath, char *l
2ce50 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78  Path, size_t max
2ce60 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b  Len){.  int len;
2ce70 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20  .  int dbLen;.  
2ce80 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c  int i;..#ifdef L
2ce90 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65  OCKPROXYDIR.  le
2cea0 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2ceb0 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c  h, LOCKPROXYDIR,
2cec0 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a   maxLen);.#else.
2ced0 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57  # ifdef _CS_DARW
2cee0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2cef0 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f  .  {.    if( !co
2cf00 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e  nfstr(_CS_DARWIN
2cf10 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20  _USER_TEMP_DIR, 
2cf20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29  lPath, maxLen) )
2cf30 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 34  {.      OSTRACE4
2cf40 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66  ("GETLOCKPATH  f
2cf50 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25  ailed %s errno=%
2cf60 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  d pid=%d\n",.   
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74              lPat
2cf80 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70 69 64  h, errno, getpid
2cf90 28 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ());.      retur
2cfa0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
2cfb0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  OCK;.    }.    l
2cfc0 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
2cfd0 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b  th, "sqliteplock
2cfe0 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20  s", maxLen);    
2cff0 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65  .  }.# else.  le
2d000 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74  n = strlcpy(lPat
2d010 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c  h, "/tmp/", maxL
2d020 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e  en);.# endif.#en
2d030 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61 74 68  dif..  if( lPath
2d040 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a  [len-1]!='/' ){.
2d050 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
2d060 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61  t(lPath, "/", ma
2d070 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  xLen);.  }.  .  
2d080 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 65  /* transform the
2d090 20 64 62 20 70 61 74 68 20 74 6f 20 61 20 75 6e   db path to a un
2d0a0 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d 65 20  ique cache name 
2d0b0 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e  */.  dbLen = (in
2d0c0 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74 68 29  t)strlen(dbPath)
2d0d0 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c  ;.  for( i=0; i<
2d0e0 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b  dbLen && (i+len+
2d0f0 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  7)<maxLen; i++){
2d100 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
2d110 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
2d120 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
2d130 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
2d140 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
2d150 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
2d160 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
2d170 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41  maxLen);.  OSTRA
2d180 43 45 33 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE3("GETLOCKPATH
2d190 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
2d1a0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
2d1b0 6c 50 61 74 68 2c 20 67 65 74 70 69 64 28 29 29  lPath, getpid())
2d1c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2d1d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a  E_OK;.}../* . **
2d1e0 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63   Creates the loc
2d1f0 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d  k file and any m
2d200 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69  issing directori
2d210 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20  es in lockPath. 
2d220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2d230 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2d240 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f  h(const char *lo
2d250 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69  ckPath){.  int i
2d260 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75  , len;.  char bu
2d270 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  f[MAXPATHLEN];. 
2d280 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
2d290 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b    .  assert(lock
2d2a0 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f  Path!=NULL);.  /
2d2b0 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  * try to create 
2d2c0 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64  all the intermed
2d2d0 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73  iate directories
2d2e0 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74   */.  len = (int
2d2f0 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68  )strlen(lockPath
2d300 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f  );.  buf[0] = lo
2d310 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72  ckPath[0];.  for
2d320 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b  ( i=1; i<len; i+
2d330 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  + ){.    if( loc
2d340 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20  kPath[i] == '/' 
2d350 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20  && (i - start > 
2d360 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f  0) ){.      /* o
2d370 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61  nly mkdir if lea
2d380 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20  f dir != "." or 
2d390 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20  "/" or ".." */. 
2d3a0 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72 74       if( i-start
2d3b0 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d  >2 || (i-start==
2d3c0 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  1 && buf[start] 
2d3d0 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
2d3e0 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20  art] != '/') .  
2d3f0 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61         || (i-sta
2d400 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61  rt==2 && buf[sta
2d410 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2d420 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e  f[start+1] != '.
2d430 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75  ') ){.        bu
2d440 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20  f[i]='\0';.     
2d450 20 20 20 69 66 28 20 6d 6b 64 69 72 28 62 75 66     if( mkdir(buf
2d460 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
2d470 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
2d480 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
2d490 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
2d4a0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
2d4b0 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
2d4d0 52 41 43 45 35 28 22 43 52 45 41 54 45 4c 4f 43  RACE5("CREATELOC
2d4e0 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
2d4f0 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
2d520 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
2d530 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2d540 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
2d550 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
2d560 6f 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28  ockPath, getpid(
2d570 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2d580 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20  return err;.    
2d590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d5a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2d5b0 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20 7d  start=i+1;.    }
2d5c0 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c 6f  .    buf[i] = lo
2d5d0 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20  ckPath[i];.  }. 
2d5e0 20 4f 53 54 52 41 43 45 33 28 22 43 52 45 41 54   OSTRACE3("CREAT
2d5f0 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79  ELOCKPATH  proxy
2d600 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
2d610 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61 74  d=%d\n", lockPat
2d620 68 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20  h, getpid());.  
2d630 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2d640 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2d650 56 46 53 20 66 69 6c 65 20 64 65 73 63 72 69 70  VFS file descrip
2d660 74 6f 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d  tor (stored in m
2d670 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
2d680 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
2d690 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20  alloc) and open 
2d6a0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22  the file named "
2d6b0 70 61 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c  path" in the fil
2d6c0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a  e descriptor..**
2d6d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69  .** The caller i
2d6e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f  s responsible no
2d6f0 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69  t only for closi
2d700 6e 67 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ng the file desc
2d710 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c  riptor.** but al
2d720 73 6f 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  so for freeing t
2d730 68 65 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  he memory associ
2d740 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
2d750 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a  le descriptor..*
2d760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
2d770 78 79 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65  xyCreateUnixFile
2d780 28 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  (.    const char
2d790 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f   *path,        /
2d7a0 2a 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e  * path for the n
2d7b0 65 77 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  ew unixFile */. 
2d7c0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70     unixFile **pp
2d7d0 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75  File,       /* u
2d7e0 6e 69 78 46 69 6c 65 20 63 72 65 61 74 65 64 20  nixFile created 
2d7f0 61 6e 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  and returned by 
2d800 72 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ref */.    int i
2d810 73 6c 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20  slockfile       
2d820 20 20 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65      /* if non ze
2d830 72 6f 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20  ro missing dirs 
2d840 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2d850 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20  */.) {.  int fd 
2d860 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 64 69 72 66  = -1;.  int dirf
2d870 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78 46 69  d = -1;.  unixFi
2d880 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  le *pNew;.  int 
2d890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d8a0 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20    int openFlags 
2d8b0 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45  = O_RDWR | O_CRE
2d8c0 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  AT;.  sqlite3_vf
2d8d0 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20 69 6e  s dummyVfs;.  in
2d8e0 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  t terrno = 0;.  
2d8f0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2d900 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  nused = NULL;.. 
2d910 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74 72 79   /* 1. first try
2d920 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
2d930 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 32 2e  the file.  ** 2.
2d940 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
2d950 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 6c 6f  and this is a lo
2d960 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e  ck file (not-con
2d970 63 68 29 2c 20 74 72 79 20 63 72 65 61 74 69 6e  ch), try creatin
2d980 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 65 6e  g.  ** the paren
2d990 74 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 6e  t directories an
2d9a0 64 20 74 68 65 6e 20 74 72 79 20 61 67 61 69 6e  d then try again
2d9b0 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74 68 61  ..  ** 3. if tha
2d9c0 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74 6f 20  t fails, try to 
2d9d0 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 72 65  open the file re
2d9e0 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68  ad-only.  ** oth
2d9f0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 42 55  erwise return BU
2da00 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69 6c 65  SY (if lock file
2da10 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20 66 6f  ) or CANTOPEN fo
2da20 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  r the conch file
2da30 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65 64 20  .  */.  pUnused 
2da40 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2da50 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
2da60 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73 65 64  );.  if( pUnused
2da70 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70 55 6e   ){.    fd = pUn
2da80 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73  used->fd;.  }els
2da90 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d  e{.    pUnused =
2daa0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2dab0 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2dac0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75  );.    if( !pUnu
2dad0 73 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sed ){.      ret
2dae0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2daf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2db00 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64  ( fd<0 ){.    fd
2db10 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70   = open(path, op
2db20 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f  enFlags, SQLITE_
2db30 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
2db40 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74  MISSIONS);.    t
2db50 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
2db60 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65     if( fd<0 && e
2db70 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20  rrno==ENOENT && 
2db80 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2db90 20 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65      if( proxyCre
2dba0 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68  ateLockPath(path
2dbb0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29  ) == SQLITE_OK )
2dbc0 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 6f  {.        fd = o
2dbd0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
2dbe0 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ags, SQLITE_DEFA
2dbf0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2dc00 49 4f 4e 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IONS);.      }. 
2dc10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
2dc20 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
2dc30 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
2dc40 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70  .    fd = open(p
2dc50 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
2dc60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2dc70 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29  ILE_PERMISSIONS)
2dc80 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
2dc90 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
2dca0 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
2dcb0 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
2dcc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dcd0 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
2dce0 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
2dcf0 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
2dd00 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
2dd10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2dd20 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
2dd30 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
2dd40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2dd50 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
2dd60 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
2dd70 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
2dd80 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
2dd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
2dda0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2ddb0 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
2ddc0 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
2ddd0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
2dde0 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
2ddf0 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
2de00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2de10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
2de20 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78   end_create_prox
2de30 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  y;.  }.  memset(
2de40 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
2de50 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70 4e  unixFile));.  pN
2de60 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  ew->openFlags = 
2de70 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 64 75 6d  openFlags;.  dum
2de80 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
2de90 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
2dea0 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 70 55 6e  kIoFinder;.  pUn
2deb0 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
2dec0 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20   pUnused->flags 
2ded0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70  = openFlags;.  p
2dee0 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  New->pUnused = p
2def0 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20  Unused;.  .  rc 
2df00 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
2df10 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20  (&dummyVfs, fd, 
2df20 64 69 72 66 64 2c 20 28 73 71 6c 69 74 65 33 5f  dirfd, (sqlite3_
2df30 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74 68  file*)pNew, path
2df40 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2df50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2df60 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e      *ppFile = pN
2df70 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ew;.    return S
2df80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e  QLITE_OK;.  }.en
2df90 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20  d_create_proxy: 
2dfa0 20 20 20 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b     .  close(fd);
2dfb0 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61   /* silently lea
2dfc0 6b 20 66 64 20 69 66 20 65 72 72 6f 72 2c 20 77  k fd if error, w
2dfd0 65 27 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20  e're already in 
2dfe0 65 72 72 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  error */.  sqlit
2dff0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
2e000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55   sqlite3_free(pU
2e010 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  nused);.  return
2e020 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
2e030 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69  QLITE_TEST./* si
2e040 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
2e050 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
2e060 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
2e070 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e  file paths */.in
2e080 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
2e090 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  _num = 0;.#endif
2e0a0 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  ..#define PROXY_
2e0b0 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20  HOSTIDLEN    16 
2e0c0 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68   /* conch file h
2e0d0 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f  ost id length */
2e0e0 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
2e0f0 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
2e100 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
2e110 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
2e120 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
2e130 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
2e140 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
2e150 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
2e160 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
2e170 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
2e180 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
2e190 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
2e1a0 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
2e1b0 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
2e1c0 6f 75 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  out */.  .  asse
2e1d0 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
2e1e0 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
2e1f0 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
2e200 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
2e210 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
2e220 69 66 28 20 67 65 74 68 6f 73 74 75 75 69 64 28  if( gethostuuid(
2e230 70 48 6f 73 74 49 44 2c 20 26 74 69 6d 65 6f 75  pHostID, &timeou
2e240 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72  t) ){.    int er
2e250 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  r = errno;.    i
2e260 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
2e270 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
2e280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2e290 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
2e2a0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
2e2b0 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d  TE_TEST.  /* sim
2e2c0 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68  ulate multiple h
2e2d0 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67  osts by creating
2e2e0 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66   unique hostid f
2e2f0 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69  ile paths */.  i
2e300 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  f( sqlite3_hosti
2e310 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20  d_num != 0){.   
2e320 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63   pHostID[0] = (c
2e330 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20  har)(pHostID[0] 
2e340 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65 33  + (char)(sqlite3
2e350 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78  _hostid_num & 0x
2e360 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  FF));.  }.#endif
2e370 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  .  .  return SQL
2e380 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
2e390 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e  e conch file con
2e3a0 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65 72  tains the header
2e3b0 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f  , host id and lo
2e3c0 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f  ck file path. */
2e3d0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43  .#define PROXY_C
2e3e0 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20  ONCHVERSION 2   
2e3f0 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65 72  /* 1-byte header
2e400 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69  , 16-byte host i
2e410 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69  d, path */.#defi
2e420 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  ne PROXY_HEADERL
2e430 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e  EN    1   /* con
2e440 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c  ch file header l
2e450 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65  ength */.#define
2e460 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58   PROXY_PATHINDEX
2e470 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45      (PROXY_HEADE
2e480 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
2e490 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52  DLEN).#define PR
2e4a0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20  OXY_MAXCONCHLEN 
2e4b0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
2e4c0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
2e4d0 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f  N+MAXPATHLEN)../
2e4e0 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f  * .** Takes an o
2e4f0 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  pen conch file, 
2e500 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65  copies the conte
2e510 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74  nts to a new pat
2e520 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73  h and then moves
2e530 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54   .** it back.  T
2e540 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64  he newly created
2e550 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73   file's file des
2e560 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69 67  criptor is assig
2e570 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ned to the.** co
2e580 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74 75  nch file structu
2e590 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74  re and finally t
2e5a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63  he original conc
2e5b0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
2e5c0 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e  r is .** closed.
2e5d0 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69    Returns zero i
2e5e0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f  f successful..*/
2e5f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2e600 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
2e610 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2e620 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
2e630 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
2e640 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
2e650 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
2e660 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
2e670 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
2e680 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
2e690 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
2e6a0 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20  nchFile;.  char 
2e6b0 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  tPath[MAXPATHLEN
2e6c0 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52  ];.  char buf[PR
2e6d0 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
2e6e0 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68 20  ;.  char *cPath 
2e6f0 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c  = pCtx->conchFil
2e700 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20  ePath;.  size_t 
2e710 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73  readLen = 0;.  s
2e720 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20  ize_t pathLen = 
2e730 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67  0;.  char errmsg
2e740 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74  [64] = "";.  int
2e750 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20   fd = -1;.  int 
2e760 72 63 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 63  rc = -1;..  /* c
2e770 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68  reate a new path
2e780 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20   by replace the 
2e790 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68  trailing '-conch
2e7a0 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20  ' with '-break' 
2e7b0 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73  */.  pathLen = s
2e7c0 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50  trlcpy(tPath, cP
2e7d0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2e7e0 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e  ;.  if( pathLen>
2e7f0 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61  MAXPATHLEN || pa
2e800 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20  thLen<6 || .    
2e810 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68   (strlcpy(&tPath
2e820 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72  [pathLen-5], "br
2e830 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29  eak", 6) != 5) )
2e840 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 65 72  {.    sprintf(er
2e850 72 6d 73 67 2c 20 22 70 61 74 68 20 65 72 72 6f  rmsg, "path erro
2e860 72 20 28 6c 65 6e 20 25 64 29 22 2c 20 28 69 6e  r (len %d)", (in
2e870 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20  t)pathLen);.    
2e880 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
2e890 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65 61  ck;.  }.  /* rea
2e8a0 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e 74  d the conch cont
2e8b0 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65 6e  ent */.  readLen
2e8c0 20 3d 20 70 72 65 61 64 28 63 6f 6e 63 68 46 69   = pread(conchFi
2e8d0 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50 52 4f 58  le->h, buf, PROX
2e8e0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
2e8f0 29 3b 0a 20 20 69 66 28 20 72 65 61 64 4c 65 6e  );.  if( readLen
2e900 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  <PROXY_PATHINDEX
2e910 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
2e920 65 72 72 6d 73 67 2c 20 22 72 65 61 64 20 65 72  errmsg, "read er
2e930 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 20 28  ror (len %d)", (
2e940 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
2e950 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
2e960 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
2e970 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
2e980 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
2e990 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
2e9a0 3d 20 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  = open(tPath, (O
2e9b0 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
2e9c0 45 58 43 4c 29 2c 20 53 51 4c 49 54 45 5f 44 45  EXCL), SQLITE_DE
2e9d0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2e9e0 53 53 49 4f 4e 53 29 3b 0a 20 20 69 66 28 20 66  SSIONS);.  if( f
2e9f0 64 3c 30 20 29 7b 0a 20 20 20 20 73 70 72 69 6e  d<0 ){.    sprin
2ea00 74 66 28 65 72 72 6d 73 67 2c 20 22 63 72 65 61  tf(errmsg, "crea
2ea10 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
2ea20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
2ea30 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
2ea40 0a 20 20 7d 0a 20 20 69 66 28 20 70 77 72 69 74  .  }.  if( pwrit
2ea50 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c  e(fd, buf, readL
2ea60 65 6e 2c 20 30 29 20 21 3d 20 72 65 61 64 4c 65  en, 0) != readLe
2ea70 6e 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  n ){.    sprintf
2ea80 28 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20  (errmsg, "write 
2ea90 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
2eaa0 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
2eab0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
2eac0 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
2ead0 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
2eae0 20 20 20 20 73 70 72 69 6e 74 66 28 65 72 72 6d      sprintf(errm
2eaf0 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c  sg, "rename fail
2eb00 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29  ed (%d)", errno)
2eb10 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2eb20 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2eb30 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74  rc = 0;.  fprint
2eb40 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65  f(stderr, "broke
2eb50 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
2eb60 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20  s\n", cPath);.  
2eb70 63 6c 6f 73 65 28 63 6f 6e 63 68 46 69 6c 65 2d  close(conchFile-
2eb80 3e 68 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  >h);.  conchFile
2eb90 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63  ->h = fd;.  conc
2eba0 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
2ebb0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
2ebc0 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c  EAT;..end_breakl
2ebd0 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b  ock:.  if( rc ){
2ebe0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
2ebf0 7b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74  {.      unlink(t
2ec00 50 61 74 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f  Path);.      clo
2ec10 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20  se(fd);.    }.  
2ec20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2ec30 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
2ec40 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
2ec50 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
2ec60 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
2ec70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ec80 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
2ec90 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
2eca0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
2ecb0 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
2ecc0 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
2ecd0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
2ece0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2ecf0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
2ed00 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
2ed10 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
2ed20 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
2ed30 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ed40 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
2ed50 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
2ed60 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
2ed70 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
2ed80 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
2ed90 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
2eda0 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
2edb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2edc0 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
2edd0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
2ede0 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
2edf0 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63   do {.    rc = c
2ee00 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
2ee10 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
2ee20 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
2ee30 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
2ee40 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20    nTries ++;.   
2ee50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ee60 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  BUSY ){.      /*
2ee70 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   If the lock fai
2ee80 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20  led (busy):.    
2ee90 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65     * 1st try: ge
2eea0 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f  t the mod time o
2eeb0 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69  f the conch, wai
2eec0 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61  t 0.5s and try a
2eed0 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20  gain. .       * 
2eee0 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66  2nd try: fail if
2eef0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68   the mod time ch
2ef00 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64  anged or host id
2ef10 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77   is different, w
2ef20 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20  ait .       *   
2ef30 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61          10 sec a
2ef40 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20  nd try again.   
2ef50 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62      * 3rd try: b
2ef60 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e  reak the lock un
2ef70 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d  less the mod tim
2ef80 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20  e has changed.. 
2ef90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2efa0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2efb0 20 20 20 20 20 20 69 66 28 20 66 73 74 61 74 28        if( fstat(
2efc0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62  conchFile->h, &b
2efd0 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  uf) ){.        p
2efe0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2eff0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
2f000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2f010 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
2f020 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2f030 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20 29 7b  if( nTries==1 ){
2f040 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f  .        conchMo
2f050 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74 5f 6d  dTime = buf.st_m
2f060 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20 20 20  timespec;.      
2f070 20 20 75 73 6c 65 65 70 28 35 30 30 30 30 30 29    usleep(500000)
2f080 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20 73 65  ; /* wait 0.5 se
2f090 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
2f0a0 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20 20 20  ck again*/.     
2f0b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
2f0c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2f0d0 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31 20 29  sert( nTries>1 )
2f0e0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63  ;.      if( conc
2f0f0 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65 63 20  hModTime.tv_sec 
2f100 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
2f110 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20 0a 20  pec.tv_sec || . 
2f120 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d 6f 64          conchMod
2f130 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21 3d 20  Time.tv_nsec != 
2f140 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
2f150 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20 20 20  .tv_nsec ){.    
2f160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f170 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 7d 0a  E_BUSY;.      }.
2f180 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
2f190 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20 20 0a   nTries==2 ){  .
2f1a0 20 20 20 20 20 20 20 20 63 68 61 72 20 74 42 75          char tBu
2f1b0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
2f1c0 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  LEN];.        in
2f1d0 74 20 6c 65 6e 20 3d 20 70 72 65 61 64 28 63 6f  t len = pread(co
2f1e0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66  nchFile->h, tBuf
2f1f0 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
2f200 4c 45 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  LEN, 0);.       
2f210 20 69 66 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20   if( len<0 ){.  
2f220 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
2f230 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  astErrno = errno
2f240 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2f250 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2f260 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LOCK;.        }.
2f270 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
2f280 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20  PROXY_PATHINDEX 
2f290 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61  && tBuf[0]==(cha
2f2a0 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52  r)PROXY_CONCHVER
2f2b0 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20  SION){.         
2f2c0 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20   /* don't break 
2f2d0 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  the lock if the 
2f2e0 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20  host id doesn't 
2f2f0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
2f300 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70     if( 0!=memcmp
2f310 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41  (&tBuf[PROXY_HEA
2f320 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
2f330 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
2f340 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EN) ){.         
2f350 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f360 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
2f370 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2f380 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64  {.          /* d
2f390 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c  on't break the l
2f3a0 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61  ock on short rea
2f3b0 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d  d or a version m
2f3c0 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  ismatch */.     
2f3d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f3e0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2f3f0 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65   }.        uslee
2f400 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20  p(10000000); /* 
2f410 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20  wait 10 sec and 
2f420 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61  try the lock aga
2f430 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  in */.        co
2f440 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d  ntinue; .      }
2f450 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73  .      .      as
2f460 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20  sert( nTries==3 
2f470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
2f480 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
2f490 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
2f4a0 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tID) ){.        
2f4b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f4c0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b          if( lock
2f4d0 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Type==EXCLUSIVE_
2f4e0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
2f4f0 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65    rc = conchFile
2f500 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
2f510 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
2f520 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45  conchFile, SHARE
2f530 44 5f 4c 4f 43 4b 29 3b 20 20 20 20 20 20 20 20  D_LOCK);        
2f540 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
2f550 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
2f560 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
2f570 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
2f580 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
2f590 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
2f5a0 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
2f5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f5c0 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28      }.  } while(
2f5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2f5e0 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a   && nTries<3 );.
2f5f0 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
2f600 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20  }../* Takes the 
2f610 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20  conch by taking 
2f620 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
2f630 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  d read the conte
2f640 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a  nts conch, if .*
2f650 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f  * lockPath is no
2f660 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74  n-NULL, the host
2f670 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c   ID and lock fil
2f680 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63  e path must matc
2f690 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c  h.  A NULL .** l
2f6a0 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68  ockPath means th
2f6b0 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20  at the lockPath 
2f6c0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
2f6d0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69  e will be used i
2f6e0 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49  f the .** host I
2f6f0 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e  Ds match, or a n
2f700 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  ew lock path wil
2f710 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61  l be generated a
2f720 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
2f730 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20   and written to 
2f740 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a  the conch file..
2f750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2f760 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69  oxyTakeConch(uni
2f770 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
2f780 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
2f790 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
2f7a0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
2f7b0 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
2f7c0 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20  ngContext; .  . 
2f7d0 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
2f7e0 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72  Held!=0 ){.    r
2f7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
2f810 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
2f820 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
2f830 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20  ile;.    uuid_t 
2f840 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e  myHostID;.    in
2f850 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  t pError = 0;.  
2f860 20 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50    char readBuf[P
2f870 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2f880 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b  ];.    char lock
2f890 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
2f8a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70  ;.    char *temp
2f8b0 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b  LockPath = NULL;
2f8c0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
2f8d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
2f8e0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30   createConch = 0
2f8f0 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64  ;.    int hostId
2f900 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69  Match = 0;.    i
2f910 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  nt readLen = 0;.
2f920 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f      int tryOldLo
2f930 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
2f940 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b  int forceNewLock
2f950 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Path = 0;.    . 
2f960 20 20 20 4f 53 54 52 41 43 45 34 28 22 54 41 4b     OSTRACE4("TAK
2f970 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25  ECONCH  %d for %
2f980 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e  s pid=%d\n", con
2f990 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20  chFile->h,.     
2f9a0 20 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c          (pCtx->l
2f9b0 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70  ockProxyPath ? p
2f9c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2f9d0 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20  th : ":auto:"), 
2f9e0 67 65 74 70 69 64 28 29 29 3b 0a 0a 20 20 20 20  getpid());..    
2f9f0 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
2fa00 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
2fa10 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
2fa20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
2fa30 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
2fa40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
2fa50 6f 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20  o = pError;.    
2fa60 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2fa70 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
2fa80 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63 68 4c  rc = proxyConchL
2fa90 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73  ock(pFile, myHos
2faa0 74 49 44 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  tID, SHARED_LOCK
2fab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2fac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fad0 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63    goto end_takec
2fae0 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  onch;.    }.    
2faf0 2f 2a 20 72 65 61 64 20 74 68 65 20 65 78 69 73  /* read the exis
2fb00 74 69 6e 67 20 63 6f 6e 63 68 20 66 69 6c 65 20  ting conch file 
2fb10 2a 2f 0a 20 20 20 20 72 65 61 64 4c 65 6e 20 3d  */.    readLen =
2fb20 20 73 65 65 6b 41 6e 64 52 65 61 64 28 28 75 6e   seekAndRead((un
2fb30 69 78 46 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  ixFile*)conchFil
2fb40 65 2c 20 30 2c 20 72 65 61 64 42 75 66 2c 20 50  e, 0, readBuf, P
2fb50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
2fb60 29 3b 0a 20 20 20 20 69 66 28 20 72 65 61 64 4c  );.    if( readL
2fb70 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  en<0 ){.      /*
2fb80 20 49 2f 4f 20 65 72 72 6f 72 3a 20 6c 61 73 74   I/O error: last
2fb90 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
2fba0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
2fbb0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
2fbc0 6e 6f 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  no = conchFile->
2fbd0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
2fbe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2fbf0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
2fc00 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
2fc10 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
2fc20 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
2fc30 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
2fc40 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
2fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
2fc60 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
2fc70 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2fc80 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
2fc90 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
2fca0 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
2fcb0 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
2fcc0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
2fcd0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
2fce0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
2fcf0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
2fd00 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
2fd10 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
2fd20 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
2fd30 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
2fd40 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
2fd50 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
2fd60 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
2fd70 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
2fd80 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
2fd90 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
2fda0 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
2fdb0 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
2fdc0 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
2fdd0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
2fde0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
2fdf0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
2fe00 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
2fe10 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
2fe20 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
2fe30 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
2fe40 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
2fe50 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
2fe60 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
2fe70 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
2fe80 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
2fe90 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
2fec0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 20 20  Y_HOSTIDLEN);.  
2fed0 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20        /* if the 
2fee0 63 6f 6e 63 68 20 68 61 73 20 64 61 74 61 20 63  conch has data c
2fef0 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
2ff00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nts */.        i
2ff10 66 28 20 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  f( !pCtx->lockPr
2ff20 6f 78 79 50 61 74 68 20 29 7b 0a 20 20 20 20 20  oxyPath ){.     
2ff30 20 20 20 20 20 2f 2a 20 66 6f 72 20 61 75 74 6f       /* for auto
2ff40 2d 6e 61 6d 65 64 20 6c 6f 63 61 6c 20 6c 6f 63  -named local loc
2ff50 6b 20 66 69 6c 65 2c 20 6a 75 73 74 20 63 68 65  k file, just che
2ff60 63 6b 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  ck the host ID a
2ff70 6e 64 20 77 65 27 6c 6c 0a 20 20 20 20 20 20 20  nd we'll.       
2ff80 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 6c      ** use the l
2ff90 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70  ocal lock file p
2ffa0 61 74 68 20 74 68 61 74 27 73 20 61 6c 72 65 61  ath that's alrea
2ffb0 64 79 20 69 6e 20 74 68 65 72 65 0a 20 20 20 20  dy in there.    
2ffc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ffd0 20 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61      if( hostIdMa
2ffe0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tch ){.         
2fff0 20 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65     size_t pathLe
30000 6e 20 3d 20 28 72 65 61 64 4c 65 6e 20 2d 20 50  n = (readLen - P
30010 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29 3b  ROXY_PATHINDEX);
30020 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
30030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30040 74 68 4c 65 6e 3e 3d 4d 41 58 50 41 54 48 4c 45  thLen>=MAXPATHLE
30050 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
30060 20 20 20 70 61 74 68 4c 65 6e 3d 4d 41 58 50 41     pathLen=MAXPA
30070 54 48 4c 45 4e 2d 31 3b 0a 20 20 20 20 20 20 20  THLEN-1;.       
30080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30090 20 20 20 6d 65 6d 63 70 79 28 6c 6f 63 6b 50 61     memcpy(lockPa
300a0 74 68 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f  th, &readBuf[PRO
300b0 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
300c0 61 74 68 4c 65 6e 29 3b 0a 20 20 20 20 20 20 20  athLen);.       
300d0 20 20 20 20 20 6c 6f 63 6b 50 61 74 68 5b 70 61       lockPath[pa
300e0 74 68 4c 65 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  thLen] = 0;.    
300f0 20 20 20 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b          tempLock
30100 50 61 74 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b  Path = lockPath;
30110 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
30120 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 31 3b  OldLockPath = 1;
30130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
30140 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
30150 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 69   the lock path i
30160 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
30170 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  aken */.        
30180 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b      goto end_tak
30190 65 63 6f 6e 63 68 3b 0a 20 20 20 20 20 20 20 20  econch;.        
301a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
301b0 65 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74 63  e if( hostIdMatc
301c0 68 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h.              
301d0 20 26 26 20 21 73 74 72 6e 63 6d 70 28 70 43 74   && !strncmp(pCt
301e0 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
301f0 2c 20 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  , &readBuf[PROXY
30200 5f 50 41 54 48 49 4e 44 45 58 5d 2c 0a 20 20 20  _PATHINDEX],.   
30210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30220 20 20 20 20 20 20 20 20 72 65 61 64 4c 65 6e 2d          readLen-
30230 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 29  PROXY_PATHINDEX)
30240 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
30250 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 20 68        /* conch h
30260 6f 73 74 20 61 6e 64 20 6c 6f 63 6b 20 70 61 74  ost and lock pat
30270 68 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20  h match */.     
30280 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74 61       goto end_ta
30290 6b 65 63 6f 6e 63 68 3b 20 0a 20 20 20 20 20 20  keconch; .      
302a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
302b0 20 20 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 74    .      /* if t
302c0 68 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 77  he conch isn't w
302d0 72 69 74 61 62 6c 65 20 61 6e 64 20 64 6f 65 73  ritable and does
302e0 6e 27 74 20 6d 61 74 63 68 2c 20 77 65 20 63 61  n't match, we ca
302f0 6e 27 74 20 74 61 6b 65 20 69 74 20 2a 2f 0a 20  n't take it */. 
30300 20 20 20 20 20 69 66 28 20 28 63 6f 6e 63 68 46       if( (conchF
30310 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 26 4f  ile->openFlags&O
30320 5f 52 44 57 52 29 20 3d 3d 20 30 20 29 7b 0a 20  _RDWR) == 0 ){. 
30330 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30340 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
30350 20 67 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f   goto end_takeco
30360 6e 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nch;.      }.   
30370 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 65 69 74     .      /* eit
30380 68 65 72 20 74 68 65 20 63 6f 6e 63 68 20 64 69  her the conch di
30390 64 6e 27 74 20 6d 61 74 63 68 20 6f 72 20 77 65  dn't match or we
303a0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
303b0 61 20 6e 65 77 20 6f 6e 65 20 2a 2f 0a 20 20 20  a new one */.   
303c0 20 20 20 69 66 28 20 21 70 43 74 78 2d 3e 6c 6f     if( !pCtx->lo
303d0 63 6b 50 72 6f 78 79 50 61 74 68 20 29 7b 0a 20  ckProxyPath ){. 
303e0 20 20 20 20 20 20 20 70 72 6f 78 79 47 65 74 4c         proxyGetL
303f0 6f 63 6b 50 61 74 68 28 70 43 74 78 2d 3e 64 62  ockPath(pCtx->db
30400 50 61 74 68 2c 20 6c 6f 63 6b 50 61 74 68 2c 20  Path, lockPath, 
30410 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
30420 20 20 20 20 20 74 65 6d 70 4c 6f 63 6b 50 61 74       tempLockPat
30430 68 20 3d 20 6c 6f 63 6b 50 61 74 68 3b 0a 20 20  h = lockPath;.  
30440 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20        /* create 
30450 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f  a copy of the lo
30460 63 6b 20 70 61 74 68 20 5f 6f 6e 6c 79 5f 20 69  ck path _only_ i
30470 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20 74  f the conch is t
30480 61 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  aken */.      }.
30490 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
304a0 75 70 64 61 74 65 20 63 6f 6e 63 68 20 77 69 74  update conch wit
304b0 68 20 68 6f 73 74 20 61 6e 64 20 70 61 74 68 20  h host and path 
304c0 28 74 68 69 73 20 77 69 6c 6c 20 66 61 69 6c 20  (this will fail 
304d0 69 66 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  if other process
304e0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 20  .      ** has a 
304f0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6c 72 65  shared lock alre
30500 61 64 79 29 2c 20 69 66 20 74 68 65 20 68 6f 73  ady), if the hos
30510 74 20 69 64 20 6d 61 74 63 68 65 73 2c 20 75 73  t id matches, us
30520 65 20 74 68 65 20 62 69 67 0a 20 20 20 20 20 20  e the big.      
30530 2a 2a 20 73 74 69 63 6b 2e 0a 20 20 20 20 20 20  ** stick..      
30540 2a 2f 0a 20 20 20 20 20 20 66 75 74 69 6d 65 73  */.      futimes
30550 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 4e  (conchFile->h, N
30560 55 4c 4c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ULL);.      if( 
30570 68 6f 73 74 49 64 4d 61 74 63 68 20 26 26 20 21  hostIdMatch && !
30580 63 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20  createConch ){. 
30590 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 63 68         if( conch
305a0 46 69 6c 65 2d 3e 70 4c 6f 63 6b 20 26 26 20 63  File->pLock && c
305b0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4c 6f 63 6b 2d  onchFile->pLock-
305c0 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20  >cnt>1 ){.      
305d0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
305e0 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
305f0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
30600 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
30610 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
30620 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
30630 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
30640 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
30650 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
30660 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
30670 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
30680 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
30690 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43       rc = proxyC
306a0 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  onchLock(pFile, 
306b0 6d 79 48 6f 73 74 49 44 2c 20 45 58 43 4c 55 53  myHostID, EXCLUS
306c0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
306d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
306e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 63  {.        rc = c
306f0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
30700 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
30710 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
30720 65 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e, EXCLUSIVE_LOC
30730 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
30740 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _OK ){.        c
30760 68 61 72 20 77 72 69 74 65 42 75 66 66 65 72 5b  har writeBuffer[
30770 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
30780 4e 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  N];.        int 
30790 77 72 69 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20  writeSize = 0;. 
307a0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
307b0 77 72 69 74 65 42 75 66 66 65 72 5b 30 5d 20 3d  writeBuffer[0] =
307c0 20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e   (char)PROXY_CON
307d0 43 48 56 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20  CHVERSION;.     
307e0 20 20 20 6d 65 6d 63 70 79 28 26 77 72 69 74 65     memcpy(&write
307f0 42 75 66 66 65 72 5b 50 52 4f 58 59 5f 48 45 41  Buffer[PROXY_HEA
30800 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49  DERLEN], myHostI
30810 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  D, PROXY_HOSTIDL
30820 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  EN);.        if(
30830 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
30840 50 61 74 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  Path!=NULL ){.  
30850 20 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28          strlcpy(
30860 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
30870 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 70  XY_PATHINDEX], p
30880 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
30890 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
308a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
308b0 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 63 70            strlcp
308c0 79 28 26 77 72 69 74 65 42 75 66 66 65 72 5b 50  y(&writeBuffer[P
308d0 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c  ROXY_PATHINDEX],
308e0 20 74 65 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d   tempLockPath, M
308f0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
30900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77 72      }.        wr
30910 69 74 65 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f  iteSize = PROXY_
30920 50 41 54 48 49 4e 44 45 58 20 2b 20 73 74 72 6c  PATHINDEX + strl
30930 65 6e 28 26 77 72 69 74 65 42 75 66 66 65 72 5b  en(&writeBuffer[
30940 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 5d  PROXY_PATHINDEX]
30950 29 3b 0a 20 20 20 20 20 20 20 20 66 74 72 75 6e  );.        ftrun
30960 63 61 74 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  cate(conchFile->
30970 68 2c 20 77 72 69 74 65 53 69 7a 65 29 3b 0a 20  h, writeSize);. 
30980 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
30990 57 72 69 74 65 28 28 73 71 6c 69 74 65 33 5f 66  Write((sqlite3_f
309a0 69 6c 65 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  ile *)conchFile,
309b0 20 77 72 69 74 65 42 75 66 66 65 72 2c 20 77 72   writeBuffer, wr
309c0 69 74 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  iteSize, 0);.   
309d0 20 20 20 20 20 66 73 79 6e 63 28 63 6f 6e 63 68       fsync(conch
309e0 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
309f0 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61 74    /* If we creat
30a00 65 64 20 61 20 6e 65 77 20 63 6f 6e 63 68 20 66  ed a new conch f
30a10 69 6c 65 20 28 6e 6f 74 20 6a 75 73 74 20 75 70  ile (not just up
30a20 64 61 74 65 64 20 74 68 65 20 63 6f 6e 74 65 6e  dated the conten
30a30 74 73 20 6f 66 20 61 20 0a 20 20 20 20 20 20 20  ts of a .       
30a40 20 20 2a 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68    ** valid conch
30a50 20 66 69 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d   file), try to m
30a60 61 74 63 68 20 74 68 65 20 70 65 72 6d 69 73 73  atch the permiss
30a70 69 6f 6e 73 20 6f 66 20 74 68 65 20 64 61 74 61  ions of the data
30a80 62 61 73 65 20 0a 20 20 20 20 20 20 20 20 20 2a  base .         *
30a90 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
30aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
30ab0 72 65 61 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20  reateConch ){.  
30ac0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
30ad0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 20 20 20  tat buf;.       
30ae0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 66 73 74     int err = fst
30af0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
30b00 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
30b10 28 20 65 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ( err==0 ){.    
30b20 20 20 20 20 20 20 20 20 6d 6f 64 65 5f 74 20 63          mode_t c
30b30 6d 6f 64 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f  mode = buf.st_mo
30b40 64 65 26 28 53 5f 49 52 55 53 52 7c 53 5f 49 57  de&(S_IRUSR|S_IW
30b50 55 53 52 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f  USR | S_IRGRP|S_
30b60 49 57 47 52 50 20 7c 0a 20 20 20 20 20 20 20 20  IWGRP |.        
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b90 53 5f 49 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29  S_IROTH|S_IWOTH)
30ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
30bb0 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68   try to match th
30bc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30bd0 52 2f 57 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c  R/W permissions,
30be0 20 69 67 6e 6f 72 65 20 66 61 69 6c 75 72 65 20   ignore failure 
30bf0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
30c00 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 20 20  E_PROXY_DEBUG.  
30c10 20 20 20 20 20 20 20 20 20 20 66 63 68 6d 6f 64            fchmod
30c20 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
30c30 6d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  mode);.#else.   
30c40 20 20 20 20 20 20 20 20 20 69 66 28 20 66 63 68           if( fch
30c50 6d 6f 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  mod(conchFile->h
30c60 2c 20 63 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20  , cmode)!=0 ){. 
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
30c80 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20   code = errno;. 
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72               fpr
30ca0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
30cb0 68 6d 6f 64 20 25 6f 20 46 41 49 4c 45 44 20 77  hmod %o FAILED w
30cc0 69 74 68 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ith %d %s\n",.  
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 20 20 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c      cmode, code,
30cf0 20 73 74 72 65 72 72 6f 72 28 63 6f 64 65 29 29   strerror(code))
30d00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
30d10 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
30d20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
30d30 65 72 72 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20  err, "fchmod %o 
30d40 53 55 43 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64  SUCCEDED\n",cmod
30d50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30d60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
30d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
30d80 6e 74 20 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b  nt code = errno;
30d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
30da0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 54  intf(stderr, "ST
30db0 41 54 20 46 41 49 4c 45 44 5b 25 64 5d 20 77 69  AT FAILED[%d] wi
30dc0 74 68 20 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20  th %d %s\n", .  
30dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30de0 20 20 65 72 72 2c 20 63 6f 64 65 2c 20 73 74 72    err, code, str
30df0 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65  error(code));.#e
30e00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 7d  ndif.          }
30e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30e20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 63 68 46 69   }.      conchFi
30e30 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
30e40 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  lock((sqlite3_fi
30e50 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53  le*)conchFile, S
30e60 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30e70 20 20 20 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65     .    end_take
30e80 63 6f 6e 63 68 3a 0a 20 20 20 20 20 20 4f 53 54  conch:.      OST
30e90 52 41 43 45 32 28 22 54 52 41 4e 53 50 52 4f 58  RACE2("TRANSPROX
30ea0 59 3a 20 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c  Y: CLOSE  %d\n",
30eb0 20 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20   pFile->h);.    
30ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30ed0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70  _OK && pFile->op
30ee0 65 6e 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  enFlags ){.     
30ef0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e     if( pFile->h>
30f00 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52  =0 ){.#ifdef STR
30f10 49 43 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a  ICT_CLOSE_ERROR.
30f20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
30f30 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b  ose(pFile->h) ){
30f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69  .            pFi
30f50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
30f60 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
30f70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30f80 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20  _IOERR_CLOSE;.  
30f90 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
30fa0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
30fb0 70 46 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69  pFile->h); /* si
30fc0 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69  lently leak fd i
30fd0 66 20 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66  f fail */.#endif
30fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30ff0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
31000 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 64  ;.        int fd
31010 20 3d 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62   = open(pCtx->db
31020 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65  Path, pFile->ope
31030 6e 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  nFlags,.        
31040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
31050 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
31060 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
31070 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 32          OSTRACE2
31080 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50  ("TRANSPROXY: OP
31090 45 4e 20 20 25 64 5c 6e 22 2c 20 66 64 29 3b 0a  EN  %d\n", fd);.
310a0 20 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d          if( fd>=
310b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
310c0 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
310d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
310e0 20 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45         rc=SQLITE
310f0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20  _CANTOPEN_BKPT; 
31100 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20  /* SQLITE_BUSY? 
31110 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63  proxyTakeConch c
31120 61 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20  alled.          
31130 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
31140 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
31150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
31160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31170 21 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  !pCtx->lockProxy
31180 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
31190 20 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63   *path = tempLoc
311a0 6b 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b  kPath ? tempLock
311b0 50 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63  Path : pCtx->loc
311c0 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20  kProxyPath;.    
311d0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
311e0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74  eateUnixFile(pat
311f0 68 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h, &pCtx->lockPr
31200 6f 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  oxy, 1);.       
31210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31220 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
31230 5f 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64  _NOMEM && tryOld
31240 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
31250 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
31260 64 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20  dn't create the 
31270 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
31280 77 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63  with the old loc
31290 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20  k file path.    
312a0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79         ** so try
312b0 20 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d   again via auto-
312c0 6e 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20  naming .        
312d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
312e0 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
312f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31300 74 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d  tryOldLockPath =
31310 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   0;.          co
31320 6e 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61  ntinue; /* go ba
31330 63 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20  ck to the do {} 
31340 77 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e  while start poin
31350 74 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a  t, try again */.
31360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31370 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
31380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31390 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
313a0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70  make a copy of p
313b0 61 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63  ath if we extrac
313c0 74 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ted the value.  
313d0 20 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74         ** from t
313e0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72  he conch file or
313f0 20 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c   the path was al
31400 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73  located on the s
31410 74 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f  tack.         */
31420 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d  .        if( tem
31430 70 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  pLockPath ){.   
31440 20 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63         pCtx->loc
31450 6b 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c  kProxyPath = sql
31460 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
31470 74 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20  tempLockPath);. 
31480 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
31490 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
314a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
314b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
314c0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
314d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
314e0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
314f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31500 20 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68       pCtx->conch
31510 48 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  Held = 1;.      
31520 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
31530 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e  Ctx->lockProxy->
31540 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49  pMethod == &afpI
31550 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
31560 20 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67        afpLocking
31570 43 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b  Context *afpCtx;
31580 0a 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74  .          afpCt
31590 78 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  x = (afpLockingC
315a0 6f 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c  ontext *)pCtx->l
315b0 6f 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e  ockProxy->lockin
315c0 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  gContext;.      
315d0 20 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61      afpCtx->dbPa
315e0 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th = pCtx->lockP
315f0 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20  roxyPath;.      
31600 20 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65    }.      } else
31610 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68   {.        conch
31620 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
31630 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
31640 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
31650 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
31660 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
31670 33 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  3("TAKECONCH  %d
31680 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c   %s\n", conchFil
31690 65 2d 3e 68 2c 20 72 63 3d 3d 53 51 4c 49 54 45  e->h, rc==SQLITE
316a0 5f 4f 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64  _OK?"ok":"failed
316b0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
316c0 20 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65   rc;.    } while
316d0 20 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65   (1); /* in case
316e0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72   we need to retr
316f0 79 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63  y the :auto: loc
31700 6b 20 66 69 6c 65 20 2d 20 77 65 20 73 68 6f 75  k file - we shou
31710 6c 64 20 6e 65 76 65 72 20 67 65 74 20 68 65 72  ld never get her
31720 65 20 65 78 63 65 70 74 20 76 69 61 20 74 68 65  e except via the
31730 20 27 63 6f 6e 74 69 6e 75 65 27 20 63 61 6c 6c   'continue' call
31740 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  . */.  }.}../*.*
31750 2a 20 49 66 20 70 46 69 6c 65 20 68 6f 6c 64 73  * If pFile holds
31760 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 63 6f 6e   a lock on a con
31770 63 68 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ch file, then re
31780 6c 65 61 73 65 20 74 68 61 74 20 6c 6f 63 6b 2e  lease that lock.
31790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
317a0 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63 68  roxyReleaseConch
317b0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
317c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317e0 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 72   /* Subroutine r
317f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
31800 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31810 65 78 74 20 2a 70 43 74 78 3b 20 20 2f 2a 20 54  ext *pCtx;  /* T
31820 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
31830 78 74 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79  xt for the proxy
31840 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 69 78 46   lock */.  unixF
31850 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20  ile *conchFile; 
31860 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
31870 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  f the conch file
31880 20 2a 2f 0a 0a 20 20 70 43 74 78 20 3d 20 28 70   */..  pCtx = (p
31890 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
318a0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
318b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 6f  ingContext;.  co
318c0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
318d0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 4f 53 54  conchFile;.  OST
318e0 52 41 43 45 34 28 22 52 45 4c 45 41 53 45 43 4f  RACE4("RELEASECO
318f0 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73 20 70  NCH  %d for %s p
31900 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63 68 46  id=%d\n", conchF
31910 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
31920 20 20 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72     (pCtx->lockPr
31930 6f 78 79 50 61 74 68 20 3f 20 70 43 74 78 2d 3e  oxyPath ? pCtx->
31940 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3a 20  lockProxyPath : 
31950 22 3a 61 75 74 6f 3a 22 29 2c 20 0a 20 20 20 20  ":auto:"), .    
31960 20 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29         getpid())
31970 3b 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f  ;.  if( pCtx->co
31980 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
31990 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
319a0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
319b0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
319c0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 4e 4f 5f 4c  )conchFile, NO_L
319d0 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 70 43 74 78  OCK);.  }.  pCtx
319e0 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d 20 30 3b  ->conchHeld = 0;
319f0 0a 20 20 4f 53 54 52 41 43 45 33 28 22 52 45 4c  .  OSTRACE3("REL
31a00 45 41 53 45 43 4f 4e 43 48 20 20 25 64 20 25 73  EASECONCH  %d %s
31a10 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  \n", conchFile->
31a20 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 72  h,.           (r
31a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
31a40 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
31a50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31a60 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
31a70 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
31a80 62 61 73 65 20 66 69 6c 65 2c 20 63 6f 6d 70 75  base file, compu
31a90 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 69  te the name of i
31aa0 74 73 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  ts conch file..*
31ab0 2a 20 53 74 6f 72 65 20 74 68 65 20 63 6f 6e 63  * Store the conc
31ac0 68 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6d 65  h filename in me
31ad0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
31ae0 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
31af0 63 28 29 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 70 43  c()..** Make *pC
31b00 6f 6e 63 68 50 61 74 68 20 70 6f 69 6e 74 20 74  onchPath point t
31b10 6f 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 2e 20  o the new name. 
31b20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
31b30 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
31b40 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
31b50 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 6f 62 74  if unable to obt
31b60 61 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  ain memory..**.*
31b70 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
31b80 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
31b90 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
31ba0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  e allocated memo
31bb0 72 79 0a 2a 2a 20 73 70 61 63 65 20 69 73 20 65  ry.** space is e
31bc0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 2e  ventually freed.
31bd0 0a 2a 2a 0a 2a 2a 20 2a 70 43 6f 6e 63 68 50 61  .**.** *pConchPa
31be0 74 68 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  th is set to NUL
31bf0 4c 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  L if a memory al
31c00 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
31c10 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
31c20 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65   int proxyCreate
31c30 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65 28 63 68  ConchPathname(ch
31c40 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72  ar *dbPath, char
31c50 20 2a 2a 70 43 6f 6e 63 68 50 61 74 68 29 7b 0a   **pConchPath){.
31c60 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
31c90 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28  */.  int len = (
31ca0 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
31cb0 68 29 3b 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66  h); /* Length of
31cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
31cd0 6d 65 20 2d 20 64 62 50 61 74 68 20 2a 2f 0a 20  me - dbPath */. 
31ce0 20 63 68 61 72 20 2a 63 6f 6e 63 68 50 61 74 68   char *conchPath
31cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31d00 2a 20 62 75 66 66 65 72 20 69 6e 20 77 68 69 63  * buffer in whic
31d10 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 63  h to construct c
31d20 6f 6e 63 68 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  onch name */..  
31d30 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
31d40 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  e for the conch 
31d50 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6e 69  filename and ini
31d60 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 61 6d 65  tialize the name
31d70 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d   to.  ** the nam
31d80 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
31d90 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
31da0 20 2a 2f 20 20 0a 20 20 2a 70 43 6f 6e 63 68 50   */  .  *pConchP
31db0 61 74 68 20 3d 20 63 6f 6e 63 68 50 61 74 68 20  ath = conchPath 
31dc0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
31dd0 33 5f 6d 61 6c 6c 6f 63 28 6c 65 6e 20 2b 20 38  3_malloc(len + 8
31de0 29 3b 0a 20 20 69 66 28 20 63 6f 6e 63 68 50 61  );.  if( conchPa
31df0 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  th==0 ){.    ret
31e00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
31e10 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 63  ;.  }.  memcpy(c
31e20 6f 6e 63 68 50 61 74 68 2c 20 64 62 50 61 74 68  onchPath, dbPath
31e30 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 0a 20 20 2f  , len+1);.  .  /
31e40 2a 20 6e 6f 77 20 69 6e 73 65 72 74 20 61 20 22  * now insert a "
31e50 2e 22 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ." before the la
31e60 73 74 20 2f 20 63 68 61 72 61 63 74 65 72 20 2a  st / character *
31e70 2f 0a 20 20 66 6f 72 28 20 69 3d 28 6c 65 6e 2d  /.  for( i=(len-
31e80 31 29 3b 20 69 3e 3d 30 3b 20 69 2d 2d 20 29 7b  1); i>=0; i-- ){
31e90 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 50 61  .    if( conchPa
31ea0 74 68 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  th[i]=='/' ){.  
31eb0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 62      i++;.      b
31ec0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
31ed0 20 20 63 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 27    conchPath[i]='
31ee0 2e 27 3b 0a 20 20 77 68 69 6c 65 20 28 20 69 3c  .';.  while ( i<
31ef0 6c 65 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 63 68  len ){.    conch
31f00 50 61 74 68 5b 69 2b 31 5d 3d 64 62 50 61 74 68  Path[i+1]=dbPath
31f10 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  [i];.    i++;.  
31f20 7d 0a 0a 20 20 2f 2a 20 61 70 70 65 6e 64 20 74  }..  /* append t
31f30 68 65 20 22 2d 63 6f 6e 63 68 22 20 73 75 66 66  he "-conch" suff
31f40 69 78 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  ix to the file *
31f50 2f 0a 20 20 6d 65 6d 63 70 79 28 26 63 6f 6e 63  /.  memcpy(&conc
31f60 68 50 61 74 68 5b 69 2b 31 5d 2c 20 22 2d 63 6f  hPath[i+1], "-co
31f70 6e 63 68 22 2c 20 37 29 3b 0a 20 20 61 73 73 65  nch", 7);.  asse
31f80 72 74 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  rt( (int)strlen(
31f90 63 6f 6e 63 68 50 61 74 68 29 20 3d 3d 20 6c 65  conchPath) == le
31fa0 6e 2b 37 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  n+7 );..  return
31fb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
31fc0 2f 2a 20 54 61 6b 65 73 20 61 20 66 75 6c 6c 79  /* Takes a fully
31fd0 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 6f 78   configured prox
31fe0 79 20 6c 6f 63 6b 69 6e 67 2d 73 74 79 6c 65 20  y locking-style 
31ff0 75 6e 69 78 20 66 69 6c 65 20 61 6e 64 20 73 77  unix file and sw
32000 69 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 6c 6f  itches.** the lo
32010 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  cal lock file pa
32020 74 68 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th .*/.static in
32030 74 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f 78  t switchLockProx
32040 79 50 61 74 68 28 75 6e 69 78 46 69 6c 65 20 2a  yPath(unixFile *
32050 70 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  pFile, const cha
32060 72 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f  r *path) {.  pro
32070 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
32080 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
32090 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
320a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
320b0 74 65 78 74 3b 0a 20 20 63 68 61 72 20 2a 6f 6c  text;.  char *ol
320c0 64 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 6c 6f  dPath = pCtx->lo
320d0 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 69  ckProxyPath;.  i
320e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
320f0 4b 3b 0a 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  K;..  if( pFile-
32100 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
32110 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
32120 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
32130 7d 20 20 0a 0a 20 20 2f 2a 20 6e 6f 74 68 69 6e  }  ..  /* nothin
32140 67 20 74 6f 20 64 6f 20 69 66 20 74 68 65 20 70  g to do if the p
32150 61 74 68 20 69 73 20 4e 55 4c 4c 2c 20 3a 61 75  ath is NULL, :au
32160 74 6f 3a 20 6f 72 20 6d 61 74 63 68 65 73 20 74  to: or matches t
32170 68 65 20 65 78 69 73 74 69 6e 67 20 70 61 74 68  he existing path
32180 20 2a 2f 0a 20 20 69 66 28 20 21 70 61 74 68 20   */.  if( !path 
32190 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30 27  || path[0]=='\0'
321a0 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74 68   || !strcmp(path
321b0 2c 20 22 3a 61 75 74 6f 3a 22 29 20 7c 7c 0a 20  , ":auto:") ||. 
321c0 20 20 20 28 6f 6c 64 50 61 74 68 20 26 26 20 21     (oldPath && !
321d0 73 74 72 6e 63 6d 70 28 6f 6c 64 50 61 74 68 2c  strncmp(oldPath,
321e0 20 70 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45   path, MAXPATHLE
321f0 4e 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  N)) ){.    retur
32200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
32210 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 46 69  else{.    unixFi
32220 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20  le *lockProxy = 
32230 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b  pCtx->lockProxy;
32240 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  .    pCtx->lockP
32250 72 6f 78 79 3d 4e 55 4c 4c 3b 0a 20 20 20 20 70  roxy=NULL;.    p
32260 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20 3d  Ctx->conchHeld =
32270 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b   0;.    if( lock
32280 50 72 6f 78 79 21 3d 4e 55 4c 4c 20 29 7b 0a 20  Proxy!=NULL ){. 
32290 20 20 20 20 20 72 63 3d 6c 6f 63 6b 50 72 6f 78       rc=lockProx
322a0 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f  y->pMethod->xClo
322b0 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
322c0 20 2a 29 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20   *)lockProxy);. 
322d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
322e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
322f0 71 6c 69 74 65 33 5f 66 72 65 65 28 6c 6f 63 6b  qlite3_free(lock
32300 50 72 6f 78 79 29 3b 0a 20 20 20 20 7d 0a 20 20  Proxy);.    }.  
32310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6f    sqlite3_free(o
32320 6c 64 50 61 74 68 29 3b 0a 20 20 20 20 70 43 74  ldPath);.    pCt
32330 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
32340 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
32350 75 70 28 30 2c 20 70 61 74 68 29 3b 0a 20 20 7d  up(0, path);.  }
32360 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  .  .  return rc;
32370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 46 69 6c 65 20  .}../*.** pFile 
32380 69 73 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  is a file that h
32390 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
323a0 79 20 61 20 70 72 69 6f 72 20 78 4f 70 65 6e 20  y a prior xOpen 
323b0 63 61 6c 6c 2e 20 20 64 62 50 61 74 68 0a 2a 2a  call.  dbPath.**
323c0 20 69 73 20 61 20 73 74 72 69 6e 67 20 62 75 66   is a string buf
323d0 66 65 72 20 61 74 20 6c 65 61 73 74 20 4d 41 58  fer at least MAX
323e0 50 41 54 48 4c 45 4e 2b 31 20 63 68 61 72 61 63  PATHLEN+1 charac
323f0 74 65 72 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ters in size..**
32400 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32410 20 66 69 6e 64 20 74 68 65 20 66 69 6c 65 6e 61   find the filena
32420 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  me associated wi
32430 74 68 20 70 46 69 6c 65 20 61 6e 64 20 77 72 69  th pFile and wri
32440 74 65 73 20 69 74 0a 2a 2a 20 69 6e 74 20 64 62  tes it.** int db
32450 50 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Path..*/.static 
32460 69 6e 74 20 70 72 6f 78 79 47 65 74 44 62 50 61  int proxyGetDbPa
32470 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75 6e  thForUnixFile(un
32480 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
32490 68 61 72 20 2a 64 62 50 61 74 68 29 7b 0a 23 69  har *dbPath){.#i
324a0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
324b0 45 5f 5f 29 0a 20 20 69 66 28 20 70 46 69 6c 65  E__).  if( pFile
324c0 2d 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66  ->pMethod == &af
324d0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
324e0 20 20 2f 2a 20 61 66 70 20 73 74 79 6c 65 20 6b    /* afp style k
324f0 65 65 70 73 20 61 20 72 65 66 65 72 65 6e 63 65  eeps a reference
32500 20 74 6f 20 74 68 65 20 64 62 20 70 61 74 68 20   to the db path 
32510 69 6e 20 74 68 65 20 66 69 6c 65 50 61 74 68 20  in the filePath 
32520 66 69 65 6c 64 20 0a 20 20 20 20 2a 2a 20 6f 66  field .    ** of
32530 20 74 68 65 20 73 74 72 75 63 74 20 2a 2f 0a 20   the struct */. 
32540 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29     assert( (int)
32550 73 74 72 6c 65 6e 28 28 63 68 61 72 2a 29 70 46  strlen((char*)pF
32560 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
32570 65 78 74 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e  ext)<=MAXPATHLEN
32580 20 29 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   );.    strlcpy(
32590 64 62 50 61 74 68 2c 20 28 28 61 66 70 4c 6f 63  dbPath, ((afpLoc
325a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
325b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
325c0 65 78 74 29 2d 3e 64 62 50 61 74 68 2c 20 4d 41  ext)->dbPath, MA
325d0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 7d 20 65  XPATHLEN);.  } e
325e0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  lse.#endif.  if(
325f0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
32600 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
32610 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 64  hods ){.    /* d
32620 6f 74 20 6c 6f 63 6b 20 73 74 79 6c 65 20 75 73  ot lock style us
32630 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
32640 6f 6e 74 65 78 74 20 74 6f 20 73 74 6f 72 65 20  ontext to store 
32650 74 68 65 20 64 6f 74 20 6c 6f 63 6b 0a 20 20 20  the dot lock.   
32660 20 2a 2a 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   ** file path */
32670 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73  .    int len = s
32680 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 46  trlen((char *)pF
32690 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
326a0 65 78 74 29 20 2d 20 73 74 72 6c 65 6e 28 44 4f  ext) - strlen(DO
326b0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 29 3b 0a 20  TLOCK_SUFFIX);. 
326c0 20 20 20 6d 65 6d 63 70 79 28 64 62 50 61 74 68     memcpy(dbPath
326d0 2c 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  , (char *)pFile-
326e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
326f0 20 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 7d 65 6c   len + 1);.  }el
32700 73 65 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 20 6f  se{.    /* all o
32710 74 68 65 72 20 73 74 79 6c 65 73 20 75 73 65 20  ther styles use 
32720 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
32730 65 78 74 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ext to store the
32740 20 64 62 20 66 69 6c 65 20 70 61 74 68 20 2a 2f   db file path */
32750 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72  .    assert( str
32760 6c 65 6e 28 28 63 68 61 72 2a 29 70 46 69 6c 65  len((char*)pFile
32770 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32780 29 3c 3d 4d 41 58 50 41 54 48 4c 45 4e 20 29 3b  )<=MAXPATHLEN );
32790 0a 20 20 20 20 73 74 72 6c 63 70 79 28 64 62 50  .    strlcpy(dbP
327a0 61 74 68 2c 20 28 63 68 61 72 20 2a 29 70 46 69  ath, (char *)pFi
327b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
327c0 78 74 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  xt, MAXPATHLEN);
327d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
327e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
327f0 2a 20 54 61 6b 65 73 20 61 6e 20 61 6c 72 65 61  * Takes an alrea
32800 64 79 20 66 69 6c 6c 65 64 20 69 6e 20 75 6e 69  dy filled in uni
32810 78 20 66 69 6c 65 20 61 6e 64 20 61 6c 74 65 72  x file and alter
32820 73 20 69 74 20 73 6f 20 61 6c 6c 20 66 69 6c 65  s it so all file
32830 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 77 69 6c   locking .** wil
32840 6c 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  l be performed o
32850 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 72 6f 78  n the local prox
32860 79 20 6c 6f 63 6b 20 66 69 6c 65 2e 20 20 54 68  y lock file.  Th
32870 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
32880 64 73 0a 2a 2a 20 61 72 65 20 70 72 65 73 65 72  ds.** are preser
32890 76 65 64 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ved in the locki
328a0 6e 67 20 63 6f 6e 74 65 78 74 20 73 6f 20 74 68  ng context so th
328b0 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 72  at they can be r
328c0 65 73 74 6f 72 65 64 20 61 6e 64 20 0a 2a 2a 20  estored and .** 
328d0 74 68 65 20 75 6e 69 78 20 73 74 72 75 63 74 75  the unix structu
328e0 72 65 20 70 72 6f 70 65 72 6c 79 20 63 6c 65 61  re properly clea
328f0 6e 65 64 20 75 70 20 61 74 20 63 6c 6f 73 65 20  ned up at close 
32900 74 69 6d 65 3a 0a 2a 2a 20 20 2d 3e 6c 6f 63 6b  time:.**  ->lock
32910 69 6e 67 43 6f 6e 74 65 78 74 0a 2a 2a 20 20 2d  ingContext.**  -
32920 3e 70 4d 65 74 68 6f 64 0a 2a 2f 0a 73 74 61 74  >pMethod.*/.stat
32930 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
32940 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
32950 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63  ixFile *pFile, c
32960 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 29  onst char *path)
32970 20 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e   {.  proxyLockin
32980 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  gContext *pCtx;.
32990 20 20 63 68 61 72 20 64 62 50 61 74 68 5b 4d 41    char dbPath[MA
329a0 58 50 41 54 48 4c 45 4e 2b 31 5d 3b 20 20 20 20  XPATHLEN+1];    
329b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
329c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
329d0 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
329e0 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 69 6e 74 20  ath=NULL;.  int 
329f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32a00 20 20 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e    .  if( pFile->
32a10 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
32a20 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
32a30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
32a40 0a 20 20 70 72 6f 78 79 47 65 74 44 62 50 61 74  .  proxyGetDbPat
32a50 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 70 46 69  hForUnixFile(pFi
32a60 6c 65 2c 20 64 62 50 61 74 68 29 3b 0a 20 20 69  le, dbPath);.  i
32a70 66 28 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68  f( !path || path
32a80 5b 30 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74  [0]=='\0' || !st
32a90 72 63 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74  rcmp(path, ":aut
32aa0 6f 3a 22 29 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  o:") ){.    lock
32ab0 50 61 74 68 3d 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  Path=NULL;.  }el
32ac0 73 65 7b 0a 20 20 20 20 6c 6f 63 6b 50 61 74 68  se{.    lockPath
32ad0 3d 28 63 68 61 72 20 2a 29 70 61 74 68 3b 0a 20  =(char *)path;. 
32ae0 20 7d 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 34   }.  .  OSTRACE4
32af0 28 22 54 52 41 4e 53 50 52 4f 58 59 20 20 25 64  ("TRANSPROXY  %d
32b00 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
32b10 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
32b20 20 20 20 20 20 20 20 20 28 6c 6f 63 6b 50 61 74          (lockPat
32b30 68 20 3f 20 6c 6f 63 6b 50 61 74 68 20 3a 20 22  h ? lockPath : "
32b40 3a 61 75 74 6f 3a 22 29 2c 20 67 65 74 70 69 64  :auto:"), getpid
32b50 28 29 29 3b 0a 0a 20 20 70 43 74 78 20 3d 20 73  ());..  pCtx = s
32b60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
32b70 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
32b80 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
32b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32ba0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
32bb0 6d 65 6d 73 65 74 28 70 43 74 78 2c 20 30 2c 20  memset(pCtx, 0, 
32bc0 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 29 3b 0a  sizeof(*pCtx));.
32bd0 0a 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65  .  rc = proxyCre
32be0 61 74 65 43 6f 6e 63 68 50 61 74 68 6e 61 6d 65  ateConchPathname
32bf0 28 64 62 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  (dbPath, &pCtx->
32c00 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 29 3b 0a  conchFilePath);.
32c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
32c30 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
32c40 69 6c 65 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46  ile(pCtx->conchF
32c50 69 6c 65 50 61 74 68 2c 20 26 70 43 74 78 2d 3e  ilePath, &pCtx->
32c60 63 6f 6e 63 68 46 69 6c 65 2c 20 30 29 3b 0a 20  conchFile, 0);. 
32c70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32c80 45 5f 43 41 4e 54 4f 50 45 4e 20 26 26 20 28 28  E_CANTOPEN && ((
32c90 70 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  pFile->openFlags
32ca0 26 4f 5f 52 44 57 52 29 20 3d 3d 20 30 29 20 29  &O_RDWR) == 0) )
32cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 28 61  {.      /* if (a
32cc0 29 20 74 68 65 20 6f 70 65 6e 20 66 6c 61 67 73  ) the open flags
32cd0 20 61 72 65 20 6e 6f 74 20 4f 5f 52 44 57 52 2c   are not O_RDWR,
32ce0 20 28 62 29 20 74 68 65 20 63 6f 6e 63 68 20 69   (b) the conch i
32cf0 73 6e 27 74 20 74 68 65 72 65 2c 20 61 6e 64 0a  sn't there, and.
32d00 20 20 20 20 20 20 2a 2a 20 28 63 29 20 74 68 65        ** (c) the
32d10 20 66 69 6c 65 20 73 79 73 74 65 6d 20 69 73 20   file system is 
32d20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 6e 20  read-only, then 
32d30 65 6e 61 62 6c 65 20 6e 6f 2d 6c 6f 63 6b 69 6e  enable no-lockin
32d40 67 20 61 63 63 65 73 73 2e 0a 20 20 20 20 20 20  g access..      
32d50 2a 2a 20 55 67 68 2c 20 73 69 6e 63 65 20 4f 5f  ** Ugh, since O_
32d60 52 44 4f 4e 4c 59 3d 3d 30 78 30 30 30 30 20 77  RDONLY==0x0000 w
32d70 65 20 74 65 73 74 20 66 6f 72 20 21 4f 5f 52 44  e test for !O_RD
32d80 57 52 20 73 69 6e 63 65 20 75 6e 69 78 4f 70 65  WR since unixOpe
32d90 6e 20 61 73 73 65 72 74 73 0a 20 20 20 20 20 20  n asserts.      
32da0 2a 2a 20 74 68 61 74 20 6f 70 65 6e 46 6c 61 67  ** that openFlag
32db0 73 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 6c 79  s will have only
32dc0 20 6f 6e 65 20 6f 66 20 4f 5f 52 44 4f 4e 4c 59   one of O_RDONLY
32dd0 20 6f 72 20 4f 5f 52 44 57 52 2e 0a 20 20 20 20   or O_RDWR..    
32de0 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
32df0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
32e00 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
32e10 61 74 20 63 6f 6e 63 68 49 6e 66 6f 3b 0a 20 20  at conchInfo;.  
32e20 20 20 20 20 69 6e 74 20 67 6f 4c 6f 63 6b 6c 65      int goLockle
32e30 73 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  ss = 0;..      i
32e40 66 28 20 73 74 61 74 28 70 43 74 78 2d 3e 63 6f  f( stat(pCtx->co
32e50 6e 63 68 46 69 6c 65 50 61 74 68 2c 20 26 63 6f  nchFilePath, &co
32e60 6e 63 68 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  nchInfo) == -1 )
32e70 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65   {.        int e
32e80 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  rr = errno;.    
32e90 20 20 20 20 69 66 28 20 28 65 72 72 3d 3d 45 4e      if( (err==EN
32ea0 4f 45 4e 54 29 20 26 26 20 28 73 74 61 74 66 73  OENT) && (statfs
32eb0 28 64 62 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  (dbPath, &fsInfo
32ec0 29 20 21 3d 20 2d 31 29 20 29 7b 0a 20 20 20 20  ) != -1) ){.    
32ed0 20 20 20 20 20 20 67 6f 4c 6f 63 6b 6c 65 73 73        goLockless
32ee0 20 3d 20 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61   = (fsInfo.f_fla
32ef0 67 73 26 4d 4e 54 5f 52 44 4f 4e 4c 59 29 20 3d  gs&MNT_RDONLY) =
32f00 3d 20 4d 4e 54 5f 52 44 4f 4e 4c 59 3b 0a 20 20  = MNT_RDONLY;.  
32f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32f20 20 20 20 20 20 20 69 66 28 20 67 6f 4c 6f 63 6b        if( goLock
32f30 6c 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20  less ){.        
32f40 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
32f50 3d 20 2d 31 3b 20 2f 2a 20 72 65 61 64 20 6f 6e  = -1; /* read on
32f60 6c 79 20 46 53 2f 20 6c 6f 63 6b 6c 65 73 73 20  ly FS/ lockless 
32f70 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
32f80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
32f90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20   }.    }.  }  . 
32fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32fb0 4f 4b 20 26 26 20 6c 6f 63 6b 50 61 74 68 20 29  OK && lockPath )
32fc0 7b 0a 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b  {.    pCtx->lock
32fd0 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
32fe0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 6c  te3DbStrDup(0, l
32ff0 6f 63 6b 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ockPath);.  }.. 
33000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33010 4f 4b 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  OK ){.    pCtx->
33020 64 62 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  dbPath = sqlite3
33030 44 62 53 74 72 44 75 70 28 30 2c 20 64 62 50 61  DbStrDup(0, dbPa
33040 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74  th);.    if( pCt
33050 78 2d 3e 64 62 50 61 74 68 3d 3d 4e 55 4c 4c 20  x->dbPath==NULL 
33060 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
33070 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
33080 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
33090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
330a0 20 2f 2a 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 69   /* all memory i
330b0 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 70 72 6f  s allocated, pro
330c0 78 79 73 20 61 72 65 20 63 72 65 61 74 65 64 20  xys are created 
330d0 61 6e 64 20 61 73 73 69 67 6e 65 64 2c 20 0a 20  and assigned, . 
330e0 20 20 20 2a 2a 20 73 77 69 74 63 68 20 74 68 65     ** switch the
330f0 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
33100 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74 68 65   and pMethod the
33110 6e 20 72 65 74 75 72 6e 2e 0a 20 20 20 20 2a 2f  n return..    */
33120 0a 20 20 20 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f  .    pCtx->oldLo
33130 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
33140 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
33150 74 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d  text;.    pFile-
33160 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
33170 3d 20 70 43 74 78 3b 0a 20 20 20 20 70 43 74 78  = pCtx;.    pCtx
33180 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 20 3d 20 70  ->pOldMethod = p
33190 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 3b 0a 20  File->pMethod;. 
331a0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
331b0 64 20 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68  d = &proxyIoMeth
331c0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
331d0 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63    if( pCtx->conc
331e0 68 46 69 6c 65 20 29 7b 20 0a 20 20 20 20 20 20  hFile ){ .      
331f0 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 2d  pCtx->conchFile-
33200 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
33210 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
33220 29 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  )pCtx->conchFile
33230 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33240 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
33250 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
33260 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33270 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
33280 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
33290 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
332a0 68 46 69 6c 65 50 61 74 68 29 3b 20 0a 20 20 20  hFilePath); .   
332b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
332c0 74 78 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  tx);.  }.  OSTRA
332d0 43 45 33 28 22 54 52 41 4e 53 50 52 4f 58 59 20  CE3("TRANSPROXY 
332e0 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65   %d %s\n", pFile
332f0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
33300 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
33310 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
33320 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
33330 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
33340 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20  routine handles 
33350 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
33360 74 72 6f 6c 28 29 20 63 61 6c 6c 73 20 74 68 61  trol() calls tha
33370 74 20 61 72 65 20 73 70 65 63 69 66 69 63 0a 2a  t are specific.*
33380 2a 20 74 6f 20 70 72 6f 78 79 20 6c 6f 63 6b 69  * to proxy locki
33390 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
333a0 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
333b0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
333c0 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
333d0 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69 74  d *pArg){.  swit
333e0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
333f0 73 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  se SQLITE_GET_LO
33400 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20  CKPROXYFILE: {. 
33410 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
33420 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
33430 2a 29 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20  *)id;.      if( 
33440 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
33450 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  = &proxyIoMethod
33460 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 6f  s ){.        pro
33470 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
33480 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c   *pCtx = (proxyL
33490 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
334a0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
334b0 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 72  text;.        pr
334c0 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 70 46 69  oxyTakeConch(pFi
334d0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
334e0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
334f0 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Path ){.        
33500 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a    *(const char *
33510 2a 29 70 41 72 67 20 3d 20 70 43 74 78 2d 3e 6c  *)pArg = pCtx->l
33520 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 0a 20 20  ockProxyPath;.  
33530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33540 20 20 20 20 20 20 20 2a 28 63 6f 6e 73 74 20 63         *(const c
33550 68 61 72 20 2a 2a 29 70 41 72 67 20 3d 20 22 3a  har **)pArg = ":
33560 61 75 74 6f 3a 20 28 6e 6f 74 20 68 65 6c 64 29  auto: (not held)
33570 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
33580 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
33590 20 20 20 20 2a 28 63 6f 6e 73 74 20 63 68 61 72      *(const char
335a0 20 2a 2a 29 70 41 72 67 20 3d 20 4e 55 4c 4c 3b   **)pArg = NULL;
335b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
335c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
335d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
335e0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
335f0 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
33600 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
33610 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
33620 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  d;.      int rc 
33630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
33640 20 20 20 69 6e 74 20 69 73 50 72 6f 78 79 53 74     int isProxySt
33650 79 6c 65 20 3d 20 28 70 46 69 6c 65 2d 3e 70 4d  yle = (pFile->pM
33660 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f 78 79 49  ethod == &proxyI
33670 6f 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20 20 20  oMethods);.     
33680 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20   if( pArg==NULL 
33690 7c 7c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  || (const char *
336a0 29 70 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20  )pArg==0 ){.    
336b0 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 53      if( isProxyS
336c0 74 79 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tyle ){.        
336d0 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70 72    /* turn off pr
336e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 6e 6f  oxy locking - no
336f0 74 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  t supported */. 
33700 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33710 4c 49 54 45 5f 45 52 52 4f 52 20 2f 2a 53 51 4c  LITE_ERROR /*SQL
33720 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3f 20 53 51  ITE_PROTOCOL? SQ
33730 4c 49 54 45 5f 4d 49 53 55 53 45 3f 2a 2f 3b 0a  LITE_MISUSE?*/;.
33740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33750 20 20 20 20 20 20 20 20 20 2f 2a 20 74 75 72 6e           /* turn
33760 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69   off proxy locki
33770 6e 67 20 2d 20 61 6c 72 65 61 64 79 20 6f 66 66  ng - already off
33780 20 2d 20 4e 4f 4f 50 20 2a 2f 0a 20 20 20 20 20   - NOOP */.     
33790 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
337a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
337b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
337c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
337d0 70 72 6f 78 79 50 61 74 68 20 3d 20 28 63 6f 6e  proxyPath = (con
337e0 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3b 0a  st char *)pArg;.
337f0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 50 72          if( isPr
33800 6f 78 79 53 74 79 6c 65 20 29 7b 0a 20 20 20 20  oxyStyle ){.    
33810 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69        proxyLocki
33820 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
33830 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  = .            (
33840 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
33850 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
33860 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  ingContext;.    
33870 20 20 20 20 20 20 69 66 28 20 21 73 74 72 63 6d        if( !strcm
33880 70 28 70 41 72 67 2c 20 22 3a 61 75 74 6f 3a 22  p(pArg, ":auto:"
33890 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
338a0 20 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78   (pCtx->lockProx
338b0 79 50 61 74 68 20 26 26 0a 20 20 20 20 20 20 20  yPath &&.       
338c0 20 20 20 20 20 20 20 20 21 73 74 72 6e 63 6d 70          !strncmp
338d0 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79  (pCtx->lockProxy
338e0 50 61 74 68 2c 20 70 72 6f 78 79 50 61 74 68 2c  Path, proxyPath,
338f0 20 4d 41 58 50 41 54 48 4c 45 4e 29 29 0a 20 20   MAXPATHLEN)).  
33900 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
33910 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33920 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
33930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33940 20 20 20 20 72 63 20 3d 20 73 77 69 74 63 68 4c      rc = switchL
33950 6f 63 6b 50 72 6f 78 79 50 61 74 68 28 70 46 69  ockProxyPath(pFi
33960 6c 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  le, proxyPath);.
33970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
33980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33990 20 20 20 20 20 2f 2a 20 74 75 72 6e 20 6f 6e 20       /* turn on 
339a0 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
339b0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
339c0 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
339d0 6f 72 6d 55 6e 69 78 46 69 6c 65 28 70 46 69 6c  ormUnixFile(pFil
339e0 65 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  e, proxyPath);. 
339f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33a00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
33a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
33a20 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
33a30 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 54 68  ert( 0 );  /* Th
33a40 65 20 63 61 6c 6c 20 61 73 73 75 72 65 73 20 74  e call assures t
33a50 68 61 74 20 6f 6e 6c 79 20 76 61 6c 69 64 20 6f  hat only valid o
33a60 70 63 6f 64 65 73 20 61 72 65 20 73 65 6e 74 20  pcodes are sent 
33a70 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  */.    }.  }.  /
33a80 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
33a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
33aa0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  ROR;.}../*.** Wi
33ab0 74 68 69 6e 20 74 68 69 73 20 64 69 76 69 73 69  thin this divisi
33ac0 6f 6e 20 28 74 68 65 20 70 72 6f 78 79 69 6e 67  on (the proxying
33ad0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
33ae0 6e 74 61 74 69 6f 6e 29 20 74 68 65 20 70 72 6f  ntation) the pro
33af0 63 65 64 75 72 65 73 0a 2a 2a 20 61 62 6f 76 65  cedures.** above
33b00 20 74 68 69 73 20 70 6f 69 6e 74 20 61 72 65 20   this point are 
33b10 61 6c 6c 20 75 74 69 6c 69 74 69 65 73 2e 20 20  all utilities.  
33b20 54 68 65 20 6c 6f 63 6b 2d 72 65 6c 61 74 65 64  The lock-related
33b30 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 0a   methods of the.
33b40 2a 2a 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67  ** proxy-locking
33b50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
33b60 6f 64 20 6f 62 6a 65 63 74 20 66 6f 6c 6c 6f 77  od object follow
33b70 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ..*/.../*.** Thi
33b80 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
33b90 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
33ba0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
33bb0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
33bc0 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
33bd0 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
33be0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
33bf0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
33c00 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
33c10 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
33c20 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
33c30 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
33c40 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
33c50 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
33c60 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
33c70 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
33c80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
33c90 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
33ca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33cb0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
33cc0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
33cd0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
33ce0 65 73 4f 75 74 29 20 7b 0a 20 20 75 6e 69 78 46  esOut) {.  unixF
33cf0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
33d00 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
33d10 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
33d20 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
33d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33d40 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
33d50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
33d60 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
33d70 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
33d80 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
33d90 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
33da0 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
33db0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
33dc0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
33dd0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
33de0 65 74 75 72 6e 20 70 72 6f 78 79 2d 3e 70 4d 65  eturn proxy->pMe
33df0 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65 73 65  thod->xCheckRese
33e00 72 76 65 64 4c 6f 63 6b 28 28 73 71 6c 69 74 65  rvedLock((sqlite
33e10 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 70  3_file*)proxy, p
33e20 52 65 73 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ResOut);.    }el
33e30 73 65 7b 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64  se{ /* conchHeld
33e40 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
33e50 20 2a 2f 0a 20 20 20 20 20 20 70 52 65 73 4f 75   */.      pResOu
33e60 74 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t=0;.    }.  }. 
33e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33e80 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
33e90 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
33ea0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
33eb0 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65  rameter locktype
33ec0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
33ed0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
33ee0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
33ef0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
33f00 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
33f10 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
33f20 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
33f30 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
33f40 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
33f50 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
33f60 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
33f70 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
33f80 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
33f90 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
33fa0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
33fb0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
33fc0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
33fd0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
33fe0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
33ff0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
34000 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
34010 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
34020 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
34030 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
34040 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
34050 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
34060 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
34070 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
34080 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
34090 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
340a0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
340b0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
340c0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
340d0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
340e0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
340f0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
34100 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
34110 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
34120 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
34130 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
34140 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
34150 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
34160 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
34170 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
34180 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
34190 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
341a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
341b0 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  xyLock(sqlite3_f
341c0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
341d0 6b 74 79 70 65 29 20 7b 0a 20 20 75 6e 69 78 46  ktype) {.  unixF
341e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
341f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
34200 74 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65  t rc = proxyTake
34210 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20  Conch(pFile);.  
34220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34230 4b 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f  K ){.    proxyLo
34240 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
34250 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
34260 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
34270 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
34280 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d  t;.    if( pCtx-
34290 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a  >conchHeld>0 ){.
342a0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a        unixFile *
342b0 70 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f  proxy = pCtx->lo
342c0 63 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72  ckProxy;.      r
342d0 63 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68  c = proxy->pMeth
342e0 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
342f0 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20  e3_file*)proxy, 
34300 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 20  locktype);.     
34310 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
34320 20 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79   = proxy->lockty
34330 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
34340 20 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c       /* conchHel
34350 64 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73  d < 0 is lockles
34360 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s */.    }.  }. 
34370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
34380 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
34390 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
343a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
343b0 20 70 46 69 6c 65 20 74 6f 20 6c 6f 63 6b 74 79   pFile to lockty
343c0 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
343d0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
343e0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
343f0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
34400 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
34410 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
34420 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
34430 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
34440 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
34450 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
34460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
34470 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
34480 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
34490 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
344a0 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
344b0 70 65 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  pe) {.  unixFile
344c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
344d0 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
344e0 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  c = proxyTakeCon
344f0 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ch(pFile);.  if(
34500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34510 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69  {.    proxyLocki
34520 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
34530 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
34540 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
34550 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
34560 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f      if( pCtx->co
34570 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20  nchHeld>0 ){.   
34580 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f     unixFile *pro
34590 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  xy = pCtx->lockP
345a0 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d  roxy;.      rc =
345b0 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d   proxy->pMethod-
345c0 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65  >xUnlock((sqlite
345d0 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c 20 6c  3_file*)proxy, l
345e0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 20 20  ocktype);.      
345f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
34600 3d 20 70 72 6f 78 79 2d 3e 6c 6f 63 6b 74 79 70  = proxy->locktyp
34610 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
34620 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
34630 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
34640 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
34650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34660 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
34670 20 74 68 61 74 20 75 73 65 73 20 70 72 6f 78 79   that uses proxy
34680 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69   locks..*/.stati
34690 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
346a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
346b0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
346c0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
346d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
346e0 2a 29 69 64 3b 0a 20 20 20 20 70 72 6f 78 79 4c  *)id;.    proxyL
346f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
34700 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
34710 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
34720 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
34730 78 74 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xt;.    unixFile
34740 20 2a 6c 6f 63 6b 50 72 6f 78 79 20 3d 20 70 43   *lockProxy = pC
34750 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3b 0a 20  tx->lockProxy;. 
34760 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
34770 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
34780 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 69 6e  onchFile;.    in
34790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
347a0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 6c  ;.    .    if( l
347b0 6f 63 6b 50 72 6f 78 79 20 29 7b 0a 20 20 20 20  ockProxy ){.    
347c0 20 20 72 63 20 3d 20 6c 6f 63 6b 50 72 6f 78 79    rc = lockProxy
347d0 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
347e0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
347f0 2a 29 6c 6f 63 6b 50 72 6f 78 79 2c 20 4e 4f 5f  *)lockProxy, NO_
34800 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
34810 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34820 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
34830 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
34840 78 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  xClose((sqlite3_
34850 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79 29  file*)lockProxy)
34860 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6c    sqlite3_free(l
34890 6f 63 6b 50 72 6f 78 79 29 3b 0a 20 20 20 20 20  ockProxy);.     
348a0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
348b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
348c0 69 66 28 20 63 6f 6e 63 68 46 69 6c 65 20 29 7b  if( conchFile ){
348d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d  .      if( pCtx-
348e0 3e 63 6f 6e 63 68 48 65 6c 64 20 29 7b 0a 20 20  >conchHeld ){.  
348f0 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
34900 52 65 6c 65 61 73 65 43 6f 6e 63 68 28 70 46 69  ReleaseConch(pFi
34910 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le);.        if(
34920 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
34940 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
34950 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28  Method->xClose((
34960 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
34970 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  nchFile);.      
34980 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
34990 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
349a0 33 5f 66 72 65 65 28 63 6f 6e 63 68 46 69 6c 65  3_free(conchFile
349b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
349c0 69 74 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e  ite3_free(pCtx->
349d0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a  lockProxyPath);.
349e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
349f0 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
34a00 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
34a10 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 64 62  e3_free(pCtx->db
34a20 50 61 74 68 29 3b 0a 20 20 20 20 2f 2a 20 72 65  Path);.    /* re
34a30 73 74 6f 72 65 20 74 68 65 20 6f 72 69 67 69 6e  store the origin
34a40 61 6c 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  al locking conte
34a50 78 74 20 61 6e 64 20 70 4d 65 74 68 6f 64 20 74  xt and pMethod t
34a60 68 65 6e 20 63 6c 6f 73 65 20 69 74 20 2a 2f 0a  hen close it */.
34a70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69      pFile->locki
34a80 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
34a90 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74  ->oldLockingCont
34aa0 65 78 74 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ext;.    pFile->
34ab0 70 4d 65 74 68 6f 64 20 3d 20 70 43 74 78 2d 3e  pMethod = pCtx->
34ac0 70 4f 6c 64 4d 65 74 68 6f 64 3b 0a 20 20 20 20  pOldMethod;.    
34ad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
34ae0 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  x);.    return p
34af0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
34b00 43 6c 6f 73 65 28 69 64 29 3b 0a 20 20 7d 0a 20  Close(id);.  }. 
34b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34b20 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e 64 69 66 20 2f  K;.}....#endif /
34b30 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
34b40 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
34b50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
34b60 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
34b70 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 73   proxy locking s
34b80 74 79 6c 65 20 69 73 20 69 6e 74 65 6e 64 65 64  tyle is intended
34b90 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 41 46   for use with AF
34ba0 50 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a  P filesystems..*
34bb0 2a 20 41 6e 64 20 73 69 6e 63 65 20 41 46 50 20  * And since AFP 
34bc0 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
34bd0 64 20 6f 6e 20 4d 61 63 4f 53 58 2c 20 74 68 65  d on MacOSX, the
34be0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
34bf0 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 74 72 69  s also.** restri
34c00 63 74 65 64 20 74 6f 20 4d 61 63 4f 53 58 2e 0a  cted to MacOSX..
34c10 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ** .**.*********
34c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
34c30 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
34c40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
34c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c60 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
34c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34cb0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  *****/../*.** In
34cc0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
34cd0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
34ce0 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  terface..**.** T
34cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
34d00 73 74 65 72 73 20 61 6c 6c 20 56 46 53 20 69 6d  sters all VFS im
34d10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
34d20 72 20 75 6e 69 78 2d 6c 69 6b 65 20 6f 70 65 72  r unix-like oper
34d30 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
34d40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 2c  .  This routine,
34d50 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   and the sqlite3
34d60 5f 6f 73 5f 65 6e 64 28 29 20 72 6f 75 74 69 6e  _os_end() routin
34d70 65 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 2c 0a  e that follows,.
34d80 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ** should be the
34d90 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 73 20 69   only routines i
34da0 6e 20 74 68 69 73 20 66 69 6c 65 20 74 68 61 74  n this file that
34db0 20 61 72 65 20 76 69 73 69 62 6c 65 20 66 72 6f   are visible fro
34dc0 6d 20 6f 74 68 65 72 0a 2a 2a 20 66 69 6c 65 73  m other.** files
34dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
34de0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
34df0 6e 63 65 20 64 75 72 69 6e 67 20 53 51 4c 69 74  nce during SQLit
34e00 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
34e10 20 61 6e 64 20 62 79 20 61 0a 2a 2a 20 73 69 6e   and by a.** sin
34e20 67 6c 65 20 74 68 72 65 61 64 2e 20 20 54 68 65  gle thread.  The
34e30 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34e40 6f 6e 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  on and mutex sub
34e50 73 79 73 74 65 6d 73 20 68 61 76 65 20 6e 6f 74  systems have not
34e60 0a 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20  .** necessarily 
34e70 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
34e80 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
34e90 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 61 6e  ne is called, an
34ea0 64 20 73 6f 20 74 68 65 79 0a 2a 2a 20 73 68 6f  d so they.** sho
34eb0 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  uld not be used.
34ec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
34ed0 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 20 0a  os_init(void){ .
34ee0 20 20 2f 2a 20 0a 20 20 2a 2a 20 54 68 65 20 66    /* .  ** The f
34ef0 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 64  ollowing macro d
34f00 65 66 69 6e 65 73 20 61 6e 20 69 6e 69 74 69 61  efines an initia
34f10 6c 69 7a 65 72 20 66 6f 72 20 61 6e 20 73 71 6c  lizer for an sql
34f20 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
34f30 0a 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f  .  ** The name o
34f40 66 20 74 68 65 20 56 46 53 20 69 73 20 4e 41 4d  f the VFS is NAM
34f50 45 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61  E.  The pAppData
34f60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
34f70 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20   a pointer.  ** 
34f80 74 6f 20 74 68 65 20 22 66 69 6e 64 65 72 22 20  to the "finder" 
34f90 66 75 6e 63 74 69 6f 6e 2e 20 20 28 70 41 70 70  function.  (pApp
34fa0 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74 65  Data is a pointe
34fb0 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 62  r to a pointer b
34fc0 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 69 6c 6c  ecause.  ** sill
34fd0 79 20 43 39 30 20 72 75 6c 65 73 20 70 72 6f 68  y C90 rules proh
34fe0 69 62 69 74 20 61 20 76 6f 69 64 2a 20 66 72 6f  ibit a void* fro
34ff0 6d 20 62 65 69 6e 67 20 63 61 73 74 20 74 6f 20  m being cast to 
35000 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
35010 65 72 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 77  er.  ** and so w
35020 65 20 68 61 76 65 20 74 6f 20 67 6f 20 74 68 72  e have to go thr
35030 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72 6d 65  ough the interme
35040 64 69 61 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  diate pointer to
35050 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 0a   avoid problems.
35060 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
35070 69 6e 67 20 77 69 74 68 20 2d 70 65 64 61 6e 74  ing with -pedant
35080 69 63 2d 65 72 72 6f 72 73 20 6f 6e 20 47 43 43  ic-errors on GCC
35090 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  .).  **.  ** The
350a0 20 46 49 4e 44 45 52 20 70 61 72 61 6d 65 74 65   FINDER paramete
350b0 72 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  r to this macro 
350c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
350d0 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
350e0 65 0a 20 20 2a 2a 20 66 69 6e 64 65 72 2d 66 75  e.  ** finder-fu
350f0 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 66 69 6e  nction.  The fin
35100 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 74  der-function ret
35110 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
35120 6f 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  o the.  ** sqlit
35130 65 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  e_io_methods obj
35140 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
35150 6e 74 73 20 74 68 65 20 64 65 73 69 72 65 64 20  nts the desired 
35160 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 62 65 68  locking.  ** beh
35170 61 76 69 6f 72 73 2e 20 20 53 65 65 20 74 68 65  aviors.  See the
35180 20 64 69 76 69 73 69 6f 6e 20 61 62 6f 76 65 20   division above 
35190 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
351a0 65 20 49 4f 4d 45 54 48 4f 44 53 0a 20 20 2a 2a  e IOMETHODS.  **
351b0 20 6d 61 63 72 6f 20 66 6f 72 20 61 64 64 69 74   macro for addit
351c0 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
351d0 6f 6e 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  on finder-functi
351e0 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ons..  **.  ** M
351f0 6f 73 74 20 66 69 6e 64 65 72 73 20 73 69 6d 70  ost finders simp
35200 6c 79 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ly return a poin
35210 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
35220 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
35230 73 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  s.  ** object.  
35240 42 75 74 20 74 68 65 20 22 61 75 74 6f 6c 6f 63  But the "autoloc
35250 6b 49 6f 46 69 6e 64 65 72 22 20 61 76 61 69 6c  kIoFinder" avail
35260 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 64  able on MacOSX d
35270 6f 65 73 20 61 20 6c 69 74 74 6c 65 0a 20 20 2a  oes a little.  *
35280 2a 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 61 74  * more than that
35290 3b 20 69 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  ; it looks at th
352a0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
352b0 65 20 74 68 61 74 20 68 6f 73 74 73 20 74 68 65  e that hosts the
352c0 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
352d0 66 69 6c 65 20 61 6e 64 20 74 72 69 65 73 20 74  file and tries t
352e0 6f 20 63 68 6f 6f 73 65 20 61 6e 20 6c 6f 63 6b  o choose an lock
352f0 69 6e 67 20 6d 65 74 68 6f 64 20 61 70 70 72 6f  ing method appro
35300 70 72 69 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20  priate for.  ** 
35310 74 68 61 74 20 66 69 6c 65 73 79 73 74 65 6d 20  that filesystem 
35320 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 23 64 65  time..  */.  #de
35330 66 69 6e 65 20 55 4e 49 58 56 46 53 28 56 46 53  fine UNIXVFS(VFS
35340 4e 41 4d 45 2c 20 46 49 4e 44 45 52 29 20 7b 20  NAME, FINDER) { 
35350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35360 20 20 20 20 20 20 20 5c 0a 20 20 20 20 32 2c 20         \.    2, 
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
35390 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
353a0 20 20 20 20 20 5c 0a 20 20 20 20 73 69 7a 65 6f       \.    sizeo
353b0 66 28 75 6e 69 78 46 69 6c 65 29 2c 20 20 20 20  f(unixFile),    
353c0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 20   /* szOsFile */ 
353d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353e0 20 20 20 5c 0a 20 20 20 20 4d 41 58 5f 50 41 54     \.    MAX_PAT
353f0 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20 2f  HNAME,         /
35400 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 20  * mxPathname */ 
35410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35420 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20   \.    0,       
35430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35440 70 4e 65 78 74 20 2a 2f 20 20 20 20 20 20 20 20  pNext */        
35450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35460 0a 20 20 20 20 56 46 53 4e 41 4d 45 2c 20 20 20  .    VFSNAME,   
35470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
35480 61 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ame */          
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
354a0 20 20 20 28 76 6f 69 64 2a 29 26 46 49 4e 44 45     (void*)&FINDE
354b0 52 2c 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70  R,       /* pApp
354c0 44 61 74 61 20 2a 2f 20 20 20 20 20 20 20 20 20  Data */         
354d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
354e0 20 75 6e 69 78 4f 70 65 6e 2c 20 20 20 20 20 20   unixOpen,      
354f0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
35500 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35510 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35520 6e 69 78 44 65 6c 65 74 65 2c 20 20 20 20 20 20  nixDelete,      
35530 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
35540 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
35550 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35560 78 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  xAccess,        
35570 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35590 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 46       \.    unixF
355a0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
355b0 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
355c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
355d0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 4f     \.    unixDlO
355e0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
355f0 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 20 20 20 20  * xDlOpen */    
35600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35610 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 45 72 72   \.    unixDlErr
35620 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
35630 78 44 6c 45 72 72 6f 72 20 2a 2f 20 20 20 20 20  xDlError */     
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35650 0a 20 20 20 20 75 6e 69 78 44 6c 53 79 6d 2c 20  .    unixDlSym, 
35660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
35670 6c 53 79 6d 20 2a 2f 20 20 20 20 20 20 20 20 20  lSym */         
35680 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35690 20 20 20 75 6e 69 78 44 6c 43 6c 6f 73 65 2c 20     unixDlClose, 
356a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
356b0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
356c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
356d0 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 2c   unixRandomness,
356e0 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
356f0 6d 6e 65 73 73 20 2a 2f 20 20 20 20 20 20 20 20  mness */        
35700 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35710 6e 69 78 53 6c 65 65 70 2c 20 20 20 20 20 20 20  nixSleep,       
35720 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
35730 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
35740 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35750 78 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  xCurrentTime,   
35760 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
35770 6d 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  me */           
35780 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 47       \.    unixG
35790 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
357a0 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
357b0 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  r */            
357c0 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d     \.    unixShm
357d0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  Open,          /
357e0 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f 20 20 20  * xShmOpen */   
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35800 20 5c 0a 20 20 20 20 75 6e 69 78 53 68 6d 53 69   \.    unixShmSi
35810 7a 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze,          /* 
35820 78 53 68 6d 53 69 7a 65 20 2a 2f 20 20 20 20 20  xShmSize */     
35830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
35840 0a 20 20 20 20 75 6e 69 78 53 68 6d 47 65 74 2c  .    unixShmGet,
35850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
35860 68 6d 47 65 74 20 2a 2f 20 20 20 20 20 20 20 20  hmGet */        
35870 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
35880 20 20 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73     unixShmReleas
35890 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d  e,       /* xShm
358a0 52 65 6c 65 61 73 65 20 2a 2f 20 20 20 20 20 20  Release */      
358b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
358c0 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
358d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
358e0 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
358f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75           \.    u
35900 6e 69 78 53 68 6d 43 6c 6f 73 65 2c 20 20 20 20  nixShmClose,    
35910 20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73       /* xShmClos
35920 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
35930 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69         \.    uni
35940 78 53 68 6d 44 65 6c 65 74 65 2c 20 20 20 20 20  xShmDelete,     
35950 20 20 20 2f 2a 20 78 53 68 6d 44 65 6c 65 74 65     /* xShmDelete
35960 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
35970 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20       \.    0,   
35980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35990 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20 20   /* xRename */  
359a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359b0 20 20 20 5c 0a 20 20 20 20 30 2c 20 20 20 20 20     \.    0,     
359c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
359d0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
359e0 74 36 34 20 2a 2f 20 20 20 20 20 20 20 20 20 20  t64 */          
359f0 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   \.  }..  /*.  *
35a00 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74 20 56 46  * All default VF
35a10 53 65 73 20 66 6f 72 20 75 6e 69 78 20 61 72 65  Ses for unix are
35a20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
35a30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
35a40 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  y..  **.  ** Not
35a50 65 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  e that the sqlit
35a60 65 33 5f 76 66 73 2e 70 4e 65 78 74 20 66 69 65  e3_vfs.pNext fie
35a70 6c 64 20 6f 66 20 74 68 65 20 56 46 53 20 6f 62  ld of the VFS ob
35a80 6a 65 63 74 20 69 73 20 6d 6f 64 69 66 69 65 64  ject is modified
35a90 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 53 51 4c  .  ** by the SQL
35aa0 69 74 65 20 63 6f 72 65 20 77 68 65 6e 20 74 68  ite core when th
35ab0 65 20 56 46 53 20 69 73 20 72 65 67 69 73 74 65  e VFS is registe
35ac0 72 65 64 2e 20 20 53 6f 20 74 68 65 20 66 6f 6c  red.  So the fol
35ad0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61 72 72 61  lowing.  ** arra
35ae0 79 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 73  y cannot be cons
35af0 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  t..  */.  static
35b00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 61 56 66   sqlite3_vfs aVf
35b10 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53 51 4c 49  s[] = {.#if SQLI
35b20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35b30 47 5f 53 54 59 4c 45 20 26 26 20 28 4f 53 5f 56  G_STYLE && (OS_V
35b40 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66 69 6e 65  XWORKS || define
35b50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20  d(__APPLE__)).  
35b60 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 22    UNIXVFS("unix"
35b70 2c 20 20 20 20 20 20 20 20 20 20 61 75 74 6f 6c  ,          autol
35b80 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23  ockIoFinder ),.#
35b90 65 6c 73 65 0a 20 20 20 20 55 4e 49 58 56 46 53  else.    UNIXVFS
35ba0 28 22 75 6e 69 78 22 2c 20 20 20 20 20 20 20 20  ("unix",        
35bb0 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 20    posixIoFinder 
35bc0 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 55 4e  ),.#endif.    UN
35bd0 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 6f 6e 65  IXVFS("unix-none
35be0 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ",     nolockIoF
35bf0 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49  inder ),.    UNI
35c00 58 56 46 53 28 22 75 6e 69 78 2d 64 6f 74 66 69  XVFS("unix-dotfi
35c10 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b 49 6f 46  le",  dotlockIoF
35c20 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 4f 53 5f  inder ),.#if OS_
35c30 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49 58  VXWORKS.    UNIX
35c40 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d 65 64 73  VFS("unix-nameds
35c50 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e 64 65 72  em", semIoFinder
35c60 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   ),.#endif.#if S
35c70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
35c80 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 55  KING_STYLE.    U
35c90 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 70 6f 73  NIXVFS("unix-pos
35ca0 69 78 22 2c 20 20 20 20 70 6f 73 69 78 49 6f 46  ix",    posixIoF
35cb0 69 6e 64 65 72 20 29 2c 0a 23 69 66 20 21 4f 53  inder ),.#if !OS
35cc0 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55 4e 49  _VXWORKS.    UNI
35cd0 58 56 46 53 28 22 75 6e 69 78 2d 66 6c 6f 63 6b  XVFS("unix-flock
35ce0 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  ",    flockIoFin
35cf0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 65  der ),.#endif.#e
35d00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
35d10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
35d20 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
35d30 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 55  __APPLE__).    U
35d40 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 61 66 70  NIXVFS("unix-afp
35d50 22 2c 20 20 20 20 20 20 61 66 70 49 6f 46 69 6e  ",      afpIoFin
35d60 64 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56  der ),.    UNIXV
35d70 46 53 28 22 75 6e 69 78 2d 6e 66 73 22 2c 20 20  FS("unix-nfs",  
35d80 20 20 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 20      nfsIoFinder 
35d90 29 2c 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22  ),.    UNIXVFS("
35da0 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20 20 20 20  unix-proxy",    
35db0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 20 29 2c  proxyIoFinder ),
35dc0 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 75  .#endif.  };.  u
35dd0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 20 20  nsigned int i;  
35de0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
35df0 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
35e00 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46   Register all VF
35e10 53 65 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  Ses defined in t
35e20 68 65 20 61 56 66 73 5b 5d 20 61 72 72 61 79 20  he aVfs[] array 
35e30 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
35e40 28 73 69 7a 65 6f 66 28 61 56 66 73 29 2f 73 69  (sizeof(aVfs)/si
35e50 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 66 73  zeof(sqlite3_vfs
35e60 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  )); i++){.    sq
35e70 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
35e80 65 72 28 26 61 56 66 73 5b 69 5d 2c 20 69 3d 3d  er(&aVfs[i], i==
35e90 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
35ea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
35eb0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
35ec0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
35ed0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
35ee0 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65 72 61 74  *.** Some operat
35ef0 69 6e 67 20 73 79 73 74 65 6d 73 20 6d 69 67 68  ing systems migh
35f00 74 20 6e 65 65 64 20 74 6f 20 64 6f 20 73 6f 6d  t need to do som
35f10 65 20 63 6c 65 61 6e 75 70 20 69 6e 20 74 68 69  e cleanup in thi
35f20 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 74 6f  s routine,.** to
35f30 20 72 65 6c 65 61 73 65 20 64 79 6e 61 6d 69 63   release dynamic
35f40 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ally allocated o
35f50 62 6a 65 63 74 73 2e 20 20 42 75 74 20 6e 6f 74  bjects.  But not
35f60 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20 54 68 69   on unix..** Thi
35f70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
35f80 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78 2e 0a 2a  o-op for unix..*
35f90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
35fa0 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72  _end(void){ .  r
35fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35fc0 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20 2f 2a 20   .}. .#endif /* 
35fd0 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 2a  SQLITE_OS_UNIX *
35fe0 2f 0a                                            /.