/ Hex Artifact Content
Login

Artifact 385e85a38dd0f2d7c9d0ca9336b891a92765765aaa769d577673cac7ffe96fd7:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 31 32 2d 30 33  /*.** 2011-12-03
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 57 69 6e 33 32 2d 73 70 65 63  **.** Win32-spec
0180: 69 66 69 63 20 72 75 6e 2d 74 69 6d 65 20 65 6e  ific run-time en
0190: 76 69 72 6f 6e 6d 65 6e 74 20 69 6d 70 6c 65 6d  vironment implem
01a0: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 4c 53 4d  entation for LSM
01b0: 2e 0a 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 57 49  ..*/..#ifdef _WI
01c0: 4e 33 32 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61  N32..#include <a
01d0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
01e0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 23 69  e <string.h>..#i
01f0: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0200: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  >.#include <stda
0210: 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rg.h>.#include <
0220: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  stdio.h>.#includ
0230: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69 6e  e <ctype.h>..#in
0240: 63 6c 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68  clude "windows.h
0250: 22 0a 0a 23 69 6e 63 6c 75 64 65 20 22 6c 73 6d  "..#include "lsm
0260: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6e  Int.h"../*.** An
0270: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 61 6e   open file is an
0280: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0290: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63   following objec
02a0: 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
02b0: 75 63 74 20 57 69 6e 33 32 46 69 6c 65 20 57 69  uct Win32File Wi
02c0: 6e 33 32 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  n32File;.struct 
02d0: 57 69 6e 33 32 46 69 6c 65 20 7b 0a 20 20 6c 73  Win32File {.  ls
02e0: 6d 5f 65 6e 76 20 2a 70 45 6e 76 3b 20 20 20 20  m_env *pEnv;    
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0300: 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 65 6e   The run-time en
0310: 76 69 72 6f 6e 6d 65 6e 74 20 2a 2f 0a 20 20 63  vironment */.  c
0320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0340: 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 66  * Full path to f
0350: 69 6c 65 20 2a 2f 0a 0a 20 20 48 41 4e 44 4c 45  ile */..  HANDLE
0360: 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
0370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0380: 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  n file handle */
0390: 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 6d 46 69  .  HANDLE hShmFi
03a0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
03b0: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
03c0: 65 20 66 6f 72 20 2a 2d 73 68 6d 20 66 69 6c 65  e for *-shm file
03d0: 20 2a 2f 0a 0a 20 20 48 41 4e 44 4c 45 20 68 4d   */..  HANDLE hM
03e0: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
03f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
0400: 61 6e 64 6c 65 20 66 6f 72 20 6d 61 70 70 69 6e  andle for mappin
0410: 67 20 2a 2f 0a 20 20 4c 50 56 4f 49 44 20 70 4d  g */.  LPVOID pM
0420: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
0430: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
0440: 72 20 74 6f 20 6d 61 70 70 69 6e 67 20 6f 66 20  r to mapping of 
0450: 66 69 6c 65 20 66 64 20 2a 2f 0a 20 20 73 69 7a  file fd */.  siz
0460: 65 5f 74 20 6e 4d 61 70 3b 20 20 20 20 20 20 20  e_t nMap;       
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0480: 53 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20  Size of mapping 
0490: 61 74 20 70 4d 61 70 20 69 6e 20 62 79 74 65 73  at pMap in bytes
04a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 3b 20   */.  int nShm; 
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
04d0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 68  of entries in ah
04e0: 53 68 6d 5b 5d 2f 61 70 53 68 6d 5b 5d 20 2a 2f  Shm[]/apShm[] */
04f0: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 61 68 53 68  .  LPHANDLE ahSh
0500: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0510: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 68     /* Array of h
0520: 61 6e 64 6c 65 73 20 66 6f 72 20 73 68 61 72 65  andles for share
0530: 64 20 6d 61 70 70 69 6e 67 73 20 2a 2f 0a 20 20  d mappings */.  
0540: 4c 50 56 4f 49 44 20 2a 61 70 53 68 6d 3b 20 20  LPVOID *apShm;  
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0560: 2f 2a 20 41 72 72 61 79 20 6f 66 20 33 32 4b 20  /* Array of 32K 
0570: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65  shared memory se
0580: 67 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a 0a 73 74  gments */.};..st
0590: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 33 32  atic char *win32
05a0: 53 68 6d 46 69 6c 65 28 57 69 6e 33 32 46 69 6c  ShmFile(Win32Fil
05b0: 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  e *p){.  char *z
05c0: 53 68 6d 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  Shm;.  int nName
05d0: 20 3d 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4e 61   = strlen(p->zNa
05e0: 6d 65 29 3b 0a 20 20 7a 53 68 6d 20 3d 20 28 63  me);.  zShm = (c
05f0: 68 61 72 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  har *)lsmMallocZ
0600: 65 72 6f 28 70 2d 3e 70 45 6e 76 2c 20 6e 4e 61  ero(p->pEnv, nNa
0610: 6d 65 2b 34 2b 31 29 3b 0a 20 20 69 66 28 20 7a  me+4+1);.  if( z
0620: 53 68 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  Shm ){.    memcp
0630: 79 28 7a 53 68 6d 2c 20 70 2d 3e 7a 4e 61 6d 65  y(zShm, p->zName
0640: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  , nName);.    me
0650: 6d 63 70 79 28 26 7a 53 68 6d 5b 6e 4e 61 6d 65  mcpy(&zShm[nName
0660: 5d 2c 20 22 2d 73 68 6d 22 2c 20 35 29 3b 0a 20  ], "-shm", 5);. 
0670: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 53 68 6d   }.  return zShm
0680: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
0690: 77 69 6e 33 32 53 6c 65 65 70 28 69 6e 74 20 75  win32Sleep(int u
06a0: 73 29 7b 0a 20 20 53 6c 65 65 70 28 28 75 73 20  s){.  Sleep((us 
06b0: 2b 20 39 39 39 29 20 2f 20 31 30 30 30 29 3b 0a  + 999) / 1000);.
06c0: 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b    return LSM_OK;
06d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
06e0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
06f0: 61 74 20 61 6e 20 49 2f 4f 20 6f 70 65 72 61 74  at an I/O operat
0700: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 65 74 72  ion will be retr
0710: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 0a  ied following a.
0720: 2a 2a 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72  ** locking error
0730: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
0740: 65 64 20 62 79 20 61 6e 74 69 76 69 72 75 73 20  ed by antivirus 
0750: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
0760: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 64  the initial.** d
0770: 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  elay before the 
0780: 66 69 72 73 74 20 72 65 74 72 79 2e 20 20 54 68  first retry.  Th
0790: 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65  e delay increase
07a0: 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20  s linearly with 
07b0: 65 61 63 68 0a 2a 2a 20 72 65 74 72 79 2e 0a 2a  each.** retry..*
07c0: 2f 0a 23 69 66 6e 64 65 66 20 4c 53 4d 5f 57 49  /.#ifndef LSM_WI
07d0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a  N32_IOERR_RETRY.
07e0: 23 20 64 65 66 69 6e 65 20 4c 53 4d 5f 57 49 4e  # define LSM_WIN
07f0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
0800: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
0810: 20 4c 53 4d 5f 57 49 4e 33 32 5f 49 4f 45 52 52   LSM_WIN32_IOERR
0820: 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64  _RETRY_DELAY.# d
0830: 65 66 69 6e 65 20 4c 53 4d 5f 57 49 4e 33 32 5f  efine LSM_WIN32_
0840: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
0850: 59 20 32 35 30 30 30 0a 23 65 6e 64 69 66 0a 73  Y 25000.#endif.s
0860: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
0870: 6f 65 72 72 52 65 74 72 79 20 3d 20 4c 53 4d 5f  oerrRetry = LSM_
0880: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
0890: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
08a0: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
08b0: 61 79 20 3d 20 4c 53 4d 5f 57 49 4e 33 32 5f 49  ay = LSM_WIN32_I
08c0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
08d0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69  ;../*.** The "wi
08e0: 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74 72 79  n32IoerrCanRetry
08f0: 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  1" macro is used
0900: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
0910: 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a   a particular.**
0920: 20 49 2f 4f 20 65 72 72 6f 72 20 63 6f 64 65 20   I/O error code 
0930: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65 74  obtained via Get
0940: 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20 65  LastError() is e
0950: 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65  ligible to be re
0960: 74 72 69 65 64 2e 0a 2a 2a 20 49 74 20 6d 75 73  tried..** It mus
0970: 74 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72  t accept the err
0980: 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73  or code DWORD as
0990: 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65   its only argume
09a0: 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  nt and should.**
09b0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
09c0: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
09d0: 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20  de is transient 
09e0: 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68  in nature and th
09f0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 72  e.** operation r
0a00: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67  esponsible for g
0a10: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72  enerating the or
0a20: 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67  iginal error mig
0a30: 68 74 20 73 75 63 63 65 65 64 0a 2a 2a 20 75 70  ht succeed.** up
0a40: 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69 65 64  on being retried
0a50: 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .  The argument 
0a60: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68  to this macro sh
0a70: 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62  ould be a variab
0a80: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  le..**.** Additi
0a90: 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20  onally, a macro 
0aa0: 6e 61 6d 65 64 20 22 77 69 6e 33 32 49 6f 65 72  named "win32Ioer
0ab0: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
0ac0: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 0a  be defined.  If.
0ad0: 2a 2a 20 69 74 20 69 73 20 64 65 66 69 6e 65 64  ** it is defined
0ae0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
0af0: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
0b00: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 22 77   the macro.** "w
0b10: 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74 72  in32IoerrCanRetr
0b20: 79 31 22 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  y1" returns zero
0b30: 2e 20 20 54 68 65 20 22 77 69 6e 33 32 49 6f 65  .  The "win32Ioe
0b40: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63  rrCanRetry2" mac
0b50: 72 6f 0a 2a 2a 20 69 73 20 63 6f 6d 70 6c 65 74  ro.** is complet
0b60: 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64  ely optional and
0b70: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0b80: 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e  include addition
0b90: 61 6c 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  al error.** code
0ba0: 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61  s in the set tha
0bb0: 74 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  t should result 
0bc0: 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49  in the failing I
0bd0: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69  /O operation bei
0be0: 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 20 62 79  ng.** retried by
0bf0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66   the caller.  If
0c00: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77   defined, the "w
0c10: 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74 72  in32IoerrCanRetr
0c20: 79 32 22 20 6d 61 63 72 6f 0a 2a 2a 20 6d 75 73  y2" macro.** mus
0c30: 74 20 65 78 68 69 62 69 74 20 65 78 74 65 72 6e  t exhibit extern
0c40: 61 6c 20 73 65 6d 61 6e 74 69 63 73 20 69 64 65  al semantics ide
0c50: 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20  ntical to those 
0c60: 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32  of the.** "win32
0c70: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
0c80: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64  macro..*/.#if !d
0c90: 65 66 69 6e 65 64 28 77 69 6e 33 32 49 6f 65 72  efined(win32Ioer
0ca0: 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66  rCanRetry1).#def
0cb0: 69 6e 65 20 77 69 6e 33 32 49 6f 65 72 72 43 61  ine win32IoerrCa
0cc0: 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61 29  nRetry1(a) (((a)
0cd0: 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  ==ERROR_ACCESS_D
0ce0: 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c  ENIED)        ||
0cf0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
0d20: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
0d30: 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20  )    || \.      
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
0d60: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
0d70: 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c  TION)       || \
0d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56   ((a)==ERROR_DEV
0db0: 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20 20  _NOT_EXIST)     
0dc0: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
0df0: 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45  ROR_NETNAME_DELE
0e00: 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20  TED)      || \. 
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0e30: 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54  (a)==ERROR_SEM_T
0e40: 49 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20 20  IMEOUT)         
0e50: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
0e80: 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43  R_NETWORK_UNREAC
0e90: 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a  HABLE)).#endif..
0ea0: 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  /*.** If an I/O 
0eb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e  error occurs, in
0ec0: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
0ed0: 65 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  e to see if it s
0ee0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 72 65 74 72  hould be.** retr
0ef0: 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ied.  Return TRU
0f00: 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74  E to retry.  Ret
0f10: 75 72 6e 20 46 41 4c 53 45 20 74 6f 20 67 69 76  urn FALSE to giv
0f20: 65 20 75 70 20 77 69 74 68 20 61 6e 0a 2a 2a 20  e up with an.** 
0f30: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
0f40: 20 69 6e 74 20 77 69 6e 33 32 52 65 74 72 79 49   int win32RetryI
0f50: 6f 65 72 72 28 0a 20 20 6c 73 6d 5f 65 6e 76 20  oerr(.  lsm_env 
0f60: 2a 70 45 6e 76 2c 0a 20 20 69 6e 74 20 2a 70 6e  *pEnv,.  int *pn
0f70: 52 65 74 72 79 0a 29 7b 0a 20 20 44 57 4f 52 44  Retry.){.  DWORD
0f80: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
0f90: 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33  ( *pnRetry>=win3
0fa0: 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20  2IoerrRetry ){. 
0fb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0fc0: 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  .  lastErrno = G
0fd0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
0fe0: 20 69 66 28 20 77 69 6e 33 32 49 6f 65 72 72 43   if( win32IoerrC
0ff0: 61 6e 52 65 74 72 79 31 28 6c 61 73 74 45 72 72  anRetry1(lastErr
1000: 6e 6f 29 20 29 7b 0a 20 20 20 20 77 69 6e 33 32  no) ){.    win32
1010: 53 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  Sleep(win32Ioerr
1020: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
1030: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
1040: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
1050: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20  turn 1;.  }.#if 
1060: 64 65 66 69 6e 65 64 28 77 69 6e 33 32 49 6f 65  defined(win32Ioe
1070: 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65  rrCanRetry2).  e
1080: 6c 73 65 20 69 66 28 20 77 69 6e 33 32 49 6f 65  lse if( win32Ioe
1090: 72 72 43 61 6e 52 65 74 72 79 32 28 6c 61 73 74  rrCanRetry2(last
10a0: 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 77 69  Errno) ){.    wi
10b0: 6e 33 32 53 6c 65 65 70 28 77 69 6e 33 32 49 6f  n32Sleep(win32Io
10c0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
10d0: 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
10e0: 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
10f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
1100: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
1110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1120: 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  rt a UTF-8 strin
1130: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
1140: 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  nicode..**.** Sp
1150: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1160: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
1170: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
1180: 20 6c 73 6d 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f   lsmMalloc()..*/
1190: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77  .static LPWSTR w
11a0: 69 6e 33 32 55 74 66 38 54 6f 55 6e 69 63 6f 64  in32Utf8ToUnicod
11b0: 65 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c  e(lsm_env *pEnv,
11c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
11d0: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  xt){.  int nChar
11e0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
11f0: 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  Text;..  nChar =
1200: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
1210: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
1220: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c   zText, -1, NULL
1230: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  , 0);.  if( nCha
1240: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  r==0 ){.    retu
1250: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64  rn 0;.  }.  zWid
1260: 65 54 65 78 74 20 3d 20 6c 73 6d 4d 61 6c 6c 6f  eText = lsmMallo
1270: 63 5a 65 72 6f 28 70 45 6e 76 2c 20 6e 43 68 61  cZero(pEnv, nCha
1280: 72 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52  r * sizeof(WCHAR
1290: 29 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 54  ));.  if( zWideT
12a0: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
12b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
12c0: 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  har = MultiByteT
12d0: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
12e0: 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  8, 0, zText, -1,
12f0: 20 7a 57 69 64 65 54 65 78 74 2c 20 6e 43 68 61   zWideText, nCha
1300: 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  r);.  if( nChar=
1310: 3d 30 20 29 7b 0a 20 20 20 20 6c 73 6d 46 72 65  =0 ){.    lsmFre
1320: 65 28 70 45 6e 76 2c 20 7a 57 69 64 65 54 65 78  e(pEnv, zWideTex
1330: 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54 65 78  t);.    zWideTex
1340: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1350: 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a 7d  urn zWideText;.}
1360: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1370: 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  a Microsoft Unic
1380: 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ode string to UT
1390: 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  F-8..**.** Space
13a0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
13b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
13c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6c 73  obtained from ls
13d0: 6d 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  mMalloc()..*/.st
13e0: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 33 32  atic char *win32
13f0: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 6c 73  UnicodeToUtf8(ls
1400: 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 4c 50 43  m_env *pEnv, LPC
1410: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b  WSTR zWideText){
1420: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
1430: 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 0a 20 20  char *zText;..  
1440: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
1450: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
1460: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
1470: 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  t, -1, 0, 0, 0, 
1480: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
1490: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
14a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78  rn 0;.  }.  zTex
14b0: 74 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  t = lsmMallocZer
14c0: 6f 28 70 45 6e 76 2c 20 6e 42 79 74 65 29 3b 0a  o(pEnv, nByte);.
14d0: 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
14e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
14f0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 57 69    }.  nByte = Wi
1500: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
1510: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
1520: 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65  ideText, -1, zTe
1530: 78 74 2c 20 6e 42 79 74 65 2c 20 30 2c 20 30 29  xt, nByte, 0, 0)
1540: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
1550: 20 30 20 29 7b 0a 20 20 20 20 6c 73 6d 46 72 65   0 ){.    lsmFre
1560: 65 28 70 45 6e 76 2c 20 7a 54 65 78 74 29 3b 0a  e(pEnv, zText);.
1570: 20 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20      zText = 0;. 
1580: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78   }.  return zTex
1590: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
15a0: 65 64 28 77 69 6e 33 32 49 73 4e 6f 74 46 6f 75  ed(win32IsNotFou
15b0: 6e 64 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 33  nd).#define win3
15c0: 32 49 73 4e 6f 74 46 6f 75 6e 64 28 61 29 20 28  2IsNotFound(a) (
15d0: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  ((a)==ERROR_FILE
15e0: 5f 4e 4f 54 5f 46 4f 55 4e 44 29 20 20 7c 7c 20  _NOT_FOUND)  || 
15f0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
1610: 61 29 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  a)==ERROR_PATH_N
1620: 4f 54 5f 46 4f 55 4e 44 29 29 0a 23 65 6e 64 69  OT_FOUND)).#endi
1630: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  f..static int wi
1640: 6e 33 32 4f 70 65 6e 28 0a 20 20 6c 73 6d 5f 65  n32Open(.  lsm_e
1650: 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 63 6f 6e 73  nv *pEnv,.  cons
1660: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 0a 20  t char *zFile,. 
1670: 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 4c 50   int flags,.  LP
1680: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 0a 29 7b  HANDLE phFile.){
1690: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4c 50 57  .  int rc;.  LPW
16a0: 53 54 52 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  STR zConverted;.
16b0: 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
16c0: 77 69 6e 33 32 55 74 66 38 54 6f 55 6e 69 63 6f  win32Utf8ToUnico
16d0: 64 65 28 70 45 6e 76 2c 20 7a 46 69 6c 65 29 3b  de(pEnv, zFile);
16e0: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
16f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  d==0 ){.    rc =
1700: 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b   LSM_NOMEM_BKPT;
1710: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1720: 74 20 62 52 65 61 64 6f 6e 6c 79 20 3d 20 28 66  t bReadonly = (f
1730: 6c 61 67 73 20 26 20 4c 53 4d 5f 4f 50 45 4e 5f  lags & LSM_OPEN_
1740: 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 44  READONLY);.    D
1750: 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
1760: 63 65 73 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  cess;.    DWORD 
1770: 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
1780: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
1790: 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
17a0: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 43 72  ;.    DWORD dwCr
17b0: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
17c0: 6e 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  n;.    DWORD dwF
17d0: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
17e0: 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
17f0: 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 48  TE_NORMAL;.    H
1800: 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 20 20 20  ANDLE hFile;.   
1810: 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
1820: 0a 20 20 20 20 69 66 28 20 62 52 65 61 64 6f 6e  .    if( bReadon
1830: 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 77 44 65  ly ){.      dwDe
1840: 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
1850: 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 20 20  NERIC_READ;.    
1860: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1870: 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
1880: 58 49 53 54 49 4e 47 3b 0a 20 20 20 20 7d 65 6c  XISTING;.    }el
1890: 73 65 7b 0a 20 20 20 20 20 20 64 77 44 65 73 69  se{.      dwDesi
18a0: 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
18b0: 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
18c0: 49 43 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  IC_WRITE;.      
18d0: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
18e0: 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
18f0: 41 59 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  AYS;.    }.    w
1900: 68 69 6c 65 28 20 28 68 46 69 6c 65 20 3d 20 43  hile( (hFile = C
1910: 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57  reateFileW((LPCW
1920: 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
1960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
1990: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
19c0: 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
19f0: 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
1a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
1a30: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
1a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 77 69 6e 33 32 52 65 74 72 79 49 6f 65 72 72   win32RetryIoerr
1a70: 28 70 45 6e 76 2c 20 26 6e 52 65 74 72 79 29 20  (pEnv, &nRetry) 
1a80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70  ){.      /* Noop
1a90: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6c 73   */.    }.    ls
1aa0: 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a 43 6f 6e  mFree(pEnv, zCon
1ab0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28  verted);.    if(
1ac0: 20 68 46 69 6c 65 21 3d 49 4e 56 41 4c 49 44 5f   hFile!=INVALID_
1ad0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1ae0: 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20        *phFile = 
1af0: 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 72 63 20  hFile;.      rc 
1b00: 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20 20 7d 65  = LSM_OK;.    }e
1b10: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 77  lse{.      if( w
1b20: 69 6e 33 32 49 73 4e 6f 74 46 6f 75 6e 64 28 47  in32IsNotFound(G
1b30: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 29  etLastError()) )
1b40: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  {.        rc = l
1b50: 73 6d 45 72 72 6f 72 42 6b 70 74 28 4c 53 4d 5f  smErrorBkpt(LSM_
1b60: 49 4f 45 52 52 5f 4e 4f 45 4e 54 29 3b 0a 20 20  IOERR_NOENT);.  
1b70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b80: 20 20 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52     rc = LSM_IOER
1b90: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  R_BKPT;.      }.
1ba0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
1bc0: 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4f   int lsmWin32OsO
1bd0: 70 65 6e 28 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a  pen(.  lsm_env *
1be0: 70 45 6e 76 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pEnv,.  const ch
1bf0: 61 72 20 2a 7a 46 69 6c 65 2c 0a 20 20 69 6e 74  ar *zFile,.  int
1c00: 20 66 6c 61 67 73 2c 0a 20 20 6c 73 6d 5f 66 69   flags,.  lsm_fi
1c10: 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b 0a 20  le **ppFile.){. 
1c20: 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
1c30: 3b 0a 20 20 57 69 6e 33 32 46 69 6c 65 20 2a 70  ;.  Win32File *p
1c40: 57 69 6e 33 32 46 69 6c 65 3b 0a 0a 20 20 70 57  Win32File;..  pW
1c50: 69 6e 33 32 46 69 6c 65 20 3d 20 6c 73 6d 4d 61  in32File = lsmMa
1c60: 6c 6c 6f 63 5a 65 72 6f 28 70 45 6e 76 2c 20 73  llocZero(pEnv, s
1c70: 69 7a 65 6f 66 28 57 69 6e 33 32 46 69 6c 65 29  izeof(Win32File)
1c80: 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 33 32 46  );.  if( pWin32F
1c90: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ile==0 ){.    rc
1ca0: 20 3d 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50   = LSM_NOMEM_BKP
1cb0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
1cc0: 48 41 4e 44 4c 45 20 68 46 69 6c 65 3b 0a 0a 20  HANDLE hFile;.. 
1cd0: 20 20 20 72 63 20 3d 20 77 69 6e 33 32 4f 70 65     rc = win32Ope
1ce0: 6e 28 70 45 6e 76 2c 20 7a 46 69 6c 65 2c 20 66  n(pEnv, zFile, f
1cf0: 6c 61 67 73 2c 20 26 68 46 69 6c 65 29 3b 0a 20  lags, &hFile);. 
1d00: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1d10: 4b 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 33  K ){.      pWin3
1d20: 32 46 69 6c 65 2d 3e 70 45 6e 76 20 3d 20 70 45  2File->pEnv = pE
1d30: 6e 76 3b 0a 20 20 20 20 20 20 70 57 69 6e 33 32  nv;.      pWin32
1d40: 46 69 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 46  File->zName = zF
1d50: 69 6c 65 3b 0a 20 20 20 20 20 20 70 57 69 6e 33  ile;.      pWin3
1d60: 32 46 69 6c 65 2d 3e 68 46 69 6c 65 20 3d 20 68  2File->hFile = h
1d70: 46 69 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  File;.    }else{
1d80: 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70  .      lsmFree(p
1d90: 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 29  Env, pWin32File)
1da0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 33 32 46 69  ;.      pWin32Fi
1db0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  le = 0;.    }.  
1dc0: 7d 0a 20 20 2a 70 70 46 69 6c 65 20 3d 20 28 6c  }.  *ppFile = (l
1dd0: 73 6d 5f 66 69 6c 65 20 2a 29 70 57 69 6e 33 32  sm_file *)pWin32
1de0: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
1df0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
1e00: 20 6c 73 6d 57 69 6e 33 32 4f 73 57 72 69 74 65   lsmWin32OsWrite
1e10: 28 0a 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46  (.  lsm_file *pF
1e20: 69 6c 65 2c 20 2f 2a 20 46 69 6c 65 20 74 6f 20  ile, /* File to 
1e30: 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 6c 73  write to */.  ls
1e40: 6d 5f 69 36 34 20 69 4f 66 66 2c 20 20 20 20 2f  m_i64 iOff,    /
1e50: 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
1e60: 65 20 74 6f 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  e to */.  void *
1e70: 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 57 72  pData,     /* Wr
1e80: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ite data from th
1e90: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
1ea0: 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20 20 20  nt nData        
1eb0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
1ec0: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 29 7b 0a   to write */.){.
1ed0: 20 20 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69    Win32File *pWi
1ee0: 6e 33 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32  n32File = (Win32
1ef0: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
1f00: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
1f10: 61 70 70 65 64 3b 20 20 2f 2a 20 54 68 65 20 6f  apped;  /* The o
1f20: 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
1f30: 69 6c 65 2e 20 2a 2f 0a 20 20 75 38 20 2a 61 52  ile. */.  u8 *aR
1f40: 65 6d 20 3d 20 28 75 38 20 2a 29 70 44 61 74 61  em = (u8 *)pData
1f50: 3b 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f  ; /* Data yet to
1f60: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
1f70: 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 44 61 74   int nRem = nDat
1f80: 61 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  a;       /* Numb
1f90: 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20  er of bytes yet 
1fa0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
1fb0: 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
1fc0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
1fd0: 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
1fe0: 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65  /..  memset(&ove
1ff0: 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65  rlapped, 0, size
2000: 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
2010: 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
2020: 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  fset = (LONG)(iO
2030: 66 66 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ff & 0xffffffff)
2040: 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
2050: 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
2060: 47 29 28 28 69 4f 66 66 3e 3e 33 32 29 20 26 20  G)((iOff>>32) & 
2070: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77  0x7fffffff);.  w
2080: 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
2090: 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
20a0: 20 3d 20 30 3b 20 2f 2a 20 42 79 74 65 73 20 77   = 0; /* Bytes w
20b0: 72 69 74 74 65 6e 20 75 73 69 6e 67 20 57 72 69  ritten using Wri
20c0: 74 65 46 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66  teFile */.    if
20d0: 28 20 21 57 72 69 74 65 46 69 6c 65 28 70 57 69  ( !WriteFile(pWi
20e0: 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 2c 20  n32File->hFile, 
20f0: 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
2100: 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ite, &overlapped
2110: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  ) ){.      if( w
2120: 69 6e 33 32 52 65 74 72 79 49 6f 65 72 72 28 70  in32RetryIoerr(p
2130: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
2140: 20 26 6e 52 65 74 72 79 29 20 29 20 63 6f 6e 74   &nRetry) ) cont
2150: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
2160: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  k;.    }.    ass
2170: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c  ert( nWrite==0 |
2180: 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44  | nWrite<=(DWORD
2190: 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 69 66 28  )nRem );.    if(
21a0: 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
21b0: 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
21c0: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
21d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
21e0: 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 6f  += nWrite;.    o
21f0: 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
2200: 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 20 26   = (LONG)(iOff &
2210: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
2220: 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
2230: 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
2240: 28 28 69 4f 66 66 3e 3e 33 32 29 20 26 20 30 78  ((iOff>>32) & 0x
2250: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 61  7fffffff);.    a
2260: 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem += nWrite;. 
2270: 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
2280: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  e;.  }.  if( nRe
2290: 6d 21 3d 30 20 29 20 72 65 74 75 72 6e 20 4c 53  m!=0 ) return LS
22a0: 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20  M_IOERR_BKPT;.  
22b0: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
22c0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ..static int win
22d0: 33 32 54 72 75 6e 63 61 74 65 28 0a 20 20 48 41  32Truncate(.  HA
22e0: 4e 44 4c 45 20 68 46 69 6c 65 2c 0a 20 20 6c 73  NDLE hFile,.  ls
22f0: 6d 5f 69 36 34 20 6e 53 69 7a 65 0a 29 7b 0a 20  m_i64 nSize.){. 
2300: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 6f   LARGE_INTEGER o
2310: 66 66 73 65 74 3b 0a 20 20 6f 66 66 73 65 74 2e  ffset;.  offset.
2320: 51 75 61 64 50 61 72 74 20 3d 20 6e 53 69 7a 65  QuadPart = nSize
2330: 3b 0a 20 20 69 66 28 20 21 53 65 74 46 69 6c 65  ;.  if( !SetFile
2340: 50 6f 69 6e 74 65 72 45 78 28 68 46 69 6c 65 2c  PointerEx(hFile,
2350: 20 6f 66 66 73 65 74 2c 20 30 2c 20 46 49 4c 45   offset, 0, FILE
2360: 5f 42 45 47 49 4e 29 20 29 7b 0a 20 20 20 20 72  _BEGIN) ){.    r
2370: 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f  eturn LSM_IOERR_
2380: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 20 28  BKPT;.  }.  if (
2390: 21 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 68 46  !SetEndOfFile(hF
23a0: 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ile) ){.    retu
23b0: 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50  rn LSM_IOERR_BKP
23c0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
23d0: 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  LSM_OK;.}..stati
23e0: 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  c int lsmWin32Os
23f0: 54 72 75 6e 63 61 74 65 28 0a 20 20 6c 73 6d 5f  Truncate(.  lsm_
2400: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 2f 2a 20  file *pFile, /* 
2410: 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f  File to write to
2420: 20 2a 2f 0a 20 20 6c 73 6d 5f 69 36 34 20 6e 53   */.  lsm_i64 nS
2430: 69 7a 65 20 20 20 20 2f 2a 20 53 69 7a 65 20 74  ize    /* Size t
2440: 6f 20 74 72 75 6e 63 61 74 65 20 66 69 6c 65 20  o truncate file 
2450: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 33 32  to */.){.  Win32
2460: 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65  File *pWin32File
2470: 20 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29   = (Win32File *)
2480: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
2490: 77 69 6e 33 32 54 72 75 6e 63 61 74 65 28 70 57  win32Truncate(pW
24a0: 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 2c  in32File->hFile,
24b0: 20 6e 53 69 7a 65 29 3b 0a 7d 0a 0a 73 74 61 74   nSize);.}..stat
24c0: 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f  ic int lsmWin32O
24d0: 73 52 65 61 64 28 0a 20 20 6c 73 6d 5f 66 69 6c  sRead(.  lsm_fil
24e0: 65 20 2a 70 46 69 6c 65 2c 20 2f 2a 20 46 69 6c  e *pFile, /* Fil
24f0: 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
2500: 2f 0a 20 20 6c 73 6d 5f 69 36 34 20 69 4f 66 66  /.  lsm_i64 iOff
2510: 2c 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  ,    /* Offset t
2520: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2530: 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
2540: 20 20 2f 2a 20 52 65 61 64 20 64 61 74 61 20 69    /* Read data i
2550: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
2560: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 20  */.  int nData  
2570: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2580: 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 20 2a  f data to read *
2590: 2f 0a 29 7b 0a 20 20 57 69 6e 33 32 46 69 6c 65  /.){.  Win32File
25a0: 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d 20 28   *pWin32File = (
25b0: 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46 69 6c  Win32File *)pFil
25c0: 65 3b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  e;.  OVERLAPPED 
25d0: 6f 76 65 72 6c 61 70 70 65 64 3b 20 2f 2a 20 54  overlapped; /* T
25e0: 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65  he offset for Re
25f0: 61 64 46 69 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  adFile */.  DWOR
2600: 44 20 6e 52 65 61 64 20 3d 20 30 3b 20 20 20 20  D nRead = 0;    
2610: 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 61 64     /* Bytes read
2620: 20 75 73 69 6e 67 20 52 65 61 64 46 69 6c 65 20   using ReadFile 
2630: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
2640: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  = 0;        /* N
2650: 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
2660: 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  */..  memset(&ov
2670: 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
2680: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
2690: 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
26a0: 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 69  ffset = (LONG)(i
26b0: 4f 66 66 20 26 20 30 78 66 66 66 66 66 66 66 66  Off & 0xffffffff
26c0: 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
26d0: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
26e0: 4e 47 29 28 28 69 4f 66 66 3e 3e 33 32 29 20 26  NG)((iOff>>32) &
26f0: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
2700: 77 68 69 6c 65 28 20 21 52 65 61 64 46 69 6c 65  while( !ReadFile
2710: 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69  (pWin32File->hFi
2720: 6c 65 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  le, pData, nData
2730: 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c  , &nRead, &overl
2740: 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20  apped) &&.      
2750: 20 20 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28     GetLastError(
2760: 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
2770: 45 4f 46 20 29 7b 0a 20 20 20 20 69 66 28 20 77  EOF ){.    if( w
2780: 69 6e 33 32 52 65 74 72 79 49 6f 65 72 72 28 70  in32RetryIoerr(p
2790: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
27a0: 20 26 6e 52 65 74 72 79 29 20 29 20 63 6f 6e 74   &nRetry) ) cont
27b0: 69 6e 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  inue;.    return
27c0: 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b   LSM_IOERR_BKPT;
27d0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 61 64  .  }.  if( nRead
27e0: 3c 28 44 57 4f 52 44 29 6e 44 61 74 61 20 29 7b  <(DWORD)nData ){
27f0: 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
2800: 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
2810: 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
2820: 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
2830: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 44  mset(&((char*)pD
2840: 61 74 61 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  ata)[nRead], 0, 
2850: 6e 44 61 74 61 20 2d 20 6e 52 65 61 64 29 3b 0a  nData - nRead);.
2860: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d    }.  return LSM
2870: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
2880: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 53 79 6e  nt lsmWin32OsSyn
2890: 63 28 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c  c(lsm_file *pFil
28a0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  e){.  int rc = L
28b0: 53 4d 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20  SM_OK;..#ifndef 
28c0: 4c 53 4d 5f 4e 4f 5f 53 59 4e 43 0a 20 20 57 69  LSM_NO_SYNC.  Wi
28d0: 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46  n32File *pWin32F
28e0: 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69 6c 65  ile = (Win32File
28f0: 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28   *)pFile;..  if(
2900: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d 61   pWin32File->pMa
2910: 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
2920: 66 28 20 21 46 6c 75 73 68 56 69 65 77 4f 66 46  f( !FlushViewOfF
2930: 69 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e  ile(pWin32File->
2940: 70 4d 61 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  pMap, 0) ){.    
2950: 20 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52    rc = LSM_IOERR
2960: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
2970: 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
2980: 4b 20 26 26 20 21 46 6c 75 73 68 46 69 6c 65 42  K && !FlushFileB
2990: 75 66 66 65 72 73 28 70 57 69 6e 33 32 46 69 6c  uffers(pWin32Fil
29a0: 65 2d 3e 68 46 69 6c 65 29 20 29 7b 0a 20 20 20  e->hFile) ){.   
29b0: 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f   rc = LSM_IOERR_
29c0: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  BKPT;.  }.#else.
29d0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
29e0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
29f0: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 53 65 63  nt lsmWin32OsSec
2a00: 74 6f 72 53 69 7a 65 28 6c 73 6d 5f 66 69 6c 65  torSize(lsm_file
2a10: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65 74 75   *pFile){.  retu
2a20: 72 6e 20 35 31 32 3b 0a 7d 0a 0a 73 74 61 74 69  rn 512;.}..stati
2a30: 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  c int lsmWin32Os
2a40: 52 65 6d 61 70 28 0a 20 20 6c 73 6d 5f 66 69 6c  Remap(.  lsm_fil
2a50: 65 20 2a 70 46 69 6c 65 2c 0a 20 20 6c 73 6d 5f  e *pFile,.  lsm_
2a60: 69 36 34 20 69 4d 69 6e 2c 0a 20 20 76 6f 69 64  i64 iMin,.  void
2a70: 20 2a 2a 70 70 4f 75 74 2c 0a 20 20 6c 73 6d 5f   **ppOut,.  lsm_
2a80: 69 36 34 20 2a 70 6e 4f 75 74 0a 29 7b 0a 20 20  i64 *pnOut.){.  
2a90: 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33  Win32File *pWin3
2aa0: 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69  2File = (Win32Fi
2ab0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20 2f  le *)pFile;..  /
2ac0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
2ad0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 32   between 0 and 2
2ae0: 4d 42 20 69 6e 20 73 69 7a 65 2c 20 65 78 74 65  MB in size, exte
2af0: 6e 64 20 69 74 20 69 6e 20 63 68 75 6e 6b 73 20  nd it in chunks 
2b00: 6f 66 20 32 35 36 4b 2e 0a 20 20 2a 2a 20 54 68  of 256K..  ** Th
2b10: 65 72 65 61 66 74 65 72 2c 20 69 6e 20 63 68 75  ereafter, in chu
2b20: 6e 6b 73 20 6f 66 20 31 4d 42 20 61 74 20 61 20  nks of 1MB at a 
2b30: 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  time.  */.  cons
2b40: 74 20 69 6e 74 20 61 49 6e 63 72 53 7a 5b 5d 20  t int aIncrSz[] 
2b50: 3d 20 7b 32 35 36 2a 31 30 32 34 2c 20 31 30 32  = {256*1024, 102
2b60: 34 2a 31 30 32 34 7d 3b 0a 20 20 69 6e 74 20 6e  4*1024};.  int n
2b70: 49 6e 63 72 53 7a 20 3d 20 61 49 6e 63 72 53 7a  IncrSz = aIncrSz
2b80: 5b 69 4d 69 6e 3e 28 32 2a 31 30 32 34 2a 31 30  [iMin>(2*1024*10
2b90: 32 34 29 5d 3b 0a 0a 20 20 69 66 28 20 70 57 69  24)];..  if( pWi
2ba0: 6e 33 32 46 69 6c 65 2d 3e 70 4d 61 70 21 3d 4e  n32File->pMap!=N
2bb0: 55 4c 4c 20 29 7b 0a 20 20 20 20 55 6e 6d 61 70  ULL ){.    Unmap
2bc0: 56 69 65 77 4f 66 46 69 6c 65 28 70 57 69 6e 33  ViewOfFile(pWin3
2bd0: 32 46 69 6c 65 2d 3e 70 4d 61 70 29 3b 0a 20 20  2File->pMap);.  
2be0: 20 20 2a 70 70 4f 75 74 20 3d 20 70 57 69 6e 33    *ppOut = pWin3
2bf0: 32 46 69 6c 65 2d 3e 70 4d 61 70 20 3d 20 4e 55  2File->pMap = NU
2c00: 4c 4c 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d  LL;.    *pnOut =
2c10: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 6e 4d 61   pWin32File->nMa
2c20: 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
2c30: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 4d 61   pWin32File->hMa
2c40: 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 43  p!=NULL ){.    C
2c50: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57 69 6e 33  loseHandle(pWin3
2c60: 32 46 69 6c 65 2d 3e 68 4d 61 70 29 3b 0a 20 20  2File->hMap);.  
2c70: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 4d    pWin32File->hM
2c80: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  ap = NULL;.  }. 
2c90: 20 69 66 28 20 69 4d 69 6e 3e 3d 30 20 29 7b 0a   if( iMin>=0 ){.
2ca0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
2cb0: 52 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  R fileSize;.    
2cc0: 44 57 4f 52 44 20 64 77 53 69 7a 65 48 69 67 68  DWORD dwSizeHigh
2cd0: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 53 69  ;.    DWORD dwSi
2ce0: 7a 65 4c 6f 77 3b 0a 20 20 20 20 48 41 4e 44 4c  zeLow;.    HANDL
2cf0: 45 20 68 4d 61 70 3b 0a 20 20 20 20 4c 50 56 4f  E hMap;.    LPVO
2d00: 49 44 20 70 4d 61 70 3b 0a 20 20 20 20 6d 65 6d  ID pMap;.    mem
2d10: 73 65 74 28 26 66 69 6c 65 53 69 7a 65 2c 20 30  set(&fileSize, 0
2d20: 2c 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  , sizeof(LARGE_I
2d30: 4e 54 45 47 45 52 29 29 3b 0a 20 20 20 20 69 66  NTEGER));.    if
2d40: 28 20 21 47 65 74 46 69 6c 65 53 69 7a 65 45 78  ( !GetFileSizeEx
2d50: 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69  (pWin32File->hFi
2d60: 6c 65 2c 20 26 66 69 6c 65 53 69 7a 65 29 20 29  le, &fileSize) )
2d70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c  {.      return L
2d80: 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20  SM_IOERR_BKPT;. 
2d90: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2da0: 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50 61   fileSize.QuadPa
2db0: 72 74 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  rt>=0 );.    if(
2dc0: 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50 61   fileSize.QuadPa
2dd0: 72 74 3c 69 4d 69 6e 20 29 7b 0a 20 20 20 20 20  rt<iMin ){.     
2de0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 66   int rc;.      f
2df0: 69 6c 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74  ileSize.QuadPart
2e00: 20 3d 20 28 28 69 4d 69 6e 20 2b 20 6e 49 6e 63   = ((iMin + nInc
2e10: 72 53 7a 2d 31 29 20 2f 20 6e 49 6e 63 72 53 7a  rSz-1) / nIncrSz
2e20: 29 20 2a 20 6e 49 6e 63 72 53 7a 3b 0a 20 20 20  ) * nIncrSz;.   
2e30: 20 20 20 72 63 20 3d 20 6c 73 6d 57 69 6e 33 32     rc = lsmWin32
2e40: 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65  OsTruncate(pFile
2e50: 2c 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50  , fileSize.QuadP
2e60: 61 72 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  art);.      if( 
2e70: 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc!=LSM_OK ){.  
2e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ea0: 20 20 20 64 77 53 69 7a 65 4c 6f 77 20 3d 20 28     dwSizeLow = (
2eb0: 44 57 4f 52 44 29 28 66 69 6c 65 53 69 7a 65 2e  DWORD)(fileSize.
2ec0: 51 75 61 64 50 61 72 74 20 26 20 30 78 46 46 46  QuadPart & 0xFFF
2ed0: 46 46 46 46 46 29 3b 0a 20 20 20 20 64 77 53 69  FFFFF);.    dwSi
2ee0: 7a 65 48 69 67 68 20 3d 20 28 44 57 4f 52 44 29  zeHigh = (DWORD)
2ef0: 28 28 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50  ((fileSize.QuadP
2f00: 61 72 74 20 26 20 30 78 37 46 46 46 46 46 46 46  art & 0x7FFFFFFF
2f10: 46 46 46 46 46 46 46 46 29 20 3e 3e 20 33 32 29  FFFFFFFF) >> 32)
2f20: 3b 0a 20 20 20 20 68 4d 61 70 20 3d 20 43 72 65  ;.    hMap = Cre
2f30: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
2f40: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c  pWin32File->hFil
2f50: 65 2c 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45  e, NULL, PAGE_RE
2f60: 41 44 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20  ADWRITE,.       
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 64 77 53 69 7a 65 48 69 67         dwSizeHig
2f90: 68 2c 20 64 77 53 69 7a 65 4c 6f 77 2c 20 4e 55  h, dwSizeLow, NU
2fa0: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 68 4d 61  LL);.    if( hMa
2fb0: 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
2fc0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
2fd0: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  R_BKPT;.    }.  
2fe0: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 4d    pWin32File->hM
2ff0: 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 61  ap = hMap;.    a
3000: 73 73 65 72 74 28 20 66 69 6c 65 53 69 7a 65 2e  ssert( fileSize.
3010: 51 75 61 64 50 61 72 74 3c 3d 30 78 46 46 46 46  QuadPart<=0xFFFF
3020: 46 46 46 46 20 29 3b 0a 20 20 20 20 70 4d 61 70  FFFF );.    pMap
3030: 20 3d 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   = MapViewOfFile
3040: 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
3050: 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
3060: 5f 52 45 41 44 2c 20 30 2c 20 30 2c 0a 20 20 20  _READ, 0, 0,.   
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 20 28 53 49 5a 45 5f 54 29 66 69        (SIZE_T)fi
3090: 6c 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74 29  leSize.QuadPart)
30a0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 70 3d 3d  ;.    if( pMap==
30b0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 65  NULL ){.      re
30c0: 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42  turn LSM_IOERR_B
30d0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
30e0: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d 61 70 20  Win32File->pMap 
30f0: 3d 20 70 4d 61 70 3b 0a 20 20 20 20 70 57 69 6e  = pMap;.    pWin
3100: 33 32 46 69 6c 65 2d 3e 6e 4d 61 70 20 3d 20 28  32File->nMap = (
3110: 53 49 5a 45 5f 54 29 66 69 6c 65 53 69 7a 65 2e  SIZE_T)fileSize.
3120: 51 75 61 64 50 61 72 74 3b 0a 20 20 7d 0a 20 20  QuadPart;.  }.  
3130: 2a 70 70 4f 75 74 20 3d 20 70 57 69 6e 33 32 46  *ppOut = pWin32F
3140: 69 6c 65 2d 3e 70 4d 61 70 3b 0a 20 20 2a 70 6e  ile->pMap;.  *pn
3150: 4f 75 74 20 3d 20 70 57 69 6e 33 32 46 69 6c 65  Out = pWin32File
3160: 2d 3e 6e 4d 61 70 3b 0a 20 20 72 65 74 75 72 6e  ->nMap;.  return
3170: 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   LSM_OK;.}..stat
3180: 69 63 20 42 4f 4f 4c 20 77 69 6e 33 32 49 73 44  ic BOOL win32IsD
3190: 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
31a0: 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
31b0: 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
31c0: 20 72 65 74 75 72 6e 20 28 20 69 73 61 6c 70 68   return ( isalph
31d0: 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
31e0: 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
31f0: 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  =':' );.}..stati
3200: 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  c int lsmWin32Os
3210: 46 75 6c 6c 70 61 74 68 28 0a 20 20 6c 73 6d 5f  Fullpath(.  lsm_
3220: 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 63 6f 6e  env *pEnv,.  con
3230: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
3240: 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 0a 20 20    char *zOut,.  
3250: 69 6e 74 20 2a 70 6e 4f 75 74 0a 29 7b 0a 20 20  int *pnOut.){.  
3260: 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
3270: 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
3280: 0a 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57  .  LPWSTR zTempW
3290: 69 64 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  ide;.  char *zTe
32a0: 6d 70 55 74 66 38 3b 0a 0a 20 20 69 66 28 20 7a  mpUtf8;..  if( z
32b0: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  Name[0]=='/' && 
32c0: 77 69 6e 33 32 49 73 44 72 69 76 65 4c 65 74 74  win32IsDriveLett
32d0: 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 4e 61 6d 65  erAndColon(zName
32e0: 2b 31 29 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  +1) ){.    zName
32f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  ++;.  }.  zConve
3300: 72 74 65 64 20 3d 20 77 69 6e 33 32 55 74 66 38  rted = win32Utf8
3310: 54 6f 55 6e 69 63 6f 64 65 28 70 45 6e 76 2c 20  ToUnicode(pEnv, 
3320: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  zName);.  if( zC
3330: 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
3340: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f     return LSM_NO
3350: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
3360: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
3370: 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
3380: 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
3390: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
33a0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 73  yte==0 ){.    ls
33b0: 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a 43 6f 6e  mFree(pEnv, zCon
33c0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
33d0: 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b  urn LSM_IOERR_BK
33e0: 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  PT;.  }.  nByte 
33f0: 2b 3d 20 33 3b 0a 20 20 7a 54 65 6d 70 57 69 64  += 3;.  zTempWid
3400: 65 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  e = lsmMallocZer
3410: 6f 28 70 45 6e 76 2c 20 6e 42 79 74 65 20 2a 20  o(pEnv, nByte * 
3420: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 57 69 64 65  sizeof(zTempWide
3430: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 7a 54 65  [0]));.  if( zTe
3440: 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20  mpWide==0 ){.   
3450: 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a   lsmFree(pEnv, z
3460: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
3470: 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d  return LSM_NOMEM
3480: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79  _BKPT;.  }.  nBy
3490: 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68  te = GetFullPath
34a0: 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
34b0: 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
34c0: 2c 20 7a 54 65 6d 70 57 69 64 65 2c 20 30 29 3b  , zTempWide, 0);
34d0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
34e0: 29 7b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70  ){.    lsmFree(p
34f0: 45 6e 76 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  Env, zConverted)
3500: 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45  ;.    lsmFree(pE
3510: 6e 76 2c 20 7a 54 65 6d 70 57 69 64 65 29 3b 0a  nv, zTempWide);.
3520: 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49      return LSM_I
3530: 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OERR_BKPT;.  }. 
3540: 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a   lsmFree(pEnv, z
3550: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7a 54  Converted);.  zT
3560: 65 6d 70 55 74 66 38 20 3d 20 77 69 6e 33 32 55  empUtf8 = win32U
3570: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 70 45 6e  nicodeToUtf8(pEn
3580: 76 2c 20 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  v, zTempWide);. 
3590: 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a   lsmFree(pEnv, z
35a0: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 69 66 28  TempWide);.  if(
35b0: 20 7a 54 65 6d 70 55 74 66 38 20 29 7b 0a 20 20   zTempUtf8 ){.  
35c0: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 2a 70 6e    int nOut = *pn
35d0: 4f 75 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  Out;.    int nLe
35e0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70  n = strlen(zTemp
35f0: 55 74 66 38 29 20 2b 20 31 3b 0a 20 20 20 20 69  Utf8) + 1;.    i
3600: 66 28 20 6e 4c 65 6e 3c 3d 6e 4f 75 74 20 29 7b  f( nLen<=nOut ){
3610: 0a 20 20 20 20 20 20 73 6e 70 72 69 6e 74 66 28  .      snprintf(
3620: 7a 4f 75 74 2c 20 6e 4f 75 74 2c 20 22 25 73 22  zOut, nOut, "%s"
3630: 2c 20 7a 54 65 6d 70 55 74 66 38 29 3b 0a 20 20  , zTempUtf8);.  
3640: 20 20 7d 0a 20 20 20 20 6c 73 6d 46 72 65 65 28    }.    lsmFree(
3650: 70 45 6e 76 2c 20 7a 54 65 6d 70 55 74 66 38 29  pEnv, zTempUtf8)
3660: 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 6e  ;.    *pnOut = n
3670: 4c 65 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Len;.    return 
3680: 4c 53 4d 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  LSM_OK;.  }else{
3690: 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  .    return LSM_
36a0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
36b0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  }..static int ls
36c0: 6d 57 69 6e 33 32 4f 73 46 69 6c 65 69 64 28 0a  mWin32OsFileid(.
36d0: 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c    lsm_file *pFil
36e0: 65 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  e,.  void *pBuf,
36f0: 0a 20 20 69 6e 74 20 2a 70 6e 42 75 66 0a 29 7b  .  int *pnBuf.){
3700: 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 69  .  int nBuf;.  i
3710: 6e 74 20 6e 52 65 71 3b 0a 20 20 75 38 20 2a 70  nt nReq;.  u8 *p
3720: 42 75 66 32 20 3d 20 28 75 38 20 2a 29 70 42 75  Buf2 = (u8 *)pBu
3730: 66 3b 0a 20 20 57 69 6e 33 32 46 69 6c 65 20 2a  f;.  Win32File *
3740: 70 57 69 6e 33 32 46 69 6c 65 20 3d 20 28 57 69  pWin32File = (Wi
3750: 6e 33 32 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  n32File *)pFile;
3760: 0a 20 20 42 59 5f 48 41 4e 44 4c 45 5f 46 49 4c  .  BY_HANDLE_FIL
3770: 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 66 69  E_INFORMATION fi
3780: 6c 65 49 6e 66 6f 3b 0a 0a 20 20 6e 42 75 66 20  leInfo;..  nBuf 
3790: 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 6e 52 65 71  = *pnBuf;.  nReq
37a0: 20 3d 20 28 73 69 7a 65 6f 66 28 66 69 6c 65 49   = (sizeof(fileI
37b0: 6e 66 6f 2e 64 77 56 6f 6c 75 6d 65 53 65 72 69  nfo.dwVolumeSeri
37c0: 61 6c 4e 75 6d 62 65 72 29 20 2b 0a 20 20 20 20  alNumber) +.    
37d0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 66 69 6c        sizeof(fil
37e0: 65 49 6e 66 6f 2e 6e 46 69 6c 65 49 6e 64 65 78  eInfo.nFileIndex
37f0: 48 69 67 68 29 20 2b 0a 20 20 20 20 20 20 20 20  High) +.        
3800: 20 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 6e 66    sizeof(fileInf
3810: 6f 2e 6e 46 69 6c 65 49 6e 64 65 78 4c 6f 77 29  o.nFileIndexLow)
3820: 29 3b 0a 20 20 2a 70 6e 42 75 66 20 3d 20 6e 52  );.  *pnBuf = nR
3830: 65 71 3b 0a 20 20 69 66 28 20 6e 52 65 71 3e 6e  eq;.  if( nReq>n
3840: 42 75 66 20 29 20 72 65 74 75 72 6e 20 4c 53 4d  Buf ) return LSM
3850: 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66  _OK;.  memset(&f
3860: 69 6c 65 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  ileInfo, 0, size
3870: 6f 66 28 42 59 5f 48 41 4e 44 4c 45 5f 46 49 4c  of(BY_HANDLE_FIL
3880: 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 29 29 3b  E_INFORMATION));
3890: 0a 20 20 69 66 28 20 21 47 65 74 46 69 6c 65 49  .  if( !GetFileI
38a0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
38b0: 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68  le(pWin32File->h
38c0: 46 69 6c 65 2c 20 26 66 69 6c 65 49 6e 66 6f 29  File, &fileInfo)
38d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4c   ){.    return L
38e0: 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20  SM_IOERR_BKPT;. 
38f0: 20 7d 0a 20 20 6e 52 65 71 20 3d 20 73 69 7a 65   }.  nReq = size
3900: 6f 66 28 66 69 6c 65 49 6e 66 6f 2e 64 77 56 6f  of(fileInfo.dwVo
3910: 6c 75 6d 65 53 65 72 69 61 6c 4e 75 6d 62 65 72  lumeSerialNumber
3920: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42 75 66  );.  memcpy(pBuf
3930: 32 2c 20 26 66 69 6c 65 49 6e 66 6f 2e 64 77 56  2, &fileInfo.dwV
3940: 6f 6c 75 6d 65 53 65 72 69 61 6c 4e 75 6d 62 65  olumeSerialNumbe
3950: 72 2c 20 6e 52 65 71 29 3b 0a 20 20 70 42 75 66  r, nReq);.  pBuf
3960: 32 20 2b 3d 20 6e 52 65 71 3b 0a 20 20 6e 52 65  2 += nReq;.  nRe
3970: 71 20 3d 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  q = sizeof(fileI
3980: 6e 66 6f 2e 6e 46 69 6c 65 49 6e 64 65 78 48 69  nfo.nFileIndexHi
3990: 67 68 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42  gh);.  memcpy(pB
39a0: 75 66 2c 20 26 66 69 6c 65 49 6e 66 6f 2e 6e 46  uf, &fileInfo.nF
39b0: 69 6c 65 49 6e 64 65 78 48 69 67 68 2c 20 6e 52  ileIndexHigh, nR
39c0: 65 71 29 3b 0a 20 20 70 42 75 66 32 20 2b 3d 20  eq);.  pBuf2 += 
39d0: 6e 52 65 71 3b 0a 20 20 6e 52 65 71 20 3d 20 73  nReq;.  nReq = s
39e0: 69 7a 65 6f 66 28 66 69 6c 65 49 6e 66 6f 2e 6e  izeof(fileInfo.n
39f0: 46 69 6c 65 49 6e 64 65 78 4c 6f 77 29 3b 0a 20  FileIndexLow);. 
3a00: 20 6d 65 6d 63 70 79 28 70 42 75 66 32 2c 20 26   memcpy(pBuf2, &
3a10: 66 69 6c 65 49 6e 66 6f 2e 6e 46 69 6c 65 49 6e  fileInfo.nFileIn
3a20: 64 65 78 4c 6f 77 2c 20 6e 52 65 71 29 3b 0a 20  dexLow, nReq);. 
3a30: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a   return LSM_OK;.
3a40: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  }..static int wi
3a50: 6e 33 32 44 65 6c 65 74 65 28 0a 20 20 6c 73 6d  n32Delete(.  lsm
3a60: 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 63 6f  _env *pEnv,.  co
3a70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 0a  nst char *zFile.
3a80: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4c  ){.  int rc;.  L
3a90: 50 57 53 54 52 20 7a 43 6f 6e 76 65 72 74 65 64  PWSTR zConverted
3aa0: 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
3ab0: 3d 20 77 69 6e 33 32 55 74 66 38 54 6f 55 6e 69  = win32Utf8ToUni
3ac0: 63 6f 64 65 28 70 45 6e 76 2c 20 7a 46 69 6c 65  code(pEnv, zFile
3ad0: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
3ae0: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ted==0 ){.    rc
3af0: 20 3d 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50   = LSM_NOMEM_BKP
3b00: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
3b10: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 0a  int nRetry = 0;.
3b20: 20 20 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a      DWORD attr;.
3b30: 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
3b40: 72 6e 6f 3b 0a 0a 20 20 20 20 64 6f 20 7b 0a 20  rno;..    do {. 
3b50: 20 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46       attr = GetF
3b60: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
3b70: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
3b80: 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
3b90: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
3ba0: 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
3bb0: 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42  rc = LSM_IOERR_B
3bc0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 62 72 65  KPT;.        bre
3bd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3be0: 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
3bf0: 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
3c00: 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
3c10: 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42  rc = LSM_IOERR_B
3c20: 4b 50 54 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  KPT; /* Files on
3c30: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
3c40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3c50: 20 20 20 20 69 66 20 28 20 44 65 6c 65 74 65 46      if ( DeleteF
3c60: 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileW(zConverted)
3c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
3c80: 20 4c 53 4d 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65   LSM_OK; /* Dele
3c90: 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
3ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3cb0: 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
3cc0: 6e 33 32 52 65 74 72 79 49 6f 65 72 72 28 70 45  n32RetryIoerr(pE
3cd0: 6e 76 2c 20 26 6e 52 65 74 72 79 29 20 29 7b 0a  nv, &nRetry) ){.
3ce0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d          rc = LSM
3cf0: 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 20 2f 2a 20  _IOERR_BKPT; /* 
3d00: 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
3d10: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
3d20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3d30: 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a  while( 1 );.  }.
3d40: 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20    lsmFree(pEnv, 
3d50: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72  zConverted);.  r
3d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
3d70: 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32  tic int lsmWin32
3d80: 4f 73 55 6e 6c 69 6e 6b 28 6c 73 6d 5f 65 6e 76  OsUnlink(lsm_env
3d90: 20 2a 70 45 6e 76 2c 20 63 6f 6e 73 74 20 63 68   *pEnv, const ch
3da0: 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20 72 65  ar *zFile){.  re
3db0: 74 75 72 6e 20 77 69 6e 33 32 44 65 6c 65 74 65  turn win32Delete
3dc0: 28 70 45 6e 76 2c 20 7a 46 69 6c 65 29 3b 0a 7d  (pEnv, zFile);.}
3dd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77  ..#if !defined(w
3de0: 69 6e 33 32 49 73 4c 6f 63 6b 42 75 73 79 29 0a  in32IsLockBusy).
3df0: 23 64 65 66 69 6e 65 20 77 69 6e 33 32 49 73 4c  #define win32IsL
3e00: 6f 63 6b 42 75 73 79 28 61 29 20 28 28 28 61 29  ockBusy(a) (((a)
3e10: 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f  ==ERROR_LOCK_VIO
3e20: 4c 41 54 49 4f 4e 29 20 7c 7c 20 5c 0a 20 20 20  LATION) || \.   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
3e50: 52 52 4f 52 5f 49 4f 5f 50 45 4e 44 49 4e 47 29  RROR_IO_PENDING)
3e60: 29 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 20 6c 73  ).#endif..int ls
3e70: 6d 57 69 6e 33 32 4f 73 4c 6f 63 6b 28 6c 73 6d  mWin32OsLock(lsm
3e80: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
3e90: 74 20 69 4c 6f 63 6b 2c 20 69 6e 74 20 65 54 79  t iLock, int eTy
3ea0: 70 65 29 7b 0a 20 20 57 69 6e 33 32 46 69 6c 65  pe){.  Win32File
3eb0: 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d 20 28   *pWin32File = (
3ec0: 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46 69 6c  Win32File *)pFil
3ed0: 65 3b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  e;.  OVERLAPPED 
3ee0: 6f 76 6c 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  ovlp;..  assert(
3ef0: 20 4c 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b   LSM_LOCK_UNLOCK
3f00: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
3f10: 20 4c 53 4d 5f 4c 4f 43 4b 5f 53 48 41 52 45 44   LSM_LOCK_SHARED
3f20: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
3f30: 20 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 3d 3d   LSM_LOCK_EXCL==
3f40: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  2 );.  assert( e
3f50: 54 79 70 65 3e 3d 4c 53 4d 5f 4c 4f 43 4b 5f 55  Type>=LSM_LOCK_U
3f60: 4e 4c 4f 43 4b 20 26 26 20 65 54 79 70 65 3c 3d  NLOCK && eType<=
3f70: 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 20 29 3b  LSM_LOCK_EXCL );
3f80: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 6f 63 6b  .  assert( iLock
3f90: 3e 30 20 26 26 20 69 4c 6f 63 6b 3c 3d 33 32 20  >0 && iLock<=32 
3fa0: 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  );..  memset(&ov
3fb0: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
3fc0: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
3fd0: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 28 34 30 39  lp.Offset = (409
3fe0: 36 2d 69 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20  6-iLock);.  if( 
3ff0: 65 54 79 70 65 3e 4c 53 4d 5f 4c 4f 43 4b 5f 55  eType>LSM_LOCK_U
4000: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 44 57 4f  NLOCK ){.    DWO
4010: 52 44 20 66 6c 61 67 73 20 3d 20 4c 4f 43 4b 46  RD flags = LOCKF
4020: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
4030: 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 65 54  TELY;.    if( eT
4040: 79 70 65 3e 3d 4c 53 4d 5f 4c 4f 43 4b 5f 45 58  ype>=LSM_LOCK_EX
4050: 43 4c 20 29 20 66 6c 61 67 73 20 7c 3d 20 4c 4f  CL ) flags |= LO
4060: 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
4070: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 69 66 28 20 21  _LOCK;.    if( !
4080: 4c 6f 63 6b 46 69 6c 65 45 78 28 70 57 69 6e 33  LockFileEx(pWin3
4090: 32 46 69 6c 65 2d 3e 68 46 69 6c 65 2c 20 66 6c  2File->hFile, fl
40a0: 61 67 73 2c 20 30 2c 20 31 2c 20 30 2c 20 26 6f  ags, 0, 1, 0, &o
40b0: 76 6c 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66  vlp) ){.      if
40c0: 28 20 77 69 6e 33 32 49 73 4c 6f 63 6b 42 75 73  ( win32IsLockBus
40d0: 79 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y(GetLastError()
40e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
40f0: 75 72 6e 20 4c 53 4d 5f 42 55 53 59 3b 0a 20 20  urn LSM_BUSY;.  
4100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4110: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f     return LSM_IO
4120: 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  ERR_BKPT;.      
4130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4140: 0a 20 20 20 20 69 66 28 20 21 55 6e 6c 6f 63 6b  .    if( !Unlock
4150: 46 69 6c 65 45 78 28 70 57 69 6e 33 32 46 69 6c  FileEx(pWin32Fil
4160: 65 2d 3e 68 46 69 6c 65 2c 20 30 2c 20 31 2c 20  e->hFile, 0, 1, 
4170: 30 2c 20 26 6f 76 6c 70 29 20 29 7b 0a 20 20 20  0, &ovlp) ){.   
4180: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f     return LSM_IO
4190: 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  ERR_BKPT;.    }.
41a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d    }.  return LSM
41b0: 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 57  _OK;.}..int lsmW
41c0: 69 6e 33 32 4f 73 54 65 73 74 4c 6f 63 6b 28 6c  in32OsTestLock(l
41d0: 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  sm_file *pFile, 
41e0: 69 6e 74 20 69 4c 6f 63 6b 2c 20 69 6e 74 20 6e  int iLock, int n
41f0: 4c 6f 63 6b 2c 20 69 6e 74 20 65 54 79 70 65 29  Lock, int eType)
4200: 7b 0a 20 20 57 69 6e 33 32 46 69 6c 65 20 2a 70  {.  Win32File *p
4210: 57 69 6e 33 32 46 69 6c 65 20 3d 20 28 57 69 6e  Win32File = (Win
4220: 33 32 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  32File *)pFile;.
4230: 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20    DWORD flags = 
4240: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
4250: 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 4f 56 45  MEDIATELY;.  OVE
4260: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 0a 20  RLAPPED ovlp;.. 
4270: 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c 4f 43   assert( LSM_LOC
4280: 4b 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20  K_UNLOCK==0 );. 
4290: 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c 4f 43   assert( LSM_LOC
42a0: 4b 5f 53 48 41 52 45 44 3d 3d 31 20 29 3b 0a 20  K_SHARED==1 );. 
42b0: 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c 4f 43   assert( LSM_LOC
42c0: 4b 5f 45 58 43 4c 3d 3d 32 20 29 3b 0a 20 20 61  K_EXCL==2 );.  a
42d0: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 4c 53  ssert( eType==LS
42e0: 4d 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 20 7c 7c  M_LOCK_SHARED ||
42f0: 20 65 54 79 70 65 3d 3d 4c 53 4d 5f 4c 4f 43 4b   eType==LSM_LOCK
4300: 5f 45 58 43 4c 20 29 3b 0a 20 20 61 73 73 65 72  _EXCL );.  asser
4310: 74 28 20 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  t( nLock>=0 );. 
4320: 20 61 73 73 65 72 74 28 20 69 4c 6f 63 6b 3e 30   assert( iLock>0
4330: 20 26 26 20 69 4c 6f 63 6b 3c 3d 33 32 20 29 3b   && iLock<=32 );
4340: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3e 3d 4c  ..  if( eType>=L
4350: 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 20 29 20 66  SM_LOCK_EXCL ) f
4360: 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
4370: 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
4380: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
4390: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
43a0: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
43b0: 4f 66 66 73 65 74 20 3d 20 28 34 30 39 36 2d 69  Offset = (4096-i
43c0: 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 21 4c 6f  Lock);.  if( !Lo
43d0: 63 6b 46 69 6c 65 45 78 28 70 57 69 6e 33 32 46  ckFileEx(pWin32F
43e0: 69 6c 65 2d 3e 68 46 69 6c 65 2c 20 66 6c 61 67  ile->hFile, flag
43f0: 73 2c 20 30 2c 20 28 44 57 4f 52 44 29 6e 4c 6f  s, 0, (DWORD)nLo
4400: 63 6b 2c 20 30 2c 20 26 6f 76 6c 70 29 20 29 7b  ck, 0, &ovlp) ){
4410: 0a 20 20 20 20 69 66 28 20 77 69 6e 33 32 49 73  .    if( win32Is
4420: 4c 6f 63 6b 42 75 73 79 28 47 65 74 4c 61 73 74  LockBusy(GetLast
4430: 45 72 72 6f 72 28 29 29 20 29 7b 0a 20 20 20 20  Error()) ){.    
4440: 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 42 55 53    return LSM_BUS
4450: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
4460: 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49      return LSM_I
4470: 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OERR_BKPT;.    }
4480: 0a 20 20 7d 0a 20 20 55 6e 6c 6f 63 6b 46 69 6c  .  }.  UnlockFil
4490: 65 45 78 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e  eEx(pWin32File->
44a0: 68 46 69 6c 65 2c 20 30 2c 20 28 44 57 4f 52 44  hFile, 0, (DWORD
44b0: 29 6e 4c 6f 63 6b 2c 20 30 2c 20 26 6f 76 6c 70  )nLock, 0, &ovlp
44c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  );.  return LSM_
44d0: 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 57 69  OK;.}..int lsmWi
44e0: 6e 33 32 4f 73 53 68 6d 4d 61 70 28 6c 73 6d 5f  n32OsShmMap(lsm_
44f0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
4500: 20 69 43 68 75 6e 6b 2c 20 69 6e 74 20 73 7a 2c   iChunk, int sz,
4510: 20 76 6f 69 64 20 2a 2a 70 70 53 68 6d 29 7b 0a   void **ppShm){.
4520: 20 20 69 6e 74 20 72 63 3b 0a 20 20 57 69 6e 33    int rc;.  Win3
4530: 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c  2File *pWin32Fil
4540: 65 20 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a  e = (Win32File *
4550: 29 70 46 69 6c 65 3b 0a 0a 20 20 2a 70 70 53 68  )pFile;..  *ppSh
4560: 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 61 73 73 65  m = NULL;.  asse
4570: 72 74 28 20 73 7a 3e 3d 30 20 29 3b 0a 20 20 61  rt( sz>=0 );.  a
4580: 73 73 65 72 74 28 20 73 7a 3d 3d 4c 53 4d 5f 53  ssert( sz==LSM_S
4590: 48 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 29 3b  HM_CHUNK_SIZE );
45a0: 0a 20 20 69 66 28 20 69 43 68 75 6e 6b 3e 3d 70  .  if( iChunk>=p
45b0: 57 69 6e 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 20  Win32File->nShm 
45c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
45d0: 20 20 4c 50 48 41 4e 44 4c 45 20 61 68 4e 65 77    LPHANDLE ahNew
45e0: 3b 0a 20 20 20 20 4c 50 56 4f 49 44 20 2a 61 70  ;.    LPVOID *ap
45f0: 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
4600: 77 20 3d 20 69 43 68 75 6e 6b 2b 31 3b 0a 20 20  w = iChunk+1;.  
4610: 20 20 6c 73 6d 5f 69 36 34 20 6e 52 65 71 20 3d    lsm_i64 nReq =
4620: 20 6e 4e 65 77 20 2a 20 73 7a 3b 0a 20 20 20 20   nNew * sz;.    
4630: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 66 69  LARGE_INTEGER fi
4640: 6c 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f 2a 20  leSize;..    /* 
4650: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
4660: 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
4670: 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
4680: 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
4690: 20 20 20 69 66 28 20 70 57 69 6e 33 32 46 69 6c     if( pWin32Fil
46a0: 65 2d 3e 68 53 68 6d 46 69 6c 65 3d 3d 4e 55 4c  e->hShmFile==NUL
46b0: 4c 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  L ){.      char 
46c0: 2a 7a 53 68 6d 20 3d 20 77 69 6e 33 32 53 68 6d  *zShm = win32Shm
46d0: 46 69 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 29  File(pWin32File)
46e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 53 68  ;.      if( !zSh
46f0: 6d 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e  m ) return LSM_N
4700: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
4710: 20 72 63 20 3d 20 77 69 6e 33 32 4f 70 65 6e 28   rc = win32Open(
4720: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76  pWin32File->pEnv
4730: 2c 20 7a 53 68 6d 2c 20 30 2c 20 26 70 57 69 6e  , zShm, 0, &pWin
4740: 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46 69 6c 65  32File->hShmFile
4750: 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65  );.      lsmFree
4760: 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e  (pWin32File->pEn
4770: 76 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20 20 20  v, zShm);.      
4780: 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
4790: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
47a0: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
47b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
47c0: 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
47d0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 61 72 67  file is not larg
47e0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
47f0: 61 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ain the.    ** r
4800: 65 71 75 65 73 74 65 64 20 63 68 75 6e 6b 2c 20  equested chunk, 
4810: 63 61 75 73 65 20 69 74 20 74 6f 20 67 72 6f 77  cause it to grow
4820: 2e 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  .  */.    memset
4830: 28 26 66 69 6c 65 53 69 7a 65 2c 20 30 2c 20 73  (&fileSize, 0, s
4840: 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
4850: 47 45 52 29 29 3b 0a 20 20 20 20 69 66 28 20 21  GER));.    if( !
4860: 47 65 74 46 69 6c 65 53 69 7a 65 45 78 28 70 57  GetFileSizeEx(pW
4870: 69 6e 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46 69  in32File->hShmFi
4880: 6c 65 2c 20 26 66 69 6c 65 53 69 7a 65 29 20 29  le, &fileSize) )
4890: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c  {.      return L
48a0: 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20  SM_IOERR_BKPT;. 
48b0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
48c0: 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50 61   fileSize.QuadPa
48d0: 72 74 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  rt>=0 );.    if(
48e0: 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64 50 61   fileSize.QuadPa
48f0: 72 74 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  rt<nReq ){.     
4900: 20 72 63 20 3d 20 77 69 6e 33 32 54 72 75 6e 63   rc = win32Trunc
4910: 61 74 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e  ate(pWin32File->
4920: 68 53 68 6d 46 69 6c 65 2c 20 6e 52 65 71 29 3b  hShmFile, nReq);
4930: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 4c  .      if( rc!=L
4940: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  SM_OK ){.       
4950: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
4960: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
4970: 68 4e 65 77 20 3d 20 28 76 6f 69 64 20 2a 2a 29  hNew = (void **)
4980: 6c 73 6d 52 65 61 6c 6c 6f 63 28 70 57 69 6e 33  lsmRealloc(pWin3
4990: 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 70 57 69  2File->pEnv, pWi
49a0: 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 2c 0a  n32File->ahShm,.
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 73 69 7a 65 6f 66 28 4c 50 48 41 4e 44 4c 45 29  sizeof(LPHANDLE)
49e0: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66   * nNew);.    if
49f0: 28 20 21 61 68 4e 65 77 20 29 20 72 65 74 75 72  ( !ahNew ) retur
4a00: 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  n LSM_NOMEM_BKPT
4a10: 3b 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 76  ;.    apNew = (v
4a20: 6f 69 64 20 2a 2a 29 6c 73 6d 52 65 61 6c 6c 6f  oid **)lsmReallo
4a30: 63 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  c(pWin32File->pE
4a40: 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  nv, pWin32File->
4a50: 61 70 53 68 6d 2c 0a 20 20 20 20 20 20 20 20 20  apShm,.         
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4c 50         sizeof(LP
4a80: 56 4f 49 44 29 20 2a 20 6e 4e 65 77 29 3b 0a 20  VOID) * nNew);. 
4a90: 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
4aa0: 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70  .      lsmFree(p
4ab0: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
4ac0: 20 61 68 4e 65 77 29 3b 0a 20 20 20 20 20 20 72   ahNew);.      r
4ad0: 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f  eturn LSM_NOMEM_
4ae0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
4af0: 66 6f 72 28 69 3d 70 57 69 6e 33 32 46 69 6c 65  for(i=pWin32File
4b00: 2d 3e 6e 53 68 6d 3b 20 69 3c 6e 4e 65 77 3b 20  ->nShm; i<nNew; 
4b10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 68 4e 65  i++){.      ahNe
4b20: 77 5b 69 5d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  w[i] = NULL;.   
4b30: 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 4e 55     apNew[i] = NU
4b40: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  LL;.    }.    pW
4b50: 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 20  in32File->ahShm 
4b60: 3d 20 61 68 4e 65 77 3b 0a 20 20 20 20 70 57 69  = ahNew;.    pWi
4b70: 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 20 3d  n32File->apShm =
4b80: 20 61 70 4e 65 77 3b 0a 20 20 20 20 70 57 69 6e   apNew;.    pWin
4b90: 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 20 3d 20 6e  32File->nShm = n
4ba0: 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  New;.  }..  if( 
4bb0: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68  pWin32File->ahSh
4bc0: 6d 5b 69 43 68 75 6e 6b 5d 3d 3d 4e 55 4c 4c 20  m[iChunk]==NULL 
4bd0: 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  ){.    HANDLE hM
4be0: 61 70 3b 0a 20 20 20 20 68 4d 61 70 20 3d 20 43  ap;.    hMap = C
4bf0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4c00: 57 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53  W(pWin32File->hS
4c10: 68 6d 46 69 6c 65 2c 20 4e 55 4c 4c 2c 20 50 41  hmFile, NULL, PA
4c20: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
4c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4c50: 44 57 4f 52 44 29 73 7a 2c 20 4e 55 4c 4c 29 3b  DWORD)sz, NULL);
4c60: 0a 20 20 20 20 69 66 28 20 68 4d 61 70 3d 3d 4e  .    if( hMap==N
4c70: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULL ){.      ret
4c80: 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b  urn LSM_IOERR_BK
4c90: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  PT;.    }.    pW
4ca0: 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 5b  in32File->ahShm[
4cb0: 69 43 68 75 6e 6b 5d 20 3d 20 68 4d 61 70 3b 0a  iChunk] = hMap;.
4cc0: 20 20 7d 0a 20 20 69 66 28 20 70 57 69 6e 33 32    }.  if( pWin32
4cd0: 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 43 68 75  File->apShm[iChu
4ce0: 6e 6b 5d 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  nk]==NULL ){.   
4cf0: 20 4c 50 56 4f 49 44 20 70 4d 61 70 3b 0a 20 20   LPVOID pMap;.  
4d00: 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65 77    pMap = MapView
4d10: 4f 66 46 69 6c 65 28 70 57 69 6e 33 32 46 69 6c  OfFile(pWin32Fil
4d20: 65 2d 3e 61 68 53 68 6d 5b 69 43 68 75 6e 6b 5d  e->ahShm[iChunk]
4d30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4d40: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
4d50: 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
4d60: 5f 4d 41 50 5f 52 45 41 44 2c 20 30 2c 20 30 2c  _MAP_READ, 0, 0,
4d70: 20 28 53 49 5a 45 5f 54 29 73 7a 29 3b 0a 20 20   (SIZE_T)sz);.  
4d80: 20 20 69 66 28 20 70 4d 61 70 3d 3d 4e 55 4c 4c    if( pMap==NULL
4d90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
4da0: 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b   LSM_IOERR_BKPT;
4db0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 33  .    }.    pWin3
4dc0: 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 43 68  2File->apShm[iCh
4dd0: 75 6e 6b 5d 20 3d 20 70 4d 61 70 3b 0a 20 20 7d  unk] = pMap;.  }
4de0: 0a 20 20 2a 70 70 53 68 6d 20 3d 20 70 57 69 6e  .  *ppShm = pWin
4df0: 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 43  32File->apShm[iC
4e00: 68 75 6e 6b 5d 3b 0a 20 20 72 65 74 75 72 6e 20  hunk];.  return 
4e10: 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20  LSM_OK;.}..void 
4e20: 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d 42 61 72  lsmWin32OsShmBar
4e30: 72 69 65 72 28 76 6f 69 64 29 7b 0a 20 20 4d 65  rier(void){.  Me
4e40: 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 0a 7d  moryBarrier();.}
4e50: 0a 0a 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  ..int lsmWin32Os
4e60: 53 68 6d 55 6e 6d 61 70 28 6c 73 6d 5f 66 69 6c  ShmUnmap(lsm_fil
4e70: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62 44  e *pFile, int bD
4e80: 65 6c 65 74 65 29 7b 0a 20 20 57 69 6e 33 32 46  elete){.  Win32F
4e90: 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20  ile *pWin32File 
4ea0: 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70  = (Win32File *)p
4eb0: 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 70 57 69  File;..  if( pWi
4ec0: 6e 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46 69 6c  n32File->hShmFil
4ed0: 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  e!=NULL ){.    i
4ee0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4ef0: 30 3b 20 69 3c 70 57 69 6e 33 32 46 69 6c 65 2d  0; i<pWin32File-
4f00: 3e 6e 53 68 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nShm; i++){.   
4f10: 20 20 20 69 66 28 20 70 57 69 6e 33 32 46 69 6c     if( pWin32Fil
4f20: 65 2d 3e 61 70 53 68 6d 5b 69 5d 21 3d 4e 55 4c  e->apShm[i]!=NUL
4f30: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 55 6e 6d  L ){.        Unm
4f40: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 57 69  apViewOfFile(pWi
4f50: 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69  n32File->apShm[i
4f60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69 6e  ]);.        pWin
4f70: 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 5d  32File->apShm[i]
4f80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d   = NULL;.      }
4f90: 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 33  .      if( pWin3
4fa0: 32 46 69 6c 65 2d 3e 61 68 53 68 6d 5b 69 5d 21  2File->ahShm[i]!
4fb0: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  =NULL ){.       
4fc0: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57 69   CloseHandle(pWi
4fd0: 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 5b 69  n32File->ahShm[i
4fe0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69 6e  ]);.        pWin
4ff0: 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 5b 69 5d  32File->ahShm[i]
5000: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d   = NULL;.      }
5010: 0a 20 20 20 20 7d 0a 20 20 20 20 43 6c 6f 73 65  .    }.    Close
5020: 48 61 6e 64 6c 65 28 70 57 69 6e 33 32 46 69 6c  Handle(pWin32Fil
5030: 65 2d 3e 68 53 68 6d 46 69 6c 65 29 3b 0a 20 20  e->hShmFile);.  
5040: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53    pWin32File->hS
5050: 68 6d 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  hmFile = 0;.    
5060: 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20  if( bDelete ){. 
5070: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 68 6d 20       char *zShm 
5080: 3d 20 77 69 6e 33 32 53 68 6d 46 69 6c 65 28 70  = win32ShmFile(p
5090: 57 69 6e 33 32 46 69 6c 65 29 3b 0a 20 20 20 20  Win32File);.    
50a0: 20 20 69 66 28 20 7a 53 68 6d 20 29 7b 20 77 69    if( zShm ){ wi
50b0: 6e 33 32 44 65 6c 65 74 65 28 70 57 69 6e 33 32  n32Delete(pWin32
50c0: 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53 68 6d  File->pEnv, zShm
50d0: 29 3b 20 7d 0a 20 20 20 20 20 20 6c 73 6d 46 72  ); }.      lsmFr
50e0: 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70  ee(pWin32File->p
50f0: 45 6e 76 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20  Env, zShm);.    
5100: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4c  }.  }.  return L
5110: 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e  SM_OK;.}..#defin
5120: 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  e MX_CLOSE_ATTEM
5130: 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  PT 3.static int 
5140: 6c 73 6d 57 69 6e 33 32 4f 73 43 6c 6f 73 65 28  lsmWin32OsClose(
5150: 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  lsm_file *pFile)
5160: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
5170: 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 0a 20 20  t nRetry = 0;.  
5180: 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33  Win32File *pWin3
5190: 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69  2File = (Win32Fi
51a0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 6c 73  le *)pFile;.  ls
51b0: 6d 57 69 6e 33 32 4f 73 53 68 6d 55 6e 6d 61 70  mWin32OsShmUnmap
51c0: 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20 20 69 66  (pFile, 0);.  if
51d0: 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d  ( pWin32File->pM
51e0: 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap!=NULL ){.    
51f0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
5200: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d 61 70  pWin32File->pMap
5210: 29 3b 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c  );.    pWin32Fil
5220: 65 2d 3e 70 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->pMap = NULL;.
5230: 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e      pWin32File->
5240: 6e 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  nMap = 0;.  }.  
5250: 69 66 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  if( pWin32File->
5260: 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap!=NULL ){.  
5270: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57    CloseHandle(pW
5280: 69 6e 33 32 46 69 6c 65 2d 3e 68 4d 61 70 29 3b  in32File->hMap);
5290: 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d  .    pWin32File-
52a0: 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
52b0: 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  }.  do{.    if( 
52c0: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c  pWin32File->hFil
52d0: 65 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  e==NULL ){.     
52e0: 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f   rc = LSM_IOERR_
52f0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61  BKPT;.      brea
5300: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
5310: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57  = CloseHandle(pW
5320: 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 29  in32File->hFile)
5330: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
5340: 20 20 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65        pWin32File
5350: 2d 3e 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  ->hFile = NULL;.
5360: 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4f        rc = LSM_O
5370: 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
5380: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2b 2b      }.    if( ++
5390: 6e 52 65 74 72 79 3e 3d 4d 58 5f 43 4c 4f 53 45  nRetry>=MX_CLOSE
53a0: 5f 41 54 54 45 4d 50 54 20 29 7b 0a 20 20 20 20  _ATTEMPT ){.    
53b0: 20 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52    rc = LSM_IOERR
53c0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72 65  _BKPT;.      bre
53d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  ak;.    }.  }whi
53e0: 6c 65 28 20 31 20 29 3b 0a 20 20 6c 73 6d 46 72  le( 1 );.  lsmFr
53f0: 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70  ee(pWin32File->p
5400: 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d  Env, pWin32File-
5410: 3e 61 68 53 68 6d 29 3b 0a 20 20 6c 73 6d 46 72  >ahShm);.  lsmFr
5420: 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70  ee(pWin32File->p
5430: 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d  Env, pWin32File-
5440: 3e 61 70 53 68 6d 29 3b 0a 20 20 6c 73 6d 46 72  >apShm);.  lsmFr
5450: 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70  ee(pWin32File->p
5460: 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 29  Env, pWin32File)
5470: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5480: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  ..static int lsm
5490: 57 69 6e 33 32 4f 73 53 6c 65 65 70 28 6c 73 6d  Win32OsSleep(lsm
54a0: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 69 6e 74 20  _env *pEnv, int 
54b0: 75 73 29 7b 0a 20 20 75 6e 75 73 65 64 5f 70 61  us){.  unused_pa
54c0: 72 61 6d 65 74 65 72 28 70 45 6e 76 29 3b 0a 20  rameter(pEnv);. 
54d0: 20 72 65 74 75 72 6e 20 77 69 6e 33 32 53 6c 65   return win32Sle
54e0: 65 70 28 75 73 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  ep(us);.}../****
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5530: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 65 6d 6f  ********.** Memo
5540: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ry allocation ro
5550: 75 74 69 6e 65 73 2e 0a 2a 2f 0a 0a 73 74 61 74  utines..*/..stat
5560: 69 63 20 76 6f 69 64 20 2a 6c 73 6d 57 69 6e 33  ic void *lsmWin3
5570: 32 4f 73 4d 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e  2OsMalloc(lsm_en
5580: 76 20 2a 70 45 6e 76 2c 20 73 69 7a 65 5f 74 20  v *pEnv, size_t 
5590: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 48 65 61  N){.  return Hea
55a0: 70 41 6c 6c 6f 63 28 47 65 74 50 72 6f 63 65 73  pAlloc(GetProces
55b0: 73 48 65 61 70 28 29 2c 20 30 2c 20 28 53 49 5a  sHeap(), 0, (SIZ
55c0: 45 5f 54 29 4e 29 3b 0a 7d 0a 0a 73 74 61 74 69  E_T)N);.}..stati
55d0: 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32 4f  c void lsmWin32O
55e0: 73 46 72 65 65 28 6c 73 6d 5f 65 6e 76 20 2a 70  sFree(lsm_env *p
55f0: 45 6e 76 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  Env, void *p){. 
5600: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 48 65   if( p ){.    He
5610: 61 70 46 72 65 65 28 47 65 74 50 72 6f 63 65 73  apFree(GetProces
5620: 73 48 65 61 70 28 29 2c 20 30 2c 20 70 29 3b 0a  sHeap(), 0, p);.
5630: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
5640: 69 64 20 2a 6c 73 6d 57 69 6e 33 32 4f 73 52 65  id *lsmWin32OsRe
5650: 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e 76 20 2a 70  alloc(lsm_env *p
5660: 45 6e 76 2c 20 76 6f 69 64 20 2a 70 2c 20 73 69  Env, void *p, si
5670: 7a 65 5f 74 20 4e 29 7b 0a 20 20 75 6e 73 69 67  ze_t N){.  unsig
5680: 6e 65 64 20 63 68 61 72 20 2a 6d 20 3d 20 28 75  ned char *m = (u
5690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
56a0: 3b 0a 20 20 69 66 28 20 31 3e 4e 20 29 7b 0a 20  ;.  if( 1>N ){. 
56b0: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 46 72 65     lsmWin32OsFre
56c0: 65 28 70 45 6e 76 2c 20 70 29 3b 0a 20 20 20 20  e(pEnv, p);.    
56d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d  return NULL;.  }
56e0: 65 6c 73 65 20 69 66 28 20 4e 55 4c 4c 3d 3d 70  else if( NULL==p
56f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   ){.    return l
5700: 73 6d 57 69 6e 33 32 4f 73 4d 61 6c 6c 6f 63 28  smWin32OsMalloc(
5710: 70 45 6e 76 2c 20 4e 29 3b 0a 20 20 7d 65 6c 73  pEnv, N);.  }els
5720: 65 7b 0a 23 69 66 20 30 20 2f 2a 20 61 72 67 75  e{.#if 0 /* argu
5730: 61 62 6c 65 3a 20 64 6f 6e 27 74 20 73 68 72 69  able: don't shri
5740: 6e 6b 20 2a 2f 0a 20 20 20 20 53 49 5a 45 5f 54  nk */.    SIZE_T
5750: 20 73 7a 20 3d 20 48 65 61 70 53 69 7a 65 28 47   sz = HeapSize(G
5760: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c  etProcessHeap(),
5770: 20 30 2c 20 6d 29 3b 0a 20 20 20 20 69 66 28 20   0, m);.    if( 
5780: 73 7a 3e 3d 28 53 49 5a 45 5f 54 29 4e 20 29 7b  sz>=(SIZE_T)N ){
5790: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b  .      return p;
57a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
57b0: 20 20 72 65 74 75 72 6e 20 48 65 61 70 52 65 41    return HeapReA
57c0: 6c 6c 6f 63 28 47 65 74 50 72 6f 63 65 73 73 48  lloc(GetProcessH
57d0: 65 61 70 28 29 2c 20 30 2c 20 6d 2c 20 4e 29 3b  eap(), 0, m, N);
57e0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 73  .  }.}..static s
57f0: 69 7a 65 5f 74 20 6c 73 6d 57 69 6e 33 32 4f 73  ize_t lsmWin32Os
5800: 4d 53 69 7a 65 28 6c 73 6d 5f 65 6e 76 20 2a 70  MSize(lsm_env *p
5810: 45 6e 76 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20  Env, void *p){. 
5820: 20 72 65 74 75 72 6e 20 28 73 69 7a 65 5f 74 29   return (size_t)
5830: 48 65 61 70 53 69 7a 65 28 47 65 74 50 72 6f 63  HeapSize(GetProc
5840: 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 70 29  essHeap(), 0, p)
5850: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 4c 53 4d  ;.}...#ifdef LSM
5860: 5f 4d 55 54 45 58 5f 57 49 4e 33 32 0a 2f 2a 2a  _MUTEX_WIN32./**
5870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58b0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 75 74 65 78  *******.** Mutex
58c0: 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 57 69 6e   methods for Win
58d0: 33 32 20 62 61 73 65 64 20 73 79 73 74 65 6d 73  32 based systems
58e0: 2e 20 20 49 66 20 4c 53 4d 5f 4d 55 54 45 58 5f  .  If LSM_MUTEX_
58f0: 57 49 4e 33 32 20 69 73 0a 2a 2a 20 6d 69 73 73  WIN32 is.** miss
5900: 69 6e 67 20 74 68 65 6e 20 61 20 6e 6f 2d 6f 70  ing then a no-op
5910: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
5920: 6f 66 20 6d 75 74 65 78 65 73 20 66 6f 75 6e 64  of mutexes found
5930: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 0a 2a   below will be.*
5940: 2a 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  * used instead..
5950: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 77 69 6e  */.#include "win
5960: 64 6f 77 73 2e 68 22 0a 0a 74 79 70 65 64 65 66  dows.h"..typedef
5970: 20 73 74 72 75 63 74 20 57 69 6e 33 32 4d 75 74   struct Win32Mut
5980: 65 78 20 57 69 6e 33 32 4d 75 74 65 78 3b 0a 73  ex Win32Mutex;.s
5990: 74 72 75 63 74 20 57 69 6e 33 32 4d 75 74 65 78  truct Win32Mutex
59a0: 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45   {.  lsm_env *pE
59b0: 6e 76 3b 0a 20 20 43 52 49 54 49 43 41 4c 5f 53  nv;.  CRITICAL_S
59c0: 45 43 54 49 4f 4e 20 6d 75 74 65 78 3b 0a 23 69  ECTION mutex;.#i
59d0: 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 20  fdef LSM_DEBUG. 
59e0: 20 44 57 4f 52 44 20 6f 77 6e 65 72 3b 0a 23 65   DWORD owner;.#e
59f0: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
5a00: 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f 49 4e 49   WIN32_MUTEX_INI
5a10: 54 49 41 4c 49 5a 45 52 0a 23 20 64 65 66 69 6e  TIALIZER.# defin
5a20: 65 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f 49 4e  e WIN32_MUTEX_IN
5a30: 49 54 49 41 4c 49 5a 45 52 20 7b 20 30 20 7d 0a  ITIALIZER { 0 }.
5a40: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 4c  #endif..#ifdef L
5a50: 53 4d 5f 44 45 42 55 47 0a 23 20 64 65 66 69 6e  SM_DEBUG.# defin
5a60: 65 20 4c 53 4d 5f 57 49 4e 33 32 5f 53 54 41 54  e LSM_WIN32_STAT
5a70: 49 43 5f 4d 55 54 45 58 20 7b 20 30 2c 20 57 49  IC_MUTEX { 0, WI
5a80: 4e 33 32 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  N32_MUTEX_INITIA
5a90: 4c 49 5a 45 52 2c 20 30 20 7d 0a 23 65 6c 73 65  LIZER, 0 }.#else
5aa0: 0a 23 20 64 65 66 69 6e 65 20 4c 53 4d 5f 57 49  .# define LSM_WI
5ab0: 4e 33 32 5f 53 54 41 54 49 43 5f 4d 55 54 45 58  N32_STATIC_MUTEX
5ac0: 20 7b 20 30 2c 20 57 49 4e 33 32 5f 4d 55 54 45   { 0, WIN32_MUTE
5ad0: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7d 0a  X_INITIALIZER }.
5ae0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
5af0: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74  nt lsmWin32OsMut
5b00: 65 78 53 74 61 74 69 63 28 0a 20 20 6c 73 6d 5f  exStatic(.  lsm_
5b10: 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 69 6e 74  env *pEnv,.  int
5b20: 20 69 4d 75 74 65 78 2c 0a 20 20 6c 73 6d 5f 6d   iMutex,.  lsm_m
5b30: 75 74 65 78 20 2a 2a 70 70 53 74 61 74 69 63 0a  utex **ppStatic.
5b40: 29 7b 0a 20 20 73 74 61 74 69 63 20 76 6f 6c 61  ){.  static vola
5b50: 74 69 6c 65 20 4c 4f 4e 47 20 69 6e 69 74 69 61  tile LONG initia
5b60: 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 73 74 61  lized = 0;.  sta
5b70: 74 69 63 20 57 69 6e 33 32 4d 75 74 65 78 20 73  tic Win32Mutex s
5b80: 4d 75 74 65 78 5b 32 5d 20 3d 20 7b 0a 20 20 20  Mutex[2] = {.   
5b90: 20 4c 53 4d 5f 57 49 4e 33 32 5f 53 54 41 54 49   LSM_WIN32_STATI
5ba0: 43 5f 4d 55 54 45 58 2c 0a 20 20 20 20 4c 53 4d  C_MUTEX,.    LSM
5bb0: 5f 57 49 4e 33 32 5f 53 54 41 54 49 43 5f 4d 55  _WIN32_STATIC_MU
5bc0: 54 45 58 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65  TEX.  };..  asse
5bd0: 72 74 28 20 69 4d 75 74 65 78 3d 3d 4c 53 4d 5f  rt( iMutex==LSM_
5be0: 4d 55 54 45 58 5f 47 4c 4f 42 41 4c 20 7c 7c 20  MUTEX_GLOBAL || 
5bf0: 69 4d 75 74 65 78 3d 3d 4c 53 4d 5f 4d 55 54 45  iMutex==LSM_MUTE
5c00: 58 5f 48 45 41 50 20 29 3b 0a 20 20 61 73 73 65  X_HEAP );.  asse
5c10: 72 74 28 20 4c 53 4d 5f 4d 55 54 45 58 5f 47 4c  rt( LSM_MUTEX_GL
5c20: 4f 42 41 4c 3d 3d 31 20 26 26 20 4c 53 4d 5f 4d  OBAL==1 && LSM_M
5c30: 55 54 45 58 5f 48 45 41 50 3d 3d 32 20 29 3b 0a  UTEX_HEAP==2 );.
5c40: 0a 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b  .  if( Interlock
5c50: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
5c60: 65 28 26 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  e(&initialized, 
5c70: 31 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1, 0)==0 ){.    
5c80: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5c90: 3d 30 3b 20 69 3c 61 72 72 61 79 5f 73 69 7a 65  =0; i<array_size
5ca0: 28 73 4d 75 74 65 78 29 3b 20 69 2b 2b 29 7b 0a  (sMutex); i++){.
5cb0: 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
5cc0: 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28  CriticalSection(
5cd0: 26 73 4d 75 74 65 78 5b 69 5d 2e 6d 75 74 65 78  &sMutex[i].mutex
5ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
5cf0: 70 70 53 74 61 74 69 63 20 3d 20 28 6c 73 6d 5f  ppStatic = (lsm_
5d00: 6d 75 74 65 78 20 2a 29 26 73 4d 75 74 65 78 5b  mutex *)&sMutex[
5d10: 69 4d 75 74 65 78 2d 31 5d 3b 0a 20 20 72 65 74  iMutex-1];.  ret
5d20: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
5d30: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
5d40: 33 32 4f 73 4d 75 74 65 78 4e 65 77 28 6c 73 6d  32OsMutexNew(lsm
5d50: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d 5f  _env *pEnv, lsm_
5d60: 6d 75 74 65 78 20 2a 2a 70 70 4e 65 77 29 7b 0a  mutex **ppNew){.
5d70: 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d    Win32Mutex *pM
5d80: 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
5d90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
5da0: 77 20 6d 75 74 65 78 20 2a 2f 0a 0a 20 20 70 4d  w mutex */..  pM
5db0: 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d 75 74  utex = (Win32Mut
5dc0: 65 78 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65  ex *)lsmMallocZe
5dd0: 72 6f 28 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  ro(pEnv, sizeof(
5de0: 57 69 6e 33 32 4d 75 74 65 78 29 29 3b 0a 20 20  Win32Mutex));.  
5df0: 69 66 28 20 21 70 4d 75 74 65 78 20 29 20 72 65  if( !pMutex ) re
5e00: 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42  turn LSM_NOMEM_B
5e10: 4b 50 54 3b 0a 0a 20 20 70 4d 75 74 65 78 2d 3e  KPT;..  pMutex->
5e20: 70 45 6e 76 20 3d 20 70 45 6e 76 3b 0a 20 20 49  pEnv = pEnv;.  I
5e30: 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61  nitializeCritica
5e40: 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75 74 65 78  lSection(&pMutex
5e50: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2a 70 70  ->mutex);..  *pp
5e60: 4e 65 77 20 3d 20 28 6c 73 6d 5f 6d 75 74 65 78  New = (lsm_mutex
5e70: 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 72 65 74   *)pMutex;.  ret
5e80: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
5e90: 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69  tatic void lsmWi
5ea0: 6e 33 32 4f 73 4d 75 74 65 78 44 65 6c 28 6c 73  n32OsMutexDel(ls
5eb0: 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 57  m_mutex *p){.  W
5ec0: 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d 75 74 65  in32Mutex *pMute
5ed0: 78 20 3d 20 28 57 69 6e 33 32 4d 75 74 65 78 20  x = (Win32Mutex 
5ee0: 2a 29 70 3b 0a 20 20 44 65 6c 65 74 65 43 72 69  *)p;.  DeleteCri
5ef0: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d  ticalSection(&pM
5f00: 75 74 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  utex->mutex);.  
5f10: 6c 73 6d 46 72 65 65 28 70 4d 75 74 65 78 2d 3e  lsmFree(pMutex->
5f20: 70 45 6e 76 2c 20 70 4d 75 74 65 78 29 3b 0a 7d  pEnv, pMutex);.}
5f30: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73  ..static void ls
5f40: 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 45 6e 74  mWin32OsMutexEnt
5f50: 65 72 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 29  er(lsm_mutex *p)
5f60: 7b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a  {.  Win32Mutex *
5f70: 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d  pMutex = (Win32M
5f80: 75 74 65 78 20 2a 29 70 3b 0a 20 20 45 6e 74 65  utex *)p;.  Ente
5f90: 72 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e  rCriticalSection
5fa0: 28 26 70 4d 75 74 65 78 2d 3e 6d 75 74 65 78 29  (&pMutex->mutex)
5fb0: 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45  ;..#ifdef LSM_DE
5fc0: 42 55 47 0a 20 20 61 73 73 65 72 74 28 20 70 4d  BUG.  assert( pM
5fd0: 75 74 65 78 2d 3e 6f 77 6e 65 72 21 3d 47 65 74  utex->owner!=Get
5fe0: 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28  CurrentThreadId(
5ff0: 29 20 29 3b 0a 20 20 70 4d 75 74 65 78 2d 3e 6f  ) );.  pMutex->o
6000: 77 6e 65 72 20 3d 20 47 65 74 43 75 72 72 65 6e  wner = GetCurren
6010: 74 54 68 72 65 61 64 49 64 28 29 3b 0a 20 20 61  tThreadId();.  a
6020: 73 73 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f  ssert( pMutex->o
6030: 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74  wner==GetCurrent
6040: 54 68 72 65 61 64 49 64 28 29 20 29 3b 0a 23 65  ThreadId() );.#e
6050: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ndif.}..static i
6060: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74  nt lsmWin32OsMut
6070: 65 78 54 72 79 28 6c 73 6d 5f 6d 75 74 65 78 20  exTry(lsm_mutex 
6080: 2a 70 29 7b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  *p){.  BOOL bRet
6090: 3b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a  ;.  Win32Mutex *
60a0: 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d  pMutex = (Win32M
60b0: 75 74 65 78 20 2a 29 70 3b 0a 20 20 62 52 65 74  utex *)p;.  bRet
60c0: 20 3d 20 54 72 79 45 6e 74 65 72 43 72 69 74 69   = TryEnterCriti
60d0: 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75 74  calSection(&pMut
60e0: 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 23 69 66 64  ex->mutex);.#ifd
60f0: 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 20 20 69  ef LSM_DEBUG.  i
6100: 66 28 20 62 52 65 74 20 29 7b 0a 20 20 20 20 61  f( bRet ){.    a
6110: 73 73 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f  ssert( pMutex->o
6120: 77 6e 65 72 21 3d 47 65 74 43 75 72 72 65 6e 74  wner!=GetCurrent
6130: 54 68 72 65 61 64 49 64 28 29 20 29 3b 0a 20 20  ThreadId() );.  
6140: 20 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 20    pMutex->owner 
6150: 3d 20 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  = GetCurrentThre
6160: 61 64 49 64 28 29 3b 0a 20 20 20 20 61 73 73 65  adId();.    asse
6170: 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65  rt( pMutex->owne
6180: 72 3d 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72  r==GetCurrentThr
6190: 65 61 64 49 64 28 29 20 29 3b 0a 20 20 7d 0a 23  eadId() );.  }.#
61a0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 21  endif.  return !
61b0: 62 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bRet;.}..static 
61c0: 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32 4f 73 4d  void lsmWin32OsM
61d0: 75 74 65 78 4c 65 61 76 65 28 6c 73 6d 5f 6d 75  utexLeave(lsm_mu
61e0: 74 65 78 20 2a 70 29 7b 0a 20 20 57 69 6e 33 32  tex *p){.  Win32
61f0: 4d 75 74 65 78 20 2a 70 4d 75 74 65 78 20 3d 20  Mutex *pMutex = 
6200: 28 57 69 6e 33 32 4d 75 74 65 78 20 2a 29 70 3b  (Win32Mutex *)p;
6210: 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55  .#ifdef LSM_DEBU
6220: 47 0a 20 20 61 73 73 65 72 74 28 20 70 4d 75 74  G.  assert( pMut
6230: 65 78 2d 3e 6f 77 6e 65 72 3d 3d 47 65 74 43 75  ex->owner==GetCu
6240: 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 20  rrentThreadId() 
6250: 29 3b 0a 20 20 70 4d 75 74 65 78 2d 3e 6f 77 6e  );.  pMutex->own
6260: 65 72 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  er = 0;.  assert
6270: 28 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 21  ( pMutex->owner!
6280: 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  =GetCurrentThrea
6290: 64 49 64 28 29 20 29 3b 0a 23 65 6e 64 69 66 0a  dId() );.#endif.
62a0: 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c 53    LeaveCriticalS
62b0: 65 63 74 69 6f 6e 28 26 70 4d 75 74 65 78 2d 3e  ection(&pMutex->
62c0: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 23 69 66 64 65  mutex);.}..#ifde
62d0: 66 20 4c 53 4d 5f 44 45 42 55 47 0a 73 74 61 74  f LSM_DEBUG.stat
62e0: 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f  ic int lsmWin32O
62f0: 73 4d 75 74 65 78 48 65 6c 64 28 6c 73 6d 5f 6d  sMutexHeld(lsm_m
6300: 75 74 65 78 20 2a 70 29 7b 0a 20 20 57 69 6e 33  utex *p){.  Win3
6310: 32 4d 75 74 65 78 20 2a 70 4d 75 74 65 78 20 3d  2Mutex *pMutex =
6320: 20 28 57 69 6e 33 32 4d 75 74 65 78 20 2a 29 70   (Win32Mutex *)p
6330: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 75 74 65  ;.  return pMute
6340: 78 20 3f 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65  x ? pMutex->owne
6350: 72 3d 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72  r==GetCurrentThr
6360: 65 61 64 49 64 28 29 20 3a 20 31 3b 0a 7d 0a 73  eadId() : 1;.}.s
6370: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
6380: 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48 65 6c 64  32OsMutexNotHeld
6390: 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  (lsm_mutex *p){.
63a0: 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d    Win32Mutex *pM
63b0: 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d 75 74  utex = (Win32Mut
63c0: 65 78 20 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e  ex *)p;.  return
63d0: 20 70 4d 75 74 65 78 20 3f 20 70 4d 75 74 65 78   pMutex ? pMutex
63e0: 2d 3e 6f 77 6e 65 72 21 3d 47 65 74 43 75 72 72  ->owner!=GetCurr
63f0: 65 6e 74 54 68 72 65 61 64 49 64 28 29 20 3a 20  entThreadId() : 
6400: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  1;.}.#endif./*.*
6410: 2a 20 45 6e 64 20 6f 66 20 70 74 68 72 65 61 64  * End of pthread
6420: 73 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  s mutex implemen
6430: 74 61 74 69 6f 6e 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  tation..********
6440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6480: 2a 2f 0a 23 65 6c 73 65 0a 2f 2a 2a 2a 2a 2a 2a  */.#else./******
6490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64d0: 2a 2a 2a 0a 2a 2a 20 4e 6f 6f 70 20 6d 75 74 65  ***.** Noop mute
64e0: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
64f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
6500: 63 74 20 4e 6f 6f 70 4d 75 74 65 78 20 4e 6f 6f  ct NoopMutex Noo
6510: 70 4d 75 74 65 78 3b 0a 73 74 72 75 63 74 20 4e  pMutex;.struct N
6520: 6f 6f 70 4d 75 74 65 78 20 7b 0a 20 20 6c 73 6d  oopMutex {.  lsm
6530: 5f 65 6e 76 20 2a 70 45 6e 76 3b 20 20 20 20 20  _env *pEnv;     
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6550: 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 68 61 6e 64  Environment hand
6560: 6c 65 20 28 66 6f 72 20 78 46 72 65 65 28 29 29  le (for xFree())
6570: 20 2a 2f 0a 20 20 69 6e 74 20 62 48 65 6c 64 3b   */.  int bHeld;
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
65a0: 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 2a   mutex is held *
65b0: 2f 0a 20 20 69 6e 74 20 62 53 74 61 74 69 63 3b  /.  int bStatic;
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
65e0: 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  a static mutex *
65f0: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4e 6f 6f 70  /.};.static Noop
6600: 4d 75 74 65 78 20 61 53 74 61 74 69 63 4e 6f 6f  Mutex aStaticNoo
6610: 70 4d 75 74 65 78 5b 32 5d 20 3d 20 7b 0a 20 20  pMutex[2] = {.  
6620: 7b 30 2c 20 30 2c 20 31 7d 2c 0a 20 20 7b 30 2c  {0, 0, 1},.  {0,
6630: 20 30 2c 20 31 7d 2c 0a 7d 3b 0a 0a 73 74 61 74   0, 1},.};..stat
6640: 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f  ic int lsmWin32O
6650: 73 4d 75 74 65 78 53 74 61 74 69 63 28 0a 20 20  sMutexStatic(.  
6660: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a 20  lsm_env *pEnv,. 
6670: 20 69 6e 74 20 69 4d 75 74 65 78 2c 0a 20 20 6c   int iMutex,.  l
6680: 73 6d 5f 6d 75 74 65 78 20 2a 2a 70 70 53 74 61  sm_mutex **ppSta
6690: 74 69 63 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  tic.){.  assert(
66a0: 20 69 4d 75 74 65 78 3e 3d 31 20 26 26 20 69 4d   iMutex>=1 && iM
66b0: 75 74 65 78 3c 3d 28 69 6e 74 29 61 72 72 61 79  utex<=(int)array
66c0: 5f 73 69 7a 65 28 61 53 74 61 74 69 63 4e 6f 6f  _size(aStaticNoo
66d0: 70 4d 75 74 65 78 29 20 29 3b 0a 20 20 2a 70 70  pMutex) );.  *pp
66e0: 53 74 61 74 69 63 20 3d 20 28 6c 73 6d 5f 6d 75  Static = (lsm_mu
66f0: 74 65 78 20 2a 29 26 61 53 74 61 74 69 63 4e 6f  tex *)&aStaticNo
6700: 6f 70 4d 75 74 65 78 5b 69 4d 75 74 65 78 2d 31  opMutex[iMutex-1
6710: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  ];.  return LSM_
6720: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
6730: 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78   lsmWin32OsMutex
6740: 4e 65 77 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  New(lsm_env *pEn
6750: 76 2c 20 6c 73 6d 5f 6d 75 74 65 78 20 2a 2a 70  v, lsm_mutex **p
6760: 70 4e 65 77 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74  pNew){.  NoopMut
6770: 65 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 4e 6f  ex *p;.  p = (No
6780: 6f 70 4d 75 74 65 78 20 2a 29 6c 73 6d 4d 61 6c  opMutex *)lsmMal
6790: 6c 6f 63 5a 65 72 6f 28 70 45 6e 76 2c 20 73 69  locZero(pEnv, si
67a0: 7a 65 6f 66 28 4e 6f 6f 70 4d 75 74 65 78 29 29  zeof(NoopMutex))
67b0: 3b 0a 20 20 69 66 28 20 70 20 29 20 70 2d 3e 70  ;.  if( p ) p->p
67c0: 45 6e 76 20 3d 20 70 45 6e 76 3b 0a 20 20 2a 70  Env = pEnv;.  *p
67d0: 70 4e 65 77 20 3d 20 28 6c 73 6d 5f 6d 75 74 65  pNew = (lsm_mute
67e0: 78 20 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e 20  x *)p;.  return 
67f0: 28 70 20 3f 20 4c 53 4d 5f 4f 4b 20 3a 20 4c 53  (p ? LSM_OK : LS
6800: 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d  M_NOMEM_BKPT);.}
6810: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d  .static void lsm
6820: 57 69 6e 33 32 4f 73 4d 75 74 65 78 44 65 6c 28  Win32OsMutexDel(
6830: 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65  lsm_mutex *pMute
6840: 78 29 20 20 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65  x)  {.  NoopMute
6850: 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65  x *p = (NoopMute
6860: 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 61 73  x *)pMutex;.  as
6870: 73 65 72 74 28 20 70 2d 3e 62 53 74 61 74 69 63  sert( p->bStatic
6880: 3d 3d 30 20 26 26 20 70 2d 3e 70 45 6e 76 20 29  ==0 && p->pEnv )
6890: 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70 2d 3e 70  ;.  lsmFree(p->p
68a0: 45 6e 76 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  Env, p);.}.stati
68b0: 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32 4f  c void lsmWin32O
68c0: 73 4d 75 74 65 78 45 6e 74 65 72 28 6c 73 6d 5f  sMutexEnter(lsm_
68d0: 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a  mutex *pMutex){.
68e0: 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a 70 20 3d    NoopMutex *p =
68f0: 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a 29 70 4d   (NoopMutex *)pM
6900: 75 74 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20  utex;.  assert( 
6910: 70 2d 3e 62 48 65 6c 64 3d 3d 30 20 29 3b 0a 20  p->bHeld==0 );. 
6920: 20 70 2d 3e 62 48 65 6c 64 20 3d 20 31 3b 0a 7d   p->bHeld = 1;.}
6930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57  .static int lsmW
6940: 69 6e 33 32 4f 73 4d 75 74 65 78 54 72 79 28 6c  in32OsMutexTry(l
6950: 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78  sm_mutex *pMutex
6960: 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a  ){.  NoopMutex *
6970: 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a  p = (NoopMutex *
6980: 29 70 4d 75 74 65 78 3b 0a 20 20 61 73 73 65 72  )pMutex;.  asser
6990: 74 28 20 70 2d 3e 62 48 65 6c 64 3d 3d 30 20 29  t( p->bHeld==0 )
69a0: 3b 0a 20 20 70 2d 3e 62 48 65 6c 64 20 3d 20 31  ;.  p->bHeld = 1
69b0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
69c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57  static void lsmW
69d0: 69 6e 33 32 4f 73 4d 75 74 65 78 4c 65 61 76 65  in32OsMutexLeave
69e0: 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74  (lsm_mutex *pMut
69f0: 65 78 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78  ex){.  NoopMutex
6a00: 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78   *p = (NoopMutex
6a10: 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 61 73 73   *)pMutex;.  ass
6a20: 65 72 74 28 20 70 2d 3e 62 48 65 6c 64 3d 3d 31  ert( p->bHeld==1
6a30: 20 29 3b 0a 20 20 70 2d 3e 62 48 65 6c 64 20 3d   );.  p->bHeld =
6a40: 20 30 3b 0a 7d 0a 23 69 66 64 65 66 20 4c 53 4d   0;.}.#ifdef LSM
6a50: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
6a60: 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65  t lsmWin32OsMute
6a70: 78 48 65 6c 64 28 6c 73 6d 5f 6d 75 74 65 78 20  xHeld(lsm_mutex 
6a80: 2a 70 4d 75 74 65 78 29 7b 0a 20 20 4e 6f 6f 70  *pMutex){.  Noop
6a90: 4d 75 74 65 78 20 2a 70 20 3d 20 28 4e 6f 6f 70  Mutex *p = (Noop
6aa0: 4d 75 74 65 78 20 2a 29 70 4d 75 74 65 78 3b 0a  Mutex *)pMutex;.
6ab0: 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e    return p ? p->
6ac0: 62 48 65 6c 64 20 3a 20 31 3b 0a 7d 0a 73 74 61  bHeld : 1;.}.sta
6ad0: 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32  tic int lsmWin32
6ae0: 4f 73 4d 75 74 65 78 4e 6f 74 48 65 6c 64 28 6c  OsMutexNotHeld(l
6af0: 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78  sm_mutex *pMutex
6b00: 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a  ){.  NoopMutex *
6b10: 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a  p = (NoopMutex *
6b20: 29 70 4d 75 74 65 78 3b 0a 20 20 72 65 74 75 72  )pMutex;.  retur
6b30: 6e 20 70 20 3f 20 21 70 2d 3e 62 48 65 6c 64 20  n p ? !p->bHeld 
6b40: 3a 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  : 1;.}.#endif./*
6b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
6ba0: 69 66 20 2f 2a 20 65 6c 73 65 20 4c 53 4d 5f 4d  if /* else LSM_M
6bb0: 55 54 45 58 5f 4e 4f 4e 45 20 2a 2f 0a 0a 2f 2a  UTEX_NONE */../*
6bc0: 20 57 69 74 68 6f 75 74 20 4c 53 4d 5f 44 45 42   Without LSM_DEB
6bd0: 55 47 2c 20 74 68 65 20 4d 75 74 65 78 48 65 6c  UG, the MutexHel
6be0: 64 20 74 65 73 74 73 20 61 72 65 20 6e 65 76 65  d tests are neve
6bf0: 72 20 63 61 6c 6c 65 64 20 2a 2f 0a 23 69 66 6e  r called */.#ifn
6c00: 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 23 20  def LSM_DEBUG.# 
6c10: 64 65 66 69 6e 65 20 6c 73 6d 57 69 6e 33 32 4f  define lsmWin32O
6c20: 73 4d 75 74 65 78 48 65 6c 64 20 20 20 20 30 0a  sMutexHeld    0.
6c30: 23 20 64 65 66 69 6e 65 20 6c 73 6d 57 69 6e 33  # define lsmWin3
6c40: 32 4f 73 4d 75 74 65 78 4e 6f 74 48 65 6c 64 20  2OsMutexNotHeld 
6c50: 30 0a 23 65 6e 64 69 66 0a 0a 6c 73 6d 5f 65 6e  0.#endif..lsm_en
6c60: 76 20 2a 6c 73 6d 5f 64 65 66 61 75 6c 74 5f 65  v *lsm_default_e
6c70: 6e 76 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nv(void){.  stat
6c80: 69 63 20 6c 73 6d 5f 65 6e 76 20 77 69 6e 33 32  ic lsm_env win32
6c90: 5f 65 6e 76 20 3d 20 7b 0a 20 20 20 20 73 69 7a  _env = {.    siz
6ca0: 65 6f 66 28 6c 73 6d 5f 65 6e 76 29 2c 20 20 20  eof(lsm_env),   
6cb0: 20 20 20 20 20 20 2f 2a 20 6e 42 79 74 65 20 2a        /* nByte *
6cc0: 2f 0a 20 20 20 20 31 2c 20 20 20 20 20 20 20 20  /.    1,        
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ce0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
6cf0: 20 20 2f 2a 2a 2a 2a 2a 20 66 69 6c 65 20 69 2f    /***** file i/
6d00: 6f 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  o **************
6d10: 2a 2a 2a 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  ****/.    0,    
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 2f 2a 20 70 56 66 73 43 74 78 20 2a 2f     /* pVfsCtx */
6d40: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 46  .    lsmWin32OsF
6d50: 75 6c 6c 70 61 74 68 2c 20 20 20 20 20 20 2f 2a  ullpath,      /*
6d60: 20 78 46 75 6c 6c 70 61 74 68 20 2a 2f 0a 20 20   xFullpath */.  
6d70: 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4f 70 65 6e    lsmWin32OsOpen
6d80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f  ,          /* xO
6d90: 70 65 6e 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  pen */.    lsmWi
6da0: 6e 33 32 4f 73 52 65 61 64 2c 20 20 20 20 20 20  n32OsRead,      
6db0: 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
6dc0: 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 57 72      lsmWin32OsWr
6dd0: 69 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ite,         /* 
6de0: 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 6c 73  xWrite */.    ls
6df0: 6d 57 69 6e 33 32 4f 73 54 72 75 6e 63 61 74 65  mWin32OsTruncate
6e00: 2c 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63  ,      /* xTrunc
6e10: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  ate */.    lsmWi
6e20: 6e 33 32 4f 73 53 79 6e 63 2c 20 20 20 20 20 20  n32OsSync,      
6e30: 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
6e40: 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 53 65      lsmWin32OsSe
6e50: 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 2f 2a 20  ctorSize,    /* 
6e60: 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
6e70: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 52 65 6d     lsmWin32OsRem
6e80: 61 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ap,         /* x
6e90: 52 65 6d 61 70 20 2a 2f 0a 20 20 20 20 6c 73 6d  Remap */.    lsm
6ea0: 57 69 6e 33 32 4f 73 46 69 6c 65 69 64 2c 20 20  Win32OsFileid,  
6eb0: 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 69 64        /* xFileid
6ec0: 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32   */.    lsmWin32
6ed0: 4f 73 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  OsClose,        
6ee0: 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
6ef0: 20 20 6c 73 6d 57 69 6e 33 32 4f 73 55 6e 6c 69    lsmWin32OsUnli
6f00: 6e 6b 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 55  nk,        /* xU
6f10: 6e 6c 69 6e 6b 20 2a 2f 0a 20 20 20 20 6c 73 6d  nlink */.    lsm
6f20: 57 69 6e 33 32 4f 73 4c 6f 63 6b 2c 20 20 20 20  Win32OsLock,    
6f30: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
6f40: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
6f50: 54 65 73 74 4c 6f 63 6b 2c 20 20 20 20 20 20 2f  TestLock,      /
6f60: 2a 20 78 54 65 73 74 4c 6f 63 6b 20 2a 2f 0a 20  * xTestLock */. 
6f70: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d     lsmWin32OsShm
6f80: 4d 61 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  Map,        /* x
6f90: 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20 20 6c 73  ShmMap */.    ls
6fa0: 6d 57 69 6e 33 32 4f 73 53 68 6d 42 61 72 72 69  mWin32OsShmBarri
6fb0: 65 72 2c 20 20 20 20 2f 2a 20 78 53 68 6d 42 61  er,    /* xShmBa
6fc0: 72 72 69 65 72 20 2a 2f 0a 20 20 20 20 6c 73 6d  rrier */.    lsm
6fd0: 57 69 6e 33 32 4f 73 53 68 6d 55 6e 6d 61 70 2c  Win32OsShmUnmap,
6fe0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
6ff0: 61 70 20 2a 2f 0a 20 20 20 20 2f 2a 2a 2a 2a 2a  ap */.    /*****
7000: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
7010: 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20  on *********/.  
7020: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
7030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4d             /* pM
7040: 65 6d 43 74 78 20 2a 2f 0a 20 20 20 20 6c 73 6d  emCtx */.    lsm
7050: 57 69 6e 33 32 4f 73 4d 61 6c 6c 6f 63 2c 20 20  Win32OsMalloc,  
7060: 20 20 20 20 20 20 2f 2a 20 78 4d 61 6c 6c 6f 63        /* xMalloc
7070: 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32   */.    lsmWin32
7080: 4f 73 52 65 61 6c 6c 6f 63 2c 20 20 20 20 20 20  OsRealloc,      
7090: 20 2f 2a 20 78 52 65 61 6c 6c 6f 63 20 2a 2f 0a   /* xRealloc */.
70a0: 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 46 72      lsmWin32OsFr
70b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
70c0: 78 46 72 65 65 20 2a 2f 0a 20 20 20 20 6c 73 6d  xFree */.    lsm
70d0: 57 69 6e 33 32 4f 73 4d 53 69 7a 65 2c 20 20 20  Win32OsMSize,   
70e0: 20 20 20 20 20 20 2f 2a 20 78 53 69 7a 65 20 2a        /* xSize *
70f0: 2f 0a 20 20 20 20 2f 2a 2a 2a 2a 2a 20 6d 75 74  /.    /***** mut
7100: 65 78 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  exes ***********
7110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20  **********/.    
7120: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7130: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4d 75 74           /* pMut
7140: 65 78 43 74 78 20 2a 2f 0a 20 20 20 20 6c 73 6d  exCtx */.    lsm
7150: 57 69 6e 33 32 4f 73 4d 75 74 65 78 53 74 61 74  Win32OsMutexStat
7160: 69 63 2c 20 20 20 2f 2a 20 78 4d 75 74 65 78 53  ic,   /* xMutexS
7170: 74 61 74 69 63 20 2a 2f 0a 20 20 20 20 6c 73 6d  tatic */.    lsm
7180: 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e 65 77 2c  Win32OsMutexNew,
7190: 20 20 20 20 20 20 2f 2a 20 78 4d 75 74 65 78 4e        /* xMutexN
71a0: 65 77 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  ew */.    lsmWin
71b0: 33 32 4f 73 4d 75 74 65 78 44 65 6c 2c 20 20 20  32OsMutexDel,   
71c0: 20 20 20 2f 2a 20 78 4d 75 74 65 78 44 65 6c 20     /* xMutexDel 
71d0: 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f  */.    lsmWin32O
71e0: 73 4d 75 74 65 78 45 6e 74 65 72 2c 20 20 20 20  sMutexEnter,    
71f0: 2f 2a 20 78 4d 75 74 65 78 45 6e 74 65 72 20 2a  /* xMutexEnter *
7200: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
7210: 4d 75 74 65 78 54 72 79 2c 20 20 20 20 20 20 2f  MutexTry,      /
7220: 2a 20 78 4d 75 74 65 78 54 72 79 20 2a 2f 0a 20  * xMutexTry */. 
7230: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74     lsmWin32OsMut
7240: 65 78 4c 65 61 76 65 2c 20 20 20 20 2f 2a 20 78  exLeave,    /* x
7250: 4d 75 74 65 78 4c 65 61 76 65 20 2a 2f 0a 20 20  MutexLeave */.  
7260: 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65    lsmWin32OsMute
7270: 78 48 65 6c 64 2c 20 20 20 20 20 2f 2a 20 78 4d  xHeld,     /* xM
7280: 75 74 65 78 48 65 6c 64 20 2a 2f 0a 20 20 20 20  utexHeld */.    
7290: 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e  lsmWin32OsMutexN
72a0: 6f 74 48 65 6c 64 2c 20 20 2f 2a 20 78 4d 75 74  otHeld,  /* xMut
72b0: 65 78 4e 6f 74 48 65 6c 64 20 2a 2f 0a 20 20 20  exNotHeld */.   
72c0: 20 2f 2a 2a 2a 2a 2a 20 6f 74 68 65 72 20 2a 2a   /***** other **
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33  ***/.    lsmWin3
72f0: 32 4f 73 53 6c 65 65 70 2c 20 20 20 20 20 20 20  2OsSleep,       
7300: 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
7310: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
7320: 6e 33 32 5f 65 6e 76 3b 0a 7d 0a 0a 23 65 6e 64  n32_env;.}..#end
7330: 69 66 0a                                         if.