/ Hex Artifact Content
Login

Artifact 0a75314cdd881e138a5da4d450102cf9ce9c1786:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 55 6e 69 78 20 73 79 73  ific to Unix sys
01b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tems..*/.#includ
01c0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
01d0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
01e0: 23 69 66 20 4f 53 5f 55 4e 49 58 20 20 20 20 20  #if OS_UNIX     
01f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
0200: 20 66 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e   file is used on
0210: 20 75 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a   unix only */...
0220: 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68  #include <time.h
0230: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0240: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
0250: 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c   <errno.h>.#incl
0260: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 0a  ude <unistd.h>..
0270: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 63  /*.** Do not inc
0280: 6c 75 64 65 20 61 6e 79 20 6f 66 20 74 68 65 20  lude any of the 
0290: 46 69 6c 65 20 49 2f 4f 20 69 6e 74 65 72 66 61  File I/O interfa
02a0: 63 65 20 70 72 6f 63 65 64 75 72 65 73 20 69 66  ce procedures if
02b0: 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   the.** SQLITE_O
02c0: 4d 49 54 5f 44 49 53 4b 49 4f 20 6d 61 63 72 6f  MIT_DISKIO macro
02d0: 20 69 73 20 64 65 66 69 6e 65 64 20 28 69 6e 64   is defined (ind
02e0: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65  icating that the
02f0: 72 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 77  re database.** w
0300: 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f 72 79  ill be in-memory
0310: 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e 64 65   only).*/.#ifnde
0320: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
0330: 53 4b 49 4f 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  SKIO.../*.** Def
0340: 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61 63 72  ine various macr
0350: 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69 73 73  os that are miss
0360: 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79  ing from some sy
0370: 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
0380: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
0390: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
03a0: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 64  LE 0.#endif.#ifd
03b0: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
03c0: 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f  E_LFS.# undef O_
03d0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
03e0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
03f0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
0400: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66  O_NOFOLLOW.# def
0410: 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30  ine O_NOFOLLOW 0
0420: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
0430: 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66 69 6e  O_BINARY.# defin
0440: 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e  e O_BINARY 0.#en
0450: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  dif../*.** The D
0460: 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e  JGPP compiler en
0470: 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20  vironment looks 
0480: 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78  mostly like Unix
0490: 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b  , but it.** lack
04a0: 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79  s the fcntl() sy
04b0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72  stem call.  So r
04c0: 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20  edefine fcntl() 
04d0: 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a  to be something.
04e0: 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20 73  ** that always s
04f0: 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d  ucceeds.  This m
0500: 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e  eans that lockin
0510: 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  g does not occur
0520: 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e   under.** DJGPP.
0530: 20 20 42 75 74 20 69 74 73 20 44 4f 53 20 2d 20    But its DOS - 
0540: 77 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70  what did you exp
0550: 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  ect?.*/.#ifdef _
0560: 5f 44 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e  _DJGPP__.# defin
0570: 65 20 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30  e fcntl(A,B,C) 0
0580: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0590: 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74  nclude code that
05a0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c   is common to al
05b0: 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a  l os_*.c files.*
05c0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63  /.#include "os_c
05d0: 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  ommon.h"../*.** 
05e0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
05f0: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
0600: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
0610: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
0620: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
0630: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
0640: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0650: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 23 64 65  UNIX_THREADS.#de
0660: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 70 74  fine threadid pt
0670: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c  hread_self().#el
0680: 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61  se.#define threa
0690: 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  did 0.#endif../*
06a0: 0a 2a 2a 20 53 65 74 20 6f 72 20 63 68 65 63 6b  .** Set or check
06b0: 20 74 68 65 20 4f 73 46 69 6c 65 2e 74 69 64 20   the OsFile.tid 
06c0: 66 69 65 6c 64 2e 20 20 54 68 69 73 20 66 69 65  field.  This fie
06d0: 6c 64 20 69 73 20 73 65 74 20 77 68 65 6e 20 61  ld is set when a
06e0: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 69 73 20 66  n OsFile.** is f
06f0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 20 41 6c  irst opened.  Al
0700: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 75 73 65  l subsequent use
0710: 73 20 6f 66 20 74 68 65 20 4f 73 46 69 6c 65 20  s of the OsFile 
0720: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 0a  verify that the.
0730: 2a 2a 20 73 61 6d 65 20 74 68 72 65 61 64 20 69  ** same thread i
0740: 73 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74  s operating on t
0750: 68 65 20 4f 73 46 69 6c 65 2e 20 20 53 6f 6d 65  he OsFile.  Some
0760: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
0770: 6d 73 20 64 6f 0a 2a 2a 20 6e 6f 74 20 61 6c 6c  ms do.** not all
0780: 6f 77 20 6c 6f 63 6b 73 20 74 6f 20 62 65 20 6f  ow locks to be o
0790: 76 65 72 72 69 64 64 65 6e 20 62 79 20 6f 74 68  verridden by oth
07a0: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 74  er threads and t
07b0: 68 61 74 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  hat restriction.
07c0: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 73 71  ** means that sq
07d0: 6c 69 74 65 33 2a 20 64 61 74 61 62 61 73 65 20  lite3* database 
07e0: 68 61 6e 64 6c 65 73 20 63 61 6e 6e 6f 74 20 62  handles cannot b
07f0: 65 20 6d 6f 76 65 64 20 66 72 6f 6d 20 6f 6e 65  e moved from one
0800: 20 74 68 72 65 61 64 0a 2a 2a 20 74 6f 20 61 6e   thread.** to an
0810: 6f 74 68 65 72 2e 20 20 54 68 69 73 20 6c 6f 67  other.  This log
0820: 69 63 20 6d 61 6b 65 73 20 73 75 72 65 20 61 20  ic makes sure a 
0830: 75 73 65 72 20 64 6f 65 73 20 6e 6f 74 20 74 72  user does not tr
0840: 79 20 74 6f 20 64 6f 20 74 68 61 74 0a 2a 2a 20  y to do that.** 
0850: 62 79 20 6d 69 73 74 61 6b 65 2e 0a 2a 2f 0a 23  by mistake..*/.#
0860: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0870: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 29 20  E_UNIX_THREADS) 
0880: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0890: 54 45 5f 41 4c 4c 4f 57 5f 58 54 48 52 45 41 44  TE_ALLOW_XTHREAD
08a0: 5f 43 4f 4e 4e 45 43 54 49 4f 4e 53 29 0a 23 20  _CONNECTIONS).# 
08b0: 64 65 66 69 6e 65 20 53 45 54 5f 54 48 52 45 41  define SET_THREA
08c0: 44 49 44 28 58 29 20 20 20 58 2d 3e 74 69 64 20  DID(X)   X->tid 
08d0: 3d 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29  = pthread_self()
08e0: 0a 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  .# define CHECK_
08f0: 54 48 52 45 41 44 49 44 28 58 29 20 28 21 70 74  THREADID(X) (!pt
0900: 68 72 65 61 64 5f 65 71 75 61 6c 28 58 2d 3e 74  hread_equal(X->t
0910: 69 64 2c 20 70 74 68 72 65 61 64 5f 73 65 6c 66  id, pthread_self
0920: 28 29 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  ())).#else.# def
0930: 69 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44  ine SET_THREADID
0940: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 43 48 45  (X).# define CHE
0950: 43 4b 5f 54 48 52 45 41 44 49 44 28 58 29 20 30  CK_THREADID(X) 0
0960: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
0970: 65 72 65 20 69 73 20 74 68 65 20 64 69 72 74 20  ere is the dirt 
0980: 6f 6e 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  on POSIX advisor
0990: 79 20 6c 6f 63 6b 73 3a 20 20 41 4e 53 49 20 53  y locks:  ANSI S
09a0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
09b0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
09c0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
09d0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
09e0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
09f0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
0a00: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
0a10: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
0a20: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
0a30: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
0a40: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
0a50: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
0a60: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
0a70: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
0a80: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
0a90: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
0aa0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
0ab0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
0ac0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
0ad0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
0ae0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
0af0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
0b00: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
0b10: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
0b20: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
0b30: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
0b40: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
0b50: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
0b60: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
0b70: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
0b80: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
0b90: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
0ba0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
0bb0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
0bc0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
0bd0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
0be0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
0bf0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
0c00: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
0c10: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
0c20: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0c30: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
0c40: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
0c50: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
0c60: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
0c70: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
0c80: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
0c90: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
0ca0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
0cb0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
0cc0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
0cd0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
0ce0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
0cf0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
0d00: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
0d10: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
0d20: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
0d30: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
0d40: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
0d50: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
0d60: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75   names..**.** Bu
0d70: 6d 6d 65 72 2e 20 20 49 66 20 79 6f 75 20 61 73  mmer.  If you as
0d80: 6b 20 6d 65 2c 20 74 68 69 73 20 69 73 20 62 72  k me, this is br
0d90: 6f 6b 65 6e 2e 20 20 42 61 64 6c 79 20 62 72 6f  oken.  Badly bro
0da0: 6b 65 6e 2e 20 20 49 74 20 6d 65 61 6e 73 0a 2a  ken.  It means.*
0db0: 2a 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  * that we cannot
0dc0: 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73   use POSIX locks
0dd0: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
0de0: 66 69 6c 65 20 61 63 63 65 73 73 20 61 6d 6f 6e  file access amon
0df0: 67 0a 2a 2a 20 63 6f 6d 70 65 74 69 6e 67 20 74  g.** competing t
0e00: 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61  hreads of the sa
0e10: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53  me process.  POS
0e20: 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f  IX locks will wo
0e30: 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79  rk fine.** to sy
0e40: 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73  nchronize access
0e50: 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20   for threads in 
0e60: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
0e70: 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74  es, but not.** t
0e80: 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68  hreads within th
0e90: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a  e same process..
0ea0: 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72  **.** To work ar
0eb0: 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d  ound the problem
0ec0: 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20  , SQLite has to 
0ed0: 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b  manage file lock
0ee0: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  s internally.** 
0ef0: 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65  on its own.  Whe
0f00: 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61  never a new data
0f10: 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20  base is opened, 
0f20: 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20  we have to find 
0f30: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  the.** specific 
0f40: 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74  inode of the dat
0f50: 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20  abase file (the 
0f60: 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69  inode is determi
0f70: 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74  ned by the.** st
0f80: 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20  _dev and st_ino 
0f90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74  fields of the st
0fa0: 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61  at structure tha
0fb0: 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20  t fstat() fills 
0fc0: 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b  in).** and check
0fd0: 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61   for locks alrea
0fe0: 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74  dy existing on t
0ff0: 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e  hat inode.  When
1000: 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72   locks are.** cr
1010: 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64  eated or removed
1020: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f  , we have to loo
1030: 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74  k at our own int
1040: 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20  ernal record of 
1050: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20  the.** locks to 
1060: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74  see if another t
1070: 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f  hread has previo
1080: 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20  usly set a lock 
1090: 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  on that same.** 
10a0: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inode..**.** The
10b0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
10c0: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
10d0: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
10e0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
10f0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
1100: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
1110: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
1120: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
1130: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
1140: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
1150: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1160: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
1170: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
1180: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
1190: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
11a0: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
11b0: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
11c0: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
11d0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
11e0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
11f0: 62 6f 74 68 20 4f 73 46 69 6c 65 20 73 74 72 75  both OsFile stru
1200: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
1210: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
1220: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1230: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
1240: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
1250: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1260: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
1270: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
1280: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
1290: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
12a0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
12b0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
12c0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
12d0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
12e0: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
12f0: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
1300: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
1310: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
1320: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1330: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
1340: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
1350: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
1360: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1370: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
1380: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
1390: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
13a0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
13b0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
13c0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
13d0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
13e0: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
13f0: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
1400: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
1410: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
1420: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
1430: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30   state..**.** 20
1440: 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f  04-Jan-11:.** Mo
1450: 72 65 20 72 65 63 65 6e 74 20 64 69 73 63 6f 76  re recent discov
1460: 65 72 69 65 73 20 61 62 6f 75 74 20 50 4f 53 49  eries about POSI
1470: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
1480: 2e 20 20 28 54 68 65 20 6d 6f 72 65 0a 2a 2a 20  .  (The more.** 
1490: 49 20 64 69 73 63 6f 76 65 72 2c 20 74 68 65 20  I discover, the 
14a0: 6d 6f 72 65 20 49 20 72 65 61 6c 69 7a 65 20 74  more I realize t
14b0: 68 65 20 61 20 50 4f 53 49 58 20 61 64 76 69 73  he a POSIX advis
14c0: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a  ory locks are.**
14d0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e   an abomination.
14e0: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ).**.** If you c
14f0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
1500: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
1510: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
1520: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
1530: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
1540: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
1550: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
1560: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
1570: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
1580: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1590: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
15a0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
15b0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
15c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
15d0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 2e  enCnt structure.
15e0: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6f    There is one o
15f0: 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65  penCnt structure
1600: 0a 2a 2a 20 70 65 72 20 6f 70 65 6e 20 69 6e 6f  .** per open ino
1610: 64 65 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  de, which means 
1620: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 4f 73  that multiple Os
1630: 46 69 6c 65 73 20 63 61 6e 20 70 6f 69 6e 74 20  Files can point 
1640: 74 6f 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f  to a single.** o
1650: 70 65 6e 43 6e 74 2e 20 20 57 68 65 6e 20 61 6e  penCnt.  When an
1660: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1670: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 4f 73 46   to close an OsF
1680: 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ile, if there ar
1690: 65 0a 2a 2a 20 6f 74 68 65 72 20 4f 73 46 69 6c  e.** other OsFil
16a0: 65 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  es open on the s
16b0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
16c0: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
16d0: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
16e0: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
16f0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1700: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
1710: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
1720: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 6f 70  clear..** The op
1730: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
1740: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
1750: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1760: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
1770: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
1780: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
1790: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
17a0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
17b0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
17c0: 2a 0a 2a 2a 20 46 69 72 73 74 2c 20 75 6e 64 65  *.** First, unde
17d0: 72 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 2c  r Linux threads,
17e0: 20 62 65 63 61 75 73 65 20 65 61 63 68 20 74 68   because each th
17f0: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
1800: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
1810: 44 2c 20 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f  D, lock operatio
1820: 6e 73 20 69 6e 20 6f 6e 65 20 74 68 72 65 61 64  ns in one thread
1830: 20 64 6f 20 6e 6f 74 20 6f 76 65 72 72 69 64 65   do not override
1840: 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f 20 74 68 65   locks.** to the
1850: 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 20 6f 74   same file in ot
1860: 68 65 72 20 74 68 72 65 61 64 73 2e 20 20 4c 69  her threads.  Li
1870: 6e 75 78 20 74 68 72 65 61 64 73 20 62 65 68 61  nux threads beha
1880: 76 65 20 6c 69 6b 65 0a 2a 2a 20 73 65 70 61 72  ve like.** separ
1890: 61 74 65 20 70 72 6f 63 65 73 73 65 73 20 69 6e  ate processes in
18a0: 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 20 20   this respect.  
18b0: 42 75 74 2c 20 69 66 20 79 6f 75 20 63 6c 6f 73  But, if you clos
18c0: 65 20 61 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  e a file.** desc
18d0: 72 69 70 74 6f 72 20 69 6e 20 6c 69 6e 75 78 20  riptor in linux 
18e0: 74 68 72 65 61 64 73 2c 20 61 6c 6c 20 6c 6f 63  threads, all loc
18f0: 6b 73 20 61 72 65 20 63 6c 65 61 72 65 64 2c 20  ks are cleared, 
1900: 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e  even locks.** on
1910: 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
1920: 6e 64 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  nd even though t
1930: 68 65 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  he other threads
1940: 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1950: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 73 2e 20  ** process IDs. 
1960: 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69   Linux threads i
1970: 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 69  s inconsistent i
1980: 6e 20 74 68 69 73 20 72 65 73 70 65 63 74 2e 0a  n this respect..
1990: 2a 2a 20 28 49 27 6d 20 62 65 67 69 6e 6e 69 6e  ** (I'm beginnin
19a0: 67 20 74 6f 20 74 68 69 6e 6b 20 74 68 61 74 20  g to think that 
19b0: 6c 69 6e 75 78 20 74 68 72 65 61 64 73 20 69 73  linux threads is
19c0: 20 61 6e 20 61 62 6f 6d 69 6e 61 74 69 6f 6e 20   an abomination 
19d0: 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65 20 63 6f 6e  too.).** The con
19e0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 69 73  sequence of this
19f0: 20 61 6c 6c 20 69 73 20 74 68 61 74 20 74 68 65   all is that the
1a00: 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
1a10: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20  the lockInfo.** 
1a20: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 74 6f  structure has to
1a30: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f   include the pro
1a40: 63 65 73 73 20 69 64 20 61 73 20 70 61 72 74 20  cess id as part 
1a50: 6f 66 20 69 74 73 20 6b 65 79 20 62 65 63 61 75  of its key becau
1a60: 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20 69 6e 20 64  se.** locks in d
1a70: 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 73  ifferent threads
1a80: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
1a90: 64 69 73 74 69 6e 63 74 2e 20 20 42 75 74 20 74  distinct.  But t
1aa0: 68 65 20 0a 2a 2a 20 6f 70 65 6e 43 6e 74 20 73  he .** openCnt s
1ab0: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
1ac0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
1ad0: 70 72 6f 63 65 73 73 20 69 64 20 69 6e 20 69 74  process id in it
1ae0: 73 0a 2a 2a 20 6b 65 79 20 62 65 63 61 75 73 65  s.** key because
1af0: 20 63 6c 6f 73 65 28 29 20 63 6c 65 61 72 73 20   close() clears 
1b00: 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 74 68 72 65  lock on all thre
1b10: 61 64 73 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68  ads, not just th
1b20: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 68 72  e current.** thr
1b30: 65 61 64 2e 20 20 57 65 72 65 20 69 74 20 6e 6f  ead.  Were it no
1b40: 74 20 66 6f 72 20 74 68 69 73 20 67 6f 6f 66 69  t for this goofi
1b50: 6e 65 73 73 20 69 6e 20 6c 69 6e 75 78 20 74 68  ness in linux th
1b60: 72 65 61 64 73 2c 20 77 65 20 63 6f 75 6c 64 0a  reads, we could.
1b70: 2a 2a 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  ** combine the l
1b80: 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e  ockInfo and open
1b90: 43 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 69  Cnt structures i
1ba0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 74 72  nto a single str
1bb0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  ucture..**.** 20
1bc0: 30 34 2d 4a 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e  04-Jun-28:.** On
1bd0: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1be0: 66 20 6c 69 6e 75 78 2c 20 74 68 72 65 61 64 73  f linux, threads
1bf0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61   can override ea
1c00: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e  ch others locks.
1c10: 0a 2a 2a 20 4f 6e 20 6f 74 68 65 72 73 20 6e 6f  .** On others no
1c20: 74 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 79 6f  t.  Sometimes yo
1c30: 75 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65  u can change the
1c40: 20 62 65 68 61 76 69 6f 72 20 6f 6e 20 74 68 65   behavior on the
1c50: 20 73 61 6d 65 0a 2a 2a 20 73 79 73 74 65 6d 20   same.** system 
1c60: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 4c  by setting the L
1c70: 44 5f 41 53 53 55 4d 45 5f 4b 45 52 4e 45 4c 20  D_ASSUME_KERNEL 
1c80: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
1c90: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 50 4f  able.  The.** PO
1ca0: 53 49 58 20 73 74 61 6e 64 61 72 64 20 69 73 20  SIX standard is 
1cb0: 73 69 6c 65 6e 74 20 61 73 20 74 6f 20 77 68 69  silent as to whi
1cc0: 63 68 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ch behavior is c
1cd0: 6f 72 72 65 63 74 2c 20 61 73 20 66 61 72 0a 2a  orrect, as far.*
1ce0: 2a 20 61 73 20 49 20 63 61 6e 20 74 65 6c 6c 2c  * as I can tell,
1cf0: 20 73 6f 20 6f 74 68 65 72 20 76 65 72 73 69 6f   so other versio
1d00: 6e 73 20 6f 66 20 75 6e 69 78 20 6d 69 67 68 74  ns of unix might
1d10: 20 73 68 6f 77 20 74 68 65 20 73 61 6d 65 0a 2a   show the same.*
1d20: 2a 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 2e  * inconsistency.
1d30: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6c 69    There is no li
1d40: 74 74 6c 65 20 64 6f 75 62 74 20 69 6e 20 6d 79  ttle doubt in my
1d50: 20 6d 69 6e 64 20 74 68 61 74 20 70 6f 73 69 78   mind that posix
1d60: 0a 2a 2a 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  .** advisory loc
1d70: 6b 73 20 61 6e 64 20 6c 69 6e 75 78 20 74 68 72  ks and linux thr
1d80: 65 61 64 73 20 61 72 65 20 70 72 6f 66 6f 75 6e  eads are profoun
1d90: 64 6c 79 20 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a  dly broken..**.*
1da0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
1db0: 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e   the inconsisten
1dc0: 63 69 65 73 2c 20 77 65 20 68 61 76 65 20 74 6f  cies, we have to
1dd0: 20 74 65 73 74 20 61 74 20 72 75 6e 74 69 6d 65   test at runtime
1de0: 20 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20   .** whether or 
1df0: 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e 20  not threads can 
1e00: 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74  override each ot
1e10: 68 65 72 73 20 6c 6f 63 6b 73 2e 20 20 54 68 69  hers locks.  Thi
1e20: 73 20 74 65 73 74 0a 2a 2a 20 69 73 20 72 75 6e  s test.** is run
1e30: 20 6f 6e 63 65 2c 20 74 68 65 20 66 69 72 73 74   once, the first
1e40: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
1e50: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 20  s attempted.  A 
1e60: 73 74 61 74 69 63 20 0a 2a 2a 20 76 61 72 69 61  static .** varia
1e70: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 72 65  ble is set to re
1e80: 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  cord the results
1e90: 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 66 6f   of this test fo
1ea0: 72 20 66 75 74 75 72 65 0a 2a 2a 20 75 73 65 2e  r future.** use.
1eb0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
1ec0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1ee0: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
1ef0: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
1f00: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
1f10: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
1f20: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
1f30: 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inode..**.** If 
1f40: 74 68 72 65 61 64 73 20 63 61 6e 6e 6f 74 20 6f  threads cannot o
1f50: 76 65 72 72 69 64 65 20 65 61 63 68 20 6f 74 68  verride each oth
1f60: 65 72 73 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 20  ers locks, then 
1f70: 77 65 20 73 65 74 20 74 68 65 0a 2a 2a 20 6c 6f  we set the.** lo
1f80: 63 6b 4b 65 79 2e 74 69 64 20 66 69 65 6c 64 20  ckKey.tid field 
1f90: 74 6f 20 74 68 65 20 74 68 72 65 61 64 20 49 44  to the thread ID
1fa0: 2e 20 20 49 66 20 74 68 72 65 61 64 73 20 63 61  .  If threads ca
1fb0: 6e 20 6f 76 65 72 72 69 64 65 0a 2a 2a 20 65 61  n override.** ea
1fc0: 63 68 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20  ch others locks 
1fd0: 74 68 65 6e 20 74 69 64 20 69 73 20 61 6c 77 61  then tid is alwa
1fe0: 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ys set to zero. 
1ff0: 20 74 69 64 20 69 73 20 61 6c 73 6f 0a 2a 2a 20   tid is also.** 
2000: 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 66 20 77  set to zero if w
2010: 65 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 6f 75  e compile withou
2020: 74 20 74 68 72 65 61 64 69 6e 67 20 73 75 70 70  t threading supp
2030: 6f 72 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c  ort..*/.struct l
2040: 6f 63 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74  ockKey {.  dev_t
2050: 20 64 65 76 3b 20 20 20 20 20 20 20 2f 2a 20 44   dev;       /* D
2060: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
2070: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20    ino_t ino;    
2080: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
2090: 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  er */.#ifdef SQL
20a0: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
20b0: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 69 64  .  pthread_t tid
20c0: 3b 20 20 20 2f 2a 20 54 68 72 65 61 64 20 49 44  ;   /* Thread ID
20d0: 20 6f 72 20 7a 65 72 6f 20 69 66 20 74 68 72 65   or zero if thre
20e0: 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ads can override
20f0: 20 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23   each other */.#
2100: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
2110: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
2120: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2130: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
2140: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
2150: 6e 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61  n.** inode on ea
2160: 63 68 20 74 68 72 65 61 64 20 77 69 74 68 20 61  ch thread with a
2170: 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65   different proce
2180: 73 73 20 49 44 2e 20 20 28 54 68 72 65 61 64 73  ss ID.  (Threads
2190: 20 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65   have.** differe
21a0: 6e 74 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f  nt process IDs o
21b0: 6e 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74  n linux, but not
21c0: 20 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75   on most other u
21d0: 6e 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20  nixes.).**.** A 
21e0: 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e  single inode can
21f0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66   have multiple f
2200: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2210: 20 73 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a   so each OsFile.
2220: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
2230: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
2240: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
2250: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
2260: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
2270: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
2280: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2290: 4f 73 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67  OsFiles pointing
22a0: 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63   to it..*/.struc
22b0: 74 20 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73  t lockInfo {.  s
22c0: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65  truct lockKey ke
22d0: 79 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75  y;  /* The looku
22e0: 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63  p key */.  int c
22f0: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
2300: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
2310: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
2320: 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  /.  int locktype
2330: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
2340: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
2350: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
2360: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  c. */.  int nRef
2370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2380: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
2390: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
23a0: 74 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ture */.};../*.*
23b0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
23c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23d0: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
23e0: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
23f0: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
2400: 61 72 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e  articular openCn
2410: 74 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65  t structure give
2420: 6e 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68  n its inode.  Th
2430: 69 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  is.** is the sam
2440: 65 20 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79  e as the lockKey
2450: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
2460: 20 74 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d   thread ID is om
2470: 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  itted..*/.struct
2480: 20 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76   openKey {.  dev
2490: 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76  _t dev;   /* Dev
24a0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ice number */.  
24b0: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20  ino_t ino;   /* 
24c0: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
24d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
24e0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
24f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2500: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
2510: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
2520: 6e 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75  node.  This stru
2530: 63 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63  cture keeps trac
2540: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
2550: 6f 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74  of locks on that
2560: 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61  .** inode.  If a
2570: 20 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70   close is attemp
2580: 74 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69  ted against an i
2590: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c  node that is hol
25a0: 64 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74  ding.** locks, t
25b0: 68 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65  he close is defe
25c0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c  rred until all l
25d0: 6f 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64  ocks clear by ad
25e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
25f0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2600: 65 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20  e closed to the 
2610: 70 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f  pending list..*/
2620: 0a 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20  .struct openCnt 
2630: 7b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b  {.  struct openK
2640: 65 79 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65  ey key;   /* The
2650: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
2660: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2680: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
2690: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
26a0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
26b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26c0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
26d0: 6e 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e  ng locks */.  in
26e0: 74 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  t nPending;     
26f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2700: 20 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29   pending close()
2710: 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
2720: 20 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20   int *aPending; 
2730: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63         /* Malloc
2740: 65 64 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67  ed space holding
2750: 20 66 64 27 73 20 61 77 61 69 74 69 6e 67 20 61   fd's awaiting a
2760: 20 63 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a   close() */.};..
2770: 2f 2a 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73  /* .** These has
2780: 68 20 74 61 62 6c 65 20 6d 61 70 73 20 69 6e 6f  h table maps ino
2790: 64 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  des and process 
27a0: 49 44 73 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66  IDs into lockInf
27b0: 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 0a 2a 2a  o and openCnt.**
27c0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 41 63   structures.  Ac
27d0: 63 65 73 73 20 74 6f 20 74 68 65 73 65 20 68 61  cess to these ha
27e0: 73 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62  sh tables must b
27f0: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  e protected by a
2800: 20 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   mutex..*/.stati
2810: 63 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20  c Hash lockHash 
2820: 3d 20 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f  = { SQLITE_HASH_
2830: 42 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c  BINARY, 0, 0, 0,
2840: 20 30 2c 20 30 20 7d 3b 0a 73 74 61 74 69 63 20   0, 0 };.static 
2850: 48 61 73 68 20 6f 70 65 6e 48 61 73 68 20 3d 20  Hash openHash = 
2860: 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49  { SQLITE_HASH_BI
2870: 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30  NARY, 0, 0, 0, 0
2880: 2c 20 30 20 7d 3b 0a 0a 0a 23 69 66 64 65 66 20  , 0 };...#ifdef 
2890: 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45  SQLITE_UNIX_THRE
28a0: 41 44 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  ADS./*.** This v
28b0: 61 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20  ariable records 
28c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
28d0: 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72  hreads can overr
28e0: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a  ide each others.
28f0: 2a 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ** locks..**.** 
2900: 20 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65     0:  No.  Thre
2910: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
2920: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
2930: 6c 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20  locks..**    1: 
2940: 20 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63   Yes.  Threads c
2950: 61 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68  an override each
2960: 20 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a   others locks..*
2970: 2a 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27  *   -1:  We don'
2980: 74 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2f 0a 73  t know yet..*/.s
2990: 74 61 74 69 63 20 69 6e 74 20 74 68 72 65 61 64  tatic int thread
29a0: 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68  sOverrideEachOth
29b0: 65 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a 0a  ersLocks = -1;..
29c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63  /*.** This struc
29d0: 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ture holds infor
29e0: 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e  mation passed in
29f0: 74 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65  to individual te
2a00: 73 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79  st.** threads by
2a10: 20 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c   the testThreadL
2a20: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29  ockingBehavior()
2a30: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72   routine..*/.str
2a40: 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61  uct threadTestDa
2a50: 74 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20  ta {.  int fd;  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a70: 20 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   File to be lock
2a80: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66  ed */.  struct f
2a90: 6c 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f  lock lock;     /
2aa0: 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70  * The locking op
2ab0: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
2ac0: 20 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20   result;        
2ad0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
2ae0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   the locking ope
2af0: 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69  ration */.};..#i
2b00: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
2b10: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
2b20: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
2b30: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
2b40: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
2b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b60: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2b70: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
2b80: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
2b90: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
2ba0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
2bb0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
2bc0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
2bd0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
2be0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
2bf0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
2c00: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
2c10: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 6e 65 64  mally.** turnned
2c20: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
2c30: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
2c40: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
2c50: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
2c60: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
2c70: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
2c80: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
2c90: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
2ca0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
2cb0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
2cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
2cd0: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
2ce0: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
2cf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2d00: 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   = fcntl(fd, op,
2d10: 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   p);.    sqlite3
2d20: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
2d30: 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64  tl unknown %d %d
2d40: 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20   %d\n", fd, op, 
2d50: 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  s);.    return s
2d60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c  ;.  }.  if( p->l
2d70: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
2d80: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52  {.    zType = "R
2d90: 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69  DLCK";.  }else i
2da0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
2db0: 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  WRLCK ){.    zTy
2dc0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
2dd0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
2de0: 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
2df0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
2e00: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  CK";.  }else{.  
2e10: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2e20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2e30: 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53  l_whence==SEEK_S
2e40: 45 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74  ET );.  s = fcnt
2e50: 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20  l(fd, op, p);.  
2e60: 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72  savedErrno = err
2e70: 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  no;.  sqlite3Deb
2e80: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20  ugPrintf("fcntl 
2e90: 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25  %d %d %s %s %d %
2ea0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
2eb0: 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a   threadid, fd, z
2ec0: 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28  OpName, zType, (
2ed0: 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20  int)p->l_start, 
2ee0: 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20  (int)p->l_len,. 
2ef0: 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69      (int)p->l_pi
2f00: 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 20 26  d, s);.  if( s &
2f10: 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26  & op==F_SETLK &&
2f20: 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52   (p->l_type==F_R
2f30: 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70  DLCK || p->l_typ
2f40: 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20  e==F_WRLCK) ){. 
2f50: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
2f60: 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b  l2;.    l2 = *p;
2f70: 0a 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  .    fcntl(fd, F
2f80: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
2f90: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
2fa0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
2fb0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
2fc0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2fd0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
2fe0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2ff0: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
3000: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
3010: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
3020: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
3030: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
3040: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
3050: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
3060: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
3070: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
3080: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
3090: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
30a0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
30b0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
30c0: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
30d0: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
30e0: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
30f0: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
3100: 0a 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c  .#define fcntl l
3110: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
3120: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
3130: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  RACE */../*.** T
3140: 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63  he testThreadLoc
3150: 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72  kingBehavior() r
3160: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20  outine launches 
3170: 74 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  two separate.** 
3180: 74 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20  threads on this 
3190: 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72  routine.  This r
31a0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
31b0: 74 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a  to lock a file.*
31c0: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  * descriptor the
31d0: 6e 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20  n returns.  The 
31e0: 73 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75  success or failu
31f0: 72 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d  re of that attem
3200: 70 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  pt.** allows the
3210: 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69   testThreadLocki
3220: 6e 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f  ngBehavior() pro
3230: 63 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d  cedure to determ
3240: 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
3250: 72 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61  r not threads ca
3260: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3270: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f  others locks..*/
3280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68  .static void *th
3290: 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28  readLockingTest(
32a0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
32b0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
32c0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73  Data *pData = (s
32d0: 74 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74  truct threadTest
32e0: 44 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44  Data*)pArg;.  pD
32f0: 61 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63  ata->result = fc
3300: 6e 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46  ntl(pData->fd, F
3310: 5f 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e  _SETLK, &pData->
3320: 6c 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  lock);.  return 
3330: 70 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pArg;.}../*.** T
3340: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74  his procedure at
3350: 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
3360: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
3370: 6f 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61  ot threads.** ca
3380: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
3390: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65  others locks the
33a0: 6e 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74  n sets the .** t
33b0: 68 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61  hreadsOverrideEa
33c0: 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61  chOthersLocks va
33d0: 72 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61  riable appropria
33e0: 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
33f0: 76 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c  void testThreadL
3400: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
3410: 64 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66  d_orig){.  int f
3420: 64 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65  d;.  struct thre
3430: 61 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d 3b  adTestData d[2];
3440: 0a 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b 32  .  pthread_t t[2
3450: 5d 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66  ];..  fd = dup(f
3460: 64 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66  d_orig);.  if( f
3470: 64 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  d<0 ) return;.  
3480: 6d 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69 7a  memset(d, 0, siz
3490: 65 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e  eof(d));.  d[0].
34a0: 66 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e  fd = fd;.  d[0].
34b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
34c0: 52 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  RDLCK;.  d[0].lo
34d0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
34e0: 64 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72  d[0].lock.l_star
34f0: 74 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f  t = 0;.  d[0].lo
3500: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
3510: 45 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d  EK_SET;.  d[1] =
3520: 20 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f   d[0];.  d[1].lo
3530: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
3540: 4c 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63  LCK;.  pthread_c
3550: 72 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20  reate(&t[0], 0, 
3560: 74 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73  threadLockingTes
3570: 74 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68  t, &d[0]);.  pth
3580: 72 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 31  read_create(&t[1
3590: 5d 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b  ], 0, threadLock
35a0: 69 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b  ingTest, &d[1]);
35b0: 0a 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28  .  pthread_join(
35c0: 74 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72  t[0], 0);.  pthr
35d0: 65 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30  ead_join(t[1], 0
35e0: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
35f0: 20 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64    threadsOverrid
3600: 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73  eEachOthersLocks
3610: 20 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d   =  d[0].result=
3620: 3d 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c  =0 && d[1].resul
3630: 74 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  t==0;.}.#endif /
3640: 2a 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  * SQLITE_UNIX_TH
3650: 52 45 41 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  READS */../*.** 
3660: 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e  Release a lockIn
3670: 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65  fo structure pre
3680: 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
3690: 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  d by findLockInf
36a0: 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  o()..*/.static v
36b0: 6f 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49  oid releaseLockI
36c0: 6e 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49  nfo(struct lockI
36d0: 6e 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 70  nfo *pLock){.  p
36e0: 4c 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Lock->nRef--;.  
36f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d  if( pLock->nRef=
3700: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3710: 33 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63  3HashInsert(&loc
3720: 6b 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b  kHash, &pLock->k
3730: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b  ey, sizeof(pLock
3740: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
3750: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b  sqliteFree(pLock
3760: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3770: 52 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e  Release a openCn
3780: 74 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  t structure prev
3790: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
37a0: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
37b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
37c0: 69 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e  id releaseOpenCn
37d0: 74 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74  t(struct openCnt
37e0: 20 2a 70 4f 70 65 6e 29 7b 0a 20 20 70 4f 70 65   *pOpen){.  pOpe
37f0: 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  n->nRef--;.  if(
3800: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20   pOpen->nRef==0 
3810: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  ){.    sqlite3Ha
3820: 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61  shInsert(&openHa
3830: 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c  sh, &pOpen->key,
3840: 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b   sizeof(pOpen->k
3850: 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ey), 0);.    sql
3860: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61  iteFree(pOpen->a
3870: 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71  Pending);.    sq
3880: 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b  liteFree(pOpen);
3890: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
38a0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
38b0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f  iptor, locate lo
38c0: 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43  ckInfo and openC
38d0: 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68  nt structures th
38e0: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
38f0: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
3900: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
3910: 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65  new ones if nece
3920: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
3930: 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67  eturn values mig
3940: 68 74 20 62 65 20 75 6e 73 65 74 20 69 66 20 61  ht be unset if a
3950: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
3960: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
3970: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
3980: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3990: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20   findLockInfo(. 
39a0: 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20   int fd,        
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39c0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
39d0: 70 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65  ptor used in the
39e0: 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
39f0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f   lockInfo **ppLo
3a00: 63 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ck,    /* Return
3a10: 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74   the lockInfo st
3a20: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
3a30: 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74    struct openCnt
3a40: 20 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f   **ppOpen      /
3a50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65  * Return the ope
3a60: 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68  nCnt structure h
3a70: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
3a80: 72 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63  rc;.  struct loc
3a90: 6b 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72  kKey key1;.  str
3aa0: 75 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32  uct openKey key2
3ab0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
3ac0: 73 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63  statbuf;.  struc
3ad0: 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63  t lockInfo *pLoc
3ae0: 6b 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e  k;.  struct open
3af0: 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63  Cnt *pOpen;.  rc
3b00: 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74   = fstat(fd, &st
3b10: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
3b20: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  !=0 ) return 1;.
3b30: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20    memset(&key1, 
3b40: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29  0, sizeof(key1))
3b50: 3b 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73  ;.  key1.dev = s
3b60: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
3b70: 20 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74   key1.ino = stat
3b80: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64  buf.st_ino;.#ifd
3b90: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
3ba0: 48 52 45 41 44 53 0a 20 20 69 66 28 20 74 68 72  HREADS.  if( thr
3bb0: 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68  eadsOverrideEach
3bc0: 4f 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b  OthersLocks<0 ){
3bd0: 0a 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c  .    testThreadL
3be0: 6f 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66  ockingBehavior(f
3bf0: 64 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74  d);.  }.  key1.t
3c00: 69 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72  id = threadsOver
3c10: 72 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f  rideEachOthersLo
3c20: 63 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61  cks ? 0 : pthrea
3c30: 64 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66  d_self();.#endif
3c40: 0a 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c  .  memset(&key2,
3c50: 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29   0, sizeof(key2)
3c60: 29 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20  );.  key2.dev = 
3c70: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
3c80: 20 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61    key2.ino = sta
3c90: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70  tbuf.st_ino;.  p
3ca0: 4c 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c  Lock = (struct l
3cb0: 6f 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33  ockInfo*)sqlite3
3cc0: 48 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61  HashFind(&lockHa
3cd0: 73 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f  sh, &key1, sizeo
3ce0: 66 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20  f(key1));.  if( 
3cf0: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
3d00: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
3d10: 2a 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b  *pOld;.    pLock
3d20: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
3d30: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63  aw( sizeof(*pLoc
3d40: 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  k) );.    if( pL
3d50: 6f 63 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ock==0 ) return 
3d60: 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65  1;.    pLock->ke
3d70: 79 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c  y = key1;.    pL
3d80: 6f 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ock->nRef = 1;. 
3d90: 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20     pLock->cnt = 
3da0: 30 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  0;.    pLock->lo
3db0: 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  cktype = 0;.    
3dc0: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
3dd0: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61  shInsert(&lockHa
3de0: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  sh, &pLock->key,
3df0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70   sizeof(key1), p
3e00: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Lock);.    if( p
3e10: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
3e20: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c  assert( pOld==pL
3e30: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ock );.      sql
3e40: 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  iteFree(pLock);.
3e50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3e60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3e70: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
3e80: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20  ;.  }.  *ppLock 
3e90: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 70 4f 70 65 6e  = pLock;.  pOpen
3ea0: 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43   = (struct openC
3eb0: 6e 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  nt*)sqlite3HashF
3ec0: 69 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26  ind(&openHash, &
3ed0: 6b 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79  key2, sizeof(key
3ee0: 32 29 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e  2));.  if( pOpen
3ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
3f00: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b  t openCnt *pOld;
3f10: 0a 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c  .    pOpen = sql
3f20: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
3f30: 7a 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a  zeof(*pOpen) );.
3f40: 20 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30      if( pOpen==0
3f50: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
3f60: 65 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29  eLockInfo(pLock)
3f70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 65  ;.    }.    pOpe
3f90: 6e 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20  n->key = key2;. 
3fa0: 20 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d     pOpen->nRef =
3fb0: 20 31 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e   1;.    pOpen->n
3fc0: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 4f  Lock = 0;.    pO
3fd0: 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20  pen->nPending = 
3fe0: 30 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50  0;.    pOpen->aP
3ff0: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
4000: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
4010: 73 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61  shInsert(&openHa
4020: 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c  sh, &pOpen->key,
4030: 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70   sizeof(key2), p
4040: 4f 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  Open);.    if( p
4050: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
4060: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f  assert( pOld==pO
4070: 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  pen );.      sql
4080: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a  iteFree(pOpen);.
4090: 20 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63        releaseLoc
40a0: 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20  kInfo(pLock);.  
40b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
40c0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
40d0: 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a   pOpen->nRef++;.
40e0: 20 20 7d 0a 20 20 2a 70 70 4f 70 65 6e 20 3d 20    }.  *ppOpen = 
40f0: 70 4f 70 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20  pOpen;.  return 
4100: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
4110: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
4120: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
4130: 4f 73 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63  OsDelete(const c
4140: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
4150: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e  .  unlink(zFilen
4160: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ame);.  return S
4170: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4180: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
4190: 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
41a0: 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
41b0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
41c0: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
41d0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65  zFilename){.  re
41e0: 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c  turn access(zFil
41f0: 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a  ename, 0)==0;.}.
4200: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
4210: 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f  o open a file fo
4220: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
4230: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20  nd writing.  If 
4240: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74  that.** fails, t
4250: 72 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65  ry opening it re
4260: 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65  ad-only.  If the
4270: 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
4280: 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20  xist,.** try to 
4290: 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  create it..**.**
42a0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68   On success, a h
42b0: 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70  andle for the op
42c0: 65 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74  en file is writt
42d0: 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64  en to *id.** and
42e0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73   *pReadonly is s
42f0: 65 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66  et to 0 if the f
4300: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66  ile was opened f
4310: 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a  or reading and.*
4320: 2a 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69  * writing or 1 i
4330: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
4340: 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
4350: 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72    The function r
4360: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
4370: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
4380: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
4390: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
43a0: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
43b0: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e  leaves.** *id an
43c0: 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63  d *pReadonly unc
43d0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
43e0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
43f0: 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63  Write(.  const c
4400: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
4410: 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20    OsFile *id,.  
4420: 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29  int *pReadonly.)
4430: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
4440: 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65  sert( !id->isOpe
4450: 6e 20 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  n );.  id->dirfd
4460: 20 3d 20 2d 31 3b 0a 20 20 53 45 54 5f 54 48 52   = -1;.  SET_THR
4470: 45 41 44 49 44 28 69 64 29 3b 0a 20 20 69 64 2d  EADID(id);.  id-
4480: 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  >h = open(zFilen
4490: 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
44a0: 45 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  EAT|O_LARGEFILE|
44b0: 4f 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20  O_BINARY,.      
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
44e0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
44f0: 4f 4e 53 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  ONS);.  if( id->
4500: 68 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49  h<0 ){.#ifdef EI
4510: 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72  SDIR.    if( err
4520: 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20  no==EISDIR ){.  
4530: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4540: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
4550: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 64 2d  }.#endif.    id-
4560: 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  >h = open(zFilen
4570: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
4580: 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
4590: 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69 64 2d  RY);.    if( id-
45a0: 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65  >h<0 ){.      re
45b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
45c0: 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20 20 20  OPEN; .    }.   
45d0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   *pReadonly = 1;
45e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
45f0: 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20  Readonly = 0;.  
4600: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  }.  sqlite3OsEnt
4610: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
4620: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69  = findLockInfo(i
4630: 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b  d->h, &id->pLock
4640: 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20  , &id->pOpen);. 
4650: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
4660: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
4670: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64   ){.    close(id
4680: 2d 3e 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ->h);.    return
4690: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
46a0: 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70   }.  id->locktyp
46b0: 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f  e = 0;.  id->isO
46c0: 70 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41 43 45  pen = 1;.  TRACE
46d0: 33 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  3("OPEN    %-3d 
46e0: 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 7a 46  %s\n", id->h, zF
46f0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e  ilename);.  Open
4700: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
4710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4720: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  .}.../*.** Attem
4730: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77  pt to open a new
4740: 20 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73   file for exclus
4750: 69 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68  ive access by th
4760: 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54  is process..** T
4770: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
4780: 6f 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20  opened for both 
4790: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
47a0: 69 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a  ing.  To avoid.*
47b0: 2a 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65  * a potential se
47c0: 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20  curity problem, 
47d0: 77 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  we do not allow 
47e0: 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65  the file to have
47f0: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65  .** previously e
4800: 78 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20  xisted.  Nor do 
4810: 77 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c  we allow the fil
4820: 65 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c  e to be a symbol
4830: 69 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a  ic.** link..**.*
4840: 2a 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20  * If delFlag is 
4850: 74 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  true, then make 
4860: 61 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20  arrangements to 
4870: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
4880: 6c 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  lete.** the file
4890: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
48a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ed..**.** On suc
48b0: 63 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20  cess, write the 
48c0: 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f  file handle into
48d0: 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20   *id and return 
48e0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
48f0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74   On failure, ret
4900: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4910: 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  PEN..*/.int sqli
4920: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
4930: 76 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ve(const char *z
4940: 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65  Filename, OsFile
4950: 20 2a 69 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61   *id, int delFla
4960: 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
4970: 61 73 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f  assert( !id->isO
4980: 70 65 6e 20 29 3b 0a 20 20 69 66 28 20 61 63 63  pen );.  if( acc
4990: 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  ess(zFilename, 0
49a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
49b0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
49c0: 45 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48  EN;.  }.  SET_TH
49d0: 52 45 41 44 49 44 28 69 64 29 3b 0a 20 20 69 64  READID(id);.  id
49e0: 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  ->dirfd = -1;.  
49f0: 69 64 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69  id->h = open(zFi
4a00: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
4a10: 20 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f          O_RDWR|O
4a20: 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f  _CREAT|O_EXCL|O_
4a30: 4e 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45  NOFOLLOW|O_LARGE
4a40: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20  FILE|O_BINARY,. 
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
4a60: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
4a70: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
4a80: 0a 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20 29  .  if( id->h<0 )
4a90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4aa0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
4ab0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  }.  sqlite3OsEnt
4ac0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
4ad0: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69  = findLockInfo(i
4ae0: 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b  d->h, &id->pLock
4af0: 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20  , &id->pOpen);. 
4b00: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
4b10: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
4b20: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64   ){.    close(id
4b30: 2d 3e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  ->h);.    unlink
4b40: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
4b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
4b60: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e  OMEM;.  }.  id->
4b70: 6c 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20  locktype = 0;.  
4b80: 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a  id->isOpen = 1;.
4b90: 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b    if( delFlag ){
4ba0: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
4bb0: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52  ename);.  }.  TR
4bc0: 41 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d  ACE3("OPEN-EX %-
4bd0: 33 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c  3d %s\n", id->h,
4be0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f   zFilename);.  O
4bf0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
4c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4c10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
4c20: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
4c30: 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ew file for read
4c40: 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a  -only access..**
4c50: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
4c60: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
4c70: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
4c80: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
4c90: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
4ca0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
4cb0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
4cc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f  /.int sqlite3OsO
4cd0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73  penReadOnly(cons
4ce0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
4cf0: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  e, OsFile *id){.
4d00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
4d10: 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20  rt( !id->isOpen 
4d20: 29 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49  );.  SET_THREADI
4d30: 44 28 69 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72  D(id);.  id->dir
4d40: 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e 68  fd = -1;.  id->h
4d50: 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   = open(zFilenam
4d60: 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41  e, O_RDONLY|O_LA
4d70: 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59  RGEFILE|O_BINARY
4d80: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 68 3c 30  );.  if( id->h<0
4d90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4da0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
4db0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45    }.  sqlite3OsE
4dc0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
4dd0: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
4de0: 28 69 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f  (id->h, &id->pLo
4df0: 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b  ck, &id->pOpen);
4e00: 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76  .  sqlite3OsLeav
4e10: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
4e20: 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  rc ){.    close(
4e30: 69 64 2d 3e 68 29 3b 0a 20 20 20 20 72 65 74 75  id->h);.    retu
4e40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4e50: 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74  .  }.  id->lockt
4e60: 79 70 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69  ype = 0;.  id->i
4e70: 73 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41  sOpen = 1;.  TRA
4e80: 43 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33  CE3("OPEN-RO %-3
4e90: 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %s\n", id->h, 
4ea0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70  zFilename);.  Op
4eb0: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
4ec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4ed0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
4ee0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69  mpt to open a fi
4ef0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
4f00: 72 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  r the directory 
4f10: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a  that contains a.
4f20: 2a 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66  ** file.  This f
4f30: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
4f40: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73  an be used to fs
4f50: 79 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74  ync() the direct
4f60: 6f 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  ory.** in order 
4f70: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
4f80: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e   creation of a n
4f90: 65 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61  ew file is actua
4fa0: 6c 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  lly written.** t
4fb0: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  o disk..**.** Th
4fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
4fd0: 6c 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f  ly meaningful fo
4fe0: 72 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61  r Unix.  It is a
4ff0: 20 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20   no-op under.** 
5000: 77 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69  windows since wi
5010: 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73  ndows does not s
5020: 75 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b  upport hard link
5030: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  s..**.** On succ
5040: 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f  ess, a handle fo
5050: 72 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f  r a previously o
5060: 70 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a  pen file is at *
5070: 69 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64  id is.** updated
5080: 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69   with the new di
5090: 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
50a0: 63 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49  criptor and SQLI
50b0: 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75  TE_OK is.** retu
50c0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66  rned..**.** On f
50d0: 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63  ailure, the func
50e0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
50f0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64  ITE_CANTOPEN and
5100: 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75   leaves.** *id u
5110: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
5120: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
5130: 72 65 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74  rectory(.  const
5140: 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 2c   char *zDirname,
5150: 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 0a 29 7b  .  OsFile *id.){
5160: 0a 20 20 69 66 28 20 21 69 64 2d 3e 69 73 4f 70  .  if( !id->isOp
5170: 65 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  en ){.    /* Do 
5180: 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 64 69 72  not open the dir
5190: 65 63 74 6f 72 79 20 69 66 20 74 68 65 20 63 6f  ectory if the co
51a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69 6c 65  rresponding file
51b0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
51c0: 20 20 20 20 2a 2a 20 6f 70 65 6e 2e 20 2a 2f 0a      ** open. */.
51d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
51e0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
51f0: 20 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 69    SET_THREADID(i
5200: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  d);.  assert( id
5210: 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 69  ->dirfd<0 );.  i
5220: 64 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28  d->dirfd = open(
5230: 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
5240: 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
5250: 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
5260: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
5270: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
5280: 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28  ; .  }.  TRACE3(
5290: 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
52a0: 5c 6e 22 2c 20 69 64 2d 3e 64 69 72 66 64 2c 20  \n", id->dirfd, 
52b0: 7a 44 69 72 6e 61 6d 65 29 3b 0a 20 20 72 65 74  zDirname);.  ret
52c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
52d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
52e0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
52f0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
5300: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
5310: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
5320: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
5330: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
5340: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
5350: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65  d to store.** te
5360: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
5370: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
5380: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
5390: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74   0;../*.** Creat
53a0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
53b0: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
53c0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
53d0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
53e0: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
53f0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
5400: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
5410: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54  /.int sqlite3OsT
5420: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72  empFileName(char
5430: 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
5440: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
5450: 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
5460: 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  0,.     "/var/tm
5470: 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74  p",.     "/usr/t
5480: 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22  mp",.     "/tmp"
5490: 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b  ,.     ".",.  };
54a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
54b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
54c0: 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
54d0: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
54e0: 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
54f0: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
5500: 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
5510: 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69  0123456789";.  i
5520: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
5530: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
5540: 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
5550: 20 22 2e 22 3b 0a 20 20 61 7a 44 69 72 73 5b 30   ".";.  azDirs[0
5560: 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  ] = sqlite3_temp
5570: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 66 6f  _directory;.  fo
5580: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5590: 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
55a0: 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zDirs[0]); i++){
55b0: 0a 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b  .    if( azDirs[
55c0: 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
55d0: 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61  ;.    if( stat(a
55e0: 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20  zDirs[i], &buf) 
55f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5600: 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
5610: 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
5620: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63  inue;.    if( ac
5630: 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20  cess(azDirs[i], 
5640: 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  07) ) continue;.
5650: 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72      zDir = azDir
5660: 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b  s[i];.    break;
5670: 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 73  .  }.  do{.    s
5680: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73  printf(zBuf, "%s
5690: 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  /"TEMP_FILE_PREF
56a0: 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a  IX, zDir);.    j
56b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
56c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
56d0: 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
56e0: 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
56f0: 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
5700: 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
5710: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
5720: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
5730: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
5740: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
5750: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
5760: 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
5770: 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29  ( access(zBuf,0)
5780: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
5790: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 23  SQLITE_OK; .}..#
57a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
57b0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
57c0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
57d0: 74 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e 61  t a given pathna
57e0: 6d 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72  me is a director
57f0: 79 20 61 6e 64 20 69 73 20 77 72 69 74 61 62 6c  y and is writabl
5800: 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e .**.*/.int sql
5810: 69 74 65 33 4f 73 49 73 44 69 72 57 72 69 74 61  ite3OsIsDirWrita
5820: 62 6c 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b  ble(char *zBuf){
5830: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
5840: 75 66 3b 0a 20 20 69 66 28 20 7a 42 75 66 3d 3d  uf;.  if( zBuf==
5850: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
5860: 69 66 28 20 7a 42 75 66 5b 30 5d 3d 3d 30 20 29  if( zBuf[0]==0 )
5870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
5880: 20 73 74 61 74 28 7a 42 75 66 2c 20 26 62 75 66   stat(zBuf, &buf
5890: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
58a0: 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
58b0: 2e 73 74 5f 6d 6f 64 65 29 20 29 20 72 65 74 75  .st_mode) ) retu
58c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65  rn 0;.  if( acce
58d0: 73 73 28 7a 42 75 66 2c 20 30 37 29 20 29 20 72  ss(zBuf, 07) ) r
58e0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
58f0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
5900: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
5910: 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f  ER_PRAGMAS */../
5920: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
5930: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
5940: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
5950: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
5960: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
5970: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
5980: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
5990: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
59a0: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
59b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 52  /.int sqlite3OsR
59c0: 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ead(OsFile *id, 
59d0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
59e0: 61 6d 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  amt){.  int got;
59f0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69  .  assert( id->i
5a00: 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c  sOpen );.  Simul
5a10: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
5a20: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45  E_IOERR);.  TIME
5a30: 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d  R_START;.  got =
5a40: 20 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75   read(id->h, pBu
5a50: 66 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52  f, amt);.  TIMER
5a60: 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22  _END;.  TRACE5("
5a70: 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
5a80: 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e   %7d %d\n", id->
5a90: 68 2c 20 67 6f 74 2c 20 6c 61 73 74 5f 70 61 67  h, got, last_pag
5aa0: 65 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  e, TIMER_ELAPSED
5ab0: 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20  );.  SEEK(0);.  
5ac0: 2f 2a 20 69 66 28 20 67 6f 74 3c 30 20 29 20 67  /* if( got<0 ) g
5ad0: 6f 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 69 66 28  ot = 0; */.  if(
5ae0: 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
5af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5b00: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
5b10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5b20: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
5b30: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
5b40: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
5b50: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
5b60: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5b70: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
5b80: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
5b90: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
5ba0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69  int sqlite3OsWri
5bb0: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63  te(OsFile *id, c
5bc0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
5bd0: 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74   int amt){.  int
5be0: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
5bf0: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
5c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
5c10: 74 3e 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  t>0 );.  Simulat
5c20: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
5c30: 49 4f 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61  IOERR);.  Simula
5c40: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b  teDiskfullError;
5c50: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
5c60: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
5c70: 26 20 28 77 72 6f 74 65 20 3d 20 77 72 69 74 65  & (wrote = write
5c80: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
5c90: 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74  t))>0 ){.    amt
5ca0: 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   -= wrote;.    p
5cb0: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
5cc0: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
5cd0: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
5ce0: 54 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20  TRACE5("WRITE   
5cf0: 25 2d 33 64 20 25 35 64 20 25 37 64 20 25 64 5c  %-3d %5d %7d %d\
5d00: 6e 22 2c 20 69 64 2d 3e 68 2c 20 77 72 6f 74 65  n", id->h, wrote
5d10: 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d  , last_page, TIM
5d20: 45 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53  ER_ELAPSED);.  S
5d30: 45 45 4b 28 30 29 3b 0a 20 20 69 66 28 20 61 6d  EEK(0);.  if( am
5d40: 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
5d50: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
5d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5d70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5d80: 4d 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72  Move the read/wr
5d90: 69 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61  ite pointer in a
5da0: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
5db0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 4f 73 46 69  lite3OsSeek(OsFi
5dc0: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
5dd0: 65 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  et){.  assert( i
5de0: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53  d->isOpen );.  S
5df0: 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20  EEK(offset/1024 
5e00: 2b 20 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  + 1);.#ifdef SQL
5e10: 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 6f  ITE_TEST.  if( o
5e20: 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74 65  ffset ) Simulate
5e30: 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23 65  DiskfullError.#e
5e40: 6e 64 69 66 0a 20 20 6c 73 65 65 6b 28 69 64 2d  ndif.  lseek(id-
5e50: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
5e60: 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  _SET);.  return 
5e70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5e80: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5e90: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
5ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
5eb0: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
5ec0: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
5ed0: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
5ee0: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
5ef0: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
5f00: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
5f10: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
5f20: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
5f30: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
5f40: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
5f50: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
5f60: 0a 2f 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  ./*.** Use the f
5f70: 64 61 74 61 73 79 6e 63 28 29 20 41 50 49 20 6f  datasync() API o
5f80: 6e 6c 79 20 69 66 20 74 68 65 20 48 41 56 45 5f  nly if the HAVE_
5f90: 46 44 41 54 41 53 59 4e 43 20 6d 61 63 72 6f 20  FDATASYNC macro 
5fa0: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 20 4f  is defined..** O
5fb0: 74 68 65 72 77 69 73 65 20 75 73 65 20 66 73 79  therwise use fsy
5fc0: 6e 63 28 29 20 69 6e 20 69 74 73 20 70 6c 61 63  nc() in its plac
5fd0: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 48 41  e..*/.#ifndef HA
5fe0: 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
5ff0: 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
6000: 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 0a 2f  fsync.#endif.../
6010: 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
6020: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
6030: 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
6040: 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
6050: 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
6060: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6070: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
6080: 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
6090: 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
60a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
60b0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
60c0: 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
60d0: 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
60e0: 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
60f0: 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
6100: 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
6110: 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
6120: 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
6130: 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
6140: 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
6150: 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
6160: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
6170: 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
6180: 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
6190: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
61a0: 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
61b0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
61c0: 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
61d0: 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
61e0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
61f0: 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66  tatic int full_f
6200: 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74  sync(int fd, int
6210: 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64   fullSync, int d
6220: 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  ataOnly){.  int 
6230: 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rc;..  /* Record
6240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
6250: 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
6260: 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
6270: 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
6280: 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
6290: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
62a0: 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
62b0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
62c0: 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
62d0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
62e0: 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
62f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6300: 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
6310: 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
6320: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
6330: 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
6340: 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
6350: 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
6360: 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
6370: 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
6380: 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
6390: 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
63a0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
63b0: 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
63c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
63d0: 65 0a 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  e..#ifdef F_FULL
63e0: 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c  FSYNC.  if( full
63f0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
6400: 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c   fcntl(fd, F_FUL
6410: 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
6420: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
6430: 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
6440: 20 46 55 4c 4c 53 59 4e 43 20 66 61 69 6c 65 64   FULLSYNC failed
6450: 2c 20 74 72 79 20 74 6f 20 64 6f 20 61 20 6e 6f  , try to do a no
6460: 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a  rmal fsync() */.
6470: 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
6480: 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 73  fsync(fd);..#els
6490: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
64a0: 28 46 5f 46 55 4c 4c 53 59 4e 43 29 20 2a 2f 0a  (F_FULLSYNC) */.
64b0: 20 20 69 66 28 20 64 61 74 61 4f 6e 6c 79 20 29    if( dataOnly )
64c0: 7b 0a 20 20 20 20 72 63 20 3d 20 66 64 61 74 61  {.    rc = fdata
64d0: 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 65 6c 73  sync(fd);.  }els
64e0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e  e{.    rc = fsyn
64f0: 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  c(fd);.  }.#endi
6500: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 46 5f 46  f /* defined(F_F
6510: 55 4c 4c 46 53 59 4e 43 29 20 2a 2f 0a 23 65 6e  ULLFSYNC) */.#en
6520: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
6530: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a  QLITE_NO_SYNC) *
6540: 2f 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  /..  return rc;.
6550: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
6560: 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
6570: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
6580: 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
6590: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
65a0: 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
65b0: 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
65c0: 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
65d0: 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
65e0: 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
65f0: 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
6600: 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
6610: 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
6620: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
6630: 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
6640: 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
6650: 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
6660: 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
6670: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
6680: 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
6690: 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
66a0: 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
66b0: 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
66c0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
66d0: 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
66e0: 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
66f0: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
6700: 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
6710: 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
6720: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
6730: 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
6740: 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
6750: 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
6760: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
6770: 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
6780: 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
6790: 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
67a0: 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
67b0: 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
67c0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
67d0: 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
67e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
67f0: 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
6800: 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
6810: 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
6820: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
6830: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6840: 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69  OsSync(OsFile *i
6850: 64 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  d, int dataOnly)
6860: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  {.  assert( id->
6870: 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75  isOpen );.  Simu
6880: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
6890: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41  TE_IOERR);.  TRA
68a0: 43 45 32 28 22 53 59 4e 43 20 20 20 20 25 2d 33  CE2("SYNC    %-3
68b0: 64 5c 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20  d\n", id->h);.  
68c0: 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69  if( full_fsync(i
68d0: 64 2d 3e 68 2c 20 69 64 2d 3e 66 75 6c 6c 53 79  d->h, id->fullSy
68e0: 6e 63 2c 20 64 61 74 61 4f 6e 6c 79 29 20 29 7b  nc, dataOnly) ){
68f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6900: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20  TE_IOERR;.  }.  
6910: 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
6920: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
6930: 44 49 52 53 59 4e 43 20 25 2d 33 64 5c 6e 22 2c  DIRSYNC %-3d\n",
6940: 20 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20   id->dirfd);.   
6950: 20 69 66 28 20 66 75 6c 6c 5f 66 73 79 6e 63 28   if( full_fsync(
6960: 69 64 2d 3e 64 69 72 66 64 2c 20 69 64 2d 3e 66  id->dirfd, id->f
6970: 75 6c 6c 53 79 6e 63 2c 20 30 29 20 29 7b 0a 20  ullSync, 0) ){. 
6980: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
6990: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
69a0: 7d 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e  }.    close(id->
69b0: 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79  dirfd);  /* Only
69c0: 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e   need to sync on
69d0: 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65  ce, so close the
69e0: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
69f0: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
6a00: 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20  ;    /* when we 
6a10: 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 7d  are done. */.  }
6a20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6a30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
6a40: 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
6a50: 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20   zDirname. This 
6a60: 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70  is a no-op on op
6a70: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
6a80: 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e  other.** than UN
6a90: 49 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  IX..**.** This i
6aa0: 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  s used to make s
6ab0: 75 72 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ure the master j
6ac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
6ad0: 74 72 75 65 6c 79 20 62 65 65 6e 20 64 65 6c 65  truely been dele
6ae0: 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 6d 61  ted.** before ma
6af0: 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20  king changes to 
6b00: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
6b10: 61 6c 73 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 64  als on a multi-d
6b20: 61 74 61 62 61 73 65 20 63 6f 6d 6d 69 74 2e 0a  atabase commit..
6b30: 2a 2a 20 54 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** The F_FULLFSY
6b40: 4e 43 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74  NC option is not
6b50: 20 6e 65 65 64 65 64 20 68 65 72 65 2e 0a 2a 2f   needed here..*/
6b60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79  .int sqlite3OsSy
6b70: 6e 63 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73  ncDirectory(cons
6b80: 74 20 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65  t char *zDirname
6b90: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 69  ){.  int fd;.  i
6ba0: 6e 74 20 72 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nt r;.  Simulate
6bb0: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
6bc0: 4f 45 52 52 29 3b 0a 20 20 66 64 20 3d 20 6f 70  OERR);.  fd = op
6bd0: 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
6be0: 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
6bf0: 30 29 3b 0a 20 20 54 52 41 43 45 33 28 22 44 49  0);.  TRACE3("DI
6c00: 52 53 59 4e 43 20 25 2d 33 64 20 28 25 73 29 5c  RSYNC %-3d (%s)\
6c10: 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65  n", fd, zDirname
6c20: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
6c30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6c40: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20  TE_CANTOPEN; .  
6c50: 7d 0a 20 20 72 20 3d 20 66 73 79 6e 63 28 66 64  }.  r = fsync(fd
6c60: 29 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  );.  close(fd);.
6c70: 20 20 72 65 74 75 72 6e 20 28 28 72 3d 3d 30 29    return ((r==0)
6c80: 3f 53 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54  ?SQLITE_OK:SQLIT
6c90: 45 5f 49 4f 45 52 52 29 3b 0a 7d 0a 0a 2f 2a 0a  E_IOERR);.}../*.
6ca0: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
6cb0: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
6cc0: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
6cd0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 72 75  int sqlite3OsTru
6ce0: 6e 63 61 74 65 28 4f 73 46 69 6c 65 20 2a 69 64  ncate(OsFile *id
6cf0: 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  , i64 nByte){.  
6d00: 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70  assert( id->isOp
6d10: 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  en );.  Simulate
6d20: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
6d30: 4f 45 52 52 29 3b 0a 20 20 72 65 74 75 72 6e 20  OERR);.  return 
6d40: 66 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 68 2c  ftruncate(id->h,
6d50: 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51 4c   nByte)==0 ? SQL
6d60: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
6d70: 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IOERR;.}../*.** 
6d80: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
6d90: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
6da0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
6db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69  .int sqlite3OsFi
6dc0: 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69  leSize(OsFile *i
6dd0: 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
6de0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
6df0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  f;.  assert( id-
6e00: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 69 6d  >isOpen );.  Sim
6e10: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
6e20: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66  ITE_IOERR);.  if
6e30: 28 20 66 73 74 61 74 28 69 64 2d 3e 68 2c 20 26  ( fstat(id->h, &
6e40: 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  buf)!=0 ){.    r
6e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6e60: 52 52 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65  RR;.  }.  *pSize
6e70: 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a   = buf.st_size;.
6e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
6ea0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
6eb0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
6ec0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
6ed0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
6ee0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
6ef0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
6f00: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
6f10: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
6f20: 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
6f30: 65 72 6f 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ero.  If the fil
6f40: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 6f 72  e is unlocked or
6f50: 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 53 48 41 52   holds only SHAR
6f60: 45 44 20 6c 6f 63 6b 73 2c 20 74 68 65 6e 0a 2a  ED locks, then.*
6f70: 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  * return zero..*
6f80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43  /.int sqlite3OsC
6f90: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
6fa0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
6fb0: 69 6e 74 20 72 20 3d 20 30 3b 0a 0a 20 20 61 73  int r = 0;..  as
6fc0: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
6fd0: 20 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b 5f   );.  if( CHECK_
6fe0: 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20 72  THREADID(id) ) r
6ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
7000: 55 53 45 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  USE;.  sqlite3Os
7010: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
7020: 20 4e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   Needed because 
7030: 69 64 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  id->pLock is sha
7040: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
7050: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
7060: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
7070: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
7080: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
7090: 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f  */.  if( id->pLo
70a0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53 48 41  ck->locktype>SHA
70b0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
70c0: 72 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r = 1;.  }..  /*
70d0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
70e0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
70f0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
7100: 20 2a 2f 0a 20 20 69 66 28 20 21 72 20 29 7b 0a   */.  if( !r ){.
7110: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
7120: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
7130: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
7140: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
7150: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
7160: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
7170: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
7180: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
7190: 52 4c 43 4b 3b 0a 20 20 20 20 66 63 6e 74 6c 28  RLCK;.    fcntl(
71a0: 69 64 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  id->h, F_GETLK, 
71b0: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
71c0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  lock.l_type!=F_U
71d0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 20  NLCK ){.      r 
71e0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
71f0: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61   .  sqlite3OsLea
7200: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41  veMutex();.  TRA
7210: 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE3("TEST WR-LOC
7220: 4b 20 25 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e  K %d %d\n", id->
7230: 68 2c 20 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  h, r);..  return
7240: 20 72 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   r;.}..#ifdef SQ
7250: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
7260: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
7270: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
7280: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
7290: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
72a0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
72b0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
72c0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 74   string represet
72d0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70  ation of the sup
72e0: 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  plied.** integer
72f0: 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73   lock-type..*/.s
7300: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7310: 20 2a 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28   * locktypeName(
7320: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
7330: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
7340: 65 20 29 7b 0a 20 20 63 61 73 65 20 4e 4f 5f 4c  e ){.  case NO_L
7350: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
7360: 45 22 3b 0a 20 20 63 61 73 65 20 53 48 41 52 45  E";.  case SHARE
7370: 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  D_LOCK: return "
7380: 53 48 41 52 45 44 22 3b 0a 20 20 63 61 73 65 20  SHARED";.  case 
7390: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
73a0: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
73b0: 3b 0a 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47  ;.  case PENDING
73c0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50  _LOCK: return "P
73d0: 45 4e 44 49 4e 47 22 3b 0a 20 20 63 61 73 65 20  ENDING";.  case 
73e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
73f0: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
7400: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
7410: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
7420: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  if../*.** Lock t
7430: 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
7440: 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
7450: 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
7460: 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
7470: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
7480: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
7490: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
74a0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
74b0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
74c0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
74d0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
74e0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
74f0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
7500: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
7510: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
7520: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
7530: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
7540: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
7550: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
7560: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
7570: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
7580: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
7590: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
75a0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
75b0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
75c0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
75d0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
75e0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
75f0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
7600: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
7610: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
7620: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
7630: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
7640: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
7650: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
7660: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
7670: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
7680: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
7690: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
76a0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
76b0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
76c0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
76d0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
76e0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
76f0: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
7700: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
7710: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
7720: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
7730: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
7740: 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  el..*/.int sqlit
7750: 65 33 4f 73 4c 6f 63 6b 28 4f 73 46 69 6c 65 20  e3OsLock(OsFile 
7760: 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
7770: 65 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  e){.  /* The fol
7780: 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73  lowing describes
7790: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
77a0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f  ion of the vario
77b0: 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a  us locks and.  *
77c0: 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f  * lock transitio
77d0: 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ns in terms of t
77e0: 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  he POSIX advisor
77f0: 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63  y shared and exc
7800: 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b  lusive.  ** lock
7810: 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c   primitives (cal
7820: 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61  led read-locks a
7830: 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62  nd write-locks b
7840: 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20  elow, to avoid. 
7850: 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69   ** confusion wi
7860: 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e  th SQLite lock n
7870: 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72  ames). The algor
7880: 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69  ithms are compli
7890: 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68  cated.  ** sligh
78a0: 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  tly in order to 
78b0: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
78c0: 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  th windows syste
78d0: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
78e0: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
78f0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
7900: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
7910: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
7920: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
7930: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
7940: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
7950: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
7960: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
7970: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
7980: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
7990: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
79a0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
79b0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
79c0: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
79d0: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
79e0: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
79f0: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
7a00: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
7a10: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
7a20: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
7a30: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
7a40: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
7a50: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
7a60: 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61  successful, a ra
7a70: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74  ndom byte from t
7a80: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a  he 'shared byte.
7a90: 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72    ** range' is r
7aa0: 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74  ead-locked and t
7ab0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27  he lock on the '
7ac0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65  pending byte' re
7ad0: 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  leased..  **.  *
7ae0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
7af0: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45  only obtain a RE
7b00: 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65  SERVED lock afte
7b10: 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45  r it has a SHARE
7b20: 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52  D lock..  ** A R
7b30: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
7b40: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67  implemented by g
7b50: 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d  rabbing a write-
7b60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
7b70: 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27   'reserved byte'
7b80: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  . .  **.  ** A p
7b90: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
7ba0: 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47  obtain a PENDING
7bb0: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
7bc0: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20  as obtained a.  
7bd0: 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20  ** SHARED lock. 
7be0: 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  A PENDING lock i
7bf0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
7c00: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
7c10: 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  te-lock.  ** on 
7c20: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
7c30: 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  e'. This ensures
7c40: 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41   that no new SHA
7c50: 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65  RED locks can be
7c60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20  .  ** obtained, 
7c70: 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41  but existing SHA
7c80: 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  RED locks are al
7c90: 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74  lowed to persist
7ca0: 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  . A process.  **
7cb0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
7cc0: 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  o obtain a RESER
7cd0: 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
7ce0: 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47  way to a PENDING
7cf0: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73   lock..  ** This
7d00: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
7d10: 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74  d by the algorit
7d20: 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  hm for rolling b
7d30: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
7d40: 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20  le.  ** after a 
7d50: 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  crash..  **.  **
7d60: 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
7d70: 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74  ck, obtained aft
7d80: 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  er a PENDING loc
7d90: 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20  k is held, is.  
7da0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  ** implemented b
7db0: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
7dc0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
7dd0: 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62  entire 'shared b
7de0: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e  yte.  ** range'.
7df0: 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72   Since all other
7e00: 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61   locks require a
7e10: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e   read-lock on on
7e20: 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20  e of the bytes. 
7e30: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20   ** within this 
7e40: 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75  range, this ensu
7e50: 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  res that no othe
7e60: 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  r locks are held
7e70: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
7e80: 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  abase. .  **.  *
7e90: 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73  * The reason a s
7ea0: 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f  ingle byte canno
7eb0: 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
7ec0: 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64  d of the 'shared
7ed0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
7ee0: 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76  ' is that some v
7ef0: 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f  ersions of windo
7f00: 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  ws do not suppor
7f10: 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79  t read-locks. By
7f20: 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20  .  ** locking a 
7f30: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
7f40: 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72   a range, concur
7f50: 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b  rent SHARED lock
7f60: 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a  s may exist.  **
7f70: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63   even if the loc
7f80: 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75  king primitive u
7f90: 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20  sed is always a 
7fa0: 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f  write-lock..  */
7fb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7fc0: 54 45 5f 4f 4b 3b 0a 20 20 73 74 72 75 63 74 20  TE_OK;.  struct 
7fd0: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 20  lockInfo *pLock 
7fe0: 3d 20 69 64 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 73  = id->pLock;.  s
7ff0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
8000: 3b 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20 61 73  ;.  int s;..  as
8010: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
8020: 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 4c 4f   );.  TRACE7("LO
8030: 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
8040: 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
8050: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
8060: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
8070: 65 29 2c 20 0a 20 20 20 20 20 20 6c 6f 63 6b 74  e), .      lockt
8080: 79 70 65 4e 61 6d 65 28 69 64 2d 3e 6c 6f 63 6b  ypeName(id->lock
8090: 74 79 70 65 29 2c 20 6c 6f 63 6b 74 79 70 65 4e  type), locktypeN
80a0: 61 6d 65 28 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  ame(pLock->lockt
80b0: 79 70 65 29 2c 20 70 4c 6f 63 6b 2d 3e 63 6e 74  ype), pLock->cnt
80c0: 0a 20 20 20 20 20 20 2c 67 65 74 70 69 64 28 29  .      ,getpid()
80d0: 20 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b 5f   );.  if( CHECK_
80e0: 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20 72  THREADID(id) ) r
80f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
8100: 55 53 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  USE;..  /* If th
8110: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
8120: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
8130: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
8140: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
8150: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
8160: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
8170: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
8180: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
8190: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
81a0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
81b0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
81c0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 64 2d 3e 6c    */.  if( id->l
81d0: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
81e0: 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 33 28  e ){.    TRACE3(
81f0: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
8200: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
8210: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
8220: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
8230: 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
8240: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
8250: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8260: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
8270: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
8280: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 64   */.  assert( id
8290: 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
82a0: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
82b0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
82c0: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
82d0: 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
82e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
82f0: 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
8300: 5f 4c 4f 43 4b 20 7c 7c 20 69 64 2d 3e 6c 6f 63  _LOCK || id->loc
8310: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8320: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
8330: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
8340: 20 62 65 63 61 75 73 65 20 69 64 2d 3e 70 4c 6f   because id->pLo
8350: 63 6b 20 69 73 20 73 68 61 72 65 64 20 61 63 72  ck is shared acr
8360: 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
8370: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
8380: 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
8390: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
83a0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
83b0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
83c0: 69 66 66 65 72 65 6e 74 20 4f 73 46 69 6c 65 2a  ifferent OsFile*
83d0: 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
83e0: 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
83f0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
8400: 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
8410: 2f 0a 20 20 69 66 28 20 28 69 64 2d 3e 6c 6f 63  /.  if( (id->loc
8420: 6b 74 79 70 65 21 3d 70 4c 6f 63 6b 2d 3e 6c 6f  ktype!=pLock->lo
8430: 63 6b 74 79 70 65 20 26 26 20 0a 20 20 20 20 20  cktype && .     
8440: 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f 63       (pLock->loc
8450: 6b 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c  ktype>=PENDING_L
8460: 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3e  OCK || locktype>
8470: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SHARED_LOCK)).  
8480: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8490: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
84a0: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  o end_lock;.  }.
84b0: 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
84c0: 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
84d0: 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
84e0: 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
84f0: 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
8500: 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
8510: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
8520: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
8530: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
8540: 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
8550: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
8560: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
8570: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
8580: 20 20 20 20 20 20 28 70 4c 6f 63 6b 2d 3e 6c 6f        (pLock->lo
8590: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
85a0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 6c 6f  OCK || pLock->lo
85b0: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
85c0: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
85d0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  sert( locktype==
85e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
85f0: 20 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 6c     assert( id->l
8600: 6f 63 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ocktype==0 );.  
8610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
8620: 3e 63 6e 74 3e 30 20 29 3b 0a 20 20 20 20 69 64  >cnt>0 );.    id
8630: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ->locktype = SHA
8640: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  RED_LOCK;.    pL
8650: 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20  ock->cnt++;.    
8660: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
8670: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
8680: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 6c 6f  _lock;.  }..  lo
8690: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 0a  ck.l_len = 1L;..
86a0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
86b0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 0a 20 20 2f  = SEEK_SET;..  /
86c0: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
86d0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
86e0: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
86f0: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
8700: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
8710: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
8720: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
8730: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
8740: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
8750: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
8760: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
8770: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
8780: 20 0a 20 20 20 20 20 20 7c 7c 20 28 6c 6f 63 6b   .      || (lock
8790: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
87a0: 4c 4f 43 4b 20 26 26 20 69 64 2d 3e 6c 6f 63 6b  LOCK && id->lock
87b0: 74 79 70 65 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  type<PENDING_LOC
87c0: 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
87d0: 2e 6c 5f 74 79 70 65 20 3d 20 28 6c 6f 63 6b 74  .l_type = (lockt
87e0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
87f0: 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b  ?F_RDLCK:F_WRLCK
8800: 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  );.    lock.l_st
8810: 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
8820: 54 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  TE;.    s = fcnt
8830: 6c 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  l(id->h, F_SETLK
8840: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
8850: 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ( s ){.      rc 
8860: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
8870: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
8880: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
8890: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
88a0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
88b0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
88c0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
88d0: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
88e0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
88f0: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
8900: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
8910: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
8920: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
8930: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
8940: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
8950: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
8960: 63 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  cnt==0 );.    as
8970: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  sert( pLock->loc
8980: 6b 74 79 70 65 3d 3d 30 20 29 3b 0a 0a 20 20 20  ktype==0 );..   
8990: 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
89a0: 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read-lock */.   
89b0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
89c0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
89d0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
89e0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
89f0: 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c  s = fcntl(id->h,
8a00: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
8a10: 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  ;..    /* Drop t
8a20: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
8a30: 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
8a40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
8a50: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
8a60: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
8a70: 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  L;.    lock.l_ty
8a80: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
8a90: 20 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d 3e    if( fcntl(id->
8aa0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
8ab0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)!=0 ){.      r
8ac0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
8ad0: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
8ae0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
8af0: 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  /.      goto end
8b00: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  _lock;.    }.   
8b10: 20 69 66 28 20 73 20 29 7b 0a 20 20 20 20 20 20   if( s ){.      
8b20: 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e  rc = (errno==EIN
8b30: 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f  VAL) ? SQLITE_NO
8b40: 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  LFS : SQLITE_BUS
8b50: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
8b60: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65      id->locktype
8b70: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
8b80: 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d        id->pOpen-
8b90: 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
8ba0: 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a  pLock->cnt = 1;.
8bb0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
8bc0: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
8bd0: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 4c  USIVE_LOCK && pL
8be0: 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20 20  ock->cnt>1 ){.  
8bf0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
8c00: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
8c10: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
8c20: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
8c30: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
8c40: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
8c50: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
8c60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
8c70: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
8c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8c90: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
8ca0: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
8cb0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
8cc0: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
8cd0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
8ce0: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
8cf0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
8d00: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
8d10: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
8d20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
8d30: 21 3d 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  !=id->locktype )
8d40: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
8d50: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
8d60: 20 73 77 69 74 63 68 28 20 6c 6f 63 6b 74 79 70   switch( locktyp
8d70: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 0a 20  RESERVED_LOCK:. 
8d90: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
8da0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
8db0: 59 54 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  YTE;.        bre
8dc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ak;.      case E
8dd0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 0a 20  XCLUSIVE_LOCK:. 
8de0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
8df0: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
8e00: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
8e10: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
8e20: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 62 72  SIZE;.        br
8e30: 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75  eak;.      defau
8e40: 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73 65  lt:.        asse
8e50: 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
8e60: 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 68   s = fcntl(id->h
8e70: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
8e80: 29 3b 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a  );.    if( s ){.
8e90: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
8ea0: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
8eb0: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
8ec0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
8ed0: 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
8ee0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8ef0: 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20   id->locktype = 
8f00: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 70 4c  locktype;.    pL
8f10: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
8f20: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 7d 65 6c 73  locktype;.  }els
8f30: 65 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d  e if( locktype==
8f40: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
8f50: 7b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79  {.    id->lockty
8f60: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
8f70: 4b 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f  K;.    pLock->lo
8f80: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
8f90: 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f  _LOCK;.  }..end_
8fa0: 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74 65 33 4f  lock:.  sqlite3O
8fb0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
8fc0: 20 54 52 41 43 45 34 28 22 4c 4f 43 4b 20 20 20   TRACE4("LOCK   
8fd0: 20 25 64 20 25 73 20 25 73 5c 6e 22 2c 20 69 64   %d %s %s\n", id
8fe0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d  ->h, locktypeNam
8ff0: 65 28 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20  e(locktype), .  
9000: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
9010: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
9020: 65 64 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ed");.  return r
9030: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
9040: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
9050: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
9060: 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63  riptor id to loc
9070: 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65  ktype.  locktype
9080: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
9090: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
90a0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
90b0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
90c0: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
90d0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
90e0: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
90f0: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
9100: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
9110: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
9120: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
9130: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
9140: 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
9150: 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69  outine to fail i
9160: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
9170: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c  ument.** is NO_L
9180: 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63  OCK.  If the sec
9190: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
91a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 74 68 69  SHARED_LOCK, thi
91b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
91c0: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
91d0: 5f 49 4f 45 52 52 20 69 6e 73 74 65 61 64 20 6f  _IOERR instead o
91e0: 66 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  f SQLITE_OK..*/.
91f0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  int sqlite3OsUnl
9200: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
9210: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
9220: 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f   struct lockInfo
9230: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74 72 75 63   *pLock;.  struc
9240: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
9250: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9260: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OK;..  assert( i
9270: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54  d->isOpen );.  T
9280: 52 41 43 45 37 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE7("UNLOCK  %
9290: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
92a0: 64 29 20 70 69 64 3d 25 64 5c 6e 22 2c 20 69 64  d) pid=%d\n", id
92b0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 69  ->h, locktype, i
92c0: 64 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 0a 20 20  d->locktype, .  
92d0: 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 6c      id->pLock->l
92e0: 6f 63 6b 74 79 70 65 2c 20 69 64 2d 3e 70 4c 6f  ocktype, id->pLo
92f0: 63 6b 2d 3e 63 6e 74 2c 20 67 65 74 70 69 64 28  ck->cnt, getpid(
9300: 29 29 3b 0a 20 20 69 66 28 20 43 48 45 43 4b 5f  ));.  if( CHECK_
9310: 54 48 52 45 41 44 49 44 28 69 64 29 20 29 20 72  THREADID(id) ) r
9320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9330: 55 53 45 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  USE;..  assert( 
9340: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
9350: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 69  _LOCK );.  if( i
9360: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3c 3d 6c 6f 63  d->locktype<=loc
9370: 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
9380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9390: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
93a0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 4c  terMutex();.  pL
93b0: 6f 63 6b 20 3d 20 69 64 2d 3e 70 4c 6f 63 6b 3b  ock = id->pLock;
93c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b  .  assert( pLock
93d0: 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->cnt!=0 );.  if
93e0: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 53  ( id->locktype>S
93f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
9400: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
9410: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 69 64 2d 3e 6c  >locktype==id->l
9420: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 69  ocktype );.    i
9430: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
9440: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
9450: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
9460: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 6c  F_RDLCK;.      l
9470: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
9480: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c  EEK_SET;.      l
9490: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
94a0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
94b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
94c0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
94d0: 20 20 69 66 28 20 66 63 6e 74 6c 28 69 64 2d 3e    if( fcntl(id->
94e0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
94f0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
9500: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
9510: 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a  never happen */.
9520: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
9530: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
9540: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
9550: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
9560: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
9570: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
9580: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
9590: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
95a0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
95b0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
95c0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
95d0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
95e0: 3b 0a 20 20 20 20 69 66 28 20 66 63 6e 74 6c 28  ;.    if( fcntl(
95f0: 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  id->h, F_SETLK, 
9600: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
9610: 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79     pLock->lockty
9620: 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
9630: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9640: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
9650: 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69 73 20 73  OERR;  /* This s
9660: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
9670: 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  en */.    }.  }.
9680: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
9690: 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  NO_LOCK ){.    s
96a0: 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70  truct openCnt *p
96b0: 4f 70 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  Open;..    /* De
96c0: 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
96d0: 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
96e0: 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
96f0: 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
9700: 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
9710: 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
9720: 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
9730: 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
9740: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
9750: 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
9760: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
9770: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74    if( pLock->cnt
9780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  ==0 ){.      loc
9790: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
97a0: 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  CK;.      lock.l
97b0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
97c0: 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ET;.      lock.l
97d0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
97e0: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20  len = 0L;.      
97f0: 69 66 28 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c  if( fcntl(id->h,
9800: 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
9810: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
9820: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  Lock->locktype =
9830: 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
9840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
9850: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
9860: 3b 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c  ;  /* This shoul
9870: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 2a  d never happen *
9880: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
9890: 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
98a0: 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
98b0: 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
98c0: 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
98d0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
98e0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
98f0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
9900: 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
9910: 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
9920: 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
9930: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
9940: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
9950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4f 70 65  .    */.    pOpe
9960: 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20  n = id->pOpen;. 
9970: 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d     pOpen->nLock-
9980: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
9990: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  Open->nLock>=0 )
99a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d  ;.    if( pOpen-
99b0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70  >nLock==0 && pOp
99c0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29  en->nPending>0 )
99d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
99e0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
99f0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b  pOpen->nPending;
9a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
9a10: 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  lose(pOpen->aPen
9a20: 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ding[i]);.      
9a30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
9a40: 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69  ee(pOpen->aPendi
9a50: 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e  ng);.      pOpen
9a60: 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  ->nPending = 0;.
9a70: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
9a80: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d  nding = 0;.    }
9a90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
9aa0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9ab0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c  id->locktype = l
9ac0: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
9ad0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
9ae0: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
9af0: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  int sqlite3OsClo
9b00: 73 65 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a  se(OsFile *id){.
9b10: 20 20 69 66 28 20 21 69 64 2d 3e 69 73 4f 70 65    if( !id->isOpe
9b20: 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n ) return SQLIT
9b30: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 43 48 45 43  E_OK;.  if( CHEC
9b40: 4b 5f 54 48 52 45 41 44 49 44 28 69 64 29 20 29  K_THREADID(id) )
9b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
9b60: 49 53 55 53 45 3b 0a 20 20 73 71 6c 69 74 65 33  ISUSE;.  sqlite3
9b70: 4f 73 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  OsUnlock(id, NO_
9b80: 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 69 64 2d  LOCK);.  if( id-
9b90: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
9ba0: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
9bb0: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
9bc0: 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72    sqlite3OsEnter
9bd0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69  Mutex();.  if( i
9be0: 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  d->pOpen->nLock 
9bf0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
9c00: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
9c10: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
9c20: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
9c30: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
9c40: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
9c50: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
9c60: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
9c70: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
9c80: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
9c90: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
9ca0: 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
9cb0: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
9cc0: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
9cd0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73  n.    ** the las
9ce0: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
9cf0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
9d00: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72  t *aNew;.    str
9d10: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
9d20: 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a  en = id->pOpen;.
9d30: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
9d40: 65 52 65 61 6c 6c 6f 63 28 20 70 4f 70 65 6e 2d  eRealloc( pOpen-
9d50: 3e 61 50 65 6e 64 69 6e 67 2c 20 28 70 4f 70 65  >aPending, (pOpe
9d60: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 31 29 2a 73  n->nPending+1)*s
9d70: 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a 20 20  izeof(int) );.  
9d80: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
9d90: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  .      /* If a m
9da0: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a 75 73  alloc fails, jus
9db0: 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  t leak the file 
9dc0: 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
9de0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d  Open->aPending =
9df0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 4f 70   aNew;.      pOp
9e00: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70 4f 70  en->aPending[pOp
9e10: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 5d 20 3d 20  en->nPending] = 
9e20: 69 64 2d 3e 68 3b 0a 20 20 20 20 20 20 70 4f 70  id->h;.      pOp
9e30: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2b 2b 3b 0a  en->nPending++;.
9e40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9e50: 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
9e60: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  no outstanding l
9e70: 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63  ocks so we can c
9e80: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d  lose the file im
9e90: 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20  mediately */.   
9ea0: 20 63 6c 6f 73 65 28 69 64 2d 3e 68 29 3b 0a 20   close(id->h);. 
9eb0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b   }.  releaseLock
9ec0: 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b  Info(id->pLock);
9ed0: 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e  .  releaseOpenCn
9ee0: 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20  t(id->pOpen);.  
9ef0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
9f00: 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 69 73 4f  tex();.  id->isO
9f10: 70 65 6e 20 3d 20 30 3b 0a 20 20 54 52 41 43 45  pen = 0;.  TRACE
9f20: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
9f30: 6e 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  n", id->h);.  Op
9f40: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
9f50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  K;.}../*.** Turn
9f70: 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
9f80: 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
9f90: 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75   pathname.  Retu
9fa0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
9fb0: 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  to the full path
9fc0: 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73  name stored in s
9fd0: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
9fe0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
9ff0: 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  )..** The callin
a000: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  g function is re
a010: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
a020: 65 65 69 6e 67 20 74 68 69 73 20 73 70 61 63 65  eeing this space
a030: 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e   once it.** is n
a040: 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e  o longer needed.
a050: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
a060: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
a070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
a080: 61 74 69 76 65 29 7b 0a 20 20 63 68 61 72 20 2a  ative){.  char *
a090: 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28  zFull = 0;.  if(
a0a0: 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
a0b0: 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  /' ){.    sqlite
a0c0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  3SetString(&zFul
a0d0: 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63  l, zRelative, (c
a0e0: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65  har*)0);.  }else
a0f0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66  {.    char *zBuf
a100: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
a110: 35 30 30 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  5000);.    if( z
a120: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
a130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
a140: 20 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b      zBuf[0] = 0;
a150: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
a160: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65  tring(&zFull, ge
a170: 74 63 77 64 28 7a 42 75 66 2c 20 35 30 30 30 29  tcwd(zBuf, 5000)
a180: 2c 20 22 2f 22 2c 20 7a 52 65 6c 61 74 69 76 65  , "/", zRelative
a190: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a1a0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
a1b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a1c0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zBuf);.  }.  ret
a1d0: 75 72 6e 20 7a 46 75 6c 6c 3b 0a 7d 0a 0a 0a 23  urn zFull;.}...#
a1e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a1f0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f  OMIT_DISKIO */./
a200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45  ***********.** E
a250: 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20  verything above 
a260: 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20  deals with file 
a270: 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67  I/O.  Everything
a280: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65   that follows de
a290: 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65  als.** with othe
a2a0: 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61  r miscellanous a
a2b0: 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70  spects of the op
a2c0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
a2d0: 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a  nterface.*******
a2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a320: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  *****/.../*.** G
a330: 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  et information t
a340: 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f  o seed the rando
a350: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
a360: 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a  or.  The seed.**
a370: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
a380: 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66   the buffer zBuf
a390: 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c  [256].  The call
a3a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
a3b0: 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75  t.** supply a su
a3c0: 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65  fficiently large
a3d0: 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20   buffer..*/.int 
a3e0: 73 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 53  sqlite3OsRandomS
a3f0: 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b  eed(char *zBuf){
a400: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
a410: 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
a420: 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
a430: 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
a440: 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
a450: 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
a460: 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
a470: 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
a480: 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
a490: 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
a4a0: 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
a4b0: 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
a4c0: 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
a4d0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
a4e0: 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
a4f0: 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
a500: 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
a510: 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
a520: 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
a530: 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
a540: 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
a550: 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
a560: 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
a570: 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
a580: 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
a590: 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
a5a0: 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
a5b0: 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
a5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
a5d0: 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
a5e0: 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
a5f0: 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
a600: 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
a610: 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
a620: 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
a630: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
a640: 75 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b  uence.* This mak
a650: 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
a660: 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
a670: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
a680: 2c 20 30 2c 20 32 35 36 29 3b 0a 23 69 66 20 21  , 0, 256);.#if !
a690: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
a6a0: 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  EST).  {.    int
a6b0: 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66 64   pid, fd;.    fd
a6c0: 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
a6d0: 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
a6e0: 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
a6f0: 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 28 28 74  ){.      time((t
a700: 69 6d 65 5f 74 2a 29 7a 42 75 66 29 3b 0a 20 20  ime_t*)zBuf);.  
a710: 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
a720: 28 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ();.      memcpy
a730: 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69  (&zBuf[sizeof(ti
a740: 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  me_t)], &pid, si
a750: 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
a760: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 61  }else{.      rea
a770: 64 28 66 64 2c 20 7a 42 75 66 2c 20 32 35 36 29  d(fd, zBuf, 256)
a780: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64  ;.      close(fd
a790: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
a7a0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
a7b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a7c0: 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
a7d0: 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
a7e0: 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
a7f0: 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
a800: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  int sqlite3OsSle
a810: 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
a820: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
a830: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
a840: 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a  EEP.  usleep(ms*
a850: 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
a860: 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65  ms;.#else.  slee
a870: 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29  p((ms+999)/1000)
a880: 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30 30 2a  ;.  return 1000*
a890: 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b  ((ms+999)/1000);
a8a0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a8b0: 20 53 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   Static variable
a8c0: 73 20 75 73 65 64 20 66 6f 72 20 74 68 72 65 61  s used for threa
a8d0: 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f  d synchronizatio
a8e0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
a8f0: 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66  inMutex = 0;.#if
a900: 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  def SQLITE_UNIX_
a910: 54 48 52 45 41 44 53 0a 73 74 61 74 69 63 20 70  THREADS.static p
a920: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d  thread_mutex_t m
a930: 75 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d  utex = PTHREAD_M
a940: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
a950: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
a960: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
a970: 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d  ir of routine im
a980: 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65  plement mutual e
a990: 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20  xclusion for.** 
a9a0: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70  multi-threaded p
a9b0: 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20  rocesses.  Only 
a9c0: 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20  a single thread 
a9d0: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a  is allowed to.**
a9e0: 20 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74   executed code t
a9f0: 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65  hat is surrounde
aa00: 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28  d by EnterMutex(
aa10: 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78  ) and LeaveMutex
aa20: 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ()..**.** SQLite
aa30: 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e   uses only a sin
aa40: 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72  gle Mutex.  Ther
aa50: 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72  e is not much cr
aa60: 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61  itical.** code a
aa70: 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74  nd what little t
aa80: 68 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73  here is executes
aa90: 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74   quickly and wit
aaa0: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
aab0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73  /.void sqlite3Os
aac0: 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23 69  EnterMutex(){.#i
aad0: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58  fdef SQLITE_UNIX
aae0: 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72 65  _THREADS.  pthre
aaf0: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d  ad_mutex_lock(&m
ab00: 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20  utex);.#endif.  
ab10: 61 73 73 65 72 74 28 20 21 69 6e 4d 75 74 65 78  assert( !inMutex
ab20: 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20   );.  inMutex = 
ab30: 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  1;.}.void sqlite
ab40: 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 7b  3OsLeaveMutex(){
ab50: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74  .  assert( inMut
ab60: 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20  ex );.  inMutex 
ab70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
ab80: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
ab90: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
aba0: 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b 0a  unlock(&mutex);.
abb0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
abc0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
abd0: 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
abe0: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
abf0: 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ue, becomes the 
ac00: 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e  result.** return
ac10: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  ed from sqlite3O
ac20: 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20  sCurrentTime(). 
ac30: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
ac40: 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  r testing..*/.#i
ac50: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
ac60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
ac70: 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
ac80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
ac90: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
aca0: 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
acb0: 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
acc0: 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
acd0: 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
ace0: 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
acf0: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
ad00: 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
ad10: 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
ad20: 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
ad30: 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
ad40: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
ad50: 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  nt sqlite3OsCurr
ad60: 65 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a  entTime(double *
ad70: 70 72 4e 6f 77 29 7b 0a 23 69 66 64 65 66 20 4e  prNow){.#ifdef N
ad80: 4f 5f 47 45 54 54 4f 44 0a 20 20 74 69 6d 65 5f  O_GETTOD.  time_
ad90: 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
ada0: 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74 2f 38 36  .  *prNow = t/86
adb0: 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
adc0: 35 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63  5;.#else.  struc
add0: 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a  t timeval sNow;.
ade0: 20 20 73 74 72 75 63 74 20 74 69 6d 65 7a 6f 6e    struct timezon
adf0: 65 20 73 54 7a 3b 20 20 2f 2a 20 4e 6f 74 20 75  e sTz;  /* Not u
ae00: 73 65 64 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65  sed */.  gettime
ae10: 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 26 73 54  ofday(&sNow, &sT
ae20: 7a 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 32  z);.  *prNow = 2
ae30: 34 34 30 35 38 37 2e 35 20 2b 20 73 4e 6f 77 2e  440587.5 + sNow.
ae40: 74 76 5f 73 65 63 2f 38 36 34 30 30 2e 30 20 2b  tv_sec/86400.0 +
ae50: 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 38 36   sNow.tv_usec/86
ae60: 34 30 30 30 30 30 30 30 30 2e 30 3b 0a 23 65 6e  400000000.0;.#en
ae70: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
ae80: 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
ae90: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
aea0: 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
aeb0: 3d 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  = sqlite3_curren
aec0: 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b  t_time/86400.0 +
aed0: 20 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a   2440587.5;.  }.
aee0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
aef0: 30 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  0;.}..#endif /* 
af00: 4f 53 5f 55 4e 49 58 20 2a 2f 0a                 OS_UNIX */.