/ Hex Artifact Content
Login

Artifact 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c:


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 53 59 53 54 45 4d 5f 49 4e   */..  SYSTEM_IN
03e0: 46 4f 20 73 79 73 49 6e 66 6f 3b 20 20 20 20 20  FO sysInfo;     
03f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
0400: 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 66 6f 72  ing system infor
0410: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 48 41 4e 44  mation */.  HAND
0420: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
0430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
0440: 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 6d  ile handle for m
0450: 61 70 70 69 6e 67 20 2a 2f 0a 20 20 4c 50 56 4f  apping */.  LPVO
0460: 49 44 20 70 4d 61 70 3b 20 20 20 20 20 20 20 20  ID pMap;        
0470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
0480: 6f 69 6e 74 65 72 20 74 6f 20 6d 61 70 70 69 6e  ointer to mappin
0490: 67 20 6f 66 20 66 69 6c 65 20 66 64 20 2a 2f 0a  g of file fd */.
04a0: 20 20 73 69 7a 65 5f 74 20 6e 4d 61 70 3b 20 20    size_t nMap;  
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 70    /* Size of map
04d0: 70 69 6e 67 20 61 74 20 70 4d 61 70 20 69 6e 20  ping at pMap in 
04e0: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
04f0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
0500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0510: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
0520: 69 6e 20 61 68 53 68 6d 5b 5d 2f 61 70 53 68 6d  in ahShm[]/apShm
0530: 5b 5d 20 2a 2f 0a 20 20 4c 50 48 41 4e 44 4c 45  [] */.  LPHANDLE
0540: 20 61 68 53 68 6d 3b 20 20 20 20 20 20 20 20 20   ahShm;         
0550: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
0560: 20 6f 66 20 68 61 6e 64 6c 65 73 20 66 6f 72 20   of handles for 
0570: 73 68 61 72 65 64 20 6d 61 70 70 69 6e 67 73 20  shared mappings 
0580: 2a 2f 0a 20 20 4c 50 56 4f 49 44 20 2a 61 70 53  */.  LPVOID *apS
0590: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
05a0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
05b0: 20 33 32 4b 20 73 68 61 72 65 64 20 6d 65 6d 6f   32K shared memo
05c0: 72 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 7d  ry segments */.}
05d0: 3b 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  ;..static char *
05e0: 77 69 6e 33 32 53 68 6d 46 69 6c 65 28 57 69 6e  win32ShmFile(Win
05f0: 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69  32File *pWin32Fi
0600: 6c 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 68  le){.  char *zSh
0610: 6d 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  m;.  int nName =
0620: 20 73 74 72 6c 65 6e 28 70 57 69 6e 33 32 46 69   strlen(pWin32Fi
0630: 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53  le->zName);.  zS
0640: 68 6d 20 3d 20 28 63 68 61 72 20 2a 29 6c 73 6d  hm = (char *)lsm
0650: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 57 69 6e 33  MallocZero(pWin3
0660: 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 6e 4e 61  2File->pEnv, nNa
0670: 6d 65 2b 34 2b 31 29 3b 0a 20 20 69 66 28 20 7a  me+4+1);.  if( z
0680: 53 68 6d 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  Shm ){.    memcp
0690: 79 28 7a 53 68 6d 2c 20 70 57 69 6e 33 32 46 69  y(zShm, pWin32Fi
06a0: 6c 65 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  le->zName, nName
06b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
06c0: 53 68 6d 5b 6e 4e 61 6d 65 5d 2c 20 22 2d 73 68  Shm[nName], "-sh
06d0: 6d 22 2c 20 35 29 3b 0a 20 20 7d 0a 20 20 72 65  m", 5);.  }.  re
06e0: 74 75 72 6e 20 7a 53 68 6d 3b 0a 7d 0a 0a 73 74  turn zShm;.}..st
06f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 53 6c  atic int win32Sl
0700: 65 65 70 28 69 6e 74 20 75 73 29 7b 0a 20 20 53  eep(int us){.  S
0710: 6c 65 65 70 28 28 75 73 20 2b 20 39 39 39 29 20  leep((us + 999) 
0720: 2f 20 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  / 1000);.  retur
0730: 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n LSM_OK;.}../*.
0740: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
0750: 20 74 69 6d 65 73 20 74 68 61 74 20 61 6e 20 49   times that an I
0760: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  /O operation wil
0770: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
0780: 6c 6f 77 69 6e 67 20 61 0a 2a 2a 20 6c 6f 63 6b  lowing a.** lock
0790: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
07a0: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20 61  ably caused by a
07b0: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
07c0: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
07d0: 74 69 61 6c 0a 2a 2a 20 64 65 6c 61 79 20 62 65  tial.** delay be
07e0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
07f0: 65 74 72 79 2e 20 20 54 68 65 20 64 65 6c 61 79  etry.  The delay
0800: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
0810: 72 6c 79 20 77 69 74 68 20 65 61 63 68 0a 2a 2a  rly with each.**
0820: 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64   retry..*/.#ifnd
0830: 65 66 20 4c 53 4d 5f 57 49 4e 33 32 5f 49 4f 45  ef LSM_WIN32_IOE
0840: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
0850: 65 20 4c 53 4d 5f 57 49 4e 33 32 5f 49 4f 45 52  e LSM_WIN32_IOER
0860: 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69  R_RETRY 10.#endi
0870: 66 0a 23 69 66 6e 64 65 66 20 4c 53 4d 5f 57 49  f.#ifndef LSM_WI
0880: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
0890: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 4c  DELAY.# define L
08a0: 53 4d 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  SM_WIN32_IOERR_R
08b0: 45 54 52 59 5f 44 45 4c 41 59 20 32 35 30 30 30  ETRY_DELAY 25000
08c0: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
08d0: 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74  nt win32IoerrRet
08e0: 72 79 20 3d 20 4c 53 4d 5f 57 49 4e 33 32 5f 49  ry = LSM_WIN32_I
08f0: 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
0900: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
0910: 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 4c 53  rRetryDelay = LS
0920: 4d 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  M_WIN32_IOERR_RE
0930: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
0940: 2a 20 54 68 65 20 22 77 69 6e 33 32 49 6f 65 72  * The "win32Ioer
0950: 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
0960: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  o is used to det
0970: 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74  ermine if a part
0980: 69 63 75 6c 61 72 0a 2a 2a 20 49 2f 4f 20 65 72  icular.** I/O er
0990: 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65  ror code obtaine
09a0: 64 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72  d via GetLastErr
09b0: 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65  or() is eligible
09c0: 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 0a   to be retried..
09d0: 2a 2a 20 49 74 20 6d 75 73 74 20 61 63 63 65 70  ** It must accep
09e0: 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  t the error code
09f0: 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e   DWORD as its on
0a00: 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ly argument and 
0a10: 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 74 75 72 6e  should.** return
0a20: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
0a30: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74   error code is t
0a40: 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75  ransient in natu
0a50: 72 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  re and the.** op
0a60: 65 72 61 74 69 6f 6e 20 72 65 73 70 6f 6e 73 69  eration responsi
0a70: 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69  ble for generati
0a80: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ng the original 
0a90: 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63  error might succ
0aa0: 65 65 64 0a 2a 2a 20 75 70 6f 6e 20 62 65 69 6e  eed.** upon bein
0ab0: 67 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20  g retried.  The 
0ac0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
0ad0: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
0ae0: 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a   a variable..**.
0af0: 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  ** Additionally,
0b00: 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22   a macro named "
0b10: 77 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74  win32IoerrCanRet
0b20: 72 79 32 22 20 6d 61 79 20 62 65 20 64 65 66 69  ry2" may be defi
0b30: 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 69 74 20 69  ned.  If.** it i
0b40: 73 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69  s defined, it wi
0b50: 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20  ll be consulted 
0b60: 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61  only when the ma
0b70: 63 72 6f 0a 2a 2a 20 22 77 69 6e 33 32 49 6f 65  cro.** "win32Ioe
0b80: 72 72 43 61 6e 52 65 74 72 79 31 22 20 72 65 74  rrCanRetry1" ret
0b90: 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  urns zero.  The 
0ba0: 22 77 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65  "win32IoerrCanRe
0bb0: 74 72 79 32 22 20 6d 61 63 72 6f 0a 2a 2a 20 69  try2" macro.** i
0bc0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
0bd0: 69 6f 6e 61 6c 20 61 6e 64 20 6d 61 79 20 62 65  ional and may be
0be0: 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   used to include
0bf0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f   additional erro
0c00: 72 0a 2a 2a 20 63 6f 64 65 73 20 69 6e 20 74 68  r.** codes in th
0c10: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
0c20: 64 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  d result in the 
0c30: 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72  failing I/O oper
0c40: 61 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ation being.** r
0c50: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
0c60: 6c 6c 65 72 2e 20 20 49 66 20 64 65 66 69 6e 65  ller.  If define
0c70: 64 2c 20 74 68 65 20 22 77 69 6e 33 32 49 6f 65  d, the "win32Ioe
0c80: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63  rrCanRetry2" mac
0c90: 72 6f 0a 2a 2a 20 6d 75 73 74 20 65 78 68 69 62  ro.** must exhib
0ca0: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
0cb0: 6e 74 69 63 73 20 69 64 65 6e 74 69 63 61 6c 20  ntics identical 
0cc0: 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65 0a  to those of the.
0cd0: 2a 2a 20 22 77 69 6e 33 32 49 6f 65 72 72 43 61  ** "win32IoerrCa
0ce0: 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a  nRetry1" macro..
0cf0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0d00: 77 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74  win32IoerrCanRet
0d10: 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  ry1).#define win
0d20: 33 32 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  32IoerrCanRetry1
0d30: 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52  (a) (((a)==ERROR
0d40: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20  _ACCESS_DENIED) 
0d50: 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
0d80: 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f  ==ERROR_SHARING_
0d90: 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c  VIOLATION)    ||
0da0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c     ((a)==ERROR_L
0dd0: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20  OCK_VIOLATION)  
0de0: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
0e10: 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58  ERROR_DEV_NOT_EX
0e20: 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IST)        || \
0e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e50: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
0e60: 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
0e70: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
0ea0: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
0eb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0ee0: 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f  (a)==ERROR_NETWO
0ef0: 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29  RK_UNREACHABLE))
0f00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0f10: 66 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  f an I/O error o
0f20: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
0f30: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 65  is routine to se
0f40: 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62  e if it should b
0f50: 65 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 52  e.** retried.  R
0f60: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
0f70: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
0f80: 53 45 20 74 6f 20 67 69 76 65 20 75 70 20 77 69  SE to give up wi
0f90: 74 68 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a  th an.** error..
0fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
0fb0: 6e 33 32 52 65 74 72 79 49 6f 65 72 72 28 0a 20  n32RetryIoerr(. 
0fc0: 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a   lsm_env *pEnv,.
0fd0: 20 20 69 6e 74 20 2a 70 6e 52 65 74 72 79 0a 29    int *pnRetry.)
0fe0: 7b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  {.  DWORD lastEr
0ff0: 72 6e 6f 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  rno;.  if( *pnRe
1000: 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52  try>=win32IoerrR
1010: 65 74 72 79 20 29 7b 0a 20 20 20 20 72 65 74 75  etry ){.    retu
1020: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6c 61 73 74  rn 0;.  }.  last
1030: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
1040: 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 77 69  rror();.  if( wi
1050: 6e 33 32 49 6f 65 72 72 43 61 6e 52 65 74 72 79  n32IoerrCanRetry
1060: 31 28 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a  1(lastErrno) ){.
1070: 20 20 20 20 77 69 6e 33 32 53 6c 65 65 70 28 77      win32Sleep(w
1080: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
1090: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
10a0: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
10b0: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
10c0: 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
10d0: 28 77 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65  (win32IoerrCanRe
10e0: 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28  try2).  else if(
10f0: 20 77 69 6e 33 32 49 6f 65 72 72 43 61 6e 52 65   win32IoerrCanRe
1100: 74 72 79 32 28 6c 61 73 74 45 72 72 6e 6f 29 20  try2(lastErrno) 
1110: 29 7b 0a 20 20 20 20 77 69 6e 33 32 53 6c 65 65  ){.    win32Slee
1120: 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  p(win32IoerrRetr
1130: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
1140: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
1150: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
1160: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
1170: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1180: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
1190: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
11a0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2e  crosoft Unicode.
11b0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
11c0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
11d0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
11e0: 69 6e 65 64 20 66 72 6f 6d 20 6c 73 6d 4d 61 6c  ined from lsmMal
11f0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
1200: 20 4c 50 57 53 54 52 20 77 69 6e 33 32 55 74 66   LPWSTR win32Utf
1210: 38 54 6f 55 6e 69 63 6f 64 65 28 6c 73 6d 5f 65  8ToUnicode(lsm_e
1220: 6e 76 20 2a 70 45 6e 76 2c 20 63 6f 6e 73 74 20  nv *pEnv, const 
1230: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
1240: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
1250: 53 54 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a  STR zWideText;..
1260: 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42    nChar = MultiB
1270: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1280: 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c  _UTF8, 0, zText,
1290: 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20   -1, NULL, 0);. 
12a0: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
12b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12c0: 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d   }.  zWideText =
12d0: 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70   lsmMallocZero(p
12e0: 45 6e 76 2c 20 6e 43 68 61 72 20 2a 20 73 69 7a  Env, nChar * siz
12f0: 65 6f 66 28 57 43 48 41 52 29 29 3b 0a 20 20 69  eof(WCHAR));.  i
1300: 66 28 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20  f( zWideText==0 
1310: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1320: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d  .  }.  nChar = M
1330: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1340: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
1350: 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54  Text, -1, zWideT
1360: 65 78 74 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69  ext, nChar);.  i
1370: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
1380: 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c     lsmFree(pEnv,
1390: 20 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20 20   zWideText);.   
13a0: 20 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b 0a   zWideText = 0;.
13b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
13c0: 64 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  deText;.}../*.**
13d0: 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72 6f   Convert a Micro
13e0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74 72  soft Unicode str
13f0: 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a  ing to UTF-8..**
1400: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
1410: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
1420: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
1430: 64 20 66 72 6f 6d 20 6c 73 6d 4d 61 6c 6c 6f 63  d from lsmMalloc
1440: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1450: 61 72 20 2a 77 69 6e 33 32 55 6e 69 63 6f 64 65  ar *win32Unicode
1460: 54 6f 55 74 66 38 28 6c 73 6d 5f 65 6e 76 20 2a  ToUtf8(lsm_env *
1470: 70 45 6e 76 2c 20 4c 50 43 57 53 54 52 20 7a 57  pEnv, LPCWSTR zW
1480: 69 64 65 54 65 78 74 29 7b 0a 20 20 69 6e 74 20  ideText){.  int 
1490: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
14a0: 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  Text;..  nByte =
14b0: 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69   WideCharToMulti
14c0: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
14d0: 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20   zWideText, -1, 
14e0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
14f0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
1500: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1510: 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20 6c 73 6d   }.  zText = lsm
1520: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 45 6e 76 2c  MallocZero(pEnv,
1530: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
1540: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
1550: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
1560: 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54  Byte = WideCharT
1570: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
1580: 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74  F8, 0, zWideText
1590: 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79  , -1, zText, nBy
15a0: 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  te, 0, 0);.  if(
15b0: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
15c0: 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c     lsmFree(pEnv,
15d0: 20 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65   zText);.    zTe
15e0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
15f0: 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 23  turn zText;.}..#
1600: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 33  if !defined(win3
1610: 32 49 73 4e 6f 74 46 6f 75 6e 64 29 0a 23 64 65  2IsNotFound).#de
1620: 66 69 6e 65 20 77 69 6e 33 32 49 73 4e 6f 74 46  fine win32IsNotF
1630: 6f 75 6e 64 28 61 29 20 28 28 28 61 29 3d 3d 45  ound(a) (((a)==E
1640: 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
1650: 55 4e 44 29 20 20 7c 7c 20 5c 0a 20 20 20 20 20  UND)  || \.     
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
1680: 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
1690: 44 29 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  D)).#endif..stat
16a0: 69 63 20 69 6e 74 20 77 69 6e 33 32 4f 70 65 6e  ic int win32Open
16b0: 28 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  (.  lsm_env *pEn
16c0: 76 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v,.  const char 
16d0: 2a 7a 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66 6c  *zFile,.  int fl
16e0: 61 67 73 2c 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ags,.  LPHANDLE 
16f0: 70 68 46 69 6c 65 0a 29 7b 0a 20 20 69 6e 74 20  phFile.){.  int 
1700: 72 63 3b 0a 20 20 4c 50 57 53 54 52 20 7a 43 6f  rc;.  LPWSTR zCo
1710: 6e 76 65 72 74 65 64 3b 0a 0a 20 20 7a 43 6f 6e  nverted;..  zCon
1720: 76 65 72 74 65 64 20 3d 20 77 69 6e 33 32 55 74  verted = win32Ut
1730: 66 38 54 6f 55 6e 69 63 6f 64 65 28 70 45 6e 76  f8ToUnicode(pEnv
1740: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  , zFile);.  if( 
1750: 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1760: 0a 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4e 4f  .    rc = LSM_NO
1770: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
1780: 65 7b 0a 20 20 20 20 69 6e 74 20 62 52 65 61 64  e{.    int bRead
1790: 6f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 20 26 20  only = (flags & 
17a0: 4c 53 4d 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  LSM_OPEN_READONL
17b0: 59 29 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77  Y);.    DWORD dw
17c0: 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20  DesiredAccess;. 
17d0: 20 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65     DWORD dwShare
17e0: 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
17f0: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
1800: 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 20 20 44  ARE_WRITE;.    D
1810: 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
1820: 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 20 20  isposition;.    
1830: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
1840: 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
1850: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
1860: 41 4c 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  AL;.    HANDLE h
1870: 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 52  File;.    int nR
1880: 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  etry = 0;.    if
1890: 28 20 62 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20  ( bReadonly ){. 
18a0: 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
18b0: 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
18c0: 45 41 44 3b 0a 20 20 20 20 20 20 64 77 43 72 65  EAD;.      dwCre
18d0: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
18e0: 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
18f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1900: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1910: 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1920: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1930: 45 3b 0a 20 20 20 20 20 20 64 77 43 72 65 61 74  E;.      dwCreat
1940: 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
1950: 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
1960: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
1970: 68 46 69 6c 65 20 3d 20 43 72 65 61 74 65 46 69  hFile = CreateFi
1980: 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
1990: 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
19c0: 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
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 64 77 53 68 61 72            dwShar
19f0: 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
1a00: 20 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 64 77 43               dwC
1a20: 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
1a30: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
1a60: 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
1a90: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1aa0: 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 52            win32R
1ad0: 65 74 72 79 49 6f 65 72 72 28 70 45 6e 76 2c 20  etryIoerr(pEnv, 
1ae0: 26 6e 52 65 74 72 79 29 20 29 7b 0a 20 20 20 20  &nRetry) ){.    
1af0: 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
1b00: 20 7d 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70   }.    lsmFree(p
1b10: 45 6e 76 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  Env, zConverted)
1b20: 3b 0a 20 20 20 20 69 66 28 20 68 46 69 6c 65 21  ;.    if( hFile!
1b30: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1b40: 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 2a  VALUE ){.      *
1b50: 70 68 46 69 6c 65 20 3d 20 68 46 69 6c 65 3b 0a  phFile = hFile;.
1b60: 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4f        rc = LSM_O
1b70: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b80: 20 20 20 20 69 66 28 20 77 69 6e 33 32 49 73 4e      if( win32IsN
1b90: 6f 74 46 6f 75 6e 64 28 47 65 74 4c 61 73 74 45  otFound(GetLastE
1ba0: 72 72 6f 72 28 29 29 20 29 7b 0a 20 20 20 20 20  rror()) ){.     
1bb0: 20 20 20 72 63 20 3d 20 6c 73 6d 45 72 72 6f 72     rc = lsmError
1bc0: 42 6b 70 74 28 4c 53 4d 5f 49 4f 45 52 52 5f 4e  Bkpt(LSM_IOERR_N
1bd0: 4f 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c  OENT);.      }el
1be0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1bf0: 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b   LSM_IOERR_BKPT;
1c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c20: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  }..static int ls
1c30: 6d 57 69 6e 33 32 4f 73 4f 70 65 6e 28 0a 20 20  mWin32OsOpen(.  
1c40: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a 20  lsm_env *pEnv,. 
1c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1c60: 6c 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  le,.  int flags,
1c70: 0a 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 2a 70 70  .  lsm_file **pp
1c80: 46 69 6c 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  File.){.  int rc
1c90: 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 57 69 6e   = LSM_OK;.  Win
1ca0: 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69  32File *pWin32Fi
1cb0: 6c 65 3b 0a 0a 20 20 70 57 69 6e 33 32 46 69 6c  le;..  pWin32Fil
1cc0: 65 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  e = lsmMallocZer
1cd0: 6f 28 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 57  o(pEnv, sizeof(W
1ce0: 69 6e 33 32 46 69 6c 65 29 29 3b 0a 20 20 69 66  in32File));.  if
1cf0: 28 20 70 57 69 6e 33 32 46 69 6c 65 3d 3d 30 20  ( pWin32File==0 
1d00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f  ){.    rc = LSM_
1d10: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65  NOMEM_BKPT;.  }e
1d20: 6c 73 65 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  lse{.    HANDLE 
1d30: 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  hFile = NULL;.. 
1d40: 20 20 20 72 63 20 3d 20 77 69 6e 33 32 4f 70 65     rc = win32Ope
1d50: 6e 28 70 45 6e 76 2c 20 7a 46 69 6c 65 2c 20 66  n(pEnv, zFile, f
1d60: 6c 61 67 73 2c 20 26 68 46 69 6c 65 29 3b 0a 20  lags, &hFile);. 
1d70: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1d80: 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  K ){.      memse
1d90: 74 28 26 70 57 69 6e 33 32 46 69 6c 65 2d 3e 73  t(&pWin32File->s
1da0: 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ysInfo, 0, sizeo
1db0: 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b  f(SYSTEM_INFO));
1dc0: 0a 20 20 20 20 20 20 47 65 74 53 79 73 74 65 6d  .      GetSystem
1dd0: 49 6e 66 6f 28 26 70 57 69 6e 33 32 46 69 6c 65  Info(&pWin32File
1de0: 2d 3e 73 79 73 49 6e 66 6f 29 3b 0a 20 20 20 20  ->sysInfo);.    
1df0: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45    pWin32File->pE
1e00: 6e 76 20 3d 20 70 45 6e 76 3b 0a 20 20 20 20 20  nv = pEnv;.     
1e10: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 7a 4e 61   pWin32File->zNa
1e20: 6d 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20  me = zFile;.    
1e30: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46    pWin32File->hF
1e40: 69 6c 65 20 3d 20 68 46 69 6c 65 3b 0a 20 20 20  ile = hFile;.   
1e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 73   }else{.      ls
1e60: 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 57 69 6e  mFree(pEnv, pWin
1e70: 33 32 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70  32File);.      p
1e80: 57 69 6e 33 32 46 69 6c 65 20 3d 20 30 3b 0a 20  Win32File = 0;. 
1e90: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 46 69     }.  }.  *ppFi
1ea0: 6c 65 20 3d 20 28 6c 73 6d 5f 66 69 6c 65 20 2a  le = (lsm_file *
1eb0: 29 70 57 69 6e 33 32 46 69 6c 65 3b 0a 20 20 72  )pWin32File;.  r
1ec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
1ed0: 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32  tic int lsmWin32
1ee0: 4f 73 57 72 69 74 65 28 0a 20 20 6c 73 6d 5f 66  OsWrite(.  lsm_f
1ef0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 2f 2a 20 46  ile *pFile, /* F
1f00: 69 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ile to write to 
1f10: 2a 2f 0a 20 20 6c 73 6d 5f 69 36 34 20 69 4f 66  */.  lsm_i64 iOf
1f20: 66 2c 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  f,    /* Offset 
1f30: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
1f40: 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
1f50: 20 20 2f 2a 20 57 72 69 74 65 20 64 61 74 61 20    /* Write data 
1f60: 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72  from this buffer
1f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 20   */.  int nData 
1f80: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1f90: 6f 66 20 64 61 74 61 20 74 6f 20 77 72 69 74 65  of data to write
1fa0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 33 32 46 69   */.){.  Win32Fi
1fb0: 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d  le *pWin32File =
1fc0: 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46   (Win32File *)pF
1fd0: 69 6c 65 3b 0a 20 20 4f 56 45 52 4c 41 50 50 45  ile;.  OVERLAPPE
1fe0: 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 2f  D overlapped;  /
1ff0: 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
2000: 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 20   WriteFile. */. 
2010: 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20   u8 *aRem = (u8 
2020: 2a 29 70 44 61 74 61 3b 20 2f 2a 20 44 61 74 61  *)pData; /* Data
2030: 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
2040: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  en */.  int nRem
2050: 20 3d 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   = nData;       
2060: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2070: 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
2080: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  tten */.  int nR
2090: 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
20a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
20b0: 65 74 72 79 73 20 2a 2f 0a 0a 20 20 6d 65 6d 73  etrys */..  mems
20c0: 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
20d0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
20e0: 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61  PPED));.  overla
20f0: 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
2100: 4f 4e 47 29 28 69 4f 66 66 20 26 20 30 58 46 46  ONG)(iOff & 0XFF
2110: 46 46 46 46 46 46 29 3b 0a 20 20 6f 76 65 72 6c  FFFFFF);.  overl
2120: 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
2130: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 3e   = (LONG)((iOff>
2140: 3e 33 32 29 20 26 20 30 78 37 46 46 46 46 46 46  >32) & 0x7FFFFFF
2150: 46 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  F);.  while( nRe
2160: 6d 3e 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  m>0 ){.    DWORD
2170: 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 2f 2a 20   nWrite = 0; /* 
2180: 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 75 73  Bytes written us
2190: 69 6e 67 20 57 72 69 74 65 46 69 6c 65 20 2a 2f  ing WriteFile */
21a0: 0a 20 20 20 20 69 66 28 20 21 57 72 69 74 65 46  .    if( !WriteF
21b0: 69 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e  ile(pWin32File->
21c0: 68 46 69 6c 65 2c 20 61 52 65 6d 2c 20 6e 52 65  hFile, aRem, nRe
21d0: 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65  m, &nWrite, &ove
21e0: 72 6c 61 70 70 65 64 29 20 29 7b 0a 20 20 20 20  rlapped) ){.    
21f0: 20 20 69 66 28 20 77 69 6e 33 32 52 65 74 72 79    if( win32Retry
2200: 49 6f 65 72 72 28 70 57 69 6e 33 32 46 69 6c 65  Ioerr(pWin32File
2210: 2d 3e 70 45 6e 76 2c 20 26 6e 52 65 74 72 79 29  ->pEnv, &nRetry)
2220: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2240: 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72 69      assert( nWri
2250: 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c  te==0 || nWrite<
2260: 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a  =(DWORD)nRem );.
2270: 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
2280: 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
2290: 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
22a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22b0: 20 20 69 4f 66 66 20 2b 3d 20 6e 57 72 69 74 65    iOff += nWrite
22c0: 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
22d0: 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
22e0: 28 69 4f 66 66 20 26 20 30 78 46 46 46 46 46 46  (iOff & 0xFFFFFF
22f0: 46 46 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  FF);.    overlap
2300: 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
2310: 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 3e 3e 33   (LONG)((iOff>>3
2320: 32 29 20 26 20 30 78 37 46 46 46 46 46 46 46 29  2) & 0x7FFFFFFF)
2330: 3b 0a 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57  ;.    aRem += nW
2340: 72 69 74 65 3b 0a 20 20 20 20 6e 52 65 6d 20 2d  rite;.    nRem -
2350: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 7d 0a 20 20  = nWrite;.  }.  
2360: 69 66 28 20 6e 52 65 6d 21 3d 30 20 29 20 72 65  if( nRem!=0 ) re
2370: 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42  turn LSM_IOERR_B
2380: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53  KPT;.  return LS
2390: 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  M_OK;.}..static 
23a0: 69 6e 74 20 77 69 6e 33 32 54 72 75 6e 63 61 74  int win32Truncat
23b0: 65 28 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  e(.  HANDLE hFil
23c0: 65 2c 0a 20 20 6c 73 6d 5f 69 36 34 20 6e 53 69  e,.  lsm_i64 nSi
23d0: 7a 65 0a 29 7b 0a 20 20 4c 41 52 47 45 5f 49 4e  ze.){.  LARGE_IN
23e0: 54 45 47 45 52 20 6f 66 66 73 65 74 3b 0a 20 20  TEGER offset;.  
23f0: 6f 66 66 73 65 74 2e 51 75 61 64 50 61 72 74 20  offset.QuadPart 
2400: 3d 20 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 21  = nSize;.  if( !
2410: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
2420: 28 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (hFile, offset, 
2430: 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 20 29  0, FILE_BEGIN) )
2440: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d  {.    return LSM
2450: 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 7d  _IOERR_BKPT;.  }
2460: 0a 20 20 69 66 20 28 21 53 65 74 45 6e 64 4f 66  .  if (!SetEndOf
2470: 46 69 6c 65 28 68 46 69 6c 65 29 20 29 7b 0a 20  File(hFile) ){. 
2480: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f     return LSM_IO
2490: 45 52 52 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  ERR_BKPT;.  }.  
24a0: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
24b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  ..static int lsm
24c0: 57 69 6e 33 32 4f 73 54 72 75 6e 63 61 74 65 28  Win32OsTruncate(
24d0: 0a 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69  .  lsm_file *pFi
24e0: 6c 65 2c 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77  le, /* File to w
24f0: 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 6c 73 6d  rite to */.  lsm
2500: 5f 69 36 34 20 6e 53 69 7a 65 20 20 20 20 2f 2a  _i64 nSize    /*
2510: 20 53 69 7a 65 20 74 6f 20 74 72 75 6e 63 61 74   Size to truncat
2520: 65 20 66 69 6c 65 20 74 6f 20 2a 2f 0a 29 7b 0a  e file to */.){.
2530: 20 20 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69    Win32File *pWi
2540: 6e 33 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32  n32File = (Win32
2550: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2560: 72 65 74 75 72 6e 20 77 69 6e 33 32 54 72 75 6e  return win32Trun
2570: 63 61 74 65 28 70 57 69 6e 33 32 46 69 6c 65 2d  cate(pWin32File-
2580: 3e 68 46 69 6c 65 2c 20 6e 53 69 7a 65 29 3b 0a  >hFile, nSize);.
2590: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  }..static int ls
25a0: 6d 57 69 6e 33 32 4f 73 52 65 61 64 28 0a 20 20  mWin32OsRead(.  
25b0: 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  lsm_file *pFile,
25c0: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
25d0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 6c 73 6d 5f 69   from */.  lsm_i
25e0: 36 34 20 69 4f 66 66 2c 20 20 20 20 2f 2a 20 4f  64 iOff,    /* O
25f0: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 66 72  ffset to read fr
2600: 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  om */.  void *pD
2610: 61 74 61 2c 20 20 20 20 20 2f 2a 20 52 65 61 64  ata,     /* Read
2620: 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20   data into this 
2630: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
2640: 6e 44 61 74 61 20 20 20 20 20 20 20 20 2f 2a 20  nData        /* 
2650: 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 74 6f  Bytes of data to
2660: 20 72 65 61 64 20 2a 2f 0a 29 7b 0a 20 20 57 69   read */.){.  Wi
2670: 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46  n32File *pWin32F
2680: 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69 6c 65  ile = (Win32File
2690: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 4f 56 45 52   *)pFile;.  OVER
26a0: 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
26b0: 64 3b 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74  d; /* The offset
26c0: 20 66 6f 72 20 52 65 61 64 46 69 6c 65 20 2a 2f   for ReadFile */
26d0: 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 20 3d  .  DWORD nRead =
26e0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74   0;       /* Byt
26f0: 65 73 20 72 65 61 64 20 75 73 69 6e 67 20 52 65  es read using Re
2700: 61 64 46 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  adFile */.  int 
2710: 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
2720: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2730: 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 6d 65 6d  retrys */..  mem
2740: 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
2750: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
2760: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
2770: 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
2780: 4c 4f 4e 47 29 28 69 4f 66 66 20 26 20 30 58 46  LONG)(iOff & 0XF
2790: 46 46 46 46 46 46 46 29 3b 0a 20 20 6f 76 65 72  FFFFFFF);.  over
27a0: 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
27b0: 68 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  h = (LONG)((iOff
27c0: 3e 3e 33 32 29 20 26 20 30 58 37 46 46 46 46 46  >>32) & 0X7FFFFF
27d0: 46 46 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 52  FF);.  while( !R
27e0: 65 61 64 46 69 6c 65 28 70 57 69 6e 33 32 46 69  eadFile(pWin32Fi
27f0: 6c 65 2d 3e 68 46 69 6c 65 2c 20 70 44 61 74 61  le->hFile, pData
2800: 2c 20 6e 44 61 74 61 2c 20 26 6e 52 65 61 64 2c  , nData, &nRead,
2810: 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
2820: 0a 20 20 20 20 20 20 20 20 20 47 65 74 4c 61 73  .         GetLas
2830: 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
2840: 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 20 20  HANDLE_EOF ){.  
2850: 20 20 69 66 28 20 77 69 6e 33 32 52 65 74 72 79    if( win32Retry
2860: 49 6f 65 72 72 28 70 57 69 6e 33 32 46 69 6c 65  Ioerr(pWin32File
2870: 2d 3e 70 45 6e 76 2c 20 26 6e 52 65 74 72 79 29  ->pEnv, &nRetry)
2880: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2890: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
28a0: 52 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  R_BKPT;.  }.  if
28b0: 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 6e  ( nRead<(DWORD)n
28c0: 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 55  Data ){.    /* U
28d0: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
28e0: 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
28f0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
2900: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
2910: 68 61 72 2a 29 70 44 61 74 61 29 5b 6e 52 65 61  har*)pData)[nRea
2920: 64 5d 2c 20 30 2c 20 6e 44 61 74 61 20 2d 20 6e  d], 0, nData - n
2930: 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Read);.  }.  ret
2940: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
2950: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
2960: 33 32 4f 73 53 79 6e 63 28 6c 73 6d 5f 66 69 6c  32OsSync(lsm_fil
2970: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
2980: 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 23   rc = LSM_OK;..#
2990: 69 66 6e 64 65 66 20 4c 53 4d 5f 4e 4f 5f 53 59  ifndef LSM_NO_SY
29a0: 4e 43 0a 20 20 57 69 6e 33 32 46 69 6c 65 20 2a  NC.  Win32File *
29b0: 70 57 69 6e 33 32 46 69 6c 65 20 3d 20 28 57 69  pWin32File = (Wi
29c0: 6e 33 32 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  n32File *)pFile;
29d0: 0a 0a 20 20 69 66 28 20 70 57 69 6e 33 32 46 69  ..  if( pWin32Fi
29e0: 6c 65 2d 3e 70 4d 61 70 21 3d 4e 55 4c 4c 20 29  le->pMap!=NULL )
29f0: 7b 0a 20 20 20 20 69 66 28 20 21 46 6c 75 73 68  {.    if( !Flush
2a00: 56 69 65 77 4f 66 46 69 6c 65 28 70 57 69 6e 33  ViewOfFile(pWin3
2a10: 32 46 69 6c 65 2d 3e 70 4d 61 70 2c 20 30 29 20  2File->pMap, 0) 
2a20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 4c 53  ){.      rc = LS
2a30: 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20  M_IOERR_BKPT;.  
2a40: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2a50: 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 21 46 6c 75  ==LSM_OK && !Flu
2a60: 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 57  shFileBuffers(pW
2a70: 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 29  in32File->hFile)
2a80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 4c 53 4d   ){.    rc = LSM
2a90: 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 7d  _IOERR_BKPT;.  }
2aa0: 0a 23 65 6c 73 65 0a 20 20 75 6e 75 73 65 64 5f  .#else.  unused_
2ab0: 70 61 72 61 6d 65 74 65 72 28 70 46 69 6c 65 29  parameter(pFile)
2ac0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
2ad0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
2ae0: 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 53   int lsmWin32OsS
2af0: 65 63 74 6f 72 53 69 7a 65 28 6c 73 6d 5f 66 69  ectorSize(lsm_fi
2b00: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65  le *pFile){.  re
2b10: 74 75 72 6e 20 35 31 32 3b 0a 7d 0a 0a 73 74 61  turn 512;.}..sta
2b20: 74 69 63 20 76 6f 69 64 20 77 69 6e 33 32 55 6e  tic void win32Un
2b30: 6d 61 70 28 57 69 6e 33 32 46 69 6c 65 20 2a 70  map(Win32File *p
2b40: 57 69 6e 33 32 46 69 6c 65 29 7b 0a 20 20 69 66  Win32File){.  if
2b50: 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d  ( pWin32File->pM
2b60: 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap!=NULL ){.    
2b70: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
2b80: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 4d 61 70  pWin32File->pMap
2b90: 29 3b 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c  );.    pWin32Fil
2ba0: 65 2d 3e 70 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->pMap = NULL;.
2bb0: 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e      pWin32File->
2bc0: 6e 4d 61 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  nMap = 0;.  }.  
2bd0: 69 66 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  if( pWin32File->
2be0: 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap!=NULL ){.  
2bf0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57    CloseHandle(pW
2c00: 69 6e 33 32 46 69 6c 65 2d 3e 68 4d 61 70 29 3b  in32File->hMap);
2c10: 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d  .    pWin32File-
2c20: 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
2c30: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
2c40: 6c 73 6d 57 69 6e 33 32 4f 73 52 65 6d 61 70 28  lsmWin32OsRemap(
2c50: 0a 20 20 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69  .  lsm_file *pFi
2c60: 6c 65 2c 0a 20 20 6c 73 6d 5f 69 36 34 20 69 4d  le,.  lsm_i64 iM
2c70: 69 6e 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4f  in,.  void **ppO
2c80: 75 74 2c 0a 20 20 6c 73 6d 5f 69 36 34 20 2a 70  ut,.  lsm_i64 *p
2c90: 6e 4f 75 74 0a 29 7b 0a 20 20 57 69 6e 33 32 46  nOut.){.  Win32F
2ca0: 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20  ile *pWin32File 
2cb0: 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70  = (Win32File *)p
2cc0: 46 69 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  File;..  /* If t
2cd0: 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
2ce0: 65 6e 20 30 20 61 6e 64 20 32 4d 42 20 69 6e 20  en 0 and 2MB in 
2cf0: 73 69 7a 65 2c 20 65 78 74 65 6e 64 20 69 74 20  size, extend it 
2d00: 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20 32 35 36  in chunks of 256
2d10: 4b 2e 0a 20 20 2a 2a 20 54 68 65 72 65 61 66 74  K..  ** Thereaft
2d20: 65 72 2c 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66  er, in chunks of
2d30: 20 31 4d 42 20 61 74 20 61 20 74 69 6d 65 2e 20   1MB at a time. 
2d40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2d50: 61 49 6e 63 72 53 7a 5b 5d 20 3d 20 7b 32 35 36  aIncrSz[] = {256
2d60: 2a 31 30 32 34 2c 20 31 30 32 34 2a 31 30 32 34  *1024, 1024*1024
2d70: 7d 3b 0a 20 20 69 6e 74 20 6e 49 6e 63 72 53 7a  };.  int nIncrSz
2d80: 20 3d 20 61 49 6e 63 72 53 7a 5b 69 4d 69 6e 3e   = aIncrSz[iMin>
2d90: 28 32 2a 31 30 32 34 2a 31 30 32 34 29 5d 3b 0a  (2*1024*1024)];.
2da0: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 4e 55 4c 4c  .  *ppOut = NULL
2db0: 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 30 3b 0a  ;.  *pnOut = 0;.
2dc0: 0a 20 20 77 69 6e 33 32 55 6e 6d 61 70 28 70 57  .  win32Unmap(pW
2dd0: 69 6e 33 32 46 69 6c 65 29 3b 0a 20 20 69 66 28  in32File);.  if(
2de0: 20 69 4d 69 6e 3e 3d 30 20 29 7b 0a 20 20 20 20   iMin>=0 ){.    
2df0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 66 69  LARGE_INTEGER fi
2e00: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 44 57 4f 52  leSize;.    DWOR
2e10: 44 20 64 77 53 69 7a 65 48 69 67 68 3b 0a 20 20  D dwSizeHigh;.  
2e20: 20 20 44 57 4f 52 44 20 64 77 53 69 7a 65 4c 6f    DWORD dwSizeLo
2e30: 77 3b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  w;.    HANDLE hM
2e40: 61 70 3b 0a 20 20 20 20 4c 50 56 4f 49 44 20 70  ap;.    LPVOID p
2e50: 4d 61 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  Map;.    memset(
2e60: 26 66 69 6c 65 53 69 7a 65 2c 20 30 2c 20 73 69  &fileSize, 0, si
2e70: 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
2e80: 45 52 29 29 3b 0a 20 20 20 20 69 66 28 20 21 47  ER));.    if( !G
2e90: 65 74 46 69 6c 65 53 69 7a 65 45 78 28 70 57 69  etFileSizeEx(pWi
2ea0: 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 2c 20  n32File->hFile, 
2eb0: 26 66 69 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20  &fileSize) ){.  
2ec0: 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49      return LSM_I
2ed0: 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OERR_BKPT;.    }
2ee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 69 6c  .    assert( fil
2ef0: 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74 3e 3d  eSize.QuadPart>=
2f00: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 66 69 6c  0 );.    if( fil
2f10: 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74 3c 69  eSize.QuadPart<i
2f20: 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Min ){.      int
2f30: 20 72 63 3b 0a 20 20 20 20 20 20 66 69 6c 65 53   rc;.      fileS
2f40: 69 7a 65 2e 51 75 61 64 50 61 72 74 20 3d 20 28  ize.QuadPart = (
2f50: 28 69 4d 69 6e 20 2b 20 6e 49 6e 63 72 53 7a 2d  (iMin + nIncrSz-
2f60: 31 29 20 2f 20 6e 49 6e 63 72 53 7a 29 20 2a 20  1) / nIncrSz) * 
2f70: 6e 49 6e 63 72 53 7a 3b 0a 20 20 20 20 20 20 72  nIncrSz;.      r
2f80: 63 20 3d 20 6c 73 6d 57 69 6e 33 32 4f 73 54 72  c = lsmWin32OsTr
2f90: 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 66 69  uncate(pFile, fi
2fa0: 6c 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74 29  leSize.QuadPart)
2fb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2fc0: 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
2fd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2fe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
2ff0: 77 53 69 7a 65 4c 6f 77 20 3d 20 28 44 57 4f 52  wSizeLow = (DWOR
3000: 44 29 28 66 69 6c 65 53 69 7a 65 2e 51 75 61 64  D)(fileSize.Quad
3010: 50 61 72 74 20 26 20 30 78 46 46 46 46 46 46 46  Part & 0xFFFFFFF
3020: 46 29 3b 0a 20 20 20 20 64 77 53 69 7a 65 48 69  F);.    dwSizeHi
3030: 67 68 20 3d 20 28 44 57 4f 52 44 29 28 28 66 69  gh = (DWORD)((fi
3040: 6c 65 53 69 7a 65 2e 51 75 61 64 50 61 72 74 20  leSize.QuadPart 
3050: 26 20 30 78 37 46 46 46 46 46 46 46 46 46 46 46  & 0x7FFFFFFFFFFF
3060: 46 46 46 46 29 20 3e 3e 20 33 32 29 3b 0a 20 20  FFFF) >> 32);.  
3070: 20 20 68 4d 61 70 20 3d 20 43 72 65 61 74 65 46    hMap = CreateF
3080: 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 57 69 6e  ileMappingW(pWin
3090: 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 2c 20 4e  32File->hFile, N
30a0: 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
30b0: 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 64 77 53 69 7a 65 48 69 67 68 2c 20 64     dwSizeHigh, d
30e0: 77 53 69 7a 65 4c 6f 77 2c 20 4e 55 4c 4c 29 3b  wSizeLow, NULL);
30f0: 0a 20 20 20 20 69 66 28 20 68 4d 61 70 3d 3d 4e  .    if( hMap==N
3100: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ULL ){.      ret
3110: 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b  urn LSM_IOERR_BK
3120: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  PT;.    }.    pW
3130: 69 6e 33 32 46 69 6c 65 2d 3e 68 4d 61 70 20 3d  in32File->hMap =
3140: 20 68 4d 61 70 3b 0a 20 20 20 20 61 73 73 65 72   hMap;.    asser
3150: 74 28 20 66 69 6c 65 53 69 7a 65 2e 51 75 61 64  t( fileSize.Quad
3160: 50 61 72 74 3c 3d 30 78 46 46 46 46 46 46 46 46  Part<=0xFFFFFFFF
3170: 20 29 3b 0a 20 20 20 20 70 4d 61 70 20 3d 20 4d   );.    pMap = M
3180: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
3190: 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
31a0: 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
31b0: 44 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  D, 0, 0,.       
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 28 53 49 5a 45 5f 54 29 66 69 6c 65 53 69    (SIZE_T)fileSi
31e0: 7a 65 2e 51 75 61 64 50 61 72 74 29 3b 0a 20 20  ze.QuadPart);.  
31f0: 20 20 69 66 28 20 70 4d 61 70 3d 3d 4e 55 4c 4c    if( pMap==NULL
3200: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
3210: 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b   LSM_IOERR_BKPT;
3220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 33  .    }.    pWin3
3230: 32 46 69 6c 65 2d 3e 70 4d 61 70 20 3d 20 70 4d  2File->pMap = pM
3240: 61 70 3b 0a 20 20 20 20 70 57 69 6e 33 32 46 69  ap;.    pWin32Fi
3250: 6c 65 2d 3e 6e 4d 61 70 20 3d 20 28 53 49 5a 45  le->nMap = (SIZE
3260: 5f 54 29 66 69 6c 65 53 69 7a 65 2e 51 75 61 64  _T)fileSize.Quad
3270: 50 61 72 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f  Part;.  }.  *ppO
3280: 75 74 20 3d 20 70 57 69 6e 33 32 46 69 6c 65 2d  ut = pWin32File-
3290: 3e 70 4d 61 70 3b 0a 20 20 2a 70 6e 4f 75 74 20  >pMap;.  *pnOut 
32a0: 3d 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 6e 4d  = pWin32File->nM
32b0: 61 70 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d  ap;.  return LSM
32c0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 42  _OK;.}..static B
32d0: 4f 4f 4c 20 77 69 6e 33 32 49 73 44 72 69 76 65  OOL win32IsDrive
32e0: 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a  LetterAndColon(.
32f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
3300: 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74  athname.){.  ret
3310: 75 72 6e 20 28 20 69 73 61 6c 70 68 61 28 7a 50  urn ( isalpha(zP
3320: 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
3330: 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
3340: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
3350: 74 20 6c 73 6d 57 69 6e 33 32 4f 73 46 75 6c 6c  t lsmWin32OsFull
3360: 70 61 74 68 28 0a 20 20 6c 73 6d 5f 65 6e 76 20  path(.  lsm_env 
3370: 2a 70 45 6e 76 2c 0a 20 20 63 6f 6e 73 74 20 63  *pEnv,.  const c
3380: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 63 68  har *zName,.  ch
3390: 61 72 20 2a 7a 4f 75 74 2c 0a 20 20 69 6e 74 20  ar *zOut,.  int 
33a0: 2a 70 6e 4f 75 74 0a 29 7b 0a 20 20 44 57 4f 52  *pnOut.){.  DWOR
33b0: 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  D nByte;.  void 
33c0: 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 4c  *zConverted;.  L
33d0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 3b  PWSTR zTempWide;
33e0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 55 74  .  char *zTempUt
33f0: 66 38 3b 0a 0a 20 20 69 66 28 20 7a 4e 61 6d 65  f8;..  if( zName
3400: 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 33  [0]=='/' && win3
3410: 32 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  2IsDriveLetterAn
3420: 64 43 6f 6c 6f 6e 28 7a 4e 61 6d 65 2b 31 29 20  dColon(zName+1) 
3430: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 2b 2b 3b 0a  ){.    zName++;.
3440: 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
3450: 20 3d 20 77 69 6e 33 32 55 74 66 38 54 6f 55 6e   = win32Utf8ToUn
3460: 69 63 6f 64 65 28 70 45 6e 76 2c 20 7a 4e 61 6d  icode(pEnv, zNam
3470: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
3480: 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
3490: 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f  eturn LSM_NOMEM_
34a0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  BKPT;.  }.  nByt
34b0: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
34c0: 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
34d0: 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
34e0: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  0);.  if( nByte=
34f0: 3d 30 20 29 7b 0a 20 20 20 20 6c 73 6d 46 72 65  =0 ){.    lsmFre
3500: 65 28 70 45 6e 76 2c 20 7a 43 6f 6e 76 65 72 74  e(pEnv, zConvert
3510: 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ed);.    return 
3520: 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a  LSM_IOERR_BKPT;.
3530: 20 20 7d 0a 20 20 6e 42 79 74 65 20 2b 3d 20 33    }.  nByte += 3
3540: 3b 0a 20 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  ;.  zTempWide = 
3550: 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 45  lsmMallocZero(pE
3560: 6e 76 2c 20 6e 42 79 74 65 20 2a 20 73 69 7a 65  nv, nByte * size
3570: 6f 66 28 7a 54 65 6d 70 57 69 64 65 5b 30 5d 29  of(zTempWide[0])
3580: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 57 69  );.  if( zTempWi
3590: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6c 73 6d  de==0 ){.    lsm
35a0: 46 72 65 65 28 70 45 6e 76 2c 20 7a 43 6f 6e 76  Free(pEnv, zConv
35b0: 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
35c0: 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50  rn LSM_NOMEM_BKP
35d0: 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  T;.  }.  nByte =
35e0: 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
35f0: 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
3600: 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
3610: 65 6d 70 57 69 64 65 2c 20 30 29 3b 0a 20 20 69  empWide, 0);.  i
3620: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
3630: 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c     lsmFree(pEnv,
3640: 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
3650: 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20    lsmFree(pEnv, 
3660: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
3670: 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52  return LSM_IOERR
3680: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6c 73 6d  _BKPT;.  }.  lsm
3690: 46 72 65 65 28 70 45 6e 76 2c 20 7a 43 6f 6e 76  Free(pEnv, zConv
36a0: 65 72 74 65 64 29 3b 0a 20 20 7a 54 65 6d 70 55  erted);.  zTempU
36b0: 74 66 38 20 3d 20 77 69 6e 33 32 55 6e 69 63 6f  tf8 = win32Unico
36c0: 64 65 54 6f 55 74 66 38 28 70 45 6e 76 2c 20 7a  deToUtf8(pEnv, z
36d0: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 6c 73 6d  TempWide);.  lsm
36e0: 46 72 65 65 28 70 45 6e 76 2c 20 7a 54 65 6d 70  Free(pEnv, zTemp
36f0: 57 69 64 65 29 3b 0a 20 20 69 66 28 20 7a 54 65  Wide);.  if( zTe
3700: 6d 70 55 74 66 38 20 29 7b 0a 20 20 20 20 69 6e  mpUtf8 ){.    in
3710: 74 20 6e 4f 75 74 20 3d 20 2a 70 6e 4f 75 74 3b  t nOut = *pnOut;
3720: 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20  .    int nLen = 
3730: 73 74 72 6c 65 6e 28 7a 54 65 6d 70 55 74 66 38  strlen(zTempUtf8
3740: 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 6e  ) + 1;.    if( n
3750: 4c 65 6e 3c 3d 6e 4f 75 74 20 29 7b 0a 20 20 20  Len<=nOut ){.   
3760: 20 20 20 73 6e 70 72 69 6e 74 66 28 7a 4f 75 74     snprintf(zOut
3770: 2c 20 6e 4f 75 74 2c 20 22 25 73 22 2c 20 7a 54  , nOut, "%s", zT
3780: 65 6d 70 55 74 66 38 29 3b 0a 20 20 20 20 7d 0a  empUtf8);.    }.
3790: 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76      lsmFree(pEnv
37a0: 2c 20 7a 54 65 6d 70 55 74 66 38 29 3b 0a 20 20  , zTempUtf8);.  
37b0: 20 20 2a 70 6e 4f 75 74 20 3d 20 6e 4c 65 6e 3b    *pnOut = nLen;
37c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  .    return LSM_
37d0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
37e0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45   return LSM_NOME
37f0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 7d 0a 0a 73  M_BKPT;.  }.}..s
3800: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
3810: 33 32 4f 73 46 69 6c 65 69 64 28 0a 20 20 6c 73  32OsFileid(.  ls
3820: 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  m_file *pFile,. 
3830: 20 76 6f 69 64 20 2a 70 42 75 66 2c 0a 20 20 69   void *pBuf,.  i
3840: 6e 74 20 2a 70 6e 42 75 66 0a 29 7b 0a 20 20 69  nt *pnBuf.){.  i
3850: 6e 74 20 6e 42 75 66 3b 0a 20 20 69 6e 74 20 6e  nt nBuf;.  int n
3860: 52 65 71 3b 0a 20 20 75 38 20 2a 70 42 75 66 32  Req;.  u8 *pBuf2
3870: 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 0a 20   = (u8 *)pBuf;. 
3880: 20 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e   Win32File *pWin
3890: 33 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32 46  32File = (Win32F
38a0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 42  ile *)pFile;.  B
38b0: 59 5f 48 41 4e 44 4c 45 5f 46 49 4c 45 5f 49 4e  Y_HANDLE_FILE_IN
38c0: 46 4f 52 4d 41 54 49 4f 4e 20 66 69 6c 65 49 6e  FORMATION fileIn
38d0: 66 6f 3b 0a 0a 20 20 6e 42 75 66 20 3d 20 2a 70  fo;..  nBuf = *p
38e0: 6e 42 75 66 3b 0a 20 20 6e 52 65 71 20 3d 20 28  nBuf;.  nReq = (
38f0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 6e 66 6f 2e  sizeof(fileInfo.
3900: 64 77 56 6f 6c 75 6d 65 53 65 72 69 61 6c 4e 75  dwVolumeSerialNu
3910: 6d 62 65 72 29 20 2b 0a 20 20 20 20 20 20 20 20  mber) +.        
3920: 20 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 6e 66    sizeof(fileInf
3930: 6f 2e 6e 46 69 6c 65 49 6e 64 65 78 48 69 67 68  o.nFileIndexHigh
3940: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 69  ) +.          si
3950: 7a 65 6f 66 28 66 69 6c 65 49 6e 66 6f 2e 6e 46  zeof(fileInfo.nF
3960: 69 6c 65 49 6e 64 65 78 4c 6f 77 29 29 3b 0a 20  ileIndexLow));. 
3970: 20 2a 70 6e 42 75 66 20 3d 20 6e 52 65 71 3b 0a   *pnBuf = nReq;.
3980: 20 20 69 66 28 20 6e 52 65 71 3e 6e 42 75 66 20    if( nReq>nBuf 
3990: 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b  ) return LSM_OK;
39a0: 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49  .  memset(&fileI
39b0: 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42  nfo, 0, sizeof(B
39c0: 59 5f 48 41 4e 44 4c 45 5f 46 49 4c 45 5f 49 4e  Y_HANDLE_FILE_IN
39d0: 46 4f 52 4d 41 54 49 4f 4e 29 29 3b 0a 20 20 69  FORMATION));.  i
39e0: 66 28 20 21 47 65 74 46 69 6c 65 49 6e 66 6f 72  f( !GetFileInfor
39f0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 28 70  mationByHandle(p
3a00: 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65  Win32File->hFile
3a10: 2c 20 26 66 69 6c 65 49 6e 66 6f 29 20 29 7b 0a  , &fileInfo) ){.
3a20: 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49      return LSM_I
3a30: 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OERR_BKPT;.  }. 
3a40: 20 6e 52 65 71 20 3d 20 73 69 7a 65 6f 66 28 66   nReq = sizeof(f
3a50: 69 6c 65 49 6e 66 6f 2e 64 77 56 6f 6c 75 6d 65  ileInfo.dwVolume
3a60: 53 65 72 69 61 6c 4e 75 6d 62 65 72 29 3b 0a 20  SerialNumber);. 
3a70: 20 6d 65 6d 63 70 79 28 70 42 75 66 32 2c 20 26   memcpy(pBuf2, &
3a80: 66 69 6c 65 49 6e 66 6f 2e 64 77 56 6f 6c 75 6d  fileInfo.dwVolum
3a90: 65 53 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 6e  eSerialNumber, n
3aa0: 52 65 71 29 3b 0a 20 20 70 42 75 66 32 20 2b 3d  Req);.  pBuf2 +=
3ab0: 20 6e 52 65 71 3b 0a 20 20 6e 52 65 71 20 3d 20   nReq;.  nReq = 
3ac0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 6e 66 6f 2e  sizeof(fileInfo.
3ad0: 6e 46 69 6c 65 49 6e 64 65 78 48 69 67 68 29 3b  nFileIndexHigh);
3ae0: 0a 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20  .  memcpy(pBuf, 
3af0: 26 66 69 6c 65 49 6e 66 6f 2e 6e 46 69 6c 65 49  &fileInfo.nFileI
3b00: 6e 64 65 78 48 69 67 68 2c 20 6e 52 65 71 29 3b  ndexHigh, nReq);
3b10: 0a 20 20 70 42 75 66 32 20 2b 3d 20 6e 52 65 71  .  pBuf2 += nReq
3b20: 3b 0a 20 20 6e 52 65 71 20 3d 20 73 69 7a 65 6f  ;.  nReq = sizeo
3b30: 66 28 66 69 6c 65 49 6e 66 6f 2e 6e 46 69 6c 65  f(fileInfo.nFile
3b40: 49 6e 64 65 78 4c 6f 77 29 3b 0a 20 20 6d 65 6d  IndexLow);.  mem
3b50: 63 70 79 28 70 42 75 66 32 2c 20 26 66 69 6c 65  cpy(pBuf2, &file
3b60: 49 6e 66 6f 2e 6e 46 69 6c 65 49 6e 64 65 78 4c  Info.nFileIndexL
3b70: 6f 77 2c 20 6e 52 65 71 29 3b 0a 20 20 72 65 74  ow, nReq);.  ret
3b80: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
3b90: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 44  tatic int win32D
3ba0: 65 6c 65 74 65 28 0a 20 20 6c 73 6d 5f 65 6e 76  elete(.  lsm_env
3bb0: 20 2a 70 45 6e 76 2c 0a 20 20 63 6f 6e 73 74 20   *pEnv,.  const 
3bc0: 63 68 61 72 20 2a 7a 46 69 6c 65 0a 29 7b 0a 20  char *zFile.){. 
3bd0: 20 69 6e 74 20 72 63 3b 0a 20 20 4c 50 57 53 54   int rc;.  LPWST
3be0: 52 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 0a 20  R zConverted;.. 
3bf0: 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
3c00: 6e 33 32 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  n32Utf8ToUnicode
3c10: 28 70 45 6e 76 2c 20 7a 46 69 6c 65 29 3b 0a 20  (pEnv, zFile);. 
3c20: 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
3c30: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 4c  =0 ){.    rc = L
3c40: 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  SM_NOMEM_BKPT;. 
3c50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
3c60: 6e 52 65 74 72 79 20 3d 20 30 3b 0a 20 20 20 20  nRetry = 0;.    
3c70: 44 57 4f 52 44 20 61 74 74 72 3b 0a 0a 20 20 20  DWORD attr;..   
3c80: 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
3c90: 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
3ca0: 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
3cb0: 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  );.      if ( at
3cc0: 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
3cd0: 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
3ce0: 20 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f         rc = LSM_
3cf0: 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20  IOERR_BKPT;.    
3d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3d10: 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
3d20: 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
3d30: 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
3d40: 20 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f         rc = LSM_
3d50: 49 4f 45 52 52 5f 42 4b 50 54 3b 20 2f 2a 20 46  IOERR_BKPT; /* F
3d60: 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
3d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
3d90: 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
3da0: 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
3db0: 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20     rc = LSM_OK; 
3dc0: 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
3dd0: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
3de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3df0: 66 20 28 20 21 77 69 6e 33 32 52 65 74 72 79 49  f ( !win32RetryI
3e00: 6f 65 72 72 28 70 45 6e 76 2c 20 26 6e 52 65 74  oerr(pEnv, &nRet
3e10: 72 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ry) ){.        r
3e20: 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b  c = LSM_IOERR_BK
3e30: 50 54 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  PT; /* No more r
3e40: 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
3e50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3e60: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20  }.    }while( 1 
3e70: 29 3b 0a 20 20 7d 0a 20 20 6c 73 6d 46 72 65 65  );.  }.  lsmFree
3e80: 28 70 45 6e 76 2c 20 7a 43 6f 6e 76 65 72 74 65  (pEnv, zConverte
3e90: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
3ea0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .}..static int l
3eb0: 73 6d 57 69 6e 33 32 4f 73 55 6e 6c 69 6e 6b 28  smWin32OsUnlink(
3ec0: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 63  lsm_env *pEnv, c
3ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3ee0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 33  ){.  return win3
3ef0: 32 44 65 6c 65 74 65 28 70 45 6e 76 2c 20 7a 46  2Delete(pEnv, zF
3f00: 69 6c 65 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ile);.}..#if !de
3f10: 66 69 6e 65 64 28 77 69 6e 33 32 49 73 4c 6f 63  fined(win32IsLoc
3f20: 6b 42 75 73 79 29 0a 23 64 65 66 69 6e 65 20 77  kBusy).#define w
3f30: 69 6e 33 32 49 73 4c 6f 63 6b 42 75 73 79 28 61  in32IsLockBusy(a
3f40: 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c  ) (((a)==ERROR_L
3f50: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 7c  OCK_VIOLATION) |
3f60: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 49 4f 5f 50  ((a)==ERROR_IO_P
3f90: 45 4e 44 49 4e 47 29 29 0a 23 65 6e 64 69 66 0a  ENDING)).#endif.
3fa0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
3fb0: 32 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 57 69 6e  2LockFile(.  Win
3fc0: 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69  32File *pWin32Fi
3fd0: 6c 65 2c 0a 20 20 69 6e 74 20 69 4c 6f 63 6b 2c  le,.  int iLock,
3fe0: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 2c 0a 20 20  .  int nLock,.  
3ff0: 69 6e 74 20 65 54 79 70 65 0a 29 7b 0a 20 20 4f  int eType.){.  O
4000: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
4010: 0a 20 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c  .  assert( LSM_L
4020: 4f 43 4b 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  OCK_UNLOCK==0 );
4030: 0a 20 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c  .  assert( LSM_L
4040: 4f 43 4b 5f 53 48 41 52 45 44 3d 3d 31 20 29 3b  OCK_SHARED==1 );
4050: 0a 20 20 61 73 73 65 72 74 28 20 4c 53 4d 5f 4c  .  assert( LSM_L
4060: 4f 43 4b 5f 45 58 43 4c 3d 3d 32 20 29 3b 0a 20  OCK_EXCL==2 );. 
4070: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3e 3d   assert( eType>=
4080: 4c 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b 20  LSM_LOCK_UNLOCK 
4090: 26 26 20 65 54 79 70 65 3c 3d 4c 53 4d 5f 4c 4f  && eType<=LSM_LO
40a0: 43 4b 5f 45 58 43 4c 20 29 3b 0a 20 20 61 73 73  CK_EXCL );.  ass
40b0: 65 72 74 28 20 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ert( nLock>=0 );
40c0: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 6f 63 6b  .  assert( iLock
40d0: 3e 30 20 26 26 20 69 4c 6f 63 6b 3c 3d 33 32 20  >0 && iLock<=32 
40e0: 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  );..  memset(&ov
40f0: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
4100: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
4110: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 28 34 30 39  lp.Offset = (409
4120: 36 2d 69 4c 6f 63 6b 2d 6e 4c 6f 63 6b 2b 31 29  6-iLock-nLock+1)
4130: 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3e 4c 53  ;.  if( eType>LS
4140: 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b 20 29 7b  M_LOCK_UNLOCK ){
4150: 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
4160: 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
4170: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
4180: 20 20 69 66 28 20 65 54 79 70 65 3e 3d 4c 53 4d    if( eType>=LSM
4190: 5f 4c 4f 43 4b 5f 45 58 43 4c 20 29 20 66 6c 61  _LOCK_EXCL ) fla
41a0: 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
41b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
41c0: 20 20 20 69 66 28 20 21 4c 6f 63 6b 46 69 6c 65     if( !LockFile
41d0: 45 78 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68  Ex(pWin32File->h
41e0: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20  File, flags, 0, 
41f0: 28 44 57 4f 52 44 29 6e 4c 6f 63 6b 2c 20 30 2c  (DWORD)nLock, 0,
4200: 20 26 6f 76 6c 70 29 20 29 7b 0a 20 20 20 20 20   &ovlp) ){.     
4210: 20 69 66 28 20 77 69 6e 33 32 49 73 4c 6f 63 6b   if( win32IsLock
4220: 42 75 73 79 28 47 65 74 4c 61 73 74 45 72 72 6f  Busy(GetLastErro
4230: 72 28 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  r()) ){.        
4240: 72 65 74 75 72 6e 20 4c 53 4d 5f 42 55 53 59 3b  return LSM_BUSY;
4250: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4260: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d        return LSM
4270: 5f 49 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20  _IOERR_BKPT;.   
4280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4290: 73 65 7b 0a 20 20 20 20 69 66 28 20 21 55 6e 6c  se{.    if( !Unl
42a0: 6f 63 6b 46 69 6c 65 45 78 28 70 57 69 6e 33 32  ockFileEx(pWin32
42b0: 46 69 6c 65 2d 3e 68 46 69 6c 65 2c 20 30 2c 20  File->hFile, 0, 
42c0: 28 44 57 4f 52 44 29 6e 4c 6f 63 6b 2c 20 30 2c  (DWORD)nLock, 0,
42d0: 20 26 6f 76 6c 70 29 20 29 7b 0a 20 20 20 20 20   &ovlp) ){.     
42e0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
42f0: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  R_BKPT;.    }.  
4300: 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  }.  return LSM_O
4310: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
4320: 20 6c 73 6d 57 69 6e 33 32 4f 73 4c 6f 63 6b 28   lsmWin32OsLock(
4330: 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  lsm_file *pFile,
4340: 20 69 6e 74 20 69 4c 6f 63 6b 2c 20 69 6e 74 20   int iLock, int 
4350: 65 54 79 70 65 29 7b 0a 20 20 57 69 6e 33 32 46  eType){.  Win32F
4360: 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20  ile *pWin32File 
4370: 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70  = (Win32File *)p
4380: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 77  File;.  return w
4390: 69 6e 33 32 4c 6f 63 6b 46 69 6c 65 28 70 57 69  in32LockFile(pWi
43a0: 6e 33 32 46 69 6c 65 2c 20 69 4c 6f 63 6b 2c 20  n32File, iLock, 
43b0: 31 2c 20 65 54 79 70 65 29 3b 0a 7d 0a 0a 73 74  1, eType);.}..st
43c0: 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33  atic int lsmWin3
43d0: 32 4f 73 54 65 73 74 4c 6f 63 6b 28 6c 73 6d 5f  2OsTestLock(lsm_
43e0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
43f0: 20 69 4c 6f 63 6b 2c 20 69 6e 74 20 6e 4c 6f 63   iLock, int nLoc
4400: 6b 2c 20 69 6e 74 20 65 54 79 70 65 29 7b 0a 20  k, int eType){. 
4410: 20 69 6e 74 20 72 63 3b 0a 20 20 57 69 6e 33 32   int rc;.  Win32
4420: 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65  File *pWin32File
4430: 20 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29   = (Win32File *)
4440: 70 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 77 69  pFile;.  rc = wi
4450: 6e 33 32 4c 6f 63 6b 46 69 6c 65 28 70 57 69 6e  n32LockFile(pWin
4460: 33 32 46 69 6c 65 2c 20 69 4c 6f 63 6b 2c 20 6e  32File, iLock, n
4470: 4c 6f 63 6b 2c 20 65 54 79 70 65 29 3b 0a 20 20  Lock, eType);.  
4480: 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
4490: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 77 69   return rc;.  wi
44a0: 6e 33 32 4c 6f 63 6b 46 69 6c 65 28 70 57 69 6e  n32LockFile(pWin
44b0: 33 32 46 69 6c 65 2c 20 69 4c 6f 63 6b 2c 20 6e  32File, iLock, n
44c0: 4c 6f 63 6b 2c 20 4c 53 4d 5f 4c 4f 43 4b 5f 55  Lock, LSM_LOCK_U
44d0: 4e 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  NLOCK);.  return
44e0: 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   LSM_OK;.}..stat
44f0: 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f  ic int lsmWin32O
4500: 73 53 68 6d 4d 61 70 28 6c 73 6d 5f 66 69 6c 65  sShmMap(lsm_file
4510: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 69 43 68   *pFile, int iCh
4520: 75 6e 6b 2c 20 69 6e 74 20 73 7a 2c 20 76 6f 69  unk, int sz, voi
4530: 64 20 2a 2a 70 70 53 68 6d 29 7b 0a 20 20 69 6e  d **ppShm){.  in
4540: 74 20 72 63 3b 0a 20 20 57 69 6e 33 32 46 69 6c  t rc;.  Win32Fil
4550: 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d 20  e *pWin32File = 
4560: 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46 69  (Win32File *)pFi
4570: 6c 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65  le;.  int iOffse
4580: 74 20 3d 20 69 43 68 75 6e 6b 20 2a 20 73 7a 3b  t = iChunk * sz;
4590: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68  .  int iOffsetSh
45a0: 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
45b0: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 73 79 73 49  pWin32File->sysI
45c0: 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
45d0: 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 69  Granularity;.  i
45e0: 6e 74 20 6e 4e 65 77 20 3d 20 69 43 68 75 6e 6b  nt nNew = iChunk
45f0: 20 2b 20 31 3b 0a 20 20 6c 73 6d 5f 69 36 34 20   + 1;.  lsm_i64 
4600: 6e 52 65 71 20 3d 20 6e 4e 65 77 20 2a 20 73 7a  nReq = nNew * sz
4610: 3b 0a 0a 20 20 2a 70 70 53 68 6d 20 3d 20 4e 55  ;..  *ppShm = NU
4620: 4c 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  LL;.  assert( sz
4630: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
4640: 20 73 7a 3d 3d 4c 53 4d 5f 53 48 4d 5f 43 48 55   sz==LSM_SHM_CHU
4650: 4e 4b 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  NK_SIZE );.  if(
4660: 20 69 43 68 75 6e 6b 3e 3d 70 57 69 6e 33 32 46   iChunk>=pWin32F
4670: 69 6c 65 2d 3e 6e 53 68 6d 20 29 7b 0a 20 20 20  ile->nShm ){.   
4680: 20 4c 50 48 41 4e 44 4c 45 20 61 68 4e 65 77 3b   LPHANDLE ahNew;
4690: 0a 20 20 20 20 4c 50 56 4f 49 44 20 2a 61 70 4e  .    LPVOID *apN
46a0: 65 77 3b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e  ew;.    LARGE_IN
46b0: 54 45 47 45 52 20 66 69 6c 65 53 69 7a 65 3b 0a  TEGER fileSize;.
46c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
46d0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
46e0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6f  e has not been o
46f0: 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
4700: 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ow. */.    if( p
4710: 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46  Win32File->hShmF
4720: 69 6c 65 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  ile==NULL ){.   
4730: 20 20 20 63 68 61 72 20 2a 7a 53 68 6d 20 3d 20     char *zShm = 
4740: 77 69 6e 33 32 53 68 6d 46 69 6c 65 28 70 57 69  win32ShmFile(pWi
4750: 6e 33 32 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  n32File);.      
4760: 69 66 28 20 21 7a 53 68 6d 20 29 20 72 65 74 75  if( !zShm ) retu
4770: 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50  rn LSM_NOMEM_BKP
4780: 54 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  T;.      rc = wi
4790: 6e 33 32 4f 70 65 6e 28 70 57 69 6e 33 32 46 69  n32Open(pWin32Fi
47a0: 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53 68 6d 2c 20  le->pEnv, zShm, 
47b0: 30 2c 20 26 70 57 69 6e 33 32 46 69 6c 65 2d 3e  0, &pWin32File->
47c0: 68 53 68 6d 46 69 6c 65 29 3b 0a 20 20 20 20 20  hShmFile);.     
47d0: 20 6c 73 6d 46 72 65 65 28 70 57 69 6e 33 32 46   lsmFree(pWin32F
47e0: 69 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53 68 6d 29  ile->pEnv, zShm)
47f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
4800: 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
4810: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
4820: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
4830: 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  /* If the shared
4840: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 73 20  -memory file is 
4850: 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  not large enough
4860: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0a   to contain the.
4870: 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
4880: 20 63 68 75 6e 6b 2c 20 63 61 75 73 65 20 69 74   chunk, cause it
4890: 20 74 6f 20 67 72 6f 77 2e 20 20 2a 2f 0a 20 20   to grow.  */.  
48a0: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 53 69    memset(&fileSi
48b0: 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 41  ze, 0, sizeof(LA
48c0: 52 47 45 5f 49 4e 54 45 47 45 52 29 29 3b 0a 20  RGE_INTEGER));. 
48d0: 20 20 20 69 66 28 20 21 47 65 74 46 69 6c 65 53     if( !GetFileS
48e0: 69 7a 65 45 78 28 70 57 69 6e 33 32 46 69 6c 65  izeEx(pWin32File
48f0: 2d 3e 68 53 68 6d 46 69 6c 65 2c 20 26 66 69 6c  ->hShmFile, &fil
4900: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
4910: 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52  return LSM_IOERR
4920: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
4930: 20 61 73 73 65 72 74 28 20 66 69 6c 65 53 69 7a   assert( fileSiz
4940: 65 2e 51 75 61 64 50 61 72 74 3e 3d 30 20 29 3b  e.QuadPart>=0 );
4950: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 53 69 7a  .    if( fileSiz
4960: 65 2e 51 75 61 64 50 61 72 74 3c 6e 52 65 71 20  e.QuadPart<nReq 
4970: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
4980: 6e 33 32 54 72 75 6e 63 61 74 65 28 70 57 69 6e  n32Truncate(pWin
4990: 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46 69 6c 65  32File->hShmFile
49a0: 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 69  , nReq);.      i
49b0: 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc!=LSM_OK ){
49c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
49d0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
49e0: 7d 0a 0a 20 20 20 20 61 68 4e 65 77 20 3d 20 28  }..    ahNew = (
49f0: 4c 50 48 41 4e 44 4c 45 29 6c 73 6d 4d 61 6c 6c  LPHANDLE)lsmMall
4a00: 6f 63 5a 65 72 6f 28 70 57 69 6e 33 32 46 69 6c  ocZero(pWin32Fil
4a10: 65 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  e->pEnv, sizeof(
4a20: 48 41 4e 44 4c 45 29 20 2a 20 6e 4e 65 77 29 3b  HANDLE) * nNew);
4a30: 0a 20 20 20 20 69 66 28 20 21 61 68 4e 65 77 20  .    if( !ahNew 
4a40: 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d  ) return LSM_NOM
4a50: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 70 4e  EM_BKPT;.    apN
4a60: 65 77 20 3d 20 28 4c 50 56 4f 49 44 20 2a 29 6c  ew = (LPVOID *)l
4a70: 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 57 69  smMallocZero(pWi
4a80: 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 73  n32File->pEnv, s
4a90: 69 7a 65 6f 66 28 4c 50 56 4f 49 44 29 20 2a 20  izeof(LPVOID) * 
4aa0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 21  nNew);.    if( !
4ab0: 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 6c  apNew ){.      l
4ac0: 73 6d 46 72 65 65 28 70 57 69 6e 33 32 46 69 6c  smFree(pWin32Fil
4ad0: 65 2d 3e 70 45 6e 76 2c 20 61 68 4e 65 77 29 3b  e->pEnv, ahNew);
4ae0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53  .      return LS
4af0: 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  M_NOMEM_BKPT;.  
4b00: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 61    }.    memcpy(a
4b10: 68 4e 65 77 2c 20 70 57 69 6e 33 32 46 69 6c 65  hNew, pWin32File
4b20: 2d 3e 61 68 53 68 6d 2c 20 73 69 7a 65 6f 66 28  ->ahShm, sizeof(
4b30: 48 41 4e 44 4c 45 29 20 2a 20 70 57 69 6e 33 32  HANDLE) * pWin32
4b40: 46 69 6c 65 2d 3e 6e 53 68 6d 29 3b 0a 20 20 20  File->nShm);.   
4b50: 20 6d 65 6d 63 70 79 28 61 70 4e 65 77 2c 20 70   memcpy(apNew, p
4b60: 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d  Win32File->apShm
4b70: 2c 20 73 69 7a 65 6f 66 28 4c 50 56 4f 49 44 29  , sizeof(LPVOID)
4b80: 20 2a 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 6e   * pWin32File->n
4b90: 53 68 6d 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65  Shm);.    lsmFre
4ba0: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  e(pWin32File->pE
4bb0: 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  nv, pWin32File->
4bc0: 61 68 53 68 6d 29 3b 0a 20 20 20 20 70 57 69 6e  ahShm);.    pWin
4bd0: 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 20 3d 20  32File->ahShm = 
4be0: 61 68 4e 65 77 3b 0a 20 20 20 20 6c 73 6d 46 72  ahNew;.    lsmFr
4bf0: 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70  ee(pWin32File->p
4c00: 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d  Env, pWin32File-
4c10: 3e 61 70 53 68 6d 29 3b 0a 20 20 20 20 70 57 69  >apShm);.    pWi
4c20: 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 20 3d  n32File->apShm =
4c30: 20 61 70 4e 65 77 3b 0a 20 20 20 20 70 57 69 6e   apNew;.    pWin
4c40: 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 20 3d 20 6e  32File->nShm = n
4c50: 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  New;.  }..  if( 
4c60: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68  pWin32File->ahSh
4c70: 6d 5b 69 43 68 75 6e 6b 5d 3d 3d 4e 55 4c 4c 20  m[iChunk]==NULL 
4c80: 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  ){.    HANDLE hM
4c90: 61 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ap;.    assert( 
4ca0: 6e 52 65 71 3c 3d 30 78 46 46 46 46 46 46 46 46  nReq<=0xFFFFFFFF
4cb0: 20 29 3b 0a 20 20 20 20 68 4d 61 70 20 3d 20 43   );.    hMap = C
4cc0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4cd0: 57 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53  W(pWin32File->hS
4ce0: 68 6d 46 69 6c 65 2c 20 4e 55 4c 4c 2c 20 50 41  hmFile, NULL, PA
4cf0: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
4d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4d20: 44 57 4f 52 44 29 6e 52 65 71 2c 20 4e 55 4c 4c  DWORD)nReq, NULL
4d30: 29 3b 0a 20 20 20 20 69 66 28 20 68 4d 61 70 3d  );.    if( hMap=
4d40: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  =NULL ){.      r
4d50: 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52 52 5f  eturn LSM_IOERR_
4d60: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
4d70: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68  pWin32File->ahSh
4d80: 6d 5b 69 43 68 75 6e 6b 5d 20 3d 20 68 4d 61 70  m[iChunk] = hMap
4d90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 69 6e  ;.  }.  if( pWin
4da0: 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 43  32File->apShm[iC
4db0: 68 75 6e 6b 5d 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  hunk]==NULL ){. 
4dc0: 20 20 20 4c 50 56 4f 49 44 20 70 4d 61 70 3b 0a     LPVOID pMap;.
4dd0: 20 20 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69      pMap = MapVi
4de0: 65 77 4f 66 46 69 6c 65 28 70 57 69 6e 33 32 46  ewOfFile(pWin32F
4df0: 69 6c 65 2d 3e 61 68 53 68 6d 5b 69 43 68 75 6e  ile->ahShm[iChun
4e00: 6b 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k],.            
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
4e20: 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
4e30: 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 20 30 2c 0a  LE_MAP_READ, 0,.
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
4e60: 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
4e70: 20 73 7a 20 2b 20 69 4f 66 66 73 65 74 53 68 69   sz + iOffsetShi
4e80: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  ft);.    if( pMa
4e90: 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
4ea0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
4eb0: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  R_BKPT;.    }.  
4ec0: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70    pWin32File->ap
4ed0: 53 68 6d 5b 69 43 68 75 6e 6b 5d 20 3d 20 70 4d  Shm[iChunk] = pM
4ee0: 61 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4f  ap;.  }.  if( iO
4ef0: 66 66 73 65 74 53 68 69 66 74 21 3d 30 20 29 7b  ffsetShift!=0 ){
4f00: 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
4f10: 63 68 61 72 20 2a 29 70 57 69 6e 33 32 46 69 6c  char *)pWin32Fil
4f20: 65 2d 3e 61 70 53 68 6d 5b 69 43 68 75 6e 6b 5d  e->apShm[iChunk]
4f30: 3b 0a 20 20 20 20 2a 70 70 53 68 6d 20 3d 20 28  ;.    *ppShm = (
4f40: 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
4f50: 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
4f60: 7b 0a 20 20 20 20 2a 70 70 53 68 6d 20 3d 20 70  {.    *ppShm = p
4f70: 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d  Win32File->apShm
4f80: 5b 69 43 68 75 6e 6b 5d 3b 0a 20 20 7d 0a 20 20  [iChunk];.  }.  
4f90: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
4fa0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73  ..static void ls
4fb0: 6d 57 69 6e 33 32 4f 73 53 68 6d 42 61 72 72 69  mWin32OsShmBarri
4fc0: 65 72 28 76 6f 69 64 29 7b 0a 20 20 4d 65 6d 6f  er(void){.  Memo
4fd0: 72 79 42 61 72 72 69 65 72 28 29 3b 0a 7d 0a 0a  ryBarrier();.}..
4fe0: 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69  static int lsmWi
4ff0: 6e 33 32 4f 73 53 68 6d 55 6e 6d 61 70 28 6c 73  n32OsShmUnmap(ls
5000: 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  m_file *pFile, i
5010: 6e 74 20 62 44 65 6c 65 74 65 29 7b 0a 20 20 57  nt bDelete){.  W
5020: 69 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33 32  in32File *pWin32
5030: 46 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69 6c  File = (Win32Fil
5040: 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20 69 66  e *)pFile;..  if
5050: 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53  ( pWin32File->hS
5060: 68 6d 46 69 6c 65 21 3d 4e 55 4c 4c 20 29 7b 0a  hmFile!=NULL ){.
5070: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5080: 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 6e 33 32  or(i=0; i<pWin32
5090: 46 69 6c 65 2d 3e 6e 53 68 6d 3b 20 69 2b 2b 29  File->nShm; i++)
50a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  {.      if( pWin
50b0: 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 5d  32File->apShm[i]
50c0: 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  !=NULL ){.      
50d0: 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c    UnmapViewOfFil
50e0: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70  e(pWin32File->ap
50f0: 53 68 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Shm[i]);.       
5100: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53   pWin32File->apS
5110: 68 6d 5b 69 5d 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hm[i] = NULL;.  
5120: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5130: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68  pWin32File->ahSh
5140: 6d 5b 69 5d 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  m[i]!=NULL ){.  
5150: 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
5160: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68  e(pWin32File->ah
5170: 53 68 6d 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Shm[i]);.       
5180: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53   pWin32File->ahS
5190: 68 6d 5b 69 5d 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hm[i] = NULL;.  
51a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
51b0: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57 69 6e  CloseHandle(pWin
51c0: 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46 69 6c 65  32File->hShmFile
51d0: 29 3b 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c  );.    pWin32Fil
51e0: 65 2d 3e 68 53 68 6d 46 69 6c 65 20 3d 20 4e 55  e->hShmFile = NU
51f0: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 62 44 65 6c  LL;.    if( bDel
5200: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ete ){.      cha
5210: 72 20 2a 7a 53 68 6d 20 3d 20 77 69 6e 33 32 53  r *zShm = win32S
5220: 68 6d 46 69 6c 65 28 70 57 69 6e 33 32 46 69 6c  hmFile(pWin32Fil
5230: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53  e);.      if( zS
5240: 68 6d 20 29 7b 20 77 69 6e 33 32 44 65 6c 65 74  hm ){ win32Delet
5250: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  e(pWin32File->pE
5260: 6e 76 2c 20 7a 53 68 6d 29 3b 20 7d 0a 20 20 20  nv, zShm); }.   
5270: 20 20 20 6c 73 6d 46 72 65 65 28 70 57 69 6e 33     lsmFree(pWin3
5280: 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53 68  2File->pEnv, zSh
5290: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
52a0: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
52b0: 0a 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  ..#define MX_CLO
52c0: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
52d0: 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32  tic int lsmWin32
52e0: 4f 73 43 6c 6f 73 65 28 6c 73 6d 5f 66 69 6c 65  OsClose(lsm_file
52f0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
5300: 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 74 72 79  rc;.  int nRetry
5310: 20 3d 20 30 3b 0a 20 20 57 69 6e 33 32 46 69 6c   = 0;.  Win32Fil
5320: 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d 20  e *pWin32File = 
5330: 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46 69  (Win32File *)pFi
5340: 6c 65 3b 0a 20 20 6c 73 6d 57 69 6e 33 32 4f 73  le;.  lsmWin32Os
5350: 53 68 6d 55 6e 6d 61 70 28 70 46 69 6c 65 2c 20  ShmUnmap(pFile, 
5360: 30 29 3b 0a 20 20 77 69 6e 33 32 55 6e 6d 61 70  0);.  win32Unmap
5370: 28 70 57 69 6e 33 32 46 69 6c 65 29 3b 0a 20 20  (pWin32File);.  
5380: 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 57 69 6e  do{.    if( pWin
5390: 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 3d 3d 4e  32File->hFile==N
53a0: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ULL ){.      rc 
53b0: 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50 54  = LSM_IOERR_BKPT
53c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
53d0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 43 6c     }.    rc = Cl
53e0: 6f 73 65 48 61 6e 64 6c 65 28 70 57 69 6e 33 32  oseHandle(pWin32
53f0: 46 69 6c 65 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  File->hFile);.  
5400: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
5410: 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46    pWin32File->hF
5420: 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
5430: 20 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20    rc = LSM_OK;. 
5440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5450: 7d 0a 20 20 20 20 69 66 28 20 2b 2b 6e 52 65 74  }.    if( ++nRet
5460: 72 79 3e 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ry>=MX_CLOSE_ATT
5470: 45 4d 50 54 20 29 7b 0a 20 20 20 20 20 20 72 63  EMPT ){.      rc
5480: 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42 4b 50   = LSM_IOERR_BKP
5490: 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T;.      break;.
54a0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
54b0: 31 20 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  1 );.  lsmFree(p
54c0: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
54d0: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53   pWin32File->ahS
54e0: 68 6d 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  hm);.  lsmFree(p
54f0: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
5500: 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53   pWin32File->apS
5510: 68 6d 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  hm);.  lsmFree(p
5520: 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c  Win32File->pEnv,
5530: 20 70 57 69 6e 33 32 46 69 6c 65 29 3b 0a 20 20   pWin32File);.  
5540: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
5550: 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33  atic int lsmWin3
5560: 32 4f 73 53 6c 65 65 70 28 6c 73 6d 5f 65 6e 76  2OsSleep(lsm_env
5570: 20 2a 70 45 6e 76 2c 20 69 6e 74 20 75 73 29 7b   *pEnv, int us){
5580: 0a 20 20 75 6e 75 73 65 64 5f 70 61 72 61 6d 65  .  unused_parame
5590: 74 65 72 28 70 45 6e 76 29 3b 0a 20 20 72 65 74  ter(pEnv);.  ret
55a0: 75 72 6e 20 77 69 6e 33 32 53 6c 65 65 70 28 75  urn win32Sleep(u
55b0: 73 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s);.}../********
55c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5600: 2a 2a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 61  ****.** Memory a
5610: 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  llocation routin
5620: 65 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76  es..*/..static v
5630: 6f 69 64 20 2a 6c 73 6d 57 69 6e 33 32 4f 73 4d  oid *lsmWin32OsM
5640: 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e 76 20 2a 70  alloc(lsm_env *p
5650: 45 6e 76 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a  Env, size_t N){.
5660: 20 20 61 73 73 65 72 74 28 20 48 65 61 70 56 61    assert( HeapVa
5670: 6c 69 64 61 74 65 28 47 65 74 50 72 6f 63 65 73  lidate(GetProces
5680: 73 48 65 61 70 28 29 2c 20 30 2c 20 4e 55 4c 4c  sHeap(), 0, NULL
5690: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 48 65  ) );.  return He
56a0: 61 70 41 6c 6c 6f 63 28 47 65 74 50 72 6f 63 65  apAlloc(GetProce
56b0: 73 73 48 65 61 70 28 29 2c 20 30 2c 20 28 53 49  ssHeap(), 0, (SI
56c0: 5a 45 5f 54 29 4e 29 3b 0a 7d 0a 0a 73 74 61 74  ZE_T)N);.}..stat
56d0: 69 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32  ic void lsmWin32
56e0: 4f 73 46 72 65 65 28 6c 73 6d 5f 65 6e 76 20 2a  OsFree(lsm_env *
56f0: 70 45 6e 76 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  pEnv, void *p){.
5700: 20 20 61 73 73 65 72 74 28 20 48 65 61 70 56 61    assert( HeapVa
5710: 6c 69 64 61 74 65 28 47 65 74 50 72 6f 63 65 73  lidate(GetProces
5720: 73 48 65 61 70 28 29 2c 20 30 2c 20 4e 55 4c 4c  sHeap(), 0, NULL
5730: 29 20 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ) );.  if( p ){.
5740: 20 20 20 20 48 65 61 70 46 72 65 65 28 47 65 74      HeapFree(Get
5750: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30  ProcessHeap(), 0
5760: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , p);.  }.}..sta
5770: 74 69 63 20 76 6f 69 64 20 2a 6c 73 6d 57 69 6e  tic void *lsmWin
5780: 33 32 4f 73 52 65 61 6c 6c 6f 63 28 6c 73 6d 5f  32OsRealloc(lsm_
5790: 65 6e 76 20 2a 70 45 6e 76 2c 20 76 6f 69 64 20  env *pEnv, void 
57a0: 2a 70 2c 20 73 69 7a 65 5f 74 20 4e 29 7b 0a 20  *p, size_t N){. 
57b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
57c0: 6d 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  m = (unsigned ch
57d0: 61 72 20 2a 29 70 3b 0a 20 20 61 73 73 65 72 74  ar *)p;.  assert
57e0: 28 20 48 65 61 70 56 61 6c 69 64 61 74 65 28 47  ( HeapValidate(G
57f0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c  etProcessHeap(),
5800: 20 30 2c 20 4e 55 4c 4c 29 20 29 3b 0a 20 20 69   0, NULL) );.  i
5810: 66 28 20 31 3e 4e 20 29 7b 0a 20 20 20 20 6c 73  f( 1>N ){.    ls
5820: 6d 57 69 6e 33 32 4f 73 46 72 65 65 28 70 45 6e  mWin32OsFree(pEn
5830: 76 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72  v, p);.    retur
5840: 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  n NULL;.  }else 
5850: 69 66 28 20 4e 55 4c 4c 3d 3d 70 20 29 7b 0a 20  if( NULL==p ){. 
5860: 20 20 20 72 65 74 75 72 6e 20 6c 73 6d 57 69 6e     return lsmWin
5870: 33 32 4f 73 4d 61 6c 6c 6f 63 28 70 45 6e 76 2c  32OsMalloc(pEnv,
5880: 20 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69   N);.  }else{.#i
5890: 66 20 30 20 2f 2a 20 61 72 67 75 61 62 6c 65 3a  f 0 /* arguable:
58a0: 20 64 6f 6e 27 74 20 73 68 72 69 6e 6b 20 2a 2f   don't shrink */
58b0: 0a 20 20 20 20 53 49 5a 45 5f 54 20 73 7a 20 3d  .    SIZE_T sz =
58c0: 20 48 65 61 70 53 69 7a 65 28 47 65 74 50 72 6f   HeapSize(GetPro
58d0: 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 6d  cessHeap(), 0, m
58e0: 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 3d 28  );.    if( sz>=(
58f0: 53 49 5a 45 5f 54 29 4e 20 29 7b 0a 20 20 20 20  SIZE_T)N ){.    
5900: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
5910: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
5920: 75 72 6e 20 48 65 61 70 52 65 41 6c 6c 6f 63 28  urn HeapReAlloc(
5930: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29  GetProcessHeap()
5940: 2c 20 30 2c 20 6d 2c 20 4e 29 3b 0a 20 20 7d 0a  , 0, m, N);.  }.
5950: 7d 0a 0a 73 74 61 74 69 63 20 73 69 7a 65 5f 74  }..static size_t
5960: 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 53 69 7a 65   lsmWin32OsMSize
5970: 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20  (lsm_env *pEnv, 
5980: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 61 73 73 65  void *p){.  asse
5990: 72 74 28 20 48 65 61 70 56 61 6c 69 64 61 74 65  rt( HeapValidate
59a0: 28 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28  (GetProcessHeap(
59b0: 29 2c 20 30 2c 20 4e 55 4c 4c 29 20 29 3b 0a 20  ), 0, NULL) );. 
59c0: 20 72 65 74 75 72 6e 20 28 73 69 7a 65 5f 74 29   return (size_t)
59d0: 48 65 61 70 53 69 7a 65 28 47 65 74 50 72 6f 63  HeapSize(GetProc
59e0: 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 70 29  essHeap(), 0, p)
59f0: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 4c 53 4d  ;.}...#ifdef LSM
5a00: 5f 4d 55 54 45 58 5f 57 49 4e 33 32 0a 2f 2a 2a  _MUTEX_WIN32./**
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 75 74 65 78  *******.** Mutex
5a60: 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 57 69 6e   methods for Win
5a70: 33 32 20 62 61 73 65 64 20 73 79 73 74 65 6d 73  32 based systems
5a80: 2e 20 20 49 66 20 4c 53 4d 5f 4d 55 54 45 58 5f  .  If LSM_MUTEX_
5a90: 57 49 4e 33 32 20 69 73 0a 2a 2a 20 6d 69 73 73  WIN32 is.** miss
5aa0: 69 6e 67 20 74 68 65 6e 20 61 20 6e 6f 2d 6f 70  ing then a no-op
5ab0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
5ac0: 6f 66 20 6d 75 74 65 78 65 73 20 66 6f 75 6e 64  of mutexes found
5ad0: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62 65 0a 2a   below will be.*
5ae0: 2a 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  * used instead..
5af0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 77 69 6e  */.#include "win
5b00: 64 6f 77 73 2e 68 22 0a 0a 74 79 70 65 64 65 66  dows.h"..typedef
5b10: 20 73 74 72 75 63 74 20 57 69 6e 33 32 4d 75 74   struct Win32Mut
5b20: 65 78 20 57 69 6e 33 32 4d 75 74 65 78 3b 0a 73  ex Win32Mutex;.s
5b30: 74 72 75 63 74 20 57 69 6e 33 32 4d 75 74 65 78  truct Win32Mutex
5b40: 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45   {.  lsm_env *pE
5b50: 6e 76 3b 0a 20 20 43 52 49 54 49 43 41 4c 5f 53  nv;.  CRITICAL_S
5b60: 45 43 54 49 4f 4e 20 6d 75 74 65 78 3b 0a 23 69  ECTION mutex;.#i
5b70: 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 20  fdef LSM_DEBUG. 
5b80: 20 44 57 4f 52 44 20 6f 77 6e 65 72 3b 0a 23 65   DWORD owner;.#e
5b90: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
5ba0: 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f 49 4e 49   WIN32_MUTEX_INI
5bb0: 54 49 41 4c 49 5a 45 52 0a 23 20 64 65 66 69 6e  TIALIZER.# defin
5bc0: 65 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f 49 4e  e WIN32_MUTEX_IN
5bd0: 49 54 49 41 4c 49 5a 45 52 20 7b 20 30 20 7d 0a  ITIALIZER { 0 }.
5be0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 4c  #endif..#ifdef L
5bf0: 53 4d 5f 44 45 42 55 47 0a 23 20 64 65 66 69 6e  SM_DEBUG.# defin
5c00: 65 20 4c 53 4d 5f 57 49 4e 33 32 5f 53 54 41 54  e LSM_WIN32_STAT
5c10: 49 43 5f 4d 55 54 45 58 20 7b 20 30 2c 20 57 49  IC_MUTEX { 0, WI
5c20: 4e 33 32 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  N32_MUTEX_INITIA
5c30: 4c 49 5a 45 52 2c 20 30 20 7d 0a 23 65 6c 73 65  LIZER, 0 }.#else
5c40: 0a 23 20 64 65 66 69 6e 65 20 4c 53 4d 5f 57 49  .# define LSM_WI
5c50: 4e 33 32 5f 53 54 41 54 49 43 5f 4d 55 54 45 58  N32_STATIC_MUTEX
5c60: 20 7b 20 30 2c 20 57 49 4e 33 32 5f 4d 55 54 45   { 0, WIN32_MUTE
5c70: 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7d 0a  X_INITIALIZER }.
5c80: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
5c90: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74  nt lsmWin32OsMut
5ca0: 65 78 53 74 61 74 69 63 28 0a 20 20 6c 73 6d 5f  exStatic(.  lsm_
5cb0: 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 69 6e 74  env *pEnv,.  int
5cc0: 20 69 4d 75 74 65 78 2c 0a 20 20 6c 73 6d 5f 6d   iMutex,.  lsm_m
5cd0: 75 74 65 78 20 2a 2a 70 70 53 74 61 74 69 63 0a  utex **ppStatic.
5ce0: 29 7b 0a 20 20 73 74 61 74 69 63 20 76 6f 6c 61  ){.  static vola
5cf0: 74 69 6c 65 20 4c 4f 4e 47 20 69 6e 69 74 69 61  tile LONG initia
5d00: 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 73 74 61  lized = 0;.  sta
5d10: 74 69 63 20 57 69 6e 33 32 4d 75 74 65 78 20 73  tic Win32Mutex s
5d20: 4d 75 74 65 78 5b 32 5d 20 3d 20 7b 0a 20 20 20  Mutex[2] = {.   
5d30: 20 4c 53 4d 5f 57 49 4e 33 32 5f 53 54 41 54 49   LSM_WIN32_STATI
5d40: 43 5f 4d 55 54 45 58 2c 0a 20 20 20 20 4c 53 4d  C_MUTEX,.    LSM
5d50: 5f 57 49 4e 33 32 5f 53 54 41 54 49 43 5f 4d 55  _WIN32_STATIC_MU
5d60: 54 45 58 0a 20 20 7d 3b 0a 0a 20 20 61 73 73 65  TEX.  };..  asse
5d70: 72 74 28 20 69 4d 75 74 65 78 3d 3d 4c 53 4d 5f  rt( iMutex==LSM_
5d80: 4d 55 54 45 58 5f 47 4c 4f 42 41 4c 20 7c 7c 20  MUTEX_GLOBAL || 
5d90: 69 4d 75 74 65 78 3d 3d 4c 53 4d 5f 4d 55 54 45  iMutex==LSM_MUTE
5da0: 58 5f 48 45 41 50 20 29 3b 0a 20 20 61 73 73 65  X_HEAP );.  asse
5db0: 72 74 28 20 4c 53 4d 5f 4d 55 54 45 58 5f 47 4c  rt( LSM_MUTEX_GL
5dc0: 4f 42 41 4c 3d 3d 31 20 26 26 20 4c 53 4d 5f 4d  OBAL==1 && LSM_M
5dd0: 55 54 45 58 5f 48 45 41 50 3d 3d 32 20 29 3b 0a  UTEX_HEAP==2 );.
5de0: 0a 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b  .  if( Interlock
5df0: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
5e00: 65 28 26 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  e(&initialized, 
5e10: 31 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  1, 0)==0 ){.    
5e20: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5e30: 3d 30 3b 20 69 3c 61 72 72 61 79 5f 73 69 7a 65  =0; i<array_size
5e40: 28 73 4d 75 74 65 78 29 3b 20 69 2b 2b 29 7b 0a  (sMutex); i++){.
5e50: 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
5e60: 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28  CriticalSection(
5e70: 26 73 4d 75 74 65 78 5b 69 5d 2e 6d 75 74 65 78  &sMutex[i].mutex
5e80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
5e90: 70 70 53 74 61 74 69 63 20 3d 20 28 6c 73 6d 5f  ppStatic = (lsm_
5ea0: 6d 75 74 65 78 20 2a 29 26 73 4d 75 74 65 78 5b  mutex *)&sMutex[
5eb0: 69 4d 75 74 65 78 2d 31 5d 3b 0a 20 20 72 65 74  iMutex-1];.  ret
5ec0: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
5ed0: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
5ee0: 33 32 4f 73 4d 75 74 65 78 4e 65 77 28 6c 73 6d  32OsMutexNew(lsm
5ef0: 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c 73 6d 5f  _env *pEnv, lsm_
5f00: 6d 75 74 65 78 20 2a 2a 70 70 4e 65 77 29 7b 0a  mutex **ppNew){.
5f10: 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d    Win32Mutex *pM
5f20: 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
5f30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
5f40: 77 20 6d 75 74 65 78 20 2a 2f 0a 0a 20 20 70 4d  w mutex */..  pM
5f50: 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d 75 74  utex = (Win32Mut
5f60: 65 78 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65  ex *)lsmMallocZe
5f70: 72 6f 28 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  ro(pEnv, sizeof(
5f80: 57 69 6e 33 32 4d 75 74 65 78 29 29 3b 0a 20 20  Win32Mutex));.  
5f90: 69 66 28 20 21 70 4d 75 74 65 78 20 29 20 72 65  if( !pMutex ) re
5fa0: 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42  turn LSM_NOMEM_B
5fb0: 4b 50 54 3b 0a 0a 20 20 70 4d 75 74 65 78 2d 3e  KPT;..  pMutex->
5fc0: 70 45 6e 76 20 3d 20 70 45 6e 76 3b 0a 20 20 49  pEnv = pEnv;.  I
5fd0: 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63 61  nitializeCritica
5fe0: 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75 74 65 78  lSection(&pMutex
5ff0: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2a 70 70  ->mutex);..  *pp
6000: 4e 65 77 20 3d 20 28 6c 73 6d 5f 6d 75 74 65 78  New = (lsm_mutex
6010: 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 72 65 74   *)pMutex;.  ret
6020: 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73  urn LSM_OK;.}..s
6030: 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69  tatic void lsmWi
6040: 6e 33 32 4f 73 4d 75 74 65 78 44 65 6c 28 6c 73  n32OsMutexDel(ls
6050: 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 57  m_mutex *p){.  W
6060: 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d 75 74 65  in32Mutex *pMute
6070: 78 20 3d 20 28 57 69 6e 33 32 4d 75 74 65 78 20  x = (Win32Mutex 
6080: 2a 29 70 3b 0a 20 20 44 65 6c 65 74 65 43 72 69  *)p;.  DeleteCri
6090: 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d  ticalSection(&pM
60a0: 75 74 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  utex->mutex);.  
60b0: 6c 73 6d 46 72 65 65 28 70 4d 75 74 65 78 2d 3e  lsmFree(pMutex->
60c0: 70 45 6e 76 2c 20 70 4d 75 74 65 78 29 3b 0a 7d  pEnv, pMutex);.}
60d0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73  ..static void ls
60e0: 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 45 6e 74  mWin32OsMutexEnt
60f0: 65 72 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 29  er(lsm_mutex *p)
6100: 7b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a  {.  Win32Mutex *
6110: 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d  pMutex = (Win32M
6120: 75 74 65 78 20 2a 29 70 3b 0a 20 20 45 6e 74 65  utex *)p;.  Ente
6130: 72 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e  rCriticalSection
6140: 28 26 70 4d 75 74 65 78 2d 3e 6d 75 74 65 78 29  (&pMutex->mutex)
6150: 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45  ;..#ifdef LSM_DE
6160: 42 55 47 0a 20 20 61 73 73 65 72 74 28 20 70 4d  BUG.  assert( pM
6170: 75 74 65 78 2d 3e 6f 77 6e 65 72 21 3d 47 65 74  utex->owner!=Get
6180: 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28  CurrentThreadId(
6190: 29 20 29 3b 0a 20 20 70 4d 75 74 65 78 2d 3e 6f  ) );.  pMutex->o
61a0: 77 6e 65 72 20 3d 20 47 65 74 43 75 72 72 65 6e  wner = GetCurren
61b0: 74 54 68 72 65 61 64 49 64 28 29 3b 0a 20 20 61  tThreadId();.  a
61c0: 73 73 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f  ssert( pMutex->o
61d0: 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74  wner==GetCurrent
61e0: 54 68 72 65 61 64 49 64 28 29 20 29 3b 0a 23 65  ThreadId() );.#e
61f0: 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ndif.}..static i
6200: 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74  nt lsmWin32OsMut
6210: 65 78 54 72 79 28 6c 73 6d 5f 6d 75 74 65 78 20  exTry(lsm_mutex 
6220: 2a 70 29 7b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  *p){.  BOOL bRet
6230: 3b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a  ;.  Win32Mutex *
6240: 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d  pMutex = (Win32M
6250: 75 74 65 78 20 2a 29 70 3b 0a 20 20 62 52 65 74  utex *)p;.  bRet
6260: 20 3d 20 54 72 79 45 6e 74 65 72 43 72 69 74 69   = TryEnterCriti
6270: 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75 74  calSection(&pMut
6280: 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 23 69 66 64  ex->mutex);.#ifd
6290: 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 20 20 69  ef LSM_DEBUG.  i
62a0: 66 28 20 62 52 65 74 20 29 7b 0a 20 20 20 20 61  f( bRet ){.    a
62b0: 73 73 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f  ssert( pMutex->o
62c0: 77 6e 65 72 21 3d 47 65 74 43 75 72 72 65 6e 74  wner!=GetCurrent
62d0: 54 68 72 65 61 64 49 64 28 29 20 29 3b 0a 20 20  ThreadId() );.  
62e0: 20 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 20    pMutex->owner 
62f0: 3d 20 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  = GetCurrentThre
6300: 61 64 49 64 28 29 3b 0a 20 20 20 20 61 73 73 65  adId();.    asse
6310: 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65  rt( pMutex->owne
6320: 72 3d 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72  r==GetCurrentThr
6330: 65 61 64 49 64 28 29 20 29 3b 0a 20 20 7d 0a 23  eadId() );.  }.#
6340: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 21  endif.  return !
6350: 62 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bRet;.}..static 
6360: 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32 4f 73 4d  void lsmWin32OsM
6370: 75 74 65 78 4c 65 61 76 65 28 6c 73 6d 5f 6d 75  utexLeave(lsm_mu
6380: 74 65 78 20 2a 70 29 7b 0a 20 20 57 69 6e 33 32  tex *p){.  Win32
6390: 4d 75 74 65 78 20 2a 70 4d 75 74 65 78 20 3d 20  Mutex *pMutex = 
63a0: 28 57 69 6e 33 32 4d 75 74 65 78 20 2a 29 70 3b  (Win32Mutex *)p;
63b0: 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55  .#ifdef LSM_DEBU
63c0: 47 0a 20 20 61 73 73 65 72 74 28 20 70 4d 75 74  G.  assert( pMut
63d0: 65 78 2d 3e 6f 77 6e 65 72 3d 3d 47 65 74 43 75  ex->owner==GetCu
63e0: 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 20  rrentThreadId() 
63f0: 29 3b 0a 20 20 70 4d 75 74 65 78 2d 3e 6f 77 6e  );.  pMutex->own
6400: 65 72 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  er = 0;.  assert
6410: 28 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 21  ( pMutex->owner!
6420: 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61  =GetCurrentThrea
6430: 64 49 64 28 29 20 29 3b 0a 23 65 6e 64 69 66 0a  dId() );.#endif.
6440: 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c 53    LeaveCriticalS
6450: 65 63 74 69 6f 6e 28 26 70 4d 75 74 65 78 2d 3e  ection(&pMutex->
6460: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 23 69 66 64 65  mutex);.}..#ifde
6470: 66 20 4c 53 4d 5f 44 45 42 55 47 0a 73 74 61 74  f LSM_DEBUG.stat
6480: 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f  ic int lsmWin32O
6490: 73 4d 75 74 65 78 48 65 6c 64 28 6c 73 6d 5f 6d  sMutexHeld(lsm_m
64a0: 75 74 65 78 20 2a 70 29 7b 0a 20 20 57 69 6e 33  utex *p){.  Win3
64b0: 32 4d 75 74 65 78 20 2a 70 4d 75 74 65 78 20 3d  2Mutex *pMutex =
64c0: 20 28 57 69 6e 33 32 4d 75 74 65 78 20 2a 29 70   (Win32Mutex *)p
64d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 75 74 65  ;.  return pMute
64e0: 78 20 3f 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65  x ? pMutex->owne
64f0: 72 3d 3d 47 65 74 43 75 72 72 65 6e 74 54 68 72  r==GetCurrentThr
6500: 65 61 64 49 64 28 29 20 3a 20 31 3b 0a 7d 0a 73  eadId() : 1;.}.s
6510: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
6520: 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48 65 6c 64  32OsMutexNotHeld
6530: 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  (lsm_mutex *p){.
6540: 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d    Win32Mutex *pM
6550: 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d 75 74  utex = (Win32Mut
6560: 65 78 20 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e  ex *)p;.  return
6570: 20 70 4d 75 74 65 78 20 3f 20 70 4d 75 74 65 78   pMutex ? pMutex
6580: 2d 3e 6f 77 6e 65 72 21 3d 47 65 74 43 75 72 72  ->owner!=GetCurr
6590: 65 6e 74 54 68 72 65 61 64 49 64 28 29 20 3a 20  entThreadId() : 
65a0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  1;.}.#endif./*.*
65b0: 2a 20 45 6e 64 20 6f 66 20 57 69 6e 33 32 20 6d  * End of Win32 m
65c0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
65d0: 69 6f 6e 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion..***********
65e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
65f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6620: 23 65 6c 73 65 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  #else./*********
6630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6670: 0a 2a 2a 20 4e 6f 6f 70 20 6d 75 74 65 78 20 69  .** Noop mutex i
6680: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f  mplementation.*/
6690: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
66a0: 4e 6f 6f 70 4d 75 74 65 78 20 4e 6f 6f 70 4d 75  NoopMutex NoopMu
66b0: 74 65 78 3b 0a 73 74 72 75 63 74 20 4e 6f 6f 70  tex;.struct Noop
66c0: 4d 75 74 65 78 20 7b 0a 20 20 6c 73 6d 5f 65 6e  Mutex {.  lsm_en
66d0: 76 20 2a 70 45 6e 76 3b 20 20 20 20 20 20 20 20  v *pEnv;        
66e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 76            /* Env
66f0: 69 72 6f 6e 6d 65 6e 74 20 68 61 6e 64 6c 65 20  ironment handle 
6700: 28 66 6f 72 20 78 46 72 65 65 28 29 29 20 2a 2f  (for xFree()) */
6710: 0a 20 20 69 6e 74 20 62 48 65 6c 64 3b 20 20 20  .  int bHeld;   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 75     /* True if mu
6740: 74 65 78 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20  tex is held */. 
6750: 20 69 6e 74 20 62 53 74 61 74 69 63 3b 20 20 20   int bStatic;   
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
6780: 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 7d  tatic mutex */.}
6790: 3b 0a 73 74 61 74 69 63 20 4e 6f 6f 70 4d 75 74  ;.static NoopMut
67a0: 65 78 20 61 53 74 61 74 69 63 4e 6f 6f 70 4d 75  ex aStaticNoopMu
67b0: 74 65 78 5b 32 5d 20 3d 20 7b 0a 20 20 7b 30 2c  tex[2] = {.  {0,
67c0: 20 30 2c 20 31 7d 2c 0a 20 20 7b 30 2c 20 30 2c   0, 1},.  {0, 0,
67d0: 20 31 7d 2c 0a 7d 3b 0a 0a 73 74 61 74 69 63 20   1},.};..static 
67e0: 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75  int lsmWin32OsMu
67f0: 74 65 78 53 74 61 74 69 63 28 0a 20 20 6c 73 6d  texStatic(.  lsm
6800: 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20 69 6e  _env *pEnv,.  in
6810: 74 20 69 4d 75 74 65 78 2c 0a 20 20 6c 73 6d 5f  t iMutex,.  lsm_
6820: 6d 75 74 65 78 20 2a 2a 70 70 53 74 61 74 69 63  mutex **ppStatic
6830: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4d  .){.  assert( iM
6840: 75 74 65 78 3e 3d 31 20 26 26 20 69 4d 75 74 65  utex>=1 && iMute
6850: 78 3c 3d 28 69 6e 74 29 61 72 72 61 79 5f 73 69  x<=(int)array_si
6860: 7a 65 28 61 53 74 61 74 69 63 4e 6f 6f 70 4d 75  ze(aStaticNoopMu
6870: 74 65 78 29 20 29 3b 0a 20 20 2a 70 70 53 74 61  tex) );.  *ppSta
6880: 74 69 63 20 3d 20 28 6c 73 6d 5f 6d 75 74 65 78  tic = (lsm_mutex
6890: 20 2a 29 26 61 53 74 61 74 69 63 4e 6f 6f 70 4d   *)&aStaticNoopM
68a0: 75 74 65 78 5b 69 4d 75 74 65 78 2d 31 5d 3b 0a  utex[iMutex-1];.
68b0: 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b    return LSM_OK;
68c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  .}.static int ls
68d0: 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e 65 77  mWin32OsMutexNew
68e0: 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20  (lsm_env *pEnv, 
68f0: 6c 73 6d 5f 6d 75 74 65 78 20 2a 2a 70 70 4e 65  lsm_mutex **ppNe
6900: 77 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20  w){.  NoopMutex 
6910: 2a 70 3b 0a 20 20 70 20 3d 20 28 4e 6f 6f 70 4d  *p;.  p = (NoopM
6920: 75 74 65 78 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63  utex *)lsmMalloc
6930: 5a 65 72 6f 28 70 45 6e 76 2c 20 73 69 7a 65 6f  Zero(pEnv, sizeo
6940: 66 28 4e 6f 6f 70 4d 75 74 65 78 29 29 3b 0a 20  f(NoopMutex));. 
6950: 20 69 66 28 20 70 20 29 20 70 2d 3e 70 45 6e 76   if( p ) p->pEnv
6960: 20 3d 20 70 45 6e 76 3b 0a 20 20 2a 70 70 4e 65   = pEnv;.  *ppNe
6970: 77 20 3d 20 28 6c 73 6d 5f 6d 75 74 65 78 20 2a  w = (lsm_mutex *
6980: 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  )p;.  return (p 
6990: 3f 20 4c 53 4d 5f 4f 4b 20 3a 20 4c 53 4d 5f 4e  ? LSM_OK : LSM_N
69a0: 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 73 74  OMEM_BKPT);.}.st
69b0: 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e  atic void lsmWin
69c0: 33 32 4f 73 4d 75 74 65 78 44 65 6c 28 6c 73 6d  32OsMutexDel(lsm
69d0: 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 20  _mutex *pMutex) 
69e0: 20 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a   {.  NoopMutex *
69f0: 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a  p = (NoopMutex *
6a00: 29 70 4d 75 74 65 78 3b 0a 20 20 61 73 73 65 72  )pMutex;.  asser
6a10: 74 28 20 70 2d 3e 62 53 74 61 74 69 63 3d 3d 30  t( p->bStatic==0
6a20: 20 26 26 20 70 2d 3e 70 45 6e 76 20 29 3b 0a 20   && p->pEnv );. 
6a30: 20 6c 73 6d 46 72 65 65 28 70 2d 3e 70 45 6e 76   lsmFree(p->pEnv
6a40: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  , p);.}.static v
6a50: 6f 69 64 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75  oid lsmWin32OsMu
6a60: 74 65 78 45 6e 74 65 72 28 6c 73 6d 5f 6d 75 74  texEnter(lsm_mut
6a70: 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a 20 20 4e  ex *pMutex){.  N
6a80: 6f 6f 70 4d 75 74 65 78 20 2a 70 20 3d 20 28 4e  oopMutex *p = (N
6a90: 6f 6f 70 4d 75 74 65 78 20 2a 29 70 4d 75 74 65  oopMutex *)pMute
6aa0: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
6ab0: 62 48 65 6c 64 3d 3d 30 20 29 3b 0a 20 20 70 2d  bHeld==0 );.  p-
6ac0: 3e 62 48 65 6c 64 20 3d 20 31 3b 0a 7d 0a 73 74  >bHeld = 1;.}.st
6ad0: 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33  atic int lsmWin3
6ae0: 32 4f 73 4d 75 74 65 78 54 72 79 28 6c 73 6d 5f  2OsMutexTry(lsm_
6af0: 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a  mutex *pMutex){.
6b00: 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a 70 20 3d    NoopMutex *p =
6b10: 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a 29 70 4d   (NoopMutex *)pM
6b20: 75 74 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20  utex;.  assert( 
6b30: 70 2d 3e 62 48 65 6c 64 3d 3d 30 20 29 3b 0a 20  p->bHeld==0 );. 
6b40: 20 70 2d 3e 62 48 65 6c 64 20 3d 20 31 3b 0a 20   p->bHeld = 1;. 
6b50: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61   return 0;.}.sta
6b60: 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e 33  tic void lsmWin3
6b70: 32 4f 73 4d 75 74 65 78 4c 65 61 76 65 28 6c 73  2OsMutexLeave(ls
6b80: 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29  m_mutex *pMutex)
6b90: 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a 70  {.  NoopMutex *p
6ba0: 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a 29   = (NoopMutex *)
6bb0: 70 4d 75 74 65 78 3b 0a 20 20 61 73 73 65 72 74  pMutex;.  assert
6bc0: 28 20 70 2d 3e 62 48 65 6c 64 3d 3d 31 20 29 3b  ( p->bHeld==1 );
6bd0: 0a 20 20 70 2d 3e 62 48 65 6c 64 20 3d 20 30 3b  .  p->bHeld = 0;
6be0: 0a 7d 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45  .}.#ifdef LSM_DE
6bf0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  BUG.static int l
6c00: 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 48 65  smWin32OsMutexHe
6c10: 6c 64 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d  ld(lsm_mutex *pM
6c20: 75 74 65 78 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74  utex){.  NoopMut
6c30: 65 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75 74  ex *p = (NoopMut
6c40: 65 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 72  ex *)pMutex;.  r
6c50: 65 74 75 72 6e 20 70 20 3f 20 70 2d 3e 62 48 65  eturn p ? p->bHe
6c60: 6c 64 20 3a 20 31 3b 0a 7d 0a 73 74 61 74 69 63  ld : 1;.}.static
6c70: 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d   int lsmWin32OsM
6c80: 75 74 65 78 4e 6f 74 48 65 6c 64 28 6c 73 6d 5f  utexNotHeld(lsm_
6c90: 6d 75 74 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a  mutex *pMutex){.
6ca0: 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a 70 20 3d    NoopMutex *p =
6cb0: 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a 29 70 4d   (NoopMutex *)pM
6cc0: 75 74 65 78 3b 0a 20 20 72 65 74 75 72 6e 20 70  utex;.  return p
6cd0: 20 3f 20 21 70 2d 3e 62 48 65 6c 64 20 3a 20 31   ? !p->bHeld : 1
6ce0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 2a 2a 2a  ;.}.#endif./****
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d30: 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
6d40: 2f 2a 20 65 6c 73 65 20 4c 53 4d 5f 4d 55 54 45  /* else LSM_MUTE
6d50: 58 5f 4e 4f 4e 45 20 2a 2f 0a 0a 2f 2a 20 57 69  X_NONE */../* Wi
6d60: 74 68 6f 75 74 20 4c 53 4d 5f 44 45 42 55 47 2c  thout LSM_DEBUG,
6d70: 20 74 68 65 20 4d 75 74 65 78 48 65 6c 64 20 74   the MutexHeld t
6d80: 65 73 74 73 20 61 72 65 20 6e 65 76 65 72 20 63  ests are never c
6d90: 61 6c 6c 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  alled */.#ifndef
6da0: 20 4c 53 4d 5f 44 45 42 55 47 0a 23 20 64 65 66   LSM_DEBUG.# def
6db0: 69 6e 65 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75  ine lsmWin32OsMu
6dc0: 74 65 78 48 65 6c 64 20 20 20 20 30 0a 23 20 64  texHeld    0.# d
6dd0: 65 66 69 6e 65 20 6c 73 6d 57 69 6e 33 32 4f 73  efine lsmWin32Os
6de0: 4d 75 74 65 78 4e 6f 74 48 65 6c 64 20 30 0a 23  MutexNotHeld 0.#
6df0: 65 6e 64 69 66 0a 0a 6c 73 6d 5f 65 6e 76 20 2a  endif..lsm_env *
6e00: 6c 73 6d 5f 64 65 66 61 75 6c 74 5f 65 6e 76 28  lsm_default_env(
6e10: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
6e20: 6c 73 6d 5f 65 6e 76 20 77 69 6e 33 32 5f 65 6e  lsm_env win32_en
6e30: 76 20 3d 20 7b 0a 20 20 20 20 73 69 7a 65 6f 66  v = {.    sizeof
6e40: 28 6c 73 6d 5f 65 6e 76 29 2c 20 20 20 20 20 20  (lsm_env),      
6e50: 20 20 20 2f 2a 20 6e 42 79 74 65 20 2a 2f 0a 20     /* nByte */. 
6e60: 20 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20     1,           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
6e80: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 2f  Version */.    /
6e90: 2a 2a 2a 2a 2a 20 66 69 6c 65 20 69 2f 6f 20 2a  ***** file i/o *
6ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6eb0: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 2f 2a 20 70 56 66 73 43 74 78 20 2a 2f 0a 20 20  /* pVfsCtx */.  
6ee0: 20 20 6c 73 6d 57 69 6e 33 32 4f 73 46 75 6c 6c    lsmWin32OsFull
6ef0: 70 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 78 46  path,      /* xF
6f00: 75 6c 6c 70 61 74 68 20 2a 2f 0a 20 20 20 20 6c  ullpath */.    l
6f10: 73 6d 57 69 6e 33 32 4f 73 4f 70 65 6e 2c 20 20  smWin32OsOpen,  
6f20: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
6f30: 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32   */.    lsmWin32
6f40: 4f 73 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  OsRead,         
6f50: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 20   /* xRead */.   
6f60: 20 6c 73 6d 57 69 6e 33 32 4f 73 57 72 69 74 65   lsmWin32OsWrite
6f70: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72  ,         /* xWr
6f80: 69 74 65 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  ite */.    lsmWi
6f90: 6e 33 32 4f 73 54 72 75 6e 63 61 74 65 2c 20 20  n32OsTruncate,  
6fa0: 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
6fb0: 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32   */.    lsmWin32
6fc0: 4f 73 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  OsSync,         
6fd0: 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20   /* xSync */.   
6fe0: 20 6c 73 6d 57 69 6e 33 32 4f 73 53 65 63 74 6f   lsmWin32OsSecto
6ff0: 72 53 69 7a 65 2c 20 20 20 20 2f 2a 20 78 53 65  rSize,    /* xSe
7000: 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 20 20  ctorSize */.    
7010: 6c 73 6d 57 69 6e 33 32 4f 73 52 65 6d 61 70 2c  lsmWin32OsRemap,
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6d           /* xRem
7030: 61 70 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  ap */.    lsmWin
7040: 33 32 4f 73 46 69 6c 65 69 64 2c 20 20 20 20 20  32OsFileid,     
7050: 20 20 20 2f 2a 20 78 46 69 6c 65 69 64 20 2a 2f     /* xFileid */
7060: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 43  .    lsmWin32OsC
7070: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  lose,         /*
7080: 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 6c   xClose */.    l
7090: 73 6d 57 69 6e 33 32 4f 73 55 6e 6c 69 6e 6b 2c  smWin32OsUnlink,
70a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 69          /* xUnli
70b0: 6e 6b 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  nk */.    lsmWin
70c0: 33 32 4f 73 4c 6f 63 6b 2c 20 20 20 20 20 20 20  32OsLock,       
70d0: 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
70e0: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 54 65 73     lsmWin32OsTes
70f0: 74 4c 6f 63 6b 2c 20 20 20 20 20 20 2f 2a 20 78  tLock,      /* x
7100: 54 65 73 74 4c 6f 63 6b 20 2a 2f 0a 20 20 20 20  TestLock */.    
7110: 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d 4d 61 70  lsmWin32OsShmMap
7120: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d  ,        /* xShm
7130: 4d 61 70 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  Map */.    lsmWi
7140: 6e 33 32 4f 73 53 68 6d 42 61 72 72 69 65 72 2c  n32OsShmBarrier,
7150: 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
7160: 65 72 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  er */.    lsmWin
7170: 33 32 4f 73 53 68 6d 55 6e 6d 61 70 2c 20 20 20  32OsShmUnmap,   
7180: 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
7190: 2a 2f 0a 20 20 20 20 2f 2a 2a 2a 2a 2a 20 6d 65  */.    /***** me
71a0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 30  *********/.    0
71c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71d0: 20 20 20 20 20 20 20 20 2f 2a 20 70 4d 65 6d 43          /* pMemC
71e0: 74 78 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  tx */.    lsmWin
71f0: 33 32 4f 73 4d 61 6c 6c 6f 63 2c 20 20 20 20 20  32OsMalloc,     
7200: 20 20 20 2f 2a 20 78 4d 61 6c 6c 6f 63 20 2a 2f     /* xMalloc */
7210: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 52  .    lsmWin32OsR
7220: 65 61 6c 6c 6f 63 2c 20 20 20 20 20 20 20 2f 2a  ealloc,       /*
7230: 20 78 52 65 61 6c 6c 6f 63 20 2a 2f 0a 20 20 20   xRealloc */.   
7240: 20 6c 73 6d 57 69 6e 33 32 4f 73 46 72 65 65 2c   lsmWin32OsFree,
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 72            /* xFr
7260: 65 65 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  ee */.    lsmWin
7270: 33 32 4f 73 4d 53 69 7a 65 2c 20 20 20 20 20 20  32OsMSize,      
7280: 20 20 20 2f 2a 20 78 53 69 7a 65 20 2a 2f 0a 20     /* xSize */. 
7290: 20 20 20 2f 2a 2a 2a 2a 2a 20 6d 75 74 65 78 65     /***** mutexe
72a0: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
72b0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 30 2c 20  *******/.    0, 
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 20 20 20 20 20 2f 2a 20 70 4d 75 74 65 78 43        /* pMutexC
72e0: 74 78 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  tx */.    lsmWin
72f0: 33 32 4f 73 4d 75 74 65 78 53 74 61 74 69 63 2c  32OsMutexStatic,
7300: 20 20 20 2f 2a 20 78 4d 75 74 65 78 53 74 61 74     /* xMutexStat
7310: 69 63 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  ic */.    lsmWin
7320: 33 32 4f 73 4d 75 74 65 78 4e 65 77 2c 20 20 20  32OsMutexNew,   
7330: 20 20 20 2f 2a 20 78 4d 75 74 65 78 4e 65 77 20     /* xMutexNew 
7340: 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f  */.    lsmWin32O
7350: 73 4d 75 74 65 78 44 65 6c 2c 20 20 20 20 20 20  sMutexDel,      
7360: 2f 2a 20 78 4d 75 74 65 78 44 65 6c 20 2a 2f 0a  /* xMutexDel */.
7370: 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75      lsmWin32OsMu
7380: 74 65 78 45 6e 74 65 72 2c 20 20 20 20 2f 2a 20  texEnter,    /* 
7390: 78 4d 75 74 65 78 45 6e 74 65 72 20 2a 2f 0a 20  xMutexEnter */. 
73a0: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74     lsmWin32OsMut
73b0: 65 78 54 72 79 2c 20 20 20 20 20 20 2f 2a 20 78  exTry,      /* x
73c0: 4d 75 74 65 78 54 72 79 20 2a 2f 0a 20 20 20 20  MutexTry */.    
73d0: 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 4c  lsmWin32OsMutexL
73e0: 65 61 76 65 2c 20 20 20 20 2f 2a 20 78 4d 75 74  eave,    /* xMut
73f0: 65 78 4c 65 61 76 65 20 2a 2f 0a 20 20 20 20 6c  exLeave */.    l
7400: 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 48 65  smWin32OsMutexHe
7410: 6c 64 2c 20 20 20 20 20 2f 2a 20 78 4d 75 74 65  ld,     /* xMute
7420: 78 48 65 6c 64 20 2a 2f 0a 20 20 20 20 6c 73 6d  xHeld */.    lsm
7430: 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48  Win32OsMutexNotH
7440: 65 6c 64 2c 20 20 2f 2a 20 78 4d 75 74 65 78 4e  eld,  /* xMutexN
7450: 6f 74 48 65 6c 64 20 2a 2f 0a 20 20 20 20 2f 2a  otHeld */.    /*
7460: 2a 2a 2a 2a 20 6f 74 68 65 72 20 2a 2a 2a 2a 2a  **** other *****
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7480: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
7490: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 2f  Sleep,         /
74a0: 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 7d 3b  * xSleep */.  };
74b0: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 33 32  .  return &win32
74c0: 5f 65 6e 76 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  _env;.}..#endif.