/ Hex Artifact Content
Login

Artifact cbdac6b207295ebc528e00ca9f0d48084c8f8b8b:


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 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
0870: 58 5f 54 48 52 45 41 44 53 0a 23 20 64 65 66 69  X_THREADS.# defi
0880: 6e 65 20 53 45 54 5f 54 48 52 45 41 44 49 44 28  ne SET_THREADID(
0890: 58 29 20 20 20 58 2d 3e 74 69 64 20 3d 20 70 74  X)   X->tid = pt
08a0: 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23 20 64  hread_self().# d
08b0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 54 48 52 45  efine CHECK_THRE
08c0: 41 44 49 44 28 58 29 20 28 21 70 74 68 72 65 61  ADID(X) (!pthrea
08d0: 64 5f 65 71 75 61 6c 28 58 2d 3e 74 69 64 2c 20  d_equal(X->tid, 
08e0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 29 29  pthread_self()))
08f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0900: 53 45 54 5f 54 48 52 45 41 44 49 44 28 58 29 0a  SET_THREADID(X).
0910: 23 20 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 54  # define CHECK_T
0920: 48 52 45 41 44 49 44 28 58 29 20 30 0a 23 65 6e  HREADID(X) 0.#en
0930: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  dif../*.** Here 
0940: 69 73 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50  is the dirt on P
0950: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
0960: 63 6b 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31  cks:  ANSI STD 1
0970: 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20  003.1 (1996).** 
0980: 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20  section 6.5.2.2 
0990: 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67  lines 483 throug
09a0: 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68  h 490 specify th
09b0: 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73  at when a proces
09c0: 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65  s.** sets or cle
09d0: 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74  ars a lock, that
09e0: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72   operation overr
09f0: 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c  ides any prior l
0a00: 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74  ocks set.** by t
0a10: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
0a20: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78    It does not ex
0a30: 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c  plicitly say so,
0a40: 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65   but this implie
0a50: 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65  s.** that it ove
0a60: 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74  rrides locks set
0a70: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
0a80: 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66  cess using a dif
0a90: 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64  ferent.** file d
0aa0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73  escriptor.  Cons
0ab0: 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63  ider this test c
0ac0: 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase:.**.**      
0ad0: 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28   int fd1 = open(
0ae0: 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57  "./file1", O_RDW
0af0: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
0b00: 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  ;.**       int f
0b10: 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d2 = open("./fil
0b20: 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e2", O_RDWR|O_CR
0b30: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a  EAT, 0644);.**.*
0b40: 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65  * Suppose ./file
0b50: 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72  1 and ./file2 ar
0b60: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d  e really the sam
0b70: 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a  e file (because.
0b80: 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64  ** one is a hard
0b90: 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   or symbolic lin
0ba0: 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20  k to the other) 
0bb0: 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a  then if you set.
0bc0: 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ** an exclusive 
0bd0: 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65  lock on fd1, the
0be0: 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20  n try to get an 
0bf0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
0c00: 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72  * on fd2, it wor
0c10: 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76  ks.  I would hav
0c20: 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73  e expected the s
0c30: 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a  econd lock to.**
0c40: 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72   fail since ther
0c50: 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20  e was already a 
0c60: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
0c70: 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20   due to fd1..** 
0c80: 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e  But not so.  Sin
0c90: 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61  ce both locks ca
0ca0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  me from the same
0cb0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a   process, the.**
0cc0: 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65   second override
0cd0: 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65  s the first, eve
0ce0: 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65  n though they we
0cf0: 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a  re on different.
0d00: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
0d10: 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69  ors opened on di
0d20: 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d  fferent file nam
0d30: 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72  es..**.** Bummer
0d40: 2e 20 20 49 66 20 79 6f 75 20 61 73 6b 20 6d 65  .  If you ask me
0d50: 2c 20 74 68 69 73 20 69 73 20 62 72 6f 6b 65 6e  , this is broken
0d60: 2e 20 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e  .  Badly broken.
0d70: 20 20 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68    It means.** th
0d80: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
0d90: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
0da0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
0db0: 20 61 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a   access among.**
0dc0: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
0dd0: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
0de0: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
0df0: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
0e00: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
0e10: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
0e20: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
0e30: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
0e40: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
0e50: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
0e60: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
0e70: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
0e80: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
0e90: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
0ea0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
0eb0: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
0ec0: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
0ed0: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
0ee0: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
0ef0: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
0f00: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
0f10: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0f20: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
0f30: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
0f40: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
0f50: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
0f60: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
0f70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
0f80: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
0f90: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
0fa0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
0fb0: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
0fc0: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
0fd0: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
0fe0: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
0ff0: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
1000: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
1010: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
1020: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
1030: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
1040: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
1050: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
1060: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
1070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46  e..**.** The OsF
1080: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ile structure fo
1090: 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f  r POSIX is no lo
10a0: 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74  nger just an int
10b0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
10c0: 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20  criptor.  It is 
10d0: 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20  now a structure 
10e0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69  that holds the i
10f0: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
1100: 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20  escriptor and a 
1110: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
1120: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
1130: 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e  ribes the intern
1140: 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74  al.** locks on t
1150: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1160: 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69   inode.  There i
1170: 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74  s one locking st
1180: 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69  ructure.** per i
1190: 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20  node, so if the 
11a0: 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70  same inode is op
11b0: 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68  ened twice, both
11c0: 20 4f 73 46 69 6c 65 20 73 74 72 75 63 74 75 72   OsFile structur
11d0: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
11e0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
11f0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
1200: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1210: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
1220: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
1230: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1240: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
1250: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
1260: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
1270: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
1280: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
1290: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
12a0: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
12b0: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
12c0: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
12d0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
12e0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
12f0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
1300: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
1310: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
1320: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1330: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
1340: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
1350: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
1360: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
1370: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
1380: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
1390: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
13a0: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
13b0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
13c0: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
13d0: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
13e0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
13f0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
1400: 74 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  te..**.** 2004-J
1410: 61 6e 2d 31 31 3a 0a 2a 2a 20 4d 6f 72 65 20 72  an-11:.** More r
1420: 65 63 65 6e 74 20 64 69 73 63 6f 76 65 72 69 65  ecent discoverie
1430: 73 20 61 62 6f 75 74 20 50 4f 53 49 58 20 61 64  s about POSIX ad
1440: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 20 20 28  visory locks.  (
1450: 54 68 65 20 6d 6f 72 65 0a 2a 2a 20 49 20 64 69  The more.** I di
1460: 73 63 6f 76 65 72 2c 20 74 68 65 20 6d 6f 72 65  scover, the more
1470: 20 49 20 72 65 61 6c 69 7a 65 20 74 68 65 20 61   I realize the a
1480: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
1490: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 61 6e 20  locks are.** an 
14a0: 61 62 6f 6d 69 6e 61 74 69 6f 6e 2e 29 0a 2a 2a  abomination.).**
14b0: 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65  .** If you close
14c0: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
14d0: 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74  or that points t
14e0: 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61  o a file that ha
14f0: 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20  s locks,.** all 
1500: 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69  locks on that fi
1510: 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65  le that are owne
1520: 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
1530: 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20   process are.** 
1540: 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f  released.  To wo
1550: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  rk around this p
1560: 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 4f 73 46  roblem, each OsF
1570: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ile structure co
1580: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e  ntains.** a poin
1590: 74 65 72 20 74 6f 20 61 6e 20 6f 70 65 6e 43 6e  ter to an openCn
15a0: 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  t structure.  Th
15b0: 65 72 65 20 69 73 20 6f 6e 65 20 6f 70 65 6e 43  ere is one openC
15c0: 6e 74 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  nt structure.** 
15d0: 70 65 72 20 6f 70 65 6e 20 69 6e 6f 64 65 2c 20  per open inode, 
15e0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
15f0: 20 6d 75 6c 74 69 70 6c 65 20 4f 73 46 69 6c 65   multiple OsFile
1600: 73 20 63 61 6e 20 70 6f 69 6e 74 20 74 6f 20 61  s can point to a
1610: 20 73 69 6e 67 6c 65 0a 2a 2a 20 6f 70 65 6e 43   single.** openC
1620: 6e 74 2e 20 20 57 68 65 6e 20 61 6e 20 61 74 74  nt.  When an att
1630: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
1640: 63 6c 6f 73 65 20 61 6e 20 4f 73 46 69 6c 65 2c  close an OsFile,
1650: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
1660: 20 6f 74 68 65 72 20 4f 73 46 69 6c 65 73 20 6f   other OsFiles o
1670: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
1680: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
1690: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
16a0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
16b0: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
16c0: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
16d0: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
16e0: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
16f0: 72 2e 0a 2a 2a 20 54 68 65 20 6f 70 65 6e 43 6e  r..** The openCn
1700: 74 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  t structure keep
1710: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
1720: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
1730: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
1740: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
1750: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
1760: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
1770: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
1780: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
1790: 20 46 69 72 73 74 2c 20 75 6e 64 65 72 20 4c 69   First, under Li
17a0: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 62 65 63  nux threads, bec
17b0: 61 75 73 65 20 65 61 63 68 20 74 68 72 65 61 64  ause each thread
17c0: 20 68 61 73 20 61 20 73 65 70 61 72 61 74 65 0a   has a separate.
17d0: 2a 2a 20 70 72 6f 63 65 73 73 20 49 44 2c 20 6c  ** process ID, l
17e0: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 69  ock operations i
17f0: 6e 20 6f 6e 65 20 74 68 72 65 61 64 20 64 6f 20  n one thread do 
1800: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  not override loc
1810: 6b 73 0a 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d  ks.** to the sam
1820: 65 20 66 69 6c 65 20 69 6e 20 6f 74 68 65 72 20  e file in other 
1830: 74 68 72 65 61 64 73 2e 20 20 4c 69 6e 75 78 20  threads.  Linux 
1840: 74 68 72 65 61 64 73 20 62 65 68 61 76 65 20 6c  threads behave l
1850: 69 6b 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ike.** separate 
1860: 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68 69  processes in thi
1870: 73 20 72 65 73 70 65 63 74 2e 20 20 42 75 74 2c  s respect.  But,
1880: 20 69 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20   if you close a 
1890: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
18a0: 6f 72 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65  or in linux thre
18b0: 61 64 73 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ads, all locks a
18c0: 72 65 20 63 6c 65 61 72 65 64 2c 20 65 76 65 6e  re cleared, even
18d0: 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 6e 20 6f 74 68   locks.** on oth
18e0: 65 72 20 74 68 72 65 61 64 73 20 61 6e 64 20 65  er threads and e
18f0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 6f  ven though the o
1900: 74 68 65 72 20 74 68 72 65 61 64 73 20 68 61 76  ther threads hav
1910: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70  e different.** p
1920: 72 6f 63 65 73 73 20 49 44 73 2e 20 20 4c 69 6e  rocess IDs.  Lin
1930: 75 78 20 74 68 72 65 61 64 73 20 69 73 20 69 6e  ux threads is in
1940: 63 6f 6e 73 69 73 74 65 6e 74 20 69 6e 20 74 68  consistent in th
1950: 69 73 20 72 65 73 70 65 63 74 2e 0a 2a 2a 20 28  is respect..** (
1960: 49 27 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  I'm beginning to
1970: 20 74 68 69 6e 6b 20 74 68 61 74 20 6c 69 6e 75   think that linu
1980: 78 20 74 68 72 65 61 64 73 20 69 73 20 61 6e 20  x threads is an 
1990: 61 62 6f 6d 69 6e 61 74 69 6f 6e 20 74 6f 6f 2e  abomination too.
19a0: 29 0a 2a 2a 20 54 68 65 20 63 6f 6e 73 65 71 75  ).** The consequ
19b0: 65 6e 63 65 20 6f 66 20 74 68 69 73 20 61 6c 6c  ence of this all
19c0: 20 69 73 20 74 68 61 74 20 74 68 65 20 68 61 73   is that the has
19d0: 68 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  h table for the 
19e0: 6c 6f 63 6b 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  lockInfo.** stru
19f0: 63 74 75 72 65 20 68 61 73 20 74 6f 20 69 6e 63  cture has to inc
1a00: 6c 75 64 65 20 74 68 65 20 70 72 6f 63 65 73 73  lude the process
1a10: 20 69 64 20 61 73 20 70 61 72 74 20 6f 66 20 69   id as part of i
1a20: 74 73 20 6b 65 79 20 62 65 63 61 75 73 65 0a 2a  ts key because.*
1a30: 2a 20 6c 6f 63 6b 73 20 69 6e 20 64 69 66 66 65  * locks in diffe
1a40: 72 65 6e 74 20 74 68 72 65 61 64 73 20 61 72 65  rent threads are
1a50: 20 74 72 65 61 74 65 64 20 61 73 20 64 69 73 74   treated as dist
1a60: 69 6e 63 74 2e 20 20 42 75 74 20 74 68 65 20 0a  inct.  But the .
1a70: 2a 2a 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ** openCnt struc
1a80: 74 75 72 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ture should not 
1a90: 69 6e 63 6c 75 64 65 20 74 68 65 20 70 72 6f 63  include the proc
1aa0: 65 73 73 20 69 64 20 69 6e 20 69 74 73 0a 2a 2a  ess id in its.**
1ab0: 20 6b 65 79 20 62 65 63 61 75 73 65 20 63 6c 6f   key because clo
1ac0: 73 65 28 29 20 63 6c 65 61 72 73 20 6c 6f 63 6b  se() clears lock
1ad0: 20 6f 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 2c   on all threads,
1ae0: 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 63 75   not just the cu
1af0: 72 72 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 2e  rrent.** thread.
1b00: 20 20 57 65 72 65 20 69 74 20 6e 6f 74 20 66 6f    Were it not fo
1b10: 72 20 74 68 69 73 20 67 6f 6f 66 69 6e 65 73 73  r this goofiness
1b20: 20 69 6e 20 6c 69 6e 75 78 20 74 68 72 65 61 64   in linux thread
1b30: 73 2c 20 77 65 20 63 6f 75 6c 64 0a 2a 2a 20 63  s, we could.** c
1b40: 6f 6d 62 69 6e 65 20 74 68 65 20 6c 6f 63 6b 49  ombine the lockI
1b50: 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e 74 20  nfo and openCnt 
1b60: 73 74 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20  structures into 
1b70: 61 20 73 69 6e 67 6c 65 20 73 74 72 75 63 74 75  a single structu
1b80: 72 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  re..**.** 2004-J
1b90: 75 6e 2d 32 38 3a 0a 2a 2a 20 4f 6e 20 73 6f 6d  un-28:.** On som
1ba0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  e versions of li
1bb0: 6e 75 78 2c 20 74 68 72 65 61 64 73 20 63 61 6e  nux, threads can
1bc0: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
1bd0: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a 20  thers locks..** 
1be0: 4f 6e 20 6f 74 68 65 72 73 20 6e 6f 74 2e 20 20  On others not.  
1bf0: 53 6f 6d 65 74 69 6d 65 73 20 79 6f 75 20 63 61  Sometimes you ca
1c00: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 62 65 68  n change the beh
1c10: 61 76 69 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d  avior on the sam
1c20: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 62 79 20 73  e.** system by s
1c30: 65 74 74 69 6e 67 20 74 68 65 20 4c 44 5f 41 53  etting the LD_AS
1c40: 53 55 4d 45 5f 4b 45 52 4e 45 4c 20 65 6e 76 69  SUME_KERNEL envi
1c50: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1c60: 2e 20 20 54 68 65 0a 2a 2a 20 50 4f 53 49 58 20  .  The.** POSIX 
1c70: 73 74 61 6e 64 61 72 64 20 69 73 20 73 69 6c 65  standard is sile
1c80: 6e 74 20 61 73 20 74 6f 20 77 68 69 63 68 20 62  nt as to which b
1c90: 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65  ehavior is corre
1ca0: 63 74 2c 20 61 73 20 66 61 72 0a 2a 2a 20 61 73  ct, as far.** as
1cb0: 20 49 20 63 61 6e 20 74 65 6c 6c 2c 20 73 6f 20   I can tell, so 
1cc0: 6f 74 68 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  other versions o
1cd0: 66 20 75 6e 69 78 20 6d 69 67 68 74 20 73 68 6f  f unix might sho
1ce0: 77 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 69 6e  w the same.** in
1cf0: 63 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54 68  consistency.  Th
1d00: 65 72 65 20 69 73 20 6e 6f 20 6c 69 74 74 6c 65  ere is no little
1d10: 20 64 6f 75 62 74 20 69 6e 20 6d 79 20 6d 69 6e   doubt in my min
1d20: 64 20 74 68 61 74 20 70 6f 73 69 78 0a 2a 2a 20  d that posix.** 
1d30: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61  advisory locks a
1d40: 6e 64 20 6c 69 6e 75 78 20 74 68 72 65 61 64 73  nd linux threads
1d50: 20 61 72 65 20 70 72 6f 66 6f 75 6e 64 6c 79 20   are profoundly 
1d60: 62 72 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  broken..**.** To
1d70: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
1d80: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
1d90: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73  , we have to tes
1da0: 74 20 61 74 20 72 75 6e 74 69 6d 65 20 0a 2a 2a  t at runtime .**
1db0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1dc0: 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72  threads can over
1dd0: 72 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73  ride each others
1de0: 20 6c 6f 63 6b 73 2e 20 20 54 68 69 73 20 74 65   locks.  This te
1df0: 73 74 0a 2a 2a 20 69 73 20 72 75 6e 20 6f 6e 63  st.** is run onc
1e00: 65 2c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  e, the first tim
1e10: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
1e20: 74 65 6d 70 74 65 64 2e 20 20 41 20 73 74 61 74  tempted.  A stat
1e30: 69 63 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ic .** variable 
1e40: 69 73 20 73 65 74 20 74 6f 20 72 65 63 6f 72 64  is set to record
1e50: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1e60: 74 68 69 73 20 74 65 73 74 20 66 6f 72 20 66 75  this test for fu
1e70: 74 75 72 65 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a  ture.** use..*/.
1e80: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1e90: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1ea0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
1eb0: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
1ec0: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
1ed0: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c  e a particular l
1ee0: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
1ef0: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
1f00: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 72 65  e..**.** If thre
1f10: 61 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72  ads cannot overr
1f20: 69 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20  ide each others 
1f30: 6c 6f 63 6b 73 2c 20 74 68 65 6e 20 77 65 20 73  locks, then we s
1f40: 65 74 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 4b 65  et the.** lockKe
1f50: 79 2e 74 69 64 20 66 69 65 6c 64 20 74 6f 20 74  y.tid field to t
1f60: 68 65 20 74 68 72 65 61 64 20 49 44 2e 20 20 49  he thread ID.  I
1f70: 66 20 74 68 72 65 61 64 73 20 63 61 6e 20 6f 76  f threads can ov
1f80: 65 72 72 69 64 65 0a 2a 2a 20 65 61 63 68 20 6f  erride.** each o
1f90: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
1fa0: 20 74 69 64 20 69 73 20 61 6c 77 61 79 73 20 73   tid is always s
1fb0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 74 69 64  et to zero.  tid
1fc0: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 20   is also.** set 
1fd0: 74 6f 20 7a 65 72 6f 20 69 66 20 77 65 20 63 6f  to zero if we co
1fe0: 6d 70 69 6c 65 20 77 69 74 68 6f 75 74 20 74 68  mpile without th
1ff0: 72 65 61 64 69 6e 67 20 73 75 70 70 6f 72 74 2e  reading support.
2000: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63 6b 4b  .*/.struct lockK
2010: 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  ey {.  dev_t dev
2020: 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63  ;       /* Devic
2030: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
2040: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 2f  o_t ino;       /
2050: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
2060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2070: 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70  UNIX_THREADS.  p
2080: 74 68 72 65 61 64 5f 74 20 74 69 64 3b 20 20 20  thread_t tid;   
2090: 2f 2a 20 54 68 72 65 61 64 20 49 44 20 6f 72 20  /* Thread ID or 
20a0: 7a 65 72 6f 20 69 66 20 74 68 72 65 61 64 73 20  zero if threads 
20b0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
20c0: 65 61 63 68 20 6f 74 68 65 72 20 2a 2f 0a 23 65  each other */.#e
20d0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
20e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
20f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2100: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
2110: 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e  ed for each open
2120: 0a 2a 2a 20 69 6e 6f 64 65 20 6f 6e 20 65 61 63  .** inode on eac
2130: 68 20 74 68 72 65 61 64 20 77 69 74 68 20 61 20  h thread with a 
2140: 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73  different proces
2150: 73 20 49 44 2e 20 20 28 54 68 72 65 61 64 73 20  s ID.  (Threads 
2160: 68 61 76 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e  have.** differen
2170: 74 20 70 72 6f 63 65 73 73 20 49 44 73 20 6f 6e  t process IDs on
2180: 20 6c 69 6e 75 78 2c 20 62 75 74 20 6e 6f 74 20   linux, but not 
2190: 6f 6e 20 6d 6f 73 74 20 6f 74 68 65 72 20 75 6e  on most other un
21a0: 69 78 65 73 2e 29 0a 2a 2a 0a 2a 2a 20 41 20 73  ixes.).**.** A s
21b0: 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20  ingle inode can 
21c0: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69  have multiple fi
21d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
21e0: 73 6f 20 65 61 63 68 20 4f 73 46 69 6c 65 0a 2a  so each OsFile.*
21f0: 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  * structure cont
2200: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
2210: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
2220: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64   this object and
2230: 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20   this.** object 
2240: 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66  keeps a count of
2250: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4f   the number of O
2260: 73 46 69 6c 65 73 20 70 6f 69 6e 74 69 6e 67 20  sFiles pointing 
2270: 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  to it..*/.struct
2280: 20 6c 6f 63 6b 49 6e 66 6f 20 7b 0a 20 20 73 74   lockInfo {.  st
2290: 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65 79  ruct lockKey key
22a0: 3b 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70  ;  /* The lookup
22b0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   key */.  int cn
22c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
22d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
22e0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
22f0: 0a 20 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 3b  .  int locktype;
2300: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2310: 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  f SHARED_LOCK, R
2320: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63  ESERVED_LOCK etc
2330: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  . */.  int nRef;
2340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2350: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
2360: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
2370: 75 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ure */.};../*.**
2380: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2390: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
23a0: 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61  ructure serves a
23b0: 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a  s the key used.*
23c0: 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  * to locate a pa
23d0: 72 74 69 63 75 6c 61 72 20 6f 70 65 6e 43 6e 74  rticular openCnt
23e0: 20 73 74 72 75 63 74 75 72 65 20 67 69 76 65 6e   structure given
23f0: 20 69 74 73 20 69 6e 6f 64 65 2e 20 20 54 68 69   its inode.  Thi
2400: 73 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65  s.** is the same
2410: 20 61 73 20 74 68 65 20 6c 6f 63 6b 4b 65 79 20   as the lockKey 
2420: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
2430: 74 68 72 65 61 64 20 49 44 20 69 73 20 6f 6d 69  thread ID is omi
2440: 74 74 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tted..*/.struct 
2450: 6f 70 65 6e 4b 65 79 20 7b 0a 20 20 64 65 76 5f  openKey {.  dev_
2460: 74 20 64 65 76 3b 20 20 20 2f 2a 20 44 65 76 69  t dev;   /* Devi
2470: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
2480: 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49  no_t ino;   /* I
2490: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 7d  node number */.}
24a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
24b0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
24c0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
24d0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
24e0: 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e   each open.** in
24f0: 6f 64 65 2e 20 20 54 68 69 73 20 73 74 72 75 63  ode.  This struc
2500: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
2510: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
2520: 66 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 0a  f locks on that.
2530: 2a 2a 20 69 6e 6f 64 65 2e 20 20 49 66 20 61 20  ** inode.  If a 
2540: 63 6c 6f 73 65 20 69 73 20 61 74 74 65 6d 70 74  close is attempt
2550: 65 64 20 61 67 61 69 6e 73 74 20 61 6e 20 69 6e  ed against an in
2560: 6f 64 65 20 74 68 61 74 20 69 73 20 68 6f 6c 64  ode that is hold
2570: 69 6e 67 0a 2a 2a 20 6c 6f 63 6b 73 2c 20 74 68  ing.** locks, th
2580: 65 20 63 6c 6f 73 65 20 69 73 20 64 65 66 65 72  e close is defer
2590: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6c 6f  red until all lo
25a0: 63 6b 73 20 63 6c 65 61 72 20 62 79 20 61 64 64  cks clear by add
25b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
25c0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65  descriptor to be
25d0: 20 63 6c 6f 73 65 64 20 74 6f 20 74 68 65 20 70   closed to the p
25e0: 65 6e 64 69 6e 67 20 6c 69 73 74 2e 0a 2a 2f 0a  ending list..*/.
25f0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 7b  struct openCnt {
2600: 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 4b 65  .  struct openKe
2610: 79 20 6b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  y key;   /* The 
2620: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
2630: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2650: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
2660: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
2670: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2690: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
26a0: 67 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e 74  g locks */.  int
26b0: 20 6e 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   nPending;      
26c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26d0: 70 65 6e 64 69 6e 67 20 63 6c 6f 73 65 28 29 20  pending close() 
26e0: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
26f0: 69 6e 74 20 2a 61 50 65 6e 64 69 6e 67 3b 20 20  int *aPending;  
2700: 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65        /* Malloce
2710: 64 20 73 70 61 63 65 20 68 6f 6c 64 69 6e 67 20  d space holding 
2720: 66 64 27 73 20 61 77 61 69 74 69 6e 67 20 61 20  fd's awaiting a 
2730: 63 6c 6f 73 65 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f  close() */.};../
2740: 2a 20 0a 2a 2a 20 54 68 65 73 65 20 68 61 73 68  * .** These hash
2750: 20 74 61 62 6c 65 20 6d 61 70 73 20 69 6e 6f 64   table maps inod
2760: 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20 49  es and process I
2770: 44 73 20 69 6e 74 6f 20 6c 6f 63 6b 49 6e 66 6f  Ds into lockInfo
2780: 20 61 6e 64 20 6f 70 65 6e 43 6e 74 0a 2a 2a 20   and openCnt.** 
2790: 73 74 72 75 63 74 75 72 65 73 2e 20 20 41 63 63  structures.  Acc
27a0: 65 73 73 20 74 6f 20 74 68 65 73 65 20 68 61 73  ess to these has
27b0: 68 20 74 61 62 6c 65 73 20 6d 75 73 74 20 62 65  h tables must be
27c0: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61 20   protected by a 
27d0: 6d 75 74 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  mutex..*/.static
27e0: 20 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d   Hash lockHash =
27f0: 20 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42   { SQLITE_HASH_B
2800: 49 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20  INARY, 0, 0, 0, 
2810: 30 2c 20 30 20 7d 3b 0a 73 74 61 74 69 63 20 48  0, 0 };.static H
2820: 61 73 68 20 6f 70 65 6e 48 61 73 68 20 3d 20 7b  ash openHash = {
2830: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
2840: 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ARY, 0, 0, 0, 0,
2850: 20 30 20 7d 3b 0a 0a 0a 23 69 66 64 65 66 20 53   0 };...#ifdef S
2860: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
2870: 44 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  DS./*.** This va
2880: 72 69 61 62 6c 65 20 72 65 63 6f 72 64 73 20 77  riable records w
2890: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
28a0: 72 65 61 64 73 20 63 61 6e 20 6f 76 65 72 72 69  reads can overri
28b0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 0a 2a  de each others.*
28c0: 2a 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 20  * locks..**.**  
28d0: 20 20 30 3a 20 20 4e 6f 2e 20 20 54 68 72 65 61    0:  No.  Threa
28e0: 64 73 20 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69  ds cannot overri
28f0: 64 65 20 65 61 63 68 20 6f 74 68 65 72 73 20 6c  de each others l
2900: 6f 63 6b 73 2e 0a 2a 2a 20 20 20 20 31 3a 20 20  ocks..**    1:  
2910: 59 65 73 2e 20 20 54 68 72 65 61 64 73 20 63 61  Yes.  Threads ca
2920: 6e 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20  n override each 
2930: 6f 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2a  others locks..**
2940: 20 20 20 2d 31 3a 20 20 57 65 20 64 6f 6e 27 74     -1:  We don't
2950: 20 6b 6e 6f 77 20 79 65 74 2e 0a 2a 2f 0a 73 74   know yet..*/.st
2960: 61 74 69 63 20 69 6e 74 20 74 68 72 65 61 64 73  atic int threads
2970: 4f 76 65 72 72 69 64 65 45 61 63 68 4f 74 68 65  OverrideEachOthe
2980: 72 73 4c 6f 63 6b 73 20 3d 20 2d 31 3b 0a 0a 2f  rsLocks = -1;../
2990: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74  *.** This struct
29a0: 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d  ure holds inform
29b0: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 74  ation passed int
29c0: 6f 20 69 6e 64 69 76 69 64 75 61 6c 20 74 65 73  o individual tes
29d0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 62 79 20  t.** threads by 
29e0: 74 68 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f  the testThreadLo
29f0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20  ckingBehavior() 
2a00: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75  routine..*/.stru
2a10: 63 74 20 74 68 72 65 61 64 54 65 73 74 44 61 74  ct threadTestDat
2a20: 61 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20  a {.  int fd;   
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a40: 46 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  File to be locke
2a50: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c  d */.  struct fl
2a60: 6f 63 6b 20 6c 6f 63 6b 3b 20 20 20 20 20 2f 2a  ock lock;     /*
2a70: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65   The locking ope
2a80: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
2a90: 72 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  result;         
2aa0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
2ab0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72  the locking oper
2ac0: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ation */.};..#if
2ad0: 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  def SQLITE_LOCK_
2ae0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  TRACE./*.** Prin
2af0: 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f  t out informatio
2b00: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b  n about all lock
2b10: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ing operations..
2b20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2b30: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
2b40: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c  roubleshooting l
2b50: 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72  ocks on multithr
2b60: 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72  eaded.** platfor
2b70: 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63  ms.  Enable by c
2b80: 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68  ompiling with th
2b90: 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  e -DSQLITE_LOCK_
2ba0: 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64  TRACE.** command
2bb0: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20  -line option on 
2bc0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54  the compiler.  T
2bd0: 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d  his code is norm
2be0: 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 6e 65 64 20  ally.** turnned 
2bf0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2c00: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
2c10: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
2c20: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
2c30: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
2c40: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
2c50: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
2c60: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
2c70: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2c80: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
2c90: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
2ca0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
2cb0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
2cc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
2cd0: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
2ce0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
2cf0: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2d00: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
2d10: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
2d20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
2d30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
2d40: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2d50: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
2d60: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
2d70: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
2d80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
2d90: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
2da0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
2db0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2dc0: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2dd0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2de0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
2df0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
2e00: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
2e10: 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c  T );.  s = fcntl
2e20: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73  (fd, op, p);.  s
2e30: 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e  avedErrno = errn
2e40: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  o;.  sqlite3Debu
2e50: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25  gPrintf("fcntl %
2e60: 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64  d %d %s %s %d %d
2e70: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2e80: 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f  threadid, fd, zO
2e90: 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69  pName, zType, (i
2ea0: 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28  nt)p->l_start, (
2eb0: 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20  int)p->l_len,.  
2ec0: 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64     (int)p->l_pid
2ed0: 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 20 26 26  , s);.  if( s &&
2ee0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
2ef0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
2f00: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
2f10: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
2f20: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2f30: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
2f40: 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46 5f      fcntl(fd, F_
2f50: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
2f60: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
2f70: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
2f80: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
2f90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fa0: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
2fb0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
2fc0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
2fd0: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
2fe0: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
2ff0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
3000: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
3010: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
3020: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
3030: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
3040: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
3050: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
3060: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
3070: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
3080: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
3090: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
30a0: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
30b0: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
30c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
30d0: 23 64 65 66 69 6e 65 20 66 63 6e 74 6c 20 6c 6f  #define fcntl lo
30e0: 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f  ckTrace.#endif /
30f0: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52  * SQLITE_LOCK_TR
3100: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ACE */../*.** Th
3110: 65 20 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b  e testThreadLock
3120: 69 6e 67 42 65 68 61 76 69 6f 72 28 29 20 72 6f  ingBehavior() ro
3130: 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 73 20 74  utine launches t
3140: 77 6f 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 74  wo separate.** t
3150: 68 72 65 61 64 73 20 6f 6e 20 74 68 69 73 20 72  hreads on this r
3160: 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20 72 6f  outine.  This ro
3170: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
3180: 6f 20 6c 6f 63 6b 20 61 20 66 69 6c 65 0a 2a 2a  o lock a file.**
3190: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
31a0: 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20 73   returns.  The s
31b0: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
31c0: 65 20 6f 66 20 74 68 61 74 20 61 74 74 65 6d 70  e of that attemp
31d0: 74 0a 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20  t.** allows the 
31e0: 74 65 73 74 54 68 72 65 61 64 4c 6f 63 6b 69 6e  testThreadLockin
31f0: 67 42 65 68 61 76 69 6f 72 28 29 20 70 72 6f 63  gBehavior() proc
3200: 65 64 75 72 65 20 74 6f 20 64 65 74 65 72 6d 69  edure to determi
3210: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  ne.** whether or
3220: 20 6e 6f 74 20 74 68 72 65 61 64 73 20 63 61 6e   not threads can
3230: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3240: 74 68 65 72 73 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  thers locks..*/.
3250: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 74 68 72  static void *thr
3260: 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74 28 76  eadLockingTest(v
3270: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 74  oid *pArg){.  st
3280: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
3290: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 73 74  ata *pData = (st
32a0: 72 75 63 74 20 74 68 72 65 61 64 54 65 73 74 44  ruct threadTestD
32b0: 61 74 61 2a 29 70 41 72 67 3b 0a 20 20 70 44 61  ata*)pArg;.  pDa
32c0: 74 61 2d 3e 72 65 73 75 6c 74 20 3d 20 66 63 6e  ta->result = fcn
32d0: 74 6c 28 70 44 61 74 61 2d 3e 66 64 2c 20 46 5f  tl(pData->fd, F_
32e0: 53 45 54 4c 4b 2c 20 26 70 44 61 74 61 2d 3e 6c  SETLK, &pData->l
32f0: 6f 63 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ock);.  return p
3300: 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
3310: 69 73 20 70 72 6f 63 65 64 75 72 65 20 61 74 74  is procedure att
3320: 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69  empts to determi
3330: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
3340: 74 20 74 68 72 65 61 64 73 0a 2a 2a 20 63 61 6e  t threads.** can
3350: 20 6f 76 65 72 72 69 64 65 20 65 61 63 68 20 6f   override each o
3360: 74 68 65 72 73 20 6c 6f 63 6b 73 20 74 68 65 6e  thers locks then
3370: 20 73 65 74 73 20 74 68 65 20 0a 2a 2a 20 74 68   sets the .** th
3380: 72 65 61 64 73 4f 76 65 72 72 69 64 65 45 61 63  readsOverrideEac
3390: 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20 76 61 72  hOthersLocks var
33a0: 69 61 62 6c 65 20 61 70 70 72 6f 70 72 69 61 74  iable appropriat
33b0: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
33c0: 6f 69 64 20 74 65 73 74 54 68 72 65 61 64 4c 6f  oid testThreadLo
33d0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64  ckingBehavior(fd
33e0: 5f 6f 72 69 67 29 7b 0a 20 20 69 6e 74 20 66 64  _orig){.  int fd
33f0: 3b 0a 20 20 73 74 72 75 63 74 20 74 68 72 65 61  ;.  struct threa
3400: 64 54 65 73 74 44 61 74 61 20 64 5b 32 5d 3b 0a  dTestData d[2];.
3410: 20 20 70 74 68 72 65 61 64 5f 74 20 74 5b 32 5d    pthread_t t[2]
3420: 3b 0a 0a 20 20 66 64 20 3d 20 64 75 70 28 66 64  ;..  fd = dup(fd
3430: 5f 6f 72 69 67 29 3b 0a 20 20 69 66 28 20 66 64  _orig);.  if( fd
3440: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  <0 ) return;.  m
3450: 65 6d 73 65 74 28 64 2c 20 30 2c 20 73 69 7a 65  emset(d, 0, size
3460: 6f 66 28 64 29 29 3b 0a 20 20 64 5b 30 5d 2e 66  of(d));.  d[0].f
3470: 64 20 3d 20 66 64 3b 0a 20 20 64 5b 30 5d 2e 6c  d = fd;.  d[0].l
3480: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
3490: 44 4c 43 4b 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63  DLCK;.  d[0].loc
34a0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 64  k.l_len = 1;.  d
34b0: 5b 30 5d 2e 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74  [0].lock.l_start
34c0: 20 3d 20 30 3b 0a 20 20 64 5b 30 5d 2e 6c 6f 63   = 0;.  d[0].loc
34d0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
34e0: 4b 5f 53 45 54 3b 0a 20 20 64 5b 31 5d 20 3d 20  K_SET;.  d[1] = 
34f0: 64 5b 30 5d 3b 0a 20 20 64 5b 31 5d 2e 6c 6f 63  d[0];.  d[1].loc
3500: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
3510: 43 4b 3b 0a 20 20 70 74 68 72 65 61 64 5f 63 72  CK;.  pthread_cr
3520: 65 61 74 65 28 26 74 5b 30 5d 2c 20 30 2c 20 74  eate(&t[0], 0, t
3530: 68 72 65 61 64 4c 6f 63 6b 69 6e 67 54 65 73 74  hreadLockingTest
3540: 2c 20 26 64 5b 30 5d 29 3b 0a 20 20 70 74 68 72  , &d[0]);.  pthr
3550: 65 61 64 5f 63 72 65 61 74 65 28 26 74 5b 31 5d  ead_create(&t[1]
3560: 2c 20 30 2c 20 74 68 72 65 61 64 4c 6f 63 6b 69  , 0, threadLocki
3570: 6e 67 54 65 73 74 2c 20 26 64 5b 31 5d 29 3b 0a  ngTest, &d[1]);.
3580: 20 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74    pthread_join(t
3590: 5b 30 5d 2c 20 30 29 3b 0a 20 20 70 74 68 72 65  [0], 0);.  pthre
35a0: 61 64 5f 6a 6f 69 6e 28 74 5b 31 5d 2c 20 30 29  ad_join(t[1], 0)
35b0: 3b 0a 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20  ;.  close(fd);. 
35c0: 20 74 68 72 65 61 64 73 4f 76 65 72 72 69 64 65   threadsOverride
35d0: 45 61 63 68 4f 74 68 65 72 73 4c 6f 63 6b 73 20  EachOthersLocks 
35e0: 3d 20 20 64 5b 30 5d 2e 72 65 73 75 6c 74 3d 3d  =  d[0].result==
35f0: 30 20 26 26 20 64 5b 31 5d 2e 72 65 73 75 6c 74  0 && d[1].result
3600: 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==0;.}.#endif /*
3610: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
3620: 45 41 44 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  EADS */../*.** R
3630: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 49 6e 66  elease a lockInf
3640: 6f 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76  o structure prev
3650: 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
3660: 20 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f   by findLockInfo
3670: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
3680: 69 64 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  id releaseLockIn
3690: 66 6f 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  fo(struct lockIn
36a0: 66 6f 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 70 4c  fo *pLock){.  pL
36b0: 6f 63 6b 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ock->nRef--;.  i
36c0: 66 28 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 3d 3d  f( pLock->nRef==
36d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
36e0: 48 61 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b  HashInsert(&lock
36f0: 48 61 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65  Hash, &pLock->ke
3700: 79 2c 20 73 69 7a 65 6f 66 28 70 4c 6f 63 6b 2d  y, sizeof(pLock-
3710: 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20 73  >key), 0);.    s
3720: 71 6c 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29  qliteFree(pLock)
3730: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3740: 65 6c 65 61 73 65 20 61 20 6f 70 65 6e 43 6e 74  elease a openCnt
3750: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
3760: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
3770: 62 79 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  by findLockInfo(
3780: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
3790: 64 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74  d releaseOpenCnt
37a0: 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20  (struct openCnt 
37b0: 2a 70 4f 70 65 6e 29 7b 0a 20 20 70 4f 70 65 6e  *pOpen){.  pOpen
37c0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
37d0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 3d 3d 30 20 29  pOpen->nRef==0 )
37e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  {.    sqlite3Has
37f0: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
3800: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
3810: 73 69 7a 65 6f 66 28 70 4f 70 65 6e 2d 3e 6b 65  sizeof(pOpen->ke
3820: 79 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  y), 0);.    sqli
3830: 74 65 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50  teFree(pOpen->aP
3840: 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  ending);.    sql
3850: 69 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a  iteFree(pOpen);.
3860: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
3870: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
3880: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 6c 6f 63  ptor, locate loc
3890: 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65 6e 43 6e  kInfo and openCn
38a0: 74 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  t structures tha
38b0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
38c0: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
38d0: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
38e0: 65 77 20 6f 6e 65 73 20 69 66 20 6e 65 63 65 73  ew ones if neces
38f0: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
3900: 74 75 72 6e 20 76 61 6c 75 65 73 20 6d 69 67 68  turn values migh
3910: 74 20 62 65 20 75 6e 73 65 74 20 69 66 20 61 6e  t be unset if an
3920: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
3930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
3940: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
3950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3960: 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20  findLockInfo(.  
3970: 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
39a0: 74 6f 72 20 75 73 65 64 20 69 6e 20 74 68 65 20  tor used in the 
39b0: 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
39c0: 6c 6f 63 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63  lockInfo **ppLoc
39d0: 6b 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  k,    /* Return 
39e0: 74 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  the lockInfo str
39f0: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
3a00: 20 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20   struct openCnt 
3a10: 2a 2a 70 70 4f 70 65 6e 20 20 20 20 20 20 2f 2a  **ppOpen      /*
3a20: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 65 6e   Return the open
3a30: 43 6e 74 20 73 74 72 75 63 74 75 72 65 20 68 65  Cnt structure he
3a40: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
3a50: 63 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b  c;.  struct lock
3a60: 4b 65 79 20 6b 65 79 31 3b 0a 20 20 73 74 72 75  Key key1;.  stru
3a70: 63 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 32 3b  ct openKey key2;
3a80: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
3a90: 74 61 74 62 75 66 3b 0a 20 20 73 74 72 75 63 74  tatbuf;.  struct
3aa0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b   lockInfo *pLock
3ab0: 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43  ;.  struct openC
3ac0: 6e 74 20 2a 70 4f 70 65 6e 3b 0a 20 20 72 63 20  nt *pOpen;.  rc 
3ad0: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
3ae0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
3af0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
3b00: 20 6d 65 6d 73 65 74 28 26 6b 65 79 31 2c 20 30   memset(&key1, 0
3b10: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 29 3b  , sizeof(key1));
3b20: 0a 20 20 6b 65 79 31 2e 64 65 76 20 3d 20 73 74  .  key1.dev = st
3b30: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20  atbuf.st_dev;.  
3b40: 6b 65 79 31 2e 69 6e 6f 20 3d 20 73 74 61 74 62  key1.ino = statb
3b50: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 69 66 64 65  uf.st_ino;.#ifde
3b60: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
3b70: 52 45 41 44 53 0a 20 20 69 66 28 20 74 68 72 65  READS.  if( thre
3b80: 61 64 73 4f 76 65 72 72 69 64 65 45 61 63 68 4f  adsOverrideEachO
3b90: 74 68 65 72 73 4c 6f 63 6b 73 3c 30 20 29 7b 0a  thersLocks<0 ){.
3ba0: 20 20 20 20 74 65 73 74 54 68 72 65 61 64 4c 6f      testThreadLo
3bb0: 63 6b 69 6e 67 42 65 68 61 76 69 6f 72 28 66 64  ckingBehavior(fd
3bc0: 29 3b 0a 20 20 7d 0a 20 20 6b 65 79 31 2e 74 69  );.  }.  key1.ti
3bd0: 64 20 3d 20 74 68 72 65 61 64 73 4f 76 65 72 72  d = threadsOverr
3be0: 69 64 65 45 61 63 68 4f 74 68 65 72 73 4c 6f 63  ideEachOthersLoc
3bf0: 6b 73 20 3f 20 30 20 3a 20 70 74 68 72 65 61 64  ks ? 0 : pthread
3c00: 5f 73 65 6c 66 28 29 3b 0a 23 65 6e 64 69 66 0a  _self();.#endif.
3c10: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 32 2c 20    memset(&key2, 
3c20: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32 29 29  0, sizeof(key2))
3c30: 3b 0a 20 20 6b 65 79 32 2e 64 65 76 20 3d 20 73  ;.  key2.dev = s
3c40: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20  tatbuf.st_dev;. 
3c50: 20 6b 65 79 32 2e 69 6e 6f 20 3d 20 73 74 61 74   key2.ino = stat
3c60: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c  buf.st_ino;.  pL
3c70: 6f 63 6b 20 3d 20 28 73 74 72 75 63 74 20 6c 6f  ock = (struct lo
3c80: 63 6b 49 6e 66 6f 2a 29 73 71 6c 69 74 65 33 48  ckInfo*)sqlite3H
3c90: 61 73 68 46 69 6e 64 28 26 6c 6f 63 6b 48 61 73  ashFind(&lockHas
3ca0: 68 2c 20 26 6b 65 79 31 2c 20 73 69 7a 65 6f 66  h, &key1, sizeof
3cb0: 28 6b 65 79 31 29 29 3b 0a 20 20 69 66 28 20 70  (key1));.  if( p
3cc0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Lock==0 ){.    s
3cd0: 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a  truct lockInfo *
3ce0: 70 4f 6c 64 3b 0a 20 20 20 20 70 4c 6f 63 6b 20  pOld;.    pLock 
3cf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3d00: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4c 6f 63 6b  w( sizeof(*pLock
3d10: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ) );.    if( pLo
3d20: 63 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ck==0 ) return 1
3d30: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6b 65 79  ;.    pLock->key
3d40: 20 3d 20 6b 65 79 31 3b 0a 20 20 20 20 70 4c 6f   = key1;.    pLo
3d50: 63 6b 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ck->nRef = 1;.  
3d60: 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30    pLock->cnt = 0
3d70: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63  ;.    pLock->loc
3d80: 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ktype = 0;.    p
3d90: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
3da0: 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61 73  hInsert(&lockHas
3db0: 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c 20  h, &pLock->key, 
3dc0: 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70 4c  sizeof(key1), pL
3dd0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ock);.    if( pO
3de0: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ld!=0 ){.      a
3df0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c 6f  ssert( pOld==pLo
3e00: 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ck );.      sqli
3e10: 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  teFree(pLock);. 
3e20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3e30: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3e40: 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b 3b    pLock->nRef++;
3e50: 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20 3d  .  }.  *ppLock =
3e60: 20 70 4c 6f 63 6b 3b 0a 20 20 70 4f 70 65 6e 20   pLock;.  pOpen 
3e70: 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43 6e  = (struct openCn
3e80: 74 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  t*)sqlite3HashFi
3e90: 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b  nd(&openHash, &k
3ea0: 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  ey2, sizeof(key2
3eb0: 29 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 3d  ));.  if( pOpen=
3ec0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
3ed0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
3ee0: 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69      pOpen = sqli
3ef0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
3f00: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
3f10: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
3f20: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
3f30: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
3f40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3f50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 65 6e  .    }.    pOpen
3f60: 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20  ->key = key2;.  
3f70: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20    pOpen->nRef = 
3f80: 31 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  1;.    pOpen->nL
3f90: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ock = 0;.    pOp
3fa0: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
3fb0: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65  ;.    pOpen->aPe
3fc0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  nding = 0;.    p
3fd0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
3fe0: 68 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73  hInsert(&openHas
3ff0: 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20  h, &pOpen->key, 
4000: 73 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f  sizeof(key2), pO
4010: 70 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  pen);.    if( pO
4020: 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ld!=0 ){.      a
4030: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70  ssert( pOld==pOp
4040: 65 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  en );.      sqli
4050: 74 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20  teFree(pOpen);. 
4060: 20 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b       releaseLock
4070: 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  Info(pLock);.   
4080: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
4090: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
40a0: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  pOpen->nRef++;. 
40b0: 20 7d 0a 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70   }.  *ppOpen = p
40c0: 4f 70 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 30  Open;.  return 0
40d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
40e0: 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
40f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
4100: 73 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68  sDelete(const ch
4110: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
4120: 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61    unlink(zFilena
4130: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  me);.  return SQ
4140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4150: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
4160: 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20   the named file 
4170: 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  exists..*/.int s
4180: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
4190: 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ts(const char *z
41a0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 72 65 74  Filename){.  ret
41b0: 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65  urn access(zFile
41c0: 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 7d 0a 0a  name, 0)==0;.}..
41d0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
41e0: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 66 6f 72   open a file for
41f0: 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
4200: 64 20 77 72 69 74 69 6e 67 2e 20 20 49 66 20 74  d writing.  If t
4210: 68 61 74 0a 2a 2a 20 66 61 69 6c 73 2c 20 74 72  hat.** fails, tr
4220: 79 20 6f 70 65 6e 69 6e 67 20 69 74 20 72 65 61  y opening it rea
4230: 64 2d 6f 6e 6c 79 2e 20 20 49 66 20 74 68 65 20  d-only.  If the 
4240: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
4250: 69 73 74 2c 0a 2a 2a 20 74 72 79 20 74 6f 20 63  ist,.** try to c
4260: 72 65 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  reate it..**.** 
4270: 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 68 61  On success, a ha
4280: 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 6f 70 65  ndle for the ope
4290: 6e 20 66 69 6c 65 20 69 73 20 77 72 69 74 74 65  n file is writte
42a0: 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20 61 6e 64 20  n to *id.** and 
42b0: 2a 70 52 65 61 64 6f 6e 6c 79 20 69 73 20 73 65  *pReadonly is se
42c0: 74 20 74 6f 20 30 20 69 66 20 74 68 65 20 66 69  t to 0 if the fi
42d0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 66 6f  le was opened fo
42e0: 72 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 2a 2a  r reading and.**
42f0: 20 77 72 69 74 69 6e 67 20 6f 72 20 31 20 69 66   writing or 1 if
4300: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
4310: 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
4320: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
4330: 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  turns.** SQLITE_
4340: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
4350: 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69  lure, the functi
4360: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
4370: 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c  E_CANTOPEN and l
4380: 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 61 6e 64  eaves.** *id and
4390: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 75 6e 63 68   *pReadonly unch
43a0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
43b0: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
43c0: 72 69 74 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  rite(.  const ch
43d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  ar *zFilename,. 
43e0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 69   OsFile *id,.  i
43f0: 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79 0a 29 7b  nt *pReadonly.){
4400: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
4410: 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e  ert( !id->isOpen
4420: 20 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20   );.  id->dirfd 
4430: 3d 20 2d 31 3b 0a 20 20 53 45 54 5f 54 48 52 45  = -1;.  SET_THRE
4440: 41 44 49 44 28 69 64 29 3b 0a 20 20 69 64 2d 3e  ADID(id);.  id->
4450: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
4460: 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  me, O_RDWR|O_CRE
4470: 41 54 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  AT|O_LARGEFILE|O
4480: 5f 42 49 4e 41 52 59 2c 0a 20 20 20 20 20 20 20  _BINARY,.       
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
44b0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
44c0: 4e 53 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 68  NS);.  if( id->h
44d0: 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45 49 53  <0 ){.#ifdef EIS
44e0: 44 49 52 0a 20 20 20 20 69 66 28 20 65 72 72 6e  DIR.    if( errn
44f0: 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20 20 20  o==EISDIR ){.   
4500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4510: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
4520: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 64 2d 3e  .#endif.    id->
4530: 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  h = open(zFilena
4540: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c  me, O_RDONLY|O_L
4550: 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
4560: 59 29 3b 0a 20 20 20 20 69 66 28 20 69 64 2d 3e  Y);.    if( id->
4570: 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  h<0 ){.      ret
4580: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4590: 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  PEN; .    }.    
45a0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  *pReadonly = 1;.
45b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52    }else{.    *pR
45c0: 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  eadonly = 0;.  }
45d0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
45e0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
45f0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64   findLockInfo(id
4600: 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c  ->h, &id->pLock,
4610: 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20   &id->pOpen);.  
4620: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
4630: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20  tex();.  if( rc 
4640: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  ){.    close(id-
4650: 3e 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >h);.    return 
4660: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4670: 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65  }.  id->locktype
4680: 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73 4f 70   = 0;.  id->isOp
4690: 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41 43 45 33  en = 1;.  TRACE3
46a0: 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
46b0: 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 7a 46 69  s\n", id->h, zFi
46c0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43  lename);.  OpenC
46d0: 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
46e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
46f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  }.../*.** Attemp
4700: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
4710: 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69  file for exclusi
4720: 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68 69  ve access by thi
4730: 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68  s process..** Th
4740: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  e file will be o
4750: 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72  pened for both r
4760: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
4770: 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a  ng.  To avoid.**
4780: 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63   a potential sec
4790: 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77  urity problem, w
47a0: 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  e do not allow t
47b0: 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a  he file to have.
47c0: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ** previously ex
47d0: 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77  isted.  Nor do w
47e0: 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  e allow the file
47f0: 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69   to be a symboli
4800: 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a  c.** link..**.**
4810: 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74   If delFlag is t
4820: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  rue, then make a
4830: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61  rrangements to a
4840: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
4850: 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ete.** the file 
4860: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
4870: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  d..**.** On succ
4880: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
4890: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
48a0: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
48b0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
48c0: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
48d0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
48e0: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EN..*/.int sqlit
48f0: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
4900: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
4910: 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20  ilename, OsFile 
4920: 2a 69 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67  *id, int delFlag
4930: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
4940: 73 73 65 72 74 28 20 21 69 64 2d 3e 69 73 4f 70  ssert( !id->isOp
4950: 65 6e 20 29 3b 0a 20 20 69 66 28 20 61 63 63 65  en );.  if( acce
4960: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
4970: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4980: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4990: 4e 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 54 48 52  N;.  }.  SET_THR
49a0: 45 41 44 49 44 28 69 64 29 3b 0a 20 20 69 64 2d  EADID(id);.  id-
49b0: 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69  >dirfd = -1;.  i
49c0: 64 2d 3e 68 20 3d 20 6f 70 65 6e 28 7a 46 69 6c  d->h = open(zFil
49d0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
49e0: 20 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f         O_RDWR|O_
49f0: 43 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e  CREAT|O_EXCL|O_N
4a00: 4f 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46  OFOLLOW|O_LARGEF
4a10: 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 0a 20 20  ILE|O_BINARY,.  
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
4a30: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
4a40: 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a  E_PERMISSIONS);.
4a50: 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20 29 7b    if( id->h<0 ){
4a60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4a70: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
4a80: 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  .  sqlite3OsEnte
4a90: 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20 3d  rMutex();.  rc =
4aa0: 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64   findLockInfo(id
4ab0: 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c  ->h, &id->pLock,
4ac0: 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20   &id->pOpen);.  
4ad0: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
4ae0: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 20  tex();.  if( rc 
4af0: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  ){.    close(id-
4b00: 3e 68 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28  >h);.    unlink(
4b10: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
4b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4b30: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c  MEM;.  }.  id->l
4b40: 6f 63 6b 74 79 70 65 20 3d 20 30 3b 0a 20 20 69  ocktype = 0;.  i
4b50: 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 31 3b 0a 20  d->isOpen = 1;. 
4b60: 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a   if( delFlag ){.
4b70: 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
4b80: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52 41  name);.  }.  TRA
4b90: 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d 33  CE3("OPEN-EX %-3
4ba0: 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20  d %s\n", id->h, 
4bb0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70  zFilename);.  Op
4bc0: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
4bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4be0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
4bf0: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  mpt to open a ne
4c00: 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 2d  w file for read-
4c10: 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a 0a  only access..**.
4c20: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77  ** On success, w
4c30: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68 61  rite the file ha
4c40: 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e  ndle into *id an
4c50: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
4c60: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69  OK..**.** On fai
4c70: 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  lure, return SQL
4c80: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f  ITE_CANTOPEN..*/
4c90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4f 70  .int sqlite3OsOp
4ca0: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
4cb0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4cc0: 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  , OsFile *id){. 
4cd0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
4ce0: 74 28 20 21 69 64 2d 3e 69 73 4f 70 65 6e 20 29  t( !id->isOpen )
4cf0: 3b 0a 20 20 53 45 54 5f 54 48 52 45 41 44 49 44  ;.  SET_THREADID
4d00: 28 69 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66  (id);.  id->dirf
4d10: 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e 68 20  d = -1;.  id->h 
4d20: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
4d30: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
4d40: 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29  GEFILE|O_BINARY)
4d50: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 68 3c 30 20  ;.  if( id->h<0 
4d60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4d70: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
4d80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e   }.  sqlite3OsEn
4d90: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
4da0: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
4db0: 69 64 2d 3e 68 2c 20 26 69 64 2d 3e 70 4c 6f 63  id->h, &id->pLoc
4dc0: 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a  k, &id->pOpen);.
4dd0: 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65    sqlite3OsLeave
4de0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
4df0: 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69  c ){.    close(i
4e00: 64 2d 3e 68 29 3b 0a 20 20 20 20 72 65 74 75 72  d->h);.    retur
4e10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4e20: 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74 79    }.  id->lockty
4e30: 70 65 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 69 73  pe = 0;.  id->is
4e40: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 54 52 41 43  Open = 1;.  TRAC
4e50: 45 33 28 22 4f 50 45 4e 2d 52 4f 20 25 2d 33 64  E3("OPEN-RO %-3d
4e60: 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 7a   %s\n", id->h, z
4e70: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65  Filename);.  Ope
4e80: 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
4e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4ea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
4eb0: 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c  pt to open a fil
4ec0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4ed0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
4ee0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  hat contains a.*
4ef0: 2a 20 66 69 6c 65 2e 20 20 54 68 69 73 20 66 69  * file.  This fi
4f00: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61  le descriptor ca
4f10: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 66 73 79  n be used to fsy
4f20: 6e 63 28 29 20 74 68 65 20 64 69 72 65 63 74 6f  nc() the directo
4f30: 72 79 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  ry.** in order t
4f40: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
4f50: 63 72 65 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65  creation of a ne
4f60: 77 20 66 69 6c 65 20 69 73 20 61 63 74 75 61 6c  w file is actual
4f70: 6c 79 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  ly written.** to
4f80: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   disk..**.** Thi
4f90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
4fa0: 79 20 6d 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72  y meaningful for
4fb0: 20 55 6e 69 78 2e 20 20 49 74 20 69 73 20 61 20   Unix.  It is a 
4fc0: 6e 6f 2d 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77  no-op under.** w
4fd0: 69 6e 64 6f 77 73 20 73 69 6e 63 65 20 77 69 6e  indows since win
4fe0: 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 73 75  dows does not su
4ff0: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
5000: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
5010: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
5020: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70   a previously op
5030: 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69  en file is at *i
5040: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
5050: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
5060: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
5070: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
5080: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
5090: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
50a0: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
50b0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
50c0: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
50d0: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
50e0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
50f0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
5100: 65 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20  ectory(.  const 
5110: 63 68 61 72 20 2a 7a 44 69 72 6e 61 6d 65 2c 0a  char *zDirname,.
5120: 20 20 4f 73 46 69 6c 65 20 2a 69 64 0a 29 7b 0a    OsFile *id.){.
5130: 20 20 69 66 28 20 21 69 64 2d 3e 69 73 4f 70 65    if( !id->isOpe
5140: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  n ){.    /* Do n
5150: 6f 74 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65  ot open the dire
5160: 63 74 6f 72 79 20 69 66 20 74 68 65 20 63 6f 72  ctory if the cor
5170: 72 65 73 70 6f 6e 64 69 6e 67 20 66 69 6c 65 20  responding file 
5180: 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 20  is not already. 
5190: 20 20 20 2a 2a 20 6f 70 65 6e 2e 20 2a 2f 0a 20     ** open. */. 
51a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
51b0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
51c0: 20 53 45 54 5f 54 48 52 45 41 44 49 44 28 69 64   SET_THREADID(id
51d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
51e0: 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 69 64  >dirfd<0 );.  id
51f0: 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a  ->dirfd = open(z
5200: 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
5210: 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
5220: 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3c    if( id->dirfd<
5230: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5240: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
5250: 20 0a 20 20 7d 0a 20 20 54 52 41 43 45 33 28 22   .  }.  TRACE3("
5260: 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c  OPENDIR %-3d %s\
5270: 6e 22 2c 20 69 64 2d 3e 64 69 72 66 64 2c 20 7a  n", id->dirfd, z
5280: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75  Dirname);.  retu
5290: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
52b0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
52c0: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
52d0: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
52e0: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
52f0: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
5300: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
5310: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
5320: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
5330: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2f  porary files..*/
5340: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74  .char *sqlite3_t
5350: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
5360: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  0;../*.** Create
5370: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
5380: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
5390: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
53a0: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
53b0: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c  old at least SQL
53c0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
53d0: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  E characters..*/
53e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 54 65  .int sqlite3OsTe
53f0: 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20  mpFileName(char 
5400: 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
5410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
5420: 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
5430: 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
5440: 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
5450: 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
5460: 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20 7d 3b 0a  .     ".",.  };.
5470: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
5480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
5490: 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
54a0: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
54b0: 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
54c0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
54d0: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
54e0: 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e  123456789";.  in
54f0: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
5500: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
5510: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
5520: 22 2e 22 3b 0a 20 20 61 7a 44 69 72 73 5b 30 5d  ".";.  azDirs[0]
5530: 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
5540: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 66 6f 72  directory;.  for
5550: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
5560: 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
5570: 44 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Dirs[0]); i++){.
5580: 20 20 20 20 69 66 28 20 61 7a 44 69 72 73 5b 69      if( azDirs[i
5590: 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
55a0: 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 61 7a  .    if( stat(az
55b0: 44 69 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29  Dirs[i], &buf) )
55c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
55d0: 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
55e0: 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69  st_mode) ) conti
55f0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63  nue;.    if( acc
5600: 65 73 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30  ess(azDirs[i], 0
5610: 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
5620: 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
5630: 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  [i];.    break;.
5640: 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 73 70    }.  do{.    sp
5650: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 2f  rintf(zBuf, "%s/
5660: 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  "TEMP_FILE_PREFI
5670: 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
5680: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
5690: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
56a0: 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
56b0: 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
56c0: 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
56d0: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
56e0: 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
56f0: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
5700: 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
5710: 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
5720: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
5730: 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
5740: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
5750: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
5760: 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 23 69  QLITE_OK; .}..#i
5770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5780: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
5790: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
57a0: 20 61 20 67 69 76 65 6e 20 70 61 74 68 6e 61 6d   a given pathnam
57b0: 65 20 69 73 20 61 20 64 69 72 65 63 74 6f 72 79  e is a directory
57c0: 20 61 6e 64 20 69 73 20 77 72 69 74 61 62 6c 65   and is writable
57d0: 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   .**.*/.int sqli
57e0: 74 65 33 4f 73 49 73 44 69 72 57 72 69 74 61 62  te3OsIsDirWritab
57f0: 6c 65 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  le(char *zBuf){.
5800: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
5810: 66 3b 0a 20 20 69 66 28 20 7a 42 75 66 3d 3d 30  f;.  if( zBuf==0
5820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5830: 66 28 20 7a 42 75 66 5b 30 5d 3d 3d 30 20 29 20  f( zBuf[0]==0 ) 
5840: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5850: 73 74 61 74 28 7a 42 75 66 2c 20 26 62 75 66 29  stat(zBuf, &buf)
5860: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
5870: 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e  f( !S_ISDIR(buf.
5880: 73 74 5f 6d 6f 64 65 29 20 29 20 72 65 74 75 72  st_mode) ) retur
5890: 6e 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73  n 0;.  if( acces
58a0: 73 28 7a 42 75 66 2c 20 30 37 29 20 29 20 72 65  s(zBuf, 07) ) re
58b0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
58c0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
58d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
58e0: 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a 2f 2a  R_PRAGMAS */../*
58f0: 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72  .** Read data fr
5900: 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61  om a file into a
5910: 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e   buffer.  Return
5920: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
5930: 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20  l.** bytes were 
5940: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
5950: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  y and SQLITE_IOE
5960: 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  RR if anything g
5970: 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f  oes.** wrong..*/
5980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 52 65  .int sqlite3OsRe
5990: 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76  ad(OsFile *id, v
59a0: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61  oid *pBuf, int a
59b0: 6d 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  mt){.  int got;.
59c0: 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73    assert( id->is
59d0: 4f 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61  Open );.  Simula
59e0: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
59f0: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45 52  _IOERR);.  TIMER
5a00: 5f 53 54 41 52 54 3b 0a 20 20 67 6f 74 20 3d 20  _START;.  got = 
5a10: 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
5a20: 2c 20 61 6d 74 29 3b 0a 20 20 54 49 4d 45 52 5f  , amt);.  TIMER_
5a30: 45 4e 44 3b 0a 20 20 54 52 41 43 45 35 28 22 52  END;.  TRACE5("R
5a40: 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20  EAD    %-3d %5d 
5a50: 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 68  %7d %d\n", id->h
5a60: 2c 20 67 6f 74 2c 20 6c 61 73 74 5f 70 61 67 65  , got, last_page
5a70: 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
5a80: 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a 20 20 2f  ;.  SEEK(0);.  /
5a90: 2a 20 69 66 28 20 67 6f 74 3c 30 20 29 20 67 6f  * if( got<0 ) go
5aa0: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 69 66 28 20  t = 0; */.  if( 
5ab0: 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20  got==amt ){.    
5ac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ad0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5ae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5af0: 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  RR;.  }.}../*.**
5b00: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
5b10: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
5b20: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
5b30: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
5b40: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
5b50: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
5b60: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 69  on failure..*/.i
5b70: 6e 74 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  nt sqlite3OsWrit
5b80: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f  e(OsFile *id, co
5b90: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
5ba0: 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e 74 20  int amt){.  int 
5bb0: 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73  wrote = 0;.  ass
5bc0: 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20  ert( id->isOpen 
5bd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
5be0: 3e 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  >0 );.  Simulate
5bf0: 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  IOError(SQLITE_I
5c00: 4f 45 52 52 29 3b 0a 20 20 53 69 6d 75 6c 61 74  OERR);.  Simulat
5c10: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 3b 0a  eDiskfullError;.
5c20: 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20    TIMER_START;. 
5c30: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
5c40: 20 28 77 72 6f 74 65 20 3d 20 77 72 69 74 65 28   (wrote = write(
5c50: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  id->h, pBuf, amt
5c60: 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
5c70: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  -= wrote;.    pB
5c80: 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
5c90: 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
5ca0: 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54    TIMER_END;.  T
5cb0: 52 41 43 45 35 28 22 57 52 49 54 45 20 20 20 25  RACE5("WRITE   %
5cc0: 2d 33 64 20 25 35 64 20 25 37 64 20 25 64 5c 6e  -3d %5d %7d %d\n
5cd0: 22 2c 20 69 64 2d 3e 68 2c 20 77 72 6f 74 65 2c  ", id->h, wrote,
5ce0: 20 6c 61 73 74 5f 70 61 67 65 2c 20 54 49 4d 45   last_page, TIME
5cf0: 52 5f 45 4c 41 50 53 45 44 29 3b 0a 20 20 53 45  R_ELAPSED);.  SE
5d00: 45 4b 28 30 29 3b 0a 20 20 69 66 28 20 61 6d 74  EK(0);.  if( amt
5d10: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
5d20: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
5d30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5d40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
5d50: 6f 76 65 20 74 68 65 20 72 65 61 64 2f 77 72 69  ove the read/wri
5d60: 74 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 61 20  te pointer in a 
5d70: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
5d80: 69 74 65 33 4f 73 53 65 65 6b 28 4f 73 46 69 6c  ite3OsSeek(OsFil
5d90: 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
5da0: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  t){.  assert( id
5db0: 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53 45  ->isOpen );.  SE
5dc0: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
5dd0: 20 31 29 3b 0a 20 20 6c 73 65 65 6b 28 69 64 2d   1);.  lseek(id-
5de0: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
5df0: 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  _SET);.  return 
5e00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5e10: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5e20: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
5e30: 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
5e40: 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
5e50: 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
5e60: 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
5e70: 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
5e80: 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
5e90: 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
5ea0: 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
5eb0: 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
5ec0: 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
5ed0: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
5ee0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
5ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
5f00: 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
5f10: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
5f20: 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
5f30: 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
5f40: 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
5f50: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
5f60: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
5f70: 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
5f80: 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
5f90: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
5fa0: 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
5fb0: 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
5fc0: 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
5fd0: 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
5fe0: 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
5ff0: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
6000: 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
6010: 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
6020: 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
6030: 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
6040: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
6050: 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
6060: 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
6070: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
6080: 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
6090: 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
60a0: 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
60b0: 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
60c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
60d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c  /.static int ful
60e0: 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20  l_fsync(int fd, 
60f0: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
6100: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 52   int rc;..  /* R
6110: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
6120: 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77   of times that w
6130: 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73  e do a normal fs
6140: 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20  ync() and .  ** 
6150: 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20  FULLSYNC.  This 
6160: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  is used during t
6170: 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79  esting to verify
6180: 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
6190: 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63  dure.  ** gets c
61a0: 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63  alled with the c
61b0: 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73  orrect arguments
61c0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
61d0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
61e0: 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74  fullSync ) sqlit
61f0: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
6200: 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
6210: 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
6220: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
6230: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
6240: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
6250: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
6260: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
6270: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
6280: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
6290: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
62a0: 0a 23 65 6c 73 65 0a 0a 23 69 66 64 65 66 20 46  .#else..#ifdef F
62b0: 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
62c0: 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
62d0: 20 72 63 20 3d 20 66 63 6e 74 6c 28 66 64 2c 20   rc = fcntl(fd, 
62e0: 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b  F_FULLFSYNC, 0);
62f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
6300: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
6310: 66 20 74 68 65 20 46 55 4c 4c 53 59 4e 43 20 66  f the FULLSYNC f
6320: 61 69 6c 65 64 2c 20 74 72 79 20 74 6f 20 64 6f  ailed, try to do
6330: 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28   a normal fsync(
6340: 29 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20  ) */.  if( rc ) 
6350: 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
6360: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 66 73  .#else.  rc = fs
6370: 79 6e 63 28 66 64 29 3b 0a 23 65 6e 64 69 66 20  ync(fd);.#endif 
6380: 2f 2a 20 64 65 66 69 6e 65 64 28 46 5f 46 55 4c  /* defined(F_FUL
6390: 4c 46 53 59 4e 43 29 20 2a 2f 0a 23 65 6e 64 69  LFSYNC) */.#endi
63a0: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
63b0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 2a 2f 0a  ITE_NO_SYNC) */.
63c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
63d0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
63e0: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
63f0: 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
6400: 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
6410: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 55 6e  o disk..**.** Un
6420: 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
6430: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
6440: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
6450: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
6460: 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
6470: 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
6480: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
6490: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
64a0: 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
64b0: 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
64c0: 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
64d0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
64e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
64f0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
6500: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
6510: 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
6520: 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
6530: 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
6540: 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
6550: 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
6560: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
6570: 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
6580: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
6590: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
65a0: 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
65b0: 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
65c0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
65d0: 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
65e0: 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
65f0: 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
6600: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
6610: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  int sqlite3OsSyn
6620: 63 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20  c(OsFile *id){. 
6630: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 69 73 4f   assert( id->isO
6640: 70 65 6e 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  pen );.  Simulat
6650: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
6660: 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32  IOERR);.  TRACE2
6670: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
6680: 22 2c 20 69 64 2d 3e 68 29 3b 0a 20 20 69 66 28  ", id->h);.  if(
6690: 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 64 2d 3e   full_fsync(id->
66a0: 68 2c 20 69 64 2d 3e 66 75 6c 6c 53 79 6e 63 29  h, id->fullSync)
66b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
66c0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
66d0: 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66 64  .  if( id->dirfd
66e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 54 52 41 43 45  >=0 ){.    TRACE
66f0: 32 28 22 44 49 52 53 59 4e 43 20 25 2d 33 64 5c  2("DIRSYNC %-3d\
6700: 6e 22 2c 20 69 64 2d 3e 64 69 72 66 64 29 3b 0a  n", id->dirfd);.
6710: 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69      full_fsync(i
6720: 64 2d 3e 64 69 72 66 64 2c 20 69 64 2d 3e 66 75  d->dirfd, id->fu
6730: 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20 63 6c 6f  llSync);.    clo
6740: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 20 20  se(id->dirfd);  
6750: 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  /* Only need to 
6760: 73 79 6e 63 20 6f 6e 63 65 2c 20 73 6f 20 63 6c  sync once, so cl
6770: 6f 73 65 20 74 68 65 20 64 69 72 65 63 74 6f 72  ose the director
6780: 79 20 2a 2f 0a 20 20 20 20 69 64 2d 3e 64 69 72  y */.    id->dir
6790: 66 64 20 3d 20 2d 31 3b 20 20 20 20 2f 2a 20 77  fd = -1;    /* w
67a0: 68 65 6e 20 77 65 20 61 72 65 20 64 6f 6e 65 2e  hen we are done.
67b0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
67c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
67d0: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 69  *.** Sync the di
67e0: 72 65 63 74 6f 72 79 20 7a 44 69 72 6e 61 6d 65  rectory zDirname
67f0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
6800: 70 20 6f 6e 20 6f 70 65 72 61 74 69 6e 67 20 73  p on operating s
6810: 79 73 74 65 6d 73 20 6f 74 68 65 72 0a 2a 2a 20  ystems other.** 
6820: 74 68 61 6e 20 55 4e 49 58 2e 0a 2a 2a 0a 2a 2a  than UNIX..**.**
6830: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
6840: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d   make sure the m
6850: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
6860: 6c 65 20 68 61 73 20 74 72 75 65 6c 79 20 62 65  le has truely be
6870: 65 6e 20 64 65 6c 65 74 65 64 0a 2a 2a 20 62 65  en deleted.** be
6880: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 63 68 61 6e  fore making chan
6890: 67 65 73 20 74 6f 20 69 6e 64 69 76 69 64 75 61  ges to individua
68a0: 6c 20 6a 6f 75 72 6e 61 6c 73 20 6f 6e 20 61 20  l journals on a 
68b0: 6d 75 6c 74 69 2d 64 61 74 61 62 61 73 65 20 63  multi-database c
68c0: 6f 6d 6d 69 74 2e 0a 2a 2a 20 54 68 65 20 46 5f  ommit..** The F_
68d0: 46 55 4c 4c 46 53 59 4e 43 20 6f 70 74 69 6f 6e  FULLFSYNC option
68e0: 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 20 68   is not needed h
68f0: 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ere..*/.int sqli
6900: 74 65 33 4f 73 53 79 6e 63 44 69 72 65 63 74 6f  te3OsSyncDirecto
6910: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
6920: 44 69 72 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  Dirname){.  int 
6930: 66 64 3b 0a 20 20 69 6e 74 20 72 3b 0a 20 20 53  fd;.  int r;.  S
6940: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
6950: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
6960: 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e 61  fd = open(zDirna
6970: 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42  me, O_RDONLY|O_B
6980: 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 54 52 41  INARY, 0);.  TRA
6990: 43 45 33 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE3("DIRSYNC %-3
69a0: 64 20 28 25 73 29 5c 6e 22 2c 20 66 64 2c 20 7a  d (%s)\n", fd, z
69b0: 44 69 72 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  Dirname);.  if( 
69c0: 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
69d0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
69e0: 45 4e 3b 20 0a 20 20 7d 0a 20 20 72 20 3d 20 66  EN; .  }.  r = f
69f0: 73 79 6e 63 28 66 64 29 3b 0a 20 20 63 6c 6f 73  sync(fd);.  clos
6a00: 65 28 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(fd);.  return 
6a10: 28 28 72 3d 3d 30 29 3f 53 51 4c 49 54 45 5f 4f  ((r==0)?SQLITE_O
6a20: 4b 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  K:SQLITE_IOERR);
6a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
6a40: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
6a50: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
6a60: 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
6a70: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 4f 73 46  e3OsTruncate(OsF
6a80: 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
6a90: 74 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  te){.  assert( i
6aa0: 64 2d 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 53  d->isOpen );.  S
6ab0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
6ac0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
6ad0: 72 65 74 75 72 6e 20 66 74 72 75 6e 63 61 74 65  return ftruncate
6ae0: 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 29 3d 3d  (id->h, nByte)==
6af0: 30 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  0 ? SQLITE_OK : 
6b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a  SQLITE_IOERR;.}.
6b10: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
6b20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
6b30: 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
6b40: 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ytes.*/.int sqli
6b50: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73  te3OsFileSize(Os
6b60: 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  File *id, i64 *p
6b70: 53 69 7a 65 29 7b 0a 20 20 73 74 72 75 63 74 20  Size){.  struct 
6b80: 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
6b90: 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e 20 29  rt( id->isOpen )
6ba0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6bb0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
6bc0: 29 3b 0a 20 20 69 66 28 20 66 73 74 61 74 28 69  );.  if( fstat(i
6bd0: 64 2d 3e 68 2c 20 26 62 75 66 29 21 3d 30 20 29  d->h, &buf)!=0 )
6be0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6bf0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20  ITE_IOERR;.  }. 
6c00: 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
6c10: 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  _size;.  return 
6c20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6c30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6c40: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
6c50: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
6c60: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
6c70: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
6c80: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
6c90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
6ca0: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
6cb0: 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
6cc0: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  * non-zero.  If 
6cd0: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
6ce0: 63 6b 65 64 20 6f 72 20 68 6f 6c 64 73 20 6f 6e  cked or holds on
6cf0: 6c 79 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 2c  ly SHARED locks,
6d00: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
6d10: 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  zero..*/.int sql
6d20: 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
6d30: 76 65 64 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  vedLock(OsFile *
6d40: 69 64 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 30  id){.  int r = 0
6d50: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  ;..  assert( id-
6d60: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 69 66 28  >isOpen );.  if(
6d70: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
6d80: 69 64 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  id) ) return SQL
6d90: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 73 71  ITE_MISUSE;.  sq
6da0: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
6db0: 78 28 29 3b 20 2f 2a 20 4e 65 65 64 65 64 20 62  x(); /* Needed b
6dc0: 65 63 61 75 73 65 20 69 64 2d 3e 70 4c 6f 63 6b  ecause id->pLock
6dd0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
6de0: 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20  s threads */..  
6df0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
6e00: 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
6e10: 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
6e20: 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
6e30: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74  id->pLock->lockt
6e40: 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ype>SHARED_LOCK 
6e50: 29 7b 0a 20 20 20 20 72 20 3d 20 31 3b 0a 20 20  ){.    r = 1;.  
6e60: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
6e70: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
6e80: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
6e90: 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  s it..  */.  if(
6ea0: 20 21 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63   !r ){.    struc
6eb0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
6ec0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
6ed0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
6ee0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
6ef0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
6f00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
6f10: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
6f20: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
6f30: 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c 20 46 5f   fcntl(id->h, F_
6f40: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20  GETLK, &lock);. 
6f50: 20 20 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79     if( lock.l_ty
6f60: 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe!=F_UNLCK ){. 
6f70: 20 20 20 20 20 72 20 3d 20 31 3b 0a 20 20 20 20       r = 1;.    
6f80: 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74  }.  }.  .  sqlit
6f90: 65 33 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  e3OsLeaveMutex()
6fa0: 3b 0a 20 20 54 52 41 43 45 33 28 22 54 45 53 54  ;.  TRACE3("TEST
6fb0: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 5c 6e   WR-LOCK %d %d\n
6fc0: 22 2c 20 69 64 2d 3e 68 2c 20 72 29 3b 0a 0a 20  ", id->h, r);.. 
6fd0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 23 69   return r;.}..#i
6fe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6ff0: 47 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  G./*.** Helper f
7000: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e  unction for prin
7010: 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69  ting out trace i
7020: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
7030: 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e  debugging.** bin
7040: 61 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75  aries. This retu
7050: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72  rns the string r
7060: 65 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20  epresetation of 
7070: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
7080: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
7090: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
70a0: 73 74 20 63 68 61 72 20 2a 20 6c 6f 63 6b 74 79  st char * lockty
70b0: 70 65 4e 61 6d 65 28 69 6e 74 20 6c 6f 63 6b 74  peName(int lockt
70c0: 79 70 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ype){.  switch( 
70d0: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 63 61  locktype ){.  ca
70e0: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
70f0: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 63 61 73  rn "NONE";.  cas
7100: 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72  e SHARED_LOCK: r
7110: 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a  eturn "SHARED";.
7120: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
7130: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
7140: 53 45 52 56 45 44 22 3b 0a 20 20 63 61 73 65 20  SERVED";.  case 
7150: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65  PENDING_LOCK: re
7160: 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a  turn "PENDING";.
7170: 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45    case EXCLUSIVE
7180: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45  _LOCK: return "E
7190: 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20  XCLUSIVE";.  }. 
71a0: 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b   return "ERROR";
71b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
71c0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
71d0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
71e0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
71f0: 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
7200: 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
7210: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
7220: 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
7230: 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
7240: 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
7250: 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
7260: 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
7270: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
7280: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
7290: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
72a0: 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
72b0: 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
72c0: 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
72d0: 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
72e0: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
72f0: 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
7300: 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
7310: 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
7320: 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
7330: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
7340: 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
7350: 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
7360: 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
7370: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
7380: 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
7390: 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
73a0: 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
73b0: 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
73c0: 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
73d0: 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
73e0: 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
73f0: 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
7400: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
7410: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
7420: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
7430: 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
7440: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
7450: 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
7460: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
7470: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7480: 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
7490: 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
74a0: 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
74b0: 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
74c0: 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
74d0: 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 69 6e  ing level..*/.in
74e0: 74 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  t sqlite3OsLock(
74f0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
7500: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 2f 2a 20  locktype){.  /* 
7510: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65  The following de
7520: 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c  scribes the impl
7530: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
7540: 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20  e various locks 
7550: 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72  and.  ** lock tr
7560: 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72  ansitions in ter
7570: 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20  ms of the POSIX 
7580: 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64 20  advisory shared 
7590: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20  and exclusive.  
75a0: 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76  ** lock primitiv
75b0: 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d  es (called read-
75c0: 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d  locks and write-
75d0: 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20  locks below, to 
75e0: 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75  avoid.  ** confu
75f0: 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65  sion with SQLite
7600: 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68   lock names). Th
7610: 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65  e algorithms are
7620: 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a   complicated.  *
7630: 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72  * slightly in or
7640: 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74  der to be compat
7650: 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77  ible with window
7660: 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74  s systems simult
7670: 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63  aneously.  ** ac
7680: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
7690: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
76a0: 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73 20  in case that is 
76b0: 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20  ever required.. 
76c0: 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73   **.  ** Symbols
76d0: 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68   defined in os.h
76e0: 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27   indentify the '
76f0: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e  pending byte' an
7700: 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64 0a  d the 'reserved.
7710: 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68    ** byte', each
7720: 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74   single bytes at
7730: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7740: 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68  ets, and the 'sh
7750: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
7760: 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f  ange', a range o
7770: 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20 61  f 510 bytes at a
7780: 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73   well known offs
7790: 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  et..  **.  ** To
77a0: 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45 44   obtain a SHARED
77b0: 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f   lock, a read-lo
77c0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
77d0: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20  n the 'pending. 
77e0: 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74   ** byte'.  If t
77f0: 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66 75  his is successfu
7800: 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  l, a random byte
7810: 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65   from the 'share
7820: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
7830: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
7840: 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  d and the lock o
7850: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
7860: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20  yte' released.. 
7870: 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65   **.  ** A proce
7880: 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61  ss may only obta
7890: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
78a0: 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20  ck after it has 
78b0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20  a SHARED lock.. 
78c0: 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c   ** A RESERVED l
78d0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
78e0: 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61  ed by grabbing a
78f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
7900: 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65  he.  ** 'reserve
7910: 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20  d byte'. .  **. 
7920: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
7930: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
7940: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74  PENDING lock aft
7950: 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e  er it has obtain
7960: 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44  ed a.  ** SHARED
7970: 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47   lock. A PENDING
7980: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
7990: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
79a0: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20  g a write-lock. 
79b0: 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64   ** on the 'pend
79c0: 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20  ing byte'. This 
79d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20  ensures that no 
79e0: 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  new SHARED locks
79f0: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74   can be.  ** obt
7a00: 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74  ained, but exist
7a10: 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ing SHARED locks
7a20: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
7a30: 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65  persist. A proce
7a40: 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ss.  ** does not
7a50: 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20   have to obtain 
7a60: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
7a70: 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20  on the way to a 
7a80: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20  PENDING lock..  
7a90: 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79  ** This property
7aa0: 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
7ab0: 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f  algorithm for ro
7ac0: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
7ad0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61  rnal file.  ** a
7ae0: 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20  fter a crash..  
7af0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55  **.  ** An EXCLU
7b00: 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69  SIVE lock, obtai
7b10: 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44  ned after a PEND
7b20: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ING lock is held
7b30: 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  , is.  ** implem
7b40: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
7b50: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
7b60: 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73  on the entire 's
7b70: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
7b80: 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c  range'. Since al
7b90: 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65  l other locks re
7ba0: 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63  quire a read-loc
7bb0: 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  k on one of the 
7bc0: 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69  bytes.  ** withi
7bd0: 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68  n this range, th
7be0: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
7bf0: 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61  no other locks a
7c00: 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  re held on the. 
7c10: 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20   ** database. . 
7c20: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61   **.  ** The rea
7c30: 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74  son a single byt
7c40: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
7c50: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
7c60: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
7c70: 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61 74  * range' is that
7c80: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
7c90: 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74  f windows do not
7ca0: 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f   support read-lo
7cb0: 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63  cks. By.  ** loc
7cc0: 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79  king a random by
7cd0: 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c  te from a range,
7ce0: 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52   concurrent SHAR
7cf0: 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69  ED locks may exi
7d00: 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  st.  ** even if 
7d10: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  the locking prim
7d20: 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61 6c  itive used is al
7d30: 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63  ways a write-loc
7d40: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63  k..  */.  int rc
7d50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7d60: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
7d70: 2a 70 4c 6f 63 6b 20 3d 20 69 64 2d 3e 70 4c 6f  *pLock = id->pLo
7d80: 63 6b 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  ck;.  struct flo
7d90: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73  ck lock;.  int s
7da0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  ;..  assert( id-
7db0: 3e 69 73 4f 70 65 6e 20 29 3b 0a 20 20 54 52 41  >isOpen );.  TRA
7dc0: 43 45 37 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE7("LOCK    %d 
7dd0: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
7de0: 20 70 69 64 3d 25 64 5c 6e 22 2c 20 69 64 2d 3e   pid=%d\n", id->
7df0: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
7e00: 6c 6f 63 6b 74 79 70 65 29 2c 20 0a 20 20 20 20  locktype), .    
7e10: 20 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28 69    locktypeName(i
7e20: 64 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 6c 6f  d->locktype), lo
7e30: 63 6b 74 79 70 65 4e 61 6d 65 28 70 4c 6f 63 6b  cktypeName(pLock
7e40: 2d 3e 6c 6f 63 6b 74 79 70 65 29 2c 20 70 4c 6f  ->locktype), pLo
7e50: 63 6b 2d 3e 63 6e 74 0a 20 20 20 20 20 20 2c 67  ck->cnt.      ,g
7e60: 65 74 70 69 64 28 29 20 29 3b 0a 20 20 69 66 28  etpid() );.  if(
7e70: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
7e80: 69 64 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  id) ) return SQL
7e90: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 2f  ITE_MISUSE;..  /
7ea0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
7eb0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
7ec0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
7ed0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
7ee0: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
7ef0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
7f00: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
7f10: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
7f20: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
7f30: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
7f40: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
7f50: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
7f60: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  ( id->locktype>=
7f70: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
7f80: 54 52 41 43 45 33 28 22 4c 4f 43 4b 20 20 20 20  TRACE3("LOCK    
7f90: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
7fa0: 79 20 68 65 6c 64 29 5c 6e 22 2c 20 69 64 2d 3e  y held)\n", id->
7fb0: 68 2c 20 6c 6f 63 6b 74 79 70 65 4e 61 6d 65 28  h, locktypeName(
7fc0: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  locktype));.    
7fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7fe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
7ff0: 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
8000: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
8010: 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
8020: 65 72 74 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  ert( id->locktyp
8030: 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
8040: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
8050: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
8060: 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
8070: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
8080: 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
8090: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
80a0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  id->locktype==SH
80b0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
80c0: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
80d0: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
80e0: 69 64 2d 3e 70 4c 6f 63 6b 20 69 73 20 73 68 61  id->pLock is sha
80f0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
8100: 64 73 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ds.  */.  sqlite
8110: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  3OsEnterMutex();
8120: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
8130: 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
8140: 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
8150: 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
8160: 4f 73 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  OsFile*.  ** han
8170: 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
8180: 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
8190: 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
81a0: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
81b0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 70 4c  id->locktype!=pL
81c0: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 26 26  ock->locktype &&
81d0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c 6f   .          (pLo
81e0: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 50 45  ck->locktype>=PE
81f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  NDING_LOCK || lo
8200: 63 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f  cktype>SHARED_LO
8210: 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  CK)).  ){.    rc
8220: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8230: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
8240: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  k;.  }..  /* If 
8250: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  a SHARED lock is
8260: 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20   requested, and 
8270: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
8280: 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61  g this PID alrea
8290: 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48  dy.  ** has a SH
82a0: 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44  ARED or RESERVED
82b0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72   lock, then incr
82c0: 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20  ement reference 
82d0: 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20  counts and.  ** 
82e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
82f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ..  */.  if( loc
8300: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8310: 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 4c  CK && .      (pL
8320: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ock->locktype==S
8330: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  HARED_LOCK || pL
8340: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ock->locktype==R
8350: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
8360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
8370: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8380: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
8390: 28 20 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  ( id->locktype==
83a0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
83b0: 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 3b   pLock->cnt>0 );
83c0: 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 74 79 70  .    id->locktyp
83d0: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
83e0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e 74 2b  .    pLock->cnt+
83f0: 2b 3b 0a 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e  +;.    id->pOpen
8400: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
8410: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
8420: 7d 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  }..  lock.l_len 
8430: 3d 20 31 4c 3b 0a 0a 20 20 6c 6f 63 6b 2e 6c 5f  = 1L;..  lock.l_
8440: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
8450: 54 3b 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  T;..  /* A PENDI
8460: 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
8470: 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
8480: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
8490: 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
84a0: 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
84b0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
84c0: 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
84d0: 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
84e0: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
84f0: 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
8500: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
8510: 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
8520: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
8530: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 69  LUSIVE_LOCK && i
8540: 64 2d 3e 6c 6f 63 6b 74 79 70 65 3c 50 45 4e 44  d->locktype<PEND
8550: 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
8560: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
8570: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52   (locktype==SHAR
8580: 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
8590: 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
85a0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
85b0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 73  DING_BYTE;.    s
85c0: 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c 20   = fcntl(id->h, 
85d0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
85e0: 0a 20 20 20 20 69 66 28 20 73 20 29 7b 0a 20 20  .    if( s ){.  
85f0: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
8600: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
8610: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
8620: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 67 6f 74  _BUSY;.      got
8630: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
8640: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
8650: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
8660: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
8670: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
8680: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
8690: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
86a0: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
86b0: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
86c0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
86d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
86e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
86f0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 3b  pLock->cnt==0 );
8700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
8710: 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 30 20  ck->locktype==0 
8720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
8730: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
8740: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
8750: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
8760: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
8770: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
8780: 45 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c  E;.    s = fcntl
8790: 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  (id->h, F_SETLK,
87a0: 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a   &lock);..    /*
87b0: 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
87c0: 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
87d0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
87e0: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
87f0: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
8800: 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f  len = 1L;.    lo
8810: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
8820: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 66 63 6e  LCK;.    if( fcn
8830: 74 6c 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c  tl(id->h, F_SETL
8840: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a  K, &lock)!=0 ){.
8850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8860: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
8870: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
8880: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 67  appen */.      g
8890: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
88a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 20 29 7b    }.    if( s ){
88b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
88c0: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
88d0: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
88e0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
88f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 64 2d 3e 6c  lse{.      id->l
8900: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
8910: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 69 64 2d  _LOCK;.      id-
8920: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
8930: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  .      pLock->cn
8940: 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 1;.    }.  }
8950: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 74 79 70  else if( locktyp
8960: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
8970: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 63 6e 74 3e  K && pLock->cnt>
8980: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
8990: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
89a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
89b0: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
89c0: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
89d0: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
89e0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
89f0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
8a00: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
8a10: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
8a20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
8a30: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
8a40: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
8a50: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
8a60: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
8a70: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
8a80: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
8a90: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
8aa0: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
8ab0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
8ac0: 73 65 72 74 28 20 30 21 3d 69 64 2d 3e 6c 6f 63  sert( 0!=id->loc
8ad0: 6b 74 79 70 65 20 29 3b 0a 20 20 20 20 6c 6f 63  ktype );.    loc
8ae0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
8af0: 43 4b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  CK;.    switch( 
8b00: 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
8b10: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
8b20: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
8b30: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
8b40: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
8b50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8b60: 20 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f   case EXCLUSIVE_
8b70: 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f  LOCK:.        lo
8b80: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
8b90: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
8ba0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
8bb0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
8bc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8bd0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
8be0: 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
8bf0: 20 20 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74    }.    s = fcnt
8c00: 6c 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  l(id->h, F_SETLK
8c10: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , &lock);.    if
8c20: 28 20 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ( s ){.      rc 
8c30: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
8c40: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
8c50: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
8c60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
8c70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8c80: 20 29 7b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b   ){.    id->lock
8c90: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
8ca0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b  .    pLock->lock
8cb0: 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  type = locktype;
8cc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
8cd0: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
8ce0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 64 2d  _LOCK ){.    id-
8cf0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  >locktype = PEND
8d00: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 4c  ING_LOCK;.    pL
8d10: 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ock->locktype = 
8d20: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
8d30: 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73  }..end_lock:.  s
8d40: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
8d50: 65 78 28 29 3b 0a 20 20 54 52 41 43 45 34 28 22  ex();.  TRACE4("
8d60: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
8d70: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
8d80: 74 79 70 65 4e 61 6d 65 28 6c 6f 63 6b 74 79 70  typeName(locktyp
8d90: 65 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  e), .      rc==S
8da0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
8db0: 3a 20 22 66 61 69 6c 65 64 22 29 3b 0a 20 20 72  : "failed");.  r
8dc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8dd0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
8de0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
8df0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64  le descriptor id
8e00: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
8e10: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
8e20: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
8e30: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
8e40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
8e50: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
8e60: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
8e70: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
8e80: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
8e90: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
8ea0: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
8eb0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
8ec0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  op..**.** It is 
8ed0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
8ee0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
8ef0: 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63   fail if the sec
8f00: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
8f10: 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20  is NO_LOCK.  If 
8f20: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8f30: 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f  ent is SHARED_LO
8f40: 43 4b 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  CK, this routine
8f50: 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
8f60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 6e   SQLITE_IOERR in
8f70: 73 74 65 61 64 20 6f 66 20 53 51 4c 49 54 45 5f  stead of SQLITE_
8f80: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
8f90: 65 33 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  e3OsUnlock(OsFil
8fa0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
8fb0: 79 70 65 29 7b 0a 20 20 73 74 72 75 63 74 20 6c  ype){.  struct l
8fc0: 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a  ockInfo *pLock;.
8fd0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
8fe0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
8ff0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
9000: 73 65 72 74 28 20 69 64 2d 3e 69 73 4f 70 65 6e  sert( id->isOpen
9010: 20 29 3b 0a 20 20 54 52 41 43 45 37 28 22 55 4e   );.  TRACE7("UN
9020: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
9030: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
9040: 5c 6e 22 2c 20 69 64 2d 3e 68 2c 20 6c 6f 63 6b  \n", id->h, lock
9050: 74 79 70 65 2c 20 69 64 2d 3e 6c 6f 63 6b 74 79  type, id->lockty
9060: 70 65 2c 20 0a 20 20 20 20 20 20 69 64 2d 3e 70  pe, .      id->p
9070: 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  Lock->locktype, 
9080: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2c 20  id->pLock->cnt, 
9090: 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 66 28  getpid());.  if(
90a0: 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49 44 28   CHECK_THREADID(
90b0: 69 64 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  id) ) return SQL
90c0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 61  ITE_MISUSE;..  a
90d0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
90e0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
90f0: 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 74 79    if( id->lockty
9100: 70 65 3c 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe<=locktype ){.
9110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9120: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
9130: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
9140: 29 3b 0a 20 20 70 4c 6f 63 6b 20 3d 20 69 64 2d  );.  pLock = id-
9150: 3e 70 4c 6f 63 6b 3b 0a 20 20 61 73 73 65 72 74  >pLock;.  assert
9160: 28 20 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20  ( pLock->cnt!=0 
9170: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63  );.  if( id->loc
9180: 6b 74 79 70 65 3e 53 48 41 52 45 44 5f 4c 4f 43  ktype>SHARED_LOC
9190: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
91a0: 20 70 4c 6f 63 6b 2d 3e 6c 6f 63 6b 74 79 70 65   pLock->locktype
91b0: 3d 3d 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  ==id->locktype )
91c0: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
91d0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
91e0: 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
91f0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
9200: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
9210: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
9220: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
9230: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
9240: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
9250: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
9260: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e  E;.      if( fcn
9270: 74 6c 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c  tl(id->h, F_SETL
9280: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29 7b 0a  K, &lock)!=0 ){.
9290: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
92a0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
92b0: 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  pen */.        r
92c0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
92d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
92e0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
92f0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
9300: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
9310: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
9320: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
9330: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
9340: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
9350: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
9360: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
9370: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
9380: 20 66 63 6e 74 6c 28 69 64 2d 3e 68 2c 20 46 5f   fcntl(id->h, F_
9390: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 30  SETLK, &lock)==0
93a0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   ){.      pLock-
93b0: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52  >locktype = SHAR
93c0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
93d0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
93e0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 20 20 2f 2a  QLITE_IOERR;  /*
93f0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
9400: 65 72 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  er happen */.   
9410: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63   }.  }.  if( loc
9420: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
9430: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6f 70 65  {.    struct ope
9440: 6e 43 6e 74 20 2a 70 4f 70 65 6e 3b 0a 0a 20 20  nCnt *pOpen;..  
9450: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
9460: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
9470: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
9480: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
9490: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
94a0: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
94b0: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
94c0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
94d0: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
94e0: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
94f0: 2a 2f 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 63 6e  */.    pLock->cn
9500: 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  t--;.    if( pLo
9510: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  ck->cnt==0 ){.  
9520: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
9530: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
9540: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9550: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
9560: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
9570: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
9580: 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74 6c  .      if( fcntl
9590: 28 69 64 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  (id->h, F_SETLK,
95a0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
95b0: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 6c 6f 63        pLock->loc
95c0: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
95d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
95e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
95f0: 45 5f 49 4f 45 52 52 3b 20 20 2f 2a 20 54 68 69  E_IOERR;  /* Thi
9600: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
9610: 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20 20 20 7d  appen */.      }
9620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
9630: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
9640: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
9650: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
9660: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
9670: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
9680: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
9690: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
96a0: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
96b0: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
96c0: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
96d0: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
96e0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
96f0: 20 20 20 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70     pOpen = id->p
9700: 4f 70 65 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d  Open;.    pOpen-
9710: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
9720: 73 65 72 74 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f  sert( pOpen->nLo
9730: 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ck>=0 );.    if(
9740: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30   pOpen->nLock==0
9750: 20 26 26 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64   && pOpen->nPend
9760: 69 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ing>0 ){.      i
9770: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
9780: 69 3d 30 3b 20 69 3c 70 4f 70 65 6e 2d 3e 6e 50  i=0; i<pOpen->nP
9790: 65 6e 64 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  ending; i++){.  
97a0: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 4f 70 65        close(pOpe
97b0: 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 69 5d 29 3b  n->aPending[i]);
97c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
97d0: 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e 2d  qliteFree(pOpen-
97e0: 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20 20  >aPending);.    
97f0: 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e    pOpen->nPendin
9800: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 70  g = 0;.      pOp
9810: 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 20 3d 20 30  en->aPending = 0
9820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
9830: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
9840: 78 28 29 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 74  x();.  id->lockt
9850: 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ype = locktype;.
9860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9870: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
9880: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
9890: 65 33 4f 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65  e3OsClose(OsFile
98a0: 20 2a 69 64 29 7b 0a 20 20 69 66 28 20 21 69 64   *id){.  if( !id
98b0: 2d 3e 69 73 4f 70 65 6e 20 29 20 72 65 74 75 72  ->isOpen ) retur
98c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
98d0: 66 28 20 43 48 45 43 4b 5f 54 48 52 45 41 44 49  f( CHECK_THREADI
98e0: 44 28 69 64 29 20 29 20 72 65 74 75 72 6e 20 53  D(id) ) return S
98f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
9900: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
9910: 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
9920: 69 66 28 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30  if( id->dirfd>=0
9930: 20 29 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72   ) close(id->dir
9940: 66 64 29 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64  fd);.  id->dirfd
9950: 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33   = -1;.  sqlite3
9960: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
9970: 20 20 69 66 28 20 69 64 2d 3e 70 4f 70 65 6e 2d    if( id->pOpen-
9980: 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
9990: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
99a0: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
99b0: 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
99c0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
99d0: 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
99e0: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
99f0: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
9a00: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
9a10: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
9a20: 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
9a30: 6f 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  o pOpen->aPendin
9a40: 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
9a50: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
9a60: 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  sed when.    ** 
9a70: 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
9a80: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
9a90: 0a 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a  .    int *aNew;.
9aa0: 20 20 20 20 73 74 72 75 63 74 20 6f 70 65 6e 43      struct openC
9ab0: 6e 74 20 2a 70 4f 70 65 6e 20 3d 20 69 64 2d 3e  nt *pOpen = id->
9ac0: 70 4f 70 65 6e 3b 0a 20 20 20 20 61 4e 65 77 20  pOpen;.    aNew 
9ad0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
9ae0: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
9af0: 2c 20 28 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  , (pOpen->nPendi
9b00: 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 69 6e 74  ng+1)*sizeof(int
9b10: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ) );.    if( aNe
9b20: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  w==0 ){.      /*
9b30: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   If a malloc fai
9b40: 6c 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68  ls, just leak th
9b50: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9b60: 72 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r */.    }else{.
9b70: 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65        pOpen->aPe
9b80: 6e 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20  nding = aNew;.  
9b90: 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64      pOpen->aPend
9ba0: 69 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64  ing[pOpen->nPend
9bb0: 69 6e 67 5d 20 3d 20 69 64 2d 3e 68 3b 0a 20 20  ing] = id->h;.  
9bc0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
9bd0: 69 6e 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ing++;.    }.  }
9be0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
9bf0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
9c00: 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 73 6f 20 77  nding locks so w
9c10: 65 20 63 61 6e 20 63 6c 6f 73 65 20 74 68 65 20  e can close the 
9c20: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
9c30: 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 69 64   */.    close(id
9c40: 2d 3e 68 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ->h);.  }.  rele
9c50: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e  aseLockInfo(id->
9c60: 70 4c 6f 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73  pLock);.  releas
9c70: 65 4f 70 65 6e 43 6e 74 28 69 64 2d 3e 70 4f 70  eOpenCnt(id->pOp
9c80: 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  en);.  sqlite3Os
9c90: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
9ca0: 69 64 2d 3e 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  id->isOpen = 0;.
9cb0: 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
9cc0: 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 68    %-3d\n", id->h
9cd0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
9ce0: 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (-1);.  return S
9cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9d00: 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
9d10: 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
9d20: 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
9d30: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
9d40: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75  ter.** to the fu
9d50: 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72  ll pathname stor
9d60: 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61  ed in space obta
9d70: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
9d80: 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65  Malloc()..** The
9d90: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
9da0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
9db0: 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69   for freeing thi
9dc0: 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a  s space once it.
9dd0: 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
9de0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  needed..*/.char 
9df0: 2a 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61  *sqlite3OsFullPa
9e00: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
9e10: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20  r *zRelative){. 
9e20: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30   char *zFull = 0
9e30: 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  ;.  if( zRelativ
9e40: 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  e[0]=='/' ){.   
9e50: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
9e60: 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74  g(&zFull, zRelat
9e70: 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ive, (char*)0);.
9e80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
9e90: 72 20 2a 7a 42 75 66 20 3d 20 73 71 6c 69 74 65  r *zBuf = sqlite
9ea0: 4d 61 6c 6c 6f 63 28 35 30 30 30 29 3b 0a 20 20  Malloc(5000);.  
9eb0: 20 20 69 66 28 20 7a 42 75 66 3d 3d 30 20 29 7b    if( zBuf==0 ){
9ec0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
9ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
9ee0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  0] = 0;.    sqli
9ef0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 46  te3SetString(&zF
9f00: 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66  ull, getcwd(zBuf
9f10: 2c 20 35 30 30 30 29 2c 20 22 2f 22 2c 20 7a 52  , 5000), "/", zR
9f20: 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20  elative,.       
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
9f40: 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
9f50: 74 65 46 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  teFree(zBuf);.  
9f60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  }.  return zFull
9f70: 3b 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.}...#endif /* 
9f80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
9f90: 49 4f 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  IO */./*********
9fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9fe0: 2a 2a 0a 2a 2a 20 45 76 65 72 79 74 68 69 6e 67  **.** Everything
9ff0: 20 61 62 6f 76 65 20 64 65 61 6c 73 20 77 69 74   above deals wit
a000: 68 20 66 69 6c 65 20 49 2f 4f 2e 20 20 45 76 65  h file I/O.  Eve
a010: 72 79 74 68 69 6e 67 20 74 68 61 74 20 66 6f 6c  rything that fol
a020: 6c 6f 77 73 20 64 65 61 6c 73 0a 2a 2a 20 77 69  lows deals.** wi
a030: 74 68 20 6f 74 68 65 72 20 6d 69 73 63 65 6c 6c  th other miscell
a040: 61 6e 6f 75 73 20 61 73 70 65 63 74 73 20 6f 66  anous aspects of
a050: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
a060: 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 0a  ystem interface.
a070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
a0c0: 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d  /*.** Get inform
a0d0: 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68  ation to seed th
a0e0: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
a0f0: 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20  generator.  The 
a100: 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74  seed.** is writt
a110: 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  en into the buff
a120: 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54  er zBuf[256].  T
a130: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a140: 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70  ion must.** supp
a150: 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c  ly a sufficientl
a160: 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a  y large buffer..
a170: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
a180: 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20  RandomSeed(char 
a190: 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65 20  *zBuf){.  /* We 
a1a0: 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
a1b0: 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
a1c0: 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
a1d0: 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
a1e0: 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
a1f0: 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
a200: 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
a210: 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
a220: 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
a230: 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
a240: 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
a250: 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
a260: 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
a270: 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
a280: 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
a290: 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
a2a0: 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
a2b0: 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
a2c0: 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
a2d0: 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
a2e0: 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
a2f0: 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
a300: 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
a310: 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
a320: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
a330: 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
a340: 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
a350: 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
a360: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
a370: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
a380: 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
a390: 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
a3a0: 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
a3b0: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
a3c0: 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
a3d0: 62 65 72 20 73 65 71 75 65 6e 63 65 2e 2a 20 54  ber sequence.* T
a3e0: 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
a3f0: 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
a400: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
a410: 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36 29  et(zBuf, 0, 256)
a420: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
a430: 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a  QLITE_TEST).  {.
a440: 20 20 20 20 69 6e 74 20 70 69 64 2c 20 66 64 3b      int pid, fd;
a450: 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 22  .    fd = open("
a460: 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
a470: 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 69 66  _RDONLY);.    if
a480: 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
a490: 74 69 6d 65 28 28 74 69 6d 65 5f 74 2a 29 7a 42  time((time_t*)zB
a4a0: 75 66 29 3b 0a 20 20 20 20 20 20 70 69 64 20 3d  uf);.      pid =
a4b0: 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20 20   getpid();.     
a4c0: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69   memcpy(&zBuf[si
a4d0: 7a 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26  zeof(time_t)], &
a4e0: 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
a4f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a500: 20 20 20 20 72 65 61 64 28 66 64 2c 20 7a 42 75      read(fd, zBu
a510: 66 2c 20 32 35 36 29 3b 0a 20 20 20 20 20 20 63  f, 256);.      c
a520: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
a530: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
a540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a550: 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
a560: 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
a570: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
a580: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
a590: 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
a5a0: 65 33 4f 73 53 6c 65 65 70 28 69 6e 74 20 6d 73  e3OsSleep(int ms
a5b0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
a5c0: 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
a5d0: 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
a5e0: 65 65 70 28 6d 73 2a 31 30 30 30 29 3b 0a 20 20  eep(ms*1000);.  
a5f0: 72 65 74 75 72 6e 20 6d 73 3b 0a 23 65 6c 73 65  return ms;.#else
a600: 0a 20 20 73 6c 65 65 70 28 28 6d 73 2b 39 39 39  .  sleep((ms+999
a610: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
a620: 6e 20 31 30 30 30 2a 28 28 6d 73 2b 39 39 39 29  n 1000*((ms+999)
a630: 2f 31 30 30 30 29 3b 0a 23 65 6e 64 69 66 0a 7d  /1000);.#endif.}
a640: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76  ../*.** Static v
a650: 61 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f  ariables used fo
a660: 72 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f  r thread synchro
a670: 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  nization.*/.stat
a680: 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d  ic int inMutex =
a690: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
a6a0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 73  E_UNIX_THREADS.s
a6b0: 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75  tatic pthread_mu
a6c0: 74 65 78 5f 74 20 6d 75 74 65 78 20 3d 20 50 54  tex_t mutex = PT
a6d0: 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54  HREAD_MUTEX_INIT
a6e0: 49 41 4c 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a  IALIZER;.#endif.
a6f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a700: 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f 75  wing pair of rou
a710: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20 6d  tine implement m
a720: 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20  utual exclusion 
a730: 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72  for.** multi-thr
a740: 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e  eaded processes.
a750: 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20    Only a single 
a760: 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65  thread is allowe
a770: 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64  d to.** executed
a780: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73 75   code that is su
a790: 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65  rrounded by Ente
a7a0: 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61  rMutex() and Lea
a7b0: 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a  veMutex()..**.**
a7c0: 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c   SQLite uses onl
a7d0: 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78  y a single Mutex
a7e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20  .  There is not 
a7f0: 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a  much critical.**
a800: 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c   code and what l
a810: 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20 65  ittle there is e
a820: 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20  xecutes quickly 
a830: 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63  and without bloc
a840: 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  king..*/.void sq
a850: 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
a860: 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  x(){.#ifdef SQLI
a870: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
a880: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
a890: 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b 0a 23 65  lock(&mutex);.#e
a8a0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21  ndif.  assert( !
a8b0: 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d  inMutex );.  inM
a8c0: 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64  utex = 1;.}.void
a8d0: 20 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d   sqlite3OsLeaveM
a8e0: 75 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74  utex(){.  assert
a8f0: 28 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69  ( inMutex );.  i
a900: 6e 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64  nMutex = 0;.#ifd
a910: 65 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  ef SQLITE_UNIX_T
a920: 48 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64  HREADS.  pthread
a930: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d  _mutex_unlock(&m
a940: 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  utex);.#endif.}.
a950: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a960: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
a970: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
a980: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
a990: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
a9a0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
a9b0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
a9c0: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
a9d0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
a9e0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
a9f0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
aa00: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
aa10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
aa20: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
aa30: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
aa40: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
aa50: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
aa60: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
aa70: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
aa80: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
aa90: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
aaa0: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
aab0: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
aac0: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
aad0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
aae0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
aaf0: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64  3OsCurrentTime(d
ab00: 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 23  ouble *prNow){.#
ab10: 69 66 64 65 66 20 4e 4f 5f 47 45 54 54 4f 44 0a  ifdef NO_GETTOD.
ab20: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
ab30: 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
ab40: 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
ab50: 34 34 30 35 38 37 2e 35 3b 0a 23 65 6c 73 65 0a  440587.5;.#else.
ab60: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
ab70: 20 73 4e 6f 77 3b 0a 20 20 73 74 72 75 63 74 20   sNow;.  struct 
ab80: 74 69 6d 65 7a 6f 6e 65 20 73 54 7a 3b 20 20 2f  timezone sTz;  /
ab90: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
aba0: 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e  gettimeofday(&sN
abb0: 6f 77 2c 20 26 73 54 7a 29 3b 0a 20 20 2a 70 72  ow, &sTz);.  *pr
abc0: 4e 6f 77 20 3d 20 32 34 34 30 35 38 37 2e 35 20  Now = 2440587.5 
abd0: 2b 20 73 4e 6f 77 2e 74 76 5f 73 65 63 2f 38 36  + sNow.tv_sec/86
abe0: 34 30 30 2e 30 20 2b 20 73 4e 6f 77 2e 74 76 5f  400.0 + sNow.tv_
abf0: 75 73 65 63 2f 38 36 34 30 30 30 30 30 30 30 30  usec/86400000000
ac00: 2e 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .0;.#endif.#ifde
ac10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
ac20: 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
ac30: 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
ac40: 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 33  *prNow = sqlite3
ac50: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36  _current_time/86
ac60: 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e  400.0 + 2440587.
ac70: 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  5;.  }.#endif.  
ac80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 65 6e  return 0;.}..#en
ac90: 64 69 66 20 2f 2a 20 4f 53 5f 55 4e 49 58 20 2a  dif /* OS_UNIX *
aca0: 2f 0a                                            /.