/ Hex Artifact Content
Login

Artifact 6695337721cad5fbc226d6df4de5fa8537f47b52b909e0b832e190ad7e32cdb5:


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 6c 73 6d 57  .static int lsmW
3fb0: 69 6e 33 32 4f 73 4c 6f 63 6b 28 6c 73 6d 5f 66  in32OsLock(lsm_f
3fc0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
3fd0: 69 4c 6f 63 6b 2c 20 69 6e 74 20 65 54 79 70 65  iLock, int eType
3fe0: 29 7b 0a 20 20 57 69 6e 33 32 46 69 6c 65 20 2a  ){.  Win32File *
3ff0: 70 57 69 6e 33 32 46 69 6c 65 20 3d 20 28 57 69  pWin32File = (Wi
4000: 6e 33 32 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  n32File *)pFile;
4010: 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
4020: 6c 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 4c  lp;..  assert( L
4030: 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b 3d 3d  SM_LOCK_UNLOCK==
4040: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4c  0 );.  assert( L
4050: 53 4d 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3d 3d  SM_LOCK_SHARED==
4060: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4c  1 );.  assert( L
4070: 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 3d 3d 32 20  SM_LOCK_EXCL==2 
4080: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
4090: 70 65 3e 3d 4c 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c  pe>=LSM_LOCK_UNL
40a0: 4f 43 4b 20 26 26 20 65 54 79 70 65 3c 3d 4c 53  OCK && eType<=LS
40b0: 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 20 29 3b 0a 20  M_LOCK_EXCL );. 
40c0: 20 61 73 73 65 72 74 28 20 69 4c 6f 63 6b 3e 30   assert( iLock>0
40d0: 20 26 26 20 69 4c 6f 63 6b 3c 3d 33 32 20 29 3b   && iLock<=32 );
40e0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70  ..  memset(&ovlp
40f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
4100: 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70  LAPPED));.  ovlp
4110: 2e 4f 66 66 73 65 74 20 3d 20 28 34 30 39 36 2d  .Offset = (4096-
4120: 69 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 65 54  iLock);.  if( eT
4130: 79 70 65 3e 4c 53 4d 5f 4c 4f 43 4b 5f 55 4e 4c  ype>LSM_LOCK_UNL
4140: 4f 43 4b 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  OCK ){.    DWORD
4150: 20 66 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c   flags = LOCKFIL
4160: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
4170: 4c 59 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70  LY;.    if( eTyp
4180: 65 3e 3d 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43 4c  e>=LSM_LOCK_EXCL
4190: 20 29 20 66 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   ) flags |= LOCK
41a0: 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
41b0: 4f 43 4b 3b 0a 20 20 20 20 69 66 28 20 21 4c 6f  OCK;.    if( !Lo
41c0: 63 6b 46 69 6c 65 45 78 28 70 57 69 6e 33 32 46  ckFileEx(pWin32F
41d0: 69 6c 65 2d 3e 68 46 69 6c 65 2c 20 66 6c 61 67  ile->hFile, flag
41e0: 73 2c 20 30 2c 20 31 2c 20 30 2c 20 26 6f 76 6c  s, 0, 1, 0, &ovl
41f0: 70 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p) ){.      if( 
4200: 77 69 6e 33 32 49 73 4c 6f 63 6b 42 75 73 79 28  win32IsLockBusy(
4210: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20  GetLastError()) 
4220: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4230: 6e 20 4c 53 4d 5f 42 55 53 59 3b 0a 20 20 20 20  n LSM_BUSY;.    
4240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4250: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
4260: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  R_BKPT;.      }.
4270: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
4280: 20 20 20 69 66 28 20 21 55 6e 6c 6f 63 6b 46 69     if( !UnlockFi
4290: 6c 65 45 78 28 70 57 69 6e 33 32 46 69 6c 65 2d  leEx(pWin32File-
42a0: 3e 68 46 69 6c 65 2c 20 30 2c 20 31 2c 20 30 2c  >hFile, 0, 1, 0,
42b0: 20 26 6f 76 6c 70 29 20 29 7b 0a 20 20 20 20 20   &ovlp) ){.     
42c0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
42d0: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  R_BKPT;.    }.  
42e0: 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  }.  return LSM_O
42f0: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
4300: 20 6c 73 6d 57 69 6e 33 32 4f 73 54 65 73 74 4c   lsmWin32OsTestL
4310: 6f 63 6b 28 6c 73 6d 5f 66 69 6c 65 20 2a 70 46  ock(lsm_file *pF
4320: 69 6c 65 2c 20 69 6e 74 20 69 4c 6f 63 6b 2c 20  ile, int iLock, 
4330: 69 6e 74 20 6e 4c 6f 63 6b 2c 20 69 6e 74 20 65  int nLock, int e
4340: 54 79 70 65 29 7b 0a 20 20 57 69 6e 33 32 46 69  Type){.  Win32Fi
4350: 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65 20 3d  le *pWin32File =
4360: 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29 70 46   (Win32File *)pF
4370: 69 6c 65 3b 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile;.  DWORD fla
4380: 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
4390: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
43a0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
43b0: 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 4c 53  p;..  assert( LS
43c0: 4d 5f 4c 4f 43 4b 5f 55 4e 4c 4f 43 4b 3d 3d 30  M_LOCK_UNLOCK==0
43d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4c 53   );.  assert( LS
43e0: 4d 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3d 3d 31  M_LOCK_SHARED==1
43f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4c 53   );.  assert( LS
4400: 4d 5f 4c 4f 43 4b 5f 45 58 43 4c 3d 3d 32 20 29  M_LOCK_EXCL==2 )
4410: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
4420: 65 3d 3d 4c 53 4d 5f 4c 4f 43 4b 5f 53 48 41 52  e==LSM_LOCK_SHAR
4430: 45 44 20 7c 7c 20 65 54 79 70 65 3d 3d 4c 53 4d  ED || eType==LSM
4440: 5f 4c 4f 43 4b 5f 45 58 43 4c 20 29 3b 0a 20 20  _LOCK_EXCL );.  
4450: 61 73 73 65 72 74 28 20 6e 4c 6f 63 6b 3e 3d 30  assert( nLock>=0
4460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
4470: 6f 63 6b 3e 30 20 26 26 20 69 4c 6f 63 6b 3c 3d  ock>0 && iLock<=
4480: 33 32 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  32 );..  if( eTy
4490: 70 65 3e 3d 4c 53 4d 5f 4c 4f 43 4b 5f 45 58 43  pe>=LSM_LOCK_EXC
44a0: 4c 20 29 20 66 6c 61 67 73 20 7c 3d 20 4c 4f 43  L ) flags |= LOC
44b0: 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
44c0: 4c 4f 43 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 26  LOCK;.  memset(&
44d0: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
44e0: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
44f0: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 28 34  ovlp.Offset = (4
4500: 30 39 36 2d 69 4c 6f 63 6b 2d 6e 4c 6f 63 6b 2b  096-iLock-nLock+
4510: 31 29 3b 0a 20 20 69 66 28 20 21 4c 6f 63 6b 46  1);.  if( !LockF
4520: 69 6c 65 45 78 28 70 57 69 6e 33 32 46 69 6c 65  ileEx(pWin32File
4530: 2d 3e 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  ->hFile, flags, 
4540: 30 2c 20 28 44 57 4f 52 44 29 6e 4c 6f 63 6b 2c  0, (DWORD)nLock,
4550: 20 30 2c 20 26 6f 76 6c 70 29 20 29 7b 0a 20 20   0, &ovlp) ){.  
4560: 20 20 69 66 28 20 77 69 6e 33 32 49 73 4c 6f 63    if( win32IsLoc
4570: 6b 42 75 73 79 28 47 65 74 4c 61 73 74 45 72 72  kBusy(GetLastErr
4580: 6f 72 28 29 29 20 29 7b 0a 20 20 20 20 20 20 72  or()) ){.      r
4590: 65 74 75 72 6e 20 4c 53 4d 5f 42 55 53 59 3b 0a  eturn LSM_BUSY;.
45a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
45b0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45 52   return LSM_IOER
45c0: 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  R_BKPT;.    }.  
45d0: 7d 0a 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  }.  UnlockFileEx
45e0: 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69  (pWin32File->hFi
45f0: 6c 65 2c 20 30 2c 20 28 44 57 4f 52 44 29 6e 4c  le, 0, (DWORD)nL
4600: 6f 63 6b 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  ock, 0, &ovlp);.
4610: 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b    return LSM_OK;
4620: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .}..static int l
4630: 73 6d 57 69 6e 33 32 4f 73 53 68 6d 4d 61 70 28  smWin32OsShmMap(
4640: 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  lsm_file *pFile,
4650: 20 69 6e 74 20 69 43 68 75 6e 6b 2c 20 69 6e 74   int iChunk, int
4660: 20 73 7a 2c 20 76 6f 69 64 20 2a 2a 70 70 53 68   sz, void **ppSh
4670: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
4680: 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69 6e 33  Win32File *pWin3
4690: 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32 46 69  2File = (Win32Fi
46a0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
46b0: 74 20 69 4f 66 66 73 65 74 20 3d 20 69 43 68 75  t iOffset = iChu
46c0: 6e 6b 20 2a 20 73 7a 3b 0a 20 20 69 6e 74 20 69  nk * sz;.  int i
46d0: 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
46e0: 66 66 73 65 74 20 25 20 70 57 69 6e 33 32 46 69  ffset % pWin32Fi
46f0: 6c 65 2d 3e 73 79 73 49 6e 66 6f 2e 64 77 41 6c  le->sysInfo.dwAl
4700: 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
4710: 69 74 79 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  ity;.  int nNew 
4720: 3d 20 69 43 68 75 6e 6b 20 2b 20 31 3b 0a 20 20  = iChunk + 1;.  
4730: 6c 73 6d 5f 69 36 34 20 6e 52 65 71 20 3d 20 6e  lsm_i64 nReq = n
4740: 4e 65 77 20 2a 20 73 7a 3b 0a 0a 20 20 2a 70 70  New * sz;..  *pp
4750: 53 68 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 61 73  Shm = NULL;.  as
4760: 73 65 72 74 28 20 73 7a 3e 3d 30 20 29 3b 0a 20  sert( sz>=0 );. 
4770: 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 4c 53 4d   assert( sz==LSM
4780: 5f 53 48 4d 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  _SHM_CHUNK_SIZE 
4790: 29 3b 0a 20 20 69 66 28 20 69 43 68 75 6e 6b 3e  );.  if( iChunk>
47a0: 3d 70 57 69 6e 33 32 46 69 6c 65 2d 3e 6e 53 68  =pWin32File->nSh
47b0: 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  m ){.    int i;.
47c0: 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 61 68 4e      LPHANDLE ahN
47d0: 65 77 3b 0a 20 20 20 20 4c 50 56 4f 49 44 20 2a  ew;.    LPVOID *
47e0: 61 70 4e 65 77 3b 0a 20 20 20 20 4c 41 52 47 45  apNew;.    LARGE
47f0: 5f 49 4e 54 45 47 45 52 20 66 69 6c 65 53 69 7a  _INTEGER fileSiz
4800: 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
4810: 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
4820: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
4830: 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
4840: 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
4850: 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53  ( pWin32File->hS
4860: 68 6d 46 69 6c 65 3d 3d 4e 55 4c 4c 20 29 7b 0a  hmFile==NULL ){.
4870: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 68 6d        char *zShm
4880: 20 3d 20 77 69 6e 33 32 53 68 6d 46 69 6c 65 28   = win32ShmFile(
4890: 70 57 69 6e 33 32 46 69 6c 65 29 3b 0a 20 20 20  pWin32File);.   
48a0: 20 20 20 69 66 28 20 21 7a 53 68 6d 20 29 20 72     if( !zShm ) r
48b0: 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f  eturn LSM_NOMEM_
48c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 63 20 3d  BKPT;.      rc =
48d0: 20 77 69 6e 33 32 4f 70 65 6e 28 70 57 69 6e 33   win32Open(pWin3
48e0: 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53 68  2File->pEnv, zSh
48f0: 6d 2c 20 30 2c 20 26 70 57 69 6e 33 32 46 69 6c  m, 0, &pWin32Fil
4900: 65 2d 3e 68 53 68 6d 46 69 6c 65 29 3b 0a 20 20  e->hShmFile);.  
4910: 20 20 20 20 6c 73 6d 46 72 65 65 28 70 57 69 6e      lsmFree(pWin
4920: 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 7a 53  32File->pEnv, zS
4930: 68 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  hm);.      if( r
4940: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c!=LSM_OK ){.   
4950: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
4960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
4970: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61     /* If the sha
4980: 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
4990: 69 73 20 6e 6f 74 20 6c 61 72 67 65 20 65 6e 6f  is not large eno
49a0: 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
49b0: 68 65 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  he.    ** reques
49c0: 74 65 64 20 63 68 75 6e 6b 2c 20 63 61 75 73 65  ted chunk, cause
49d0: 20 69 74 20 74 6f 20 67 72 6f 77 2e 20 20 2a 2f   it to grow.  */
49e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 69 6c  .    memset(&fil
49f0: 65 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66  eSize, 0, sizeof
4a00: 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 29  (LARGE_INTEGER))
4a10: 3b 0a 20 20 20 20 69 66 28 20 21 47 65 74 46 69  ;.    if( !GetFi
4a20: 6c 65 53 69 7a 65 45 78 28 70 57 69 6e 33 32 46  leSizeEx(pWin32F
4a30: 69 6c 65 2d 3e 68 53 68 6d 46 69 6c 65 2c 20 26  ile->hShmFile, &
4a40: 66 69 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  fileSize) ){.   
4a50: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f     return LSM_IO
4a60: 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  ERR_BKPT;.    }.
4a70: 20 20 20 20 61 73 73 65 72 74 28 20 66 69 6c 65      assert( file
4a80: 53 69 7a 65 2e 51 75 61 64 50 61 72 74 3e 3d 30  Size.QuadPart>=0
4a90: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   );.    if( file
4aa0: 53 69 7a 65 2e 51 75 61 64 50 61 72 74 3c 6e 52  Size.QuadPart<nR
4ab0: 65 71 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  eq ){.      rc =
4ac0: 20 77 69 6e 33 32 54 72 75 6e 63 61 74 65 28 70   win32Truncate(p
4ad0: 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46  Win32File->hShmF
4ae0: 69 6c 65 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20  ile, nReq);.    
4af0: 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
4b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4b10: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4b20: 20 20 20 7d 0a 0a 20 20 20 20 61 68 4e 65 77 20     }..    ahNew 
4b30: 3d 20 28 4c 50 48 41 4e 44 4c 45 29 6c 73 6d 4d  = (LPHANDLE)lsmM
4b40: 61 6c 6c 6f 63 5a 65 72 6f 28 70 57 69 6e 33 32  allocZero(pWin32
4b50: 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 73 69 7a 65  File->pEnv, size
4b60: 6f 66 28 48 41 4e 44 4c 45 29 20 2a 20 6e 4e 65  of(HANDLE) * nNe
4b70: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 61 68 4e  w);.    if( !ahN
4b80: 65 77 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f  ew ) return LSM_
4b90: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
4ba0: 61 70 4e 65 77 20 3d 20 28 4c 50 56 4f 49 44 20  apNew = (LPVOID 
4bb0: 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 28  *)lsmMallocZero(
4bc0: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76  pWin32File->pEnv
4bd0: 2c 20 73 69 7a 65 6f 66 28 4c 50 56 4f 49 44 29  , sizeof(LPVOID)
4be0: 20 2a 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66   * nNew);.    if
4bf0: 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
4c00: 20 20 6c 73 6d 46 72 65 65 28 70 57 69 6e 33 32    lsmFree(pWin32
4c10: 46 69 6c 65 2d 3e 70 45 6e 76 2c 20 61 68 4e 65  File->pEnv, ahNe
4c20: 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
4c30: 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b   LSM_NOMEM_BKPT;
4c40: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
4c50: 79 28 61 68 4e 65 77 2c 20 70 57 69 6e 33 32 46  y(ahNew, pWin32F
4c60: 69 6c 65 2d 3e 61 68 53 68 6d 2c 20 73 69 7a 65  ile->ahShm, size
4c70: 6f 66 28 48 41 4e 44 4c 45 29 20 2a 20 70 57 69  of(HANDLE) * pWi
4c80: 6e 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 29 3b 0a  n32File->nShm);.
4c90: 20 20 20 20 6d 65 6d 63 70 79 28 61 70 4e 65 77      memcpy(apNew
4ca0: 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70  , pWin32File->ap
4cb0: 53 68 6d 2c 20 73 69 7a 65 6f 66 28 4c 50 56 4f  Shm, sizeof(LPVO
4cc0: 49 44 29 20 2a 20 70 57 69 6e 33 32 46 69 6c 65  ID) * pWin32File
4cd0: 2d 3e 6e 53 68 6d 29 3b 0a 20 20 20 20 6c 73 6d  ->nShm);.    lsm
4ce0: 46 72 65 65 28 70 57 69 6e 33 32 46 69 6c 65 2d  Free(pWin32File-
4cf0: 3e 70 45 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c  >pEnv, pWin32Fil
4d00: 65 2d 3e 61 68 53 68 6d 29 3b 0a 20 20 20 20 70  e->ahShm);.    p
4d10: 57 69 6e 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d  Win32File->ahShm
4d20: 20 3d 20 61 68 4e 65 77 3b 0a 20 20 20 20 6c 73   = ahNew;.    ls
4d30: 6d 46 72 65 65 28 70 57 69 6e 33 32 46 69 6c 65  mFree(pWin32File
4d40: 2d 3e 70 45 6e 76 2c 20 70 57 69 6e 33 32 46 69  ->pEnv, pWin32Fi
4d50: 6c 65 2d 3e 61 70 53 68 6d 29 3b 0a 20 20 20 20  le->apShm);.    
4d60: 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68  pWin32File->apSh
4d70: 6d 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 70  m = apNew;.    p
4d80: 57 69 6e 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 20  Win32File->nShm 
4d90: 3d 20 6e 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 69  = nNew;.  }..  i
4da0: 66 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61  f( pWin32File->a
4db0: 68 53 68 6d 5b 69 43 68 75 6e 6b 5d 3d 3d 4e 55  hShm[iChunk]==NU
4dc0: 4c 4c 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45  LL ){.    HANDLE
4dd0: 20 68 4d 61 70 3b 0a 20 20 20 20 61 73 73 65 72   hMap;.    asser
4de0: 74 28 20 6e 52 65 71 3c 3d 30 78 46 46 46 46 46  t( nReq<=0xFFFFF
4df0: 46 46 46 20 29 3b 0a 20 20 20 20 68 4d 61 70 20  FFF );.    hMap 
4e00: 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  = CreateFileMapp
4e10: 69 6e 67 57 28 70 57 69 6e 33 32 46 69 6c 65 2d  ingW(pWin32File-
4e20: 3e 68 53 68 6d 46 69 6c 65 2c 20 4e 55 4c 4c 2c  >hShmFile, NULL,
4e30: 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
4e40: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 28 44 57 4f 52 44 29 6e 52 65 71 2c 20 4e    (DWORD)nReq, N
4e70: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 68 4d  ULL);.    if( hM
4e80: 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
4e90: 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49 4f 45    return LSM_IOE
4ea0: 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  RR_BKPT;.    }. 
4eb0: 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61     pWin32File->a
4ec0: 68 53 68 6d 5b 69 43 68 75 6e 6b 5d 20 3d 20 68  hShm[iChunk] = h
4ed0: 4d 61 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Map;.  }.  if( p
4ee0: 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d  Win32File->apShm
4ef0: 5b 69 43 68 75 6e 6b 5d 3d 3d 4e 55 4c 4c 20 29  [iChunk]==NULL )
4f00: 7b 0a 20 20 20 20 4c 50 56 4f 49 44 20 70 4d 61  {.    LPVOID pMa
4f10: 70 3b 0a 20 20 20 20 70 4d 61 70 20 3d 20 4d 61  p;.    pMap = Ma
4f20: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 57 69 6e  pViewOfFile(pWin
4f30: 33 32 46 69 6c 65 2d 3e 61 68 53 68 6d 5b 69 43  32File->ahShm[iC
4f40: 68 75 6e 6b 5d 2c 0a 20 20 20 20 20 20 20 20 20  hunk],.         
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f60: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
4f70: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 20   FILE_MAP_READ, 
4f80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
4fa0: 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
4fb0: 66 74 2c 20 73 7a 20 2b 20 69 4f 66 66 73 65 74  ft, sz + iOffset
4fc0: 53 68 69 66 74 29 3b 0a 20 20 20 20 69 66 28 20  Shift);.    if( 
4fd0: 70 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pMap==NULL ){.  
4fe0: 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 49      return LSM_I
4ff0: 4f 45 52 52 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OERR_BKPT;.    }
5000: 0a 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d  .    pWin32File-
5010: 3e 61 70 53 68 6d 5b 69 43 68 75 6e 6b 5d 20 3d  >apShm[iChunk] =
5020: 20 70 4d 61 70 3b 0a 20 20 7d 0a 20 20 69 66 28   pMap;.  }.  if(
5030: 20 69 4f 66 66 73 65 74 53 68 69 66 74 21 3d 30   iOffsetShift!=0
5040: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20   ){.    char *p 
5050: 3d 20 28 63 68 61 72 20 2a 29 70 57 69 6e 33 32  = (char *)pWin32
5060: 46 69 6c 65 2d 3e 61 70 53 68 6d 5b 69 43 68 75  File->apShm[iChu
5070: 6e 6b 5d 3b 0a 20 20 20 20 2a 70 70 53 68 6d 20  nk];.    *ppShm 
5080: 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
5090: 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
50a0: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 53 68 6d 20  lse{.    *ppShm 
50b0: 3d 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70  = pWin32File->ap
50c0: 53 68 6d 5b 69 43 68 75 6e 6b 5d 3b 0a 20 20 7d  Shm[iChunk];.  }
50d0: 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b  .  return LSM_OK
50e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
50f0: 20 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d 42 61   lsmWin32OsShmBa
5100: 72 72 69 65 72 28 76 6f 69 64 29 7b 0a 20 20 4d  rrier(void){.  M
5110: 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 0a  emoryBarrier();.
5120: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73  }..static int ls
5130: 6d 57 69 6e 33 32 4f 73 53 68 6d 55 6e 6d 61 70  mWin32OsShmUnmap
5140: 28 6c 73 6d 5f 66 69 6c 65 20 2a 70 46 69 6c 65  (lsm_file *pFile
5150: 2c 20 69 6e 74 20 62 44 65 6c 65 74 65 29 7b 0a  , int bDelete){.
5160: 20 20 57 69 6e 33 32 46 69 6c 65 20 2a 70 57 69    Win32File *pWi
5170: 6e 33 32 46 69 6c 65 20 3d 20 28 57 69 6e 33 32  n32File = (Win32
5180: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20  File *)pFile;.. 
5190: 20 69 66 28 20 70 57 69 6e 33 32 46 69 6c 65 2d   if( pWin32File-
51a0: 3e 68 53 68 6d 46 69 6c 65 21 3d 4e 55 4c 4c 20  >hShmFile!=NULL 
51b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
51d0: 6e 33 32 46 69 6c 65 2d 3e 6e 53 68 6d 3b 20 69  n32File->nShm; i
51e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
51f0: 57 69 6e 33 32 46 69 6c 65 2d 3e 61 70 53 68 6d  Win32File->apShm
5200: 5b 69 5d 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  [i]!=NULL ){.   
5210: 20 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66       UnmapViewOf
5220: 46 69 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 2d  File(pWin32File-
5230: 3e 61 70 53 68 6d 5b 69 5d 29 3b 0a 20 20 20 20  >apShm[i]);.    
5240: 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e      pWin32File->
5250: 61 70 53 68 6d 5b 69 5d 20 3d 20 4e 55 4c 4c 3b  apShm[i] = NULL;
5260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5270: 66 28 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e 61  f( pWin32File->a
5280: 68 53 68 6d 5b 69 5d 21 3d 4e 55 4c 4c 20 29 7b  hShm[i]!=NULL ){
5290: 0a 20 20 20 20 20 20 20 20 43 6c 6f 73 65 48 61  .        CloseHa
52a0: 6e 64 6c 65 28 70 57 69 6e 33 32 46 69 6c 65 2d  ndle(pWin32File-
52b0: 3e 61 68 53 68 6d 5b 69 5d 29 3b 0a 20 20 20 20  >ahShm[i]);.    
52c0: 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e      pWin32File->
52d0: 61 68 53 68 6d 5b 69 5d 20 3d 20 4e 55 4c 4c 3b  ahShm[i] = NULL;
52e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
52f0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
5300: 57 69 6e 33 32 46 69 6c 65 2d 3e 68 53 68 6d 46  Win32File->hShmF
5310: 69 6c 65 29 3b 0a 20 20 20 20 70 57 69 6e 33 32  ile);.    pWin32
5320: 46 69 6c 65 2d 3e 68 53 68 6d 46 69 6c 65 20 3d  File->hShmFile =
5330: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 62   NULL;.    if( b
5340: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
5350: 63 68 61 72 20 2a 7a 53 68 6d 20 3d 20 77 69 6e  char *zShm = win
5360: 33 32 53 68 6d 46 69 6c 65 28 70 57 69 6e 33 32  32ShmFile(pWin32
5370: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
5380: 20 7a 53 68 6d 20 29 7b 20 77 69 6e 33 32 44 65   zShm ){ win32De
5390: 6c 65 74 65 28 70 57 69 6e 33 32 46 69 6c 65 2d  lete(pWin32File-
53a0: 3e 70 45 6e 76 2c 20 7a 53 68 6d 29 3b 20 7d 0a  >pEnv, zShm); }.
53b0: 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70 57        lsmFree(pW
53c0: 69 6e 33 32 46 69 6c 65 2d 3e 70 45 6e 76 2c 20  in32File->pEnv, 
53d0: 7a 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zShm);.    }.  }
53e0: 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b  .  return LSM_OK
53f0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ;.}..#define MX_
5400: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
5410: 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69  static int lsmWi
5420: 6e 33 32 4f 73 43 6c 6f 73 65 28 6c 73 6d 5f 66  n32OsClose(lsm_f
5430: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
5440: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65  nt rc;.  int nRe
5450: 74 72 79 20 3d 20 30 3b 0a 20 20 57 69 6e 33 32  try = 0;.  Win32
5460: 46 69 6c 65 20 2a 70 57 69 6e 33 32 46 69 6c 65  File *pWin32File
5470: 20 3d 20 28 57 69 6e 33 32 46 69 6c 65 20 2a 29   = (Win32File *)
5480: 70 46 69 6c 65 3b 0a 20 20 6c 73 6d 57 69 6e 33  pFile;.  lsmWin3
5490: 32 4f 73 53 68 6d 55 6e 6d 61 70 28 70 46 69 6c  2OsShmUnmap(pFil
54a0: 65 2c 20 30 29 3b 0a 20 20 77 69 6e 33 32 55 6e  e, 0);.  win32Un
54b0: 6d 61 70 28 70 57 69 6e 33 32 46 69 6c 65 29 3b  map(pWin32File);
54c0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
54d0: 57 69 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65  Win32File->hFile
54e0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
54f0: 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f 42  rc = LSM_IOERR_B
5500: 4b 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  KPT;.      break
5510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
5520: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 57 69   CloseHandle(pWi
5530: 6e 33 32 46 69 6c 65 2d 3e 68 46 69 6c 65 29 3b  n32File->hFile);
5540: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
5550: 20 20 20 20 20 70 57 69 6e 33 32 46 69 6c 65 2d       pWin32File-
5560: 3e 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20  >hFile = NULL;. 
5570: 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b       rc = LSM_OK
5580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5590: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2b 2b 6e     }.    if( ++n
55a0: 52 65 74 72 79 3e 3d 4d 58 5f 43 4c 4f 53 45 5f  Retry>=MX_CLOSE_
55b0: 41 54 54 45 4d 50 54 20 29 7b 0a 20 20 20 20 20  ATTEMPT ){.     
55c0: 20 72 63 20 3d 20 4c 53 4d 5f 49 4f 45 52 52 5f   rc = LSM_IOERR_
55d0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61  BKPT;.      brea
55e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  k;.    }.  }whil
55f0: 65 28 20 31 20 29 3b 0a 20 20 6c 73 6d 46 72 65  e( 1 );.  lsmFre
5600: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  e(pWin32File->pE
5610: 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  nv, pWin32File->
5620: 61 68 53 68 6d 29 3b 0a 20 20 6c 73 6d 46 72 65  ahShm);.  lsmFre
5630: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  e(pWin32File->pE
5640: 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 2d 3e  nv, pWin32File->
5650: 61 70 53 68 6d 29 3b 0a 20 20 6c 73 6d 46 72 65  apShm);.  lsmFre
5660: 65 28 70 57 69 6e 33 32 46 69 6c 65 2d 3e 70 45  e(pWin32File->pE
5670: 6e 76 2c 20 70 57 69 6e 33 32 46 69 6c 65 29 3b  nv, pWin32File);
5680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5690: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57  .static int lsmW
56a0: 69 6e 33 32 4f 73 53 6c 65 65 70 28 6c 73 6d 5f  in32OsSleep(lsm_
56b0: 65 6e 76 20 2a 70 45 6e 76 2c 20 69 6e 74 20 75  env *pEnv, int u
56c0: 73 29 7b 0a 20 20 75 6e 75 73 65 64 5f 70 61 72  s){.  unused_par
56d0: 61 6d 65 74 65 72 28 70 45 6e 76 29 3b 0a 20 20  ameter(pEnv);.  
56e0: 72 65 74 75 72 6e 20 77 69 6e 33 32 53 6c 65 65  return win32Slee
56f0: 70 28 75 73 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  p(us);.}../*****
5700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5740: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 65 6d 6f 72  *******.** Memor
5750: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
5760: 74 69 6e 65 73 2e 0a 2a 2f 0a 0a 73 74 61 74 69  tines..*/..stati
5770: 63 20 76 6f 69 64 20 2a 6c 73 6d 57 69 6e 33 32  c void *lsmWin32
5780: 4f 73 4d 61 6c 6c 6f 63 28 6c 73 6d 5f 65 6e 76  OsMalloc(lsm_env
5790: 20 2a 70 45 6e 76 2c 20 73 69 7a 65 5f 74 20 4e   *pEnv, size_t N
57a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 48 65 61  ){.  assert( Hea
57b0: 70 56 61 6c 69 64 61 74 65 28 47 65 74 50 72 6f  pValidate(GetPro
57c0: 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 4e  cessHeap(), 0, N
57d0: 55 4c 4c 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ULL) );.  return
57e0: 20 48 65 61 70 41 6c 6c 6f 63 28 47 65 74 50 72   HeapAlloc(GetPr
57f0: 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20  ocessHeap(), 0, 
5800: 28 53 49 5a 45 5f 54 29 4e 29 3b 0a 7d 0a 0a 73  (SIZE_T)N);.}..s
5810: 74 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69  tatic void lsmWi
5820: 6e 33 32 4f 73 46 72 65 65 28 6c 73 6d 5f 65 6e  n32OsFree(lsm_en
5830: 76 20 2a 70 45 6e 76 2c 20 76 6f 69 64 20 2a 70  v *pEnv, void *p
5840: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 48 65 61  ){.  assert( Hea
5850: 70 56 61 6c 69 64 61 74 65 28 47 65 74 50 72 6f  pValidate(GetPro
5860: 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c 20 4e  cessHeap(), 0, N
5870: 55 4c 4c 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ULL) );.  if( p 
5880: 29 7b 0a 20 20 20 20 48 65 61 70 46 72 65 65 28  ){.    HeapFree(
5890: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29  GetProcessHeap()
58a0: 2c 20 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, p);.  }.}..
58b0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6c 73 6d  static void *lsm
58c0: 57 69 6e 33 32 4f 73 52 65 61 6c 6c 6f 63 28 6c  Win32OsRealloc(l
58d0: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 76 6f  sm_env *pEnv, vo
58e0: 69 64 20 2a 70 2c 20 73 69 7a 65 5f 74 20 4e 29  id *p, size_t N)
58f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5900: 72 20 2a 6d 20 3d 20 28 75 6e 73 69 67 6e 65 64  r *m = (unsigned
5910: 20 63 68 61 72 20 2a 29 70 3b 0a 20 20 61 73 73   char *)p;.  ass
5920: 65 72 74 28 20 48 65 61 70 56 61 6c 69 64 61 74  ert( HeapValidat
5930: 65 28 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  e(GetProcessHeap
5940: 28 29 2c 20 30 2c 20 4e 55 4c 4c 29 20 29 3b 0a  (), 0, NULL) );.
5950: 20 20 69 66 28 20 31 3e 4e 20 29 7b 0a 20 20 20    if( 1>N ){.   
5960: 20 6c 73 6d 57 69 6e 33 32 4f 73 46 72 65 65 28   lsmWin32OsFree(
5970: 70 45 6e 76 2c 20 70 29 3b 0a 20 20 20 20 72 65  pEnv, p);.    re
5980: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  turn NULL;.  }el
5990: 73 65 20 69 66 28 20 4e 55 4c 4c 3d 3d 70 20 29  se if( NULL==p )
59a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 73 6d  {.    return lsm
59b0: 57 69 6e 33 32 4f 73 4d 61 6c 6c 6f 63 28 70 45  Win32OsMalloc(pE
59c0: 6e 76 2c 20 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b  nv, N);.  }else{
59d0: 0a 23 69 66 20 30 20 2f 2a 20 61 72 67 75 61 62  .#if 0 /* arguab
59e0: 6c 65 3a 20 64 6f 6e 27 74 20 73 68 72 69 6e 6b  le: don't shrink
59f0: 20 2a 2f 0a 20 20 20 20 53 49 5a 45 5f 54 20 73   */.    SIZE_T s
5a00: 7a 20 3d 20 48 65 61 70 53 69 7a 65 28 47 65 74  z = HeapSize(Get
5a10: 50 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30  ProcessHeap(), 0
5a20: 2c 20 6d 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  , m);.    if( sz
5a30: 3e 3d 28 53 49 5a 45 5f 54 29 4e 20 29 7b 0a 20  >=(SIZE_T)N ){. 
5a40: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
5a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
5a60: 72 65 74 75 72 6e 20 48 65 61 70 52 65 41 6c 6c  return HeapReAll
5a70: 6f 63 28 47 65 74 50 72 6f 63 65 73 73 48 65 61  oc(GetProcessHea
5a80: 70 28 29 2c 20 30 2c 20 6d 2c 20 4e 29 3b 0a 20  p(), 0, m, N);. 
5a90: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 73 69 7a   }.}..static siz
5aa0: 65 5f 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 53  e_t lsmWin32OsMS
5ab0: 69 7a 65 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ize(lsm_env *pEn
5ac0: 76 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 61  v, void *p){.  a
5ad0: 73 73 65 72 74 28 20 48 65 61 70 56 61 6c 69 64  ssert( HeapValid
5ae0: 61 74 65 28 47 65 74 50 72 6f 63 65 73 73 48 65  ate(GetProcessHe
5af0: 61 70 28 29 2c 20 30 2c 20 4e 55 4c 4c 29 20 29  ap(), 0, NULL) )
5b00: 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 69 7a 65  ;.  return (size
5b10: 5f 74 29 48 65 61 70 53 69 7a 65 28 47 65 74 50  _t)HeapSize(GetP
5b20: 72 6f 63 65 73 73 48 65 61 70 28 29 2c 20 30 2c  rocessHeap(), 0,
5b30: 20 70 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20   p);.}...#ifdef 
5b40: 4c 53 4d 5f 4d 55 54 45 58 5f 57 49 4e 33 32 0a  LSM_MUTEX_WIN32.
5b50: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 75  **********.** Mu
5ba0: 74 65 78 20 6d 65 74 68 6f 64 73 20 66 6f 72 20  tex methods for 
5bb0: 57 69 6e 33 32 20 62 61 73 65 64 20 73 79 73 74  Win32 based syst
5bc0: 65 6d 73 2e 20 20 49 66 20 4c 53 4d 5f 4d 55 54  ems.  If LSM_MUT
5bd0: 45 58 5f 57 49 4e 33 32 20 69 73 0a 2a 2a 20 6d  EX_WIN32 is.** m
5be0: 69 73 73 69 6e 67 20 74 68 65 6e 20 61 20 6e 6f  issing then a no
5bf0: 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  -op implementati
5c00: 6f 6e 20 6f 66 20 6d 75 74 65 78 65 73 20 66 6f  on of mutexes fo
5c10: 75 6e 64 20 62 65 6c 6f 77 20 77 69 6c 6c 20 62  und below will b
5c20: 65 0a 2a 2a 20 75 73 65 64 20 69 6e 73 74 65 61  e.** used instea
5c30: 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  d..*/.#include "
5c40: 77 69 6e 64 6f 77 73 2e 68 22 0a 0a 74 79 70 65  windows.h"..type
5c50: 64 65 66 20 73 74 72 75 63 74 20 57 69 6e 33 32  def struct Win32
5c60: 4d 75 74 65 78 20 57 69 6e 33 32 4d 75 74 65 78  Mutex Win32Mutex
5c70: 3b 0a 73 74 72 75 63 74 20 57 69 6e 33 32 4d 75  ;.struct Win32Mu
5c80: 74 65 78 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76 20  tex {.  lsm_env 
5c90: 2a 70 45 6e 76 3b 0a 20 20 43 52 49 54 49 43 41  *pEnv;.  CRITICA
5ca0: 4c 5f 53 45 43 54 49 4f 4e 20 6d 75 74 65 78 3b  L_SECTION mutex;
5cb0: 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55  .#ifdef LSM_DEBU
5cc0: 47 0a 20 20 44 57 4f 52 44 20 6f 77 6e 65 72 3b  G.  DWORD owner;
5cd0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e  .#endif.};..#ifn
5ce0: 64 65 66 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f  def WIN32_MUTEX_
5cf0: 49 4e 49 54 49 41 4c 49 5a 45 52 0a 23 20 64 65  INITIALIZER.# de
5d00: 66 69 6e 65 20 57 49 4e 33 32 5f 4d 55 54 45 58  fine WIN32_MUTEX
5d10: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 7b 20 30  _INITIALIZER { 0
5d20: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
5d30: 66 20 4c 53 4d 5f 44 45 42 55 47 0a 23 20 64 65  f LSM_DEBUG.# de
5d40: 66 69 6e 65 20 4c 53 4d 5f 57 49 4e 33 32 5f 53  fine LSM_WIN32_S
5d50: 54 41 54 49 43 5f 4d 55 54 45 58 20 7b 20 30 2c  TATIC_MUTEX { 0,
5d60: 20 57 49 4e 33 32 5f 4d 55 54 45 58 5f 49 4e 49   WIN32_MUTEX_INI
5d70: 54 49 41 4c 49 5a 45 52 2c 20 30 20 7d 0a 23 65  TIALIZER, 0 }.#e
5d80: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4c 53 4d  lse.# define LSM
5d90: 5f 57 49 4e 33 32 5f 53 54 41 54 49 43 5f 4d 55  _WIN32_STATIC_MU
5da0: 54 45 58 20 7b 20 30 2c 20 57 49 4e 33 32 5f 4d  TEX { 0, WIN32_M
5db0: 55 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52  UTEX_INITIALIZER
5dc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69   }.#endif..stati
5dd0: 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  c int lsmWin32Os
5de0: 4d 75 74 65 78 53 74 61 74 69 63 28 0a 20 20 6c  MutexStatic(.  l
5df0: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 0a 20 20  sm_env *pEnv,.  
5e00: 69 6e 74 20 69 4d 75 74 65 78 2c 0a 20 20 6c 73  int iMutex,.  ls
5e10: 6d 5f 6d 75 74 65 78 20 2a 2a 70 70 53 74 61 74  m_mutex **ppStat
5e20: 69 63 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 76  ic.){.  static v
5e30: 6f 6c 61 74 69 6c 65 20 4c 4f 4e 47 20 69 6e 69  olatile LONG ini
5e40: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20  tialized = 0;.  
5e50: 73 74 61 74 69 63 20 57 69 6e 33 32 4d 75 74 65  static Win32Mute
5e60: 78 20 73 4d 75 74 65 78 5b 32 5d 20 3d 20 7b 0a  x sMutex[2] = {.
5e70: 20 20 20 20 4c 53 4d 5f 57 49 4e 33 32 5f 53 54      LSM_WIN32_ST
5e80: 41 54 49 43 5f 4d 55 54 45 58 2c 0a 20 20 20 20  ATIC_MUTEX,.    
5e90: 4c 53 4d 5f 57 49 4e 33 32 5f 53 54 41 54 49 43  LSM_WIN32_STATIC
5ea0: 5f 4d 55 54 45 58 0a 20 20 7d 3b 0a 0a 20 20 61  _MUTEX.  };..  a
5eb0: 73 73 65 72 74 28 20 69 4d 75 74 65 78 3d 3d 4c  ssert( iMutex==L
5ec0: 53 4d 5f 4d 55 54 45 58 5f 47 4c 4f 42 41 4c 20  SM_MUTEX_GLOBAL 
5ed0: 7c 7c 20 69 4d 75 74 65 78 3d 3d 4c 53 4d 5f 4d  || iMutex==LSM_M
5ee0: 55 54 45 58 5f 48 45 41 50 20 29 3b 0a 20 20 61  UTEX_HEAP );.  a
5ef0: 73 73 65 72 74 28 20 4c 53 4d 5f 4d 55 54 45 58  ssert( LSM_MUTEX
5f00: 5f 47 4c 4f 42 41 4c 3d 3d 31 20 26 26 20 4c 53  _GLOBAL==1 && LS
5f10: 4d 5f 4d 55 54 45 58 5f 48 45 41 50 3d 3d 32 20  M_MUTEX_HEAP==2 
5f20: 29 3b 0a 0a 20 20 69 66 28 20 49 6e 74 65 72 6c  );..  if( Interl
5f30: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
5f40: 61 6e 67 65 28 26 69 6e 69 74 69 61 6c 69 7a 65  ange(&initialize
5f50: 64 2c 20 31 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  d, 1, 0)==0 ){. 
5f60: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
5f70: 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 5f 73  r(i=0; i<array_s
5f80: 69 7a 65 28 73 4d 75 74 65 78 29 3b 20 69 2b 2b  ize(sMutex); i++
5f90: 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69 61 6c  ){.      Initial
5fa0: 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74 69  izeCriticalSecti
5fb0: 6f 6e 28 26 73 4d 75 74 65 78 5b 69 5d 2e 6d 75  on(&sMutex[i].mu
5fc0: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tex);.    }.  }.
5fd0: 20 20 2a 70 70 53 74 61 74 69 63 20 3d 20 28 6c    *ppStatic = (l
5fe0: 73 6d 5f 6d 75 74 65 78 20 2a 29 26 73 4d 75 74  sm_mutex *)&sMut
5ff0: 65 78 5b 69 4d 75 74 65 78 2d 31 5d 3b 0a 20 20  ex[iMutex-1];.  
6000: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
6010: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  ..static int lsm
6020: 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e 65 77 28  Win32OsMutexNew(
6030: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 6c  lsm_env *pEnv, l
6040: 73 6d 5f 6d 75 74 65 78 20 2a 2a 70 70 4e 65 77  sm_mutex **ppNew
6050: 29 7b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20  ){.  Win32Mutex 
6060: 2a 70 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  *pMutex;        
6070: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
6080: 20 6e 65 77 20 6d 75 74 65 78 20 2a 2f 0a 0a 20   new mutex */.. 
6090: 20 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32   pMutex = (Win32
60a0: 4d 75 74 65 78 20 2a 29 6c 73 6d 4d 61 6c 6c 6f  Mutex *)lsmMallo
60b0: 63 5a 65 72 6f 28 70 45 6e 76 2c 20 73 69 7a 65  cZero(pEnv, size
60c0: 6f 66 28 57 69 6e 33 32 4d 75 74 65 78 29 29 3b  of(Win32Mutex));
60d0: 0a 20 20 69 66 28 20 21 70 4d 75 74 65 78 20 29  .  if( !pMutex )
60e0: 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45   return LSM_NOME
60f0: 4d 5f 42 4b 50 54 3b 0a 0a 20 20 70 4d 75 74 65  M_BKPT;..  pMute
6100: 78 2d 3e 70 45 6e 76 20 3d 20 70 45 6e 76 3b 0a  x->pEnv = pEnv;.
6110: 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74    InitializeCrit
6120: 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75  icalSection(&pMu
6130: 74 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  tex->mutex);..  
6140: 2a 70 70 4e 65 77 20 3d 20 28 6c 73 6d 5f 6d 75  *ppNew = (lsm_mu
6150: 74 65 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20  tex *)pMutex;.  
6160: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
6170: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73  ..static void ls
6180: 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 44 65 6c  mWin32OsMutexDel
6190: 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a  (lsm_mutex *p){.
61a0: 20 20 57 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d    Win32Mutex *pM
61b0: 75 74 65 78 20 3d 20 28 57 69 6e 33 32 4d 75 74  utex = (Win32Mut
61c0: 65 78 20 2a 29 70 3b 0a 20 20 44 65 6c 65 74 65  ex *)p;.  Delete
61d0: 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28  CriticalSection(
61e0: 26 70 4d 75 74 65 78 2d 3e 6d 75 74 65 78 29 3b  &pMutex->mutex);
61f0: 0a 20 20 6c 73 6d 46 72 65 65 28 70 4d 75 74 65  .  lsmFree(pMute
6200: 78 2d 3e 70 45 6e 76 2c 20 70 4d 75 74 65 78 29  x->pEnv, pMutex)
6210: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
6220: 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78   lsmWin32OsMutex
6230: 45 6e 74 65 72 28 6c 73 6d 5f 6d 75 74 65 78 20  Enter(lsm_mutex 
6240: 2a 70 29 7b 0a 20 20 57 69 6e 33 32 4d 75 74 65  *p){.  Win32Mute
6250: 78 20 2a 70 4d 75 74 65 78 20 3d 20 28 57 69 6e  x *pMutex = (Win
6260: 33 32 4d 75 74 65 78 20 2a 29 70 3b 0a 20 20 45  32Mutex *)p;.  E
6270: 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65 63 74  nterCriticalSect
6280: 69 6f 6e 28 26 70 4d 75 74 65 78 2d 3e 6d 75 74  ion(&pMutex->mut
6290: 65 78 29 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d  ex);..#ifdef LSM
62a0: 5f 44 45 42 55 47 0a 20 20 61 73 73 65 72 74 28  _DEBUG.  assert(
62b0: 20 70 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 21 3d   pMutex->owner!=
62c0: 47 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64  GetCurrentThread
62d0: 49 64 28 29 20 29 3b 0a 20 20 70 4d 75 74 65 78  Id() );.  pMutex
62e0: 2d 3e 6f 77 6e 65 72 20 3d 20 47 65 74 43 75 72  ->owner = GetCur
62f0: 72 65 6e 74 54 68 72 65 61 64 49 64 28 29 3b 0a  rentThreadId();.
6300: 20 20 61 73 73 65 72 74 28 20 70 4d 75 74 65 78    assert( pMutex
6310: 2d 3e 6f 77 6e 65 72 3d 3d 47 65 74 43 75 72 72  ->owner==GetCurr
6320: 65 6e 74 54 68 72 65 61 64 49 64 28 29 20 29 3b  entThreadId() );
6330: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 73 74 61 74 69  .#endif.}..stati
6340: 63 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73  c int lsmWin32Os
6350: 4d 75 74 65 78 54 72 79 28 6c 73 6d 5f 6d 75 74  MutexTry(lsm_mut
6360: 65 78 20 2a 70 29 7b 0a 20 20 42 4f 4f 4c 20 62  ex *p){.  BOOL b
6370: 52 65 74 3b 0a 20 20 57 69 6e 33 32 4d 75 74 65  Ret;.  Win32Mute
6380: 78 20 2a 70 4d 75 74 65 78 20 3d 20 28 57 69 6e  x *pMutex = (Win
6390: 33 32 4d 75 74 65 78 20 2a 29 70 3b 0a 20 20 62  32Mutex *)p;.  b
63a0: 52 65 74 20 3d 20 54 72 79 45 6e 74 65 72 43 72  Ret = TryEnterCr
63b0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 70  iticalSection(&p
63c0: 4d 75 74 65 78 2d 3e 6d 75 74 65 78 29 3b 0a 23  Mutex->mutex);.#
63d0: 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a  ifdef LSM_DEBUG.
63e0: 20 20 69 66 28 20 62 52 65 74 20 29 7b 0a 20 20    if( bRet ){.  
63f0: 20 20 61 73 73 65 72 74 28 20 70 4d 75 74 65 78    assert( pMutex
6400: 2d 3e 6f 77 6e 65 72 21 3d 47 65 74 43 75 72 72  ->owner!=GetCurr
6410: 65 6e 74 54 68 72 65 61 64 49 64 28 29 20 29 3b  entThreadId() );
6420: 0a 20 20 20 20 70 4d 75 74 65 78 2d 3e 6f 77 6e  .    pMutex->own
6430: 65 72 20 3d 20 47 65 74 43 75 72 72 65 6e 74 54  er = GetCurrentT
6440: 68 72 65 61 64 49 64 28 29 3b 0a 20 20 20 20 61  hreadId();.    a
6450: 73 73 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f  ssert( pMutex->o
6460: 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74  wner==GetCurrent
6470: 54 68 72 65 61 64 49 64 28 29 20 29 3b 0a 20 20  ThreadId() );.  
6480: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
6490: 6e 20 21 62 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  n !bRet;.}..stat
64a0: 69 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e 33 32  ic void lsmWin32
64b0: 4f 73 4d 75 74 65 78 4c 65 61 76 65 28 6c 73 6d  OsMutexLeave(lsm
64c0: 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 57 69  _mutex *p){.  Wi
64d0: 6e 33 32 4d 75 74 65 78 20 2a 70 4d 75 74 65 78  n32Mutex *pMutex
64e0: 20 3d 20 28 57 69 6e 33 32 4d 75 74 65 78 20 2a   = (Win32Mutex *
64f0: 29 70 3b 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44  )p;.#ifdef LSM_D
6500: 45 42 55 47 0a 20 20 61 73 73 65 72 74 28 20 70  EBUG.  assert( p
6510: 4d 75 74 65 78 2d 3e 6f 77 6e 65 72 3d 3d 47 65  Mutex->owner==Ge
6520: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49 64  tCurrentThreadId
6530: 28 29 20 29 3b 0a 20 20 70 4d 75 74 65 78 2d 3e  () );.  pMutex->
6540: 6f 77 6e 65 72 20 3d 20 30 3b 0a 20 20 61 73 73  owner = 0;.  ass
6550: 65 72 74 28 20 70 4d 75 74 65 78 2d 3e 6f 77 6e  ert( pMutex->own
6560: 65 72 21 3d 47 65 74 43 75 72 72 65 6e 74 54 68  er!=GetCurrentTh
6570: 72 65 61 64 49 64 28 29 20 29 3b 0a 23 65 6e 64  readId() );.#end
6580: 69 66 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63  if.  LeaveCritic
6590: 61 6c 53 65 63 74 69 6f 6e 28 26 70 4d 75 74 65  alSection(&pMute
65a0: 78 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 23 69  x->mutex);.}..#i
65b0: 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 0a 73  fdef LSM_DEBUG.s
65c0: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
65d0: 33 32 4f 73 4d 75 74 65 78 48 65 6c 64 28 6c 73  32OsMutexHeld(ls
65e0: 6d 5f 6d 75 74 65 78 20 2a 70 29 7b 0a 20 20 57  m_mutex *p){.  W
65f0: 69 6e 33 32 4d 75 74 65 78 20 2a 70 4d 75 74 65  in32Mutex *pMute
6600: 78 20 3d 20 28 57 69 6e 33 32 4d 75 74 65 78 20  x = (Win32Mutex 
6610: 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d  *)p;.  return pM
6620: 75 74 65 78 20 3f 20 70 4d 75 74 65 78 2d 3e 6f  utex ? pMutex->o
6630: 77 6e 65 72 3d 3d 47 65 74 43 75 72 72 65 6e 74  wner==GetCurrent
6640: 54 68 72 65 61 64 49 64 28 29 20 3a 20 31 3b 0a  ThreadId() : 1;.
6650: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d  }.static int lsm
6660: 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48  Win32OsMutexNotH
6670: 65 6c 64 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70  eld(lsm_mutex *p
6680: 29 7b 0a 20 20 57 69 6e 33 32 4d 75 74 65 78 20  ){.  Win32Mutex 
6690: 2a 70 4d 75 74 65 78 20 3d 20 28 57 69 6e 33 32  *pMutex = (Win32
66a0: 4d 75 74 65 78 20 2a 29 70 3b 0a 20 20 72 65 74  Mutex *)p;.  ret
66b0: 75 72 6e 20 70 4d 75 74 65 78 20 3f 20 70 4d 75  urn pMutex ? pMu
66c0: 74 65 78 2d 3e 6f 77 6e 65 72 21 3d 47 65 74 43  tex->owner!=GetC
66d0: 75 72 72 65 6e 74 54 68 72 65 61 64 49 64 28 29  urrentThreadId()
66e0: 20 3a 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f   : 1;.}.#endif./
66f0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 70 74 68 72  *.** End of pthr
6700: 65 61 64 73 20 6d 75 74 65 78 20 69 6d 70 6c 65  eads mutex imple
6710: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 2a 2a 2a  mentation..*****
6720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6760: 2a 2a 2a 2a 2f 0a 23 65 6c 73 65 0a 2f 2a 2a 2a  ****/.#else./***
6770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
67b0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4e 6f 6f 70 20 6d  ******.** Noop m
67c0: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
67d0: 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ion.*/.typedef s
67e0: 74 72 75 63 74 20 4e 6f 6f 70 4d 75 74 65 78 20  truct NoopMutex 
67f0: 4e 6f 6f 70 4d 75 74 65 78 3b 0a 73 74 72 75 63  NoopMutex;.struc
6800: 74 20 4e 6f 6f 70 4d 75 74 65 78 20 7b 0a 20 20  t NoopMutex {.  
6810: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 3b 20 20  lsm_env *pEnv;  
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 2f 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 68  /* Environment h
6840: 61 6e 64 6c 65 20 28 66 6f 72 20 78 46 72 65 65  andle (for xFree
6850: 28 29 29 20 2a 2f 0a 20 20 69 6e 74 20 62 48 65  ()) */.  int bHe
6860: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
6870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6880: 20 69 66 20 6d 75 74 65 78 20 69 73 20 68 65 6c   if mutex is hel
6890: 64 20 2a 2f 0a 20 20 69 6e 74 20 62 53 74 61 74  d */.  int bStat
68a0: 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ic;             
68b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
68c0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
68d0: 78 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4e  x */.};.static N
68e0: 6f 6f 70 4d 75 74 65 78 20 61 53 74 61 74 69 63  oopMutex aStatic
68f0: 4e 6f 6f 70 4d 75 74 65 78 5b 32 5d 20 3d 20 7b  NoopMutex[2] = {
6900: 0a 20 20 7b 30 2c 20 30 2c 20 31 7d 2c 0a 20 20  .  {0, 0, 1},.  
6910: 7b 30 2c 20 30 2c 20 31 7d 2c 0a 7d 3b 0a 0a 73  {0, 0, 1},.};..s
6920: 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69 6e  tatic int lsmWin
6930: 33 32 4f 73 4d 75 74 65 78 53 74 61 74 69 63 28  32OsMutexStatic(
6940: 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76  .  lsm_env *pEnv
6950: 2c 0a 20 20 69 6e 74 20 69 4d 75 74 65 78 2c 0a  ,.  int iMutex,.
6960: 20 20 6c 73 6d 5f 6d 75 74 65 78 20 2a 2a 70 70    lsm_mutex **pp
6970: 53 74 61 74 69 63 0a 29 7b 0a 20 20 61 73 73 65  Static.){.  asse
6980: 72 74 28 20 69 4d 75 74 65 78 3e 3d 31 20 26 26  rt( iMutex>=1 &&
6990: 20 69 4d 75 74 65 78 3c 3d 28 69 6e 74 29 61 72   iMutex<=(int)ar
69a0: 72 61 79 5f 73 69 7a 65 28 61 53 74 61 74 69 63  ray_size(aStatic
69b0: 4e 6f 6f 70 4d 75 74 65 78 29 20 29 3b 0a 20 20  NoopMutex) );.  
69c0: 2a 70 70 53 74 61 74 69 63 20 3d 20 28 6c 73 6d  *ppStatic = (lsm
69d0: 5f 6d 75 74 65 78 20 2a 29 26 61 53 74 61 74 69  _mutex *)&aStati
69e0: 63 4e 6f 6f 70 4d 75 74 65 78 5b 69 4d 75 74 65  cNoopMutex[iMute
69f0: 78 2d 31 5d 3b 0a 20 20 72 65 74 75 72 6e 20 4c  x-1];.  return L
6a00: 53 4d 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  SM_OK;.}.static 
6a10: 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75  int lsmWin32OsMu
6a20: 74 65 78 4e 65 77 28 6c 73 6d 5f 65 6e 76 20 2a  texNew(lsm_env *
6a30: 70 45 6e 76 2c 20 6c 73 6d 5f 6d 75 74 65 78 20  pEnv, lsm_mutex 
6a40: 2a 2a 70 70 4e 65 77 29 7b 0a 20 20 4e 6f 6f 70  **ppNew){.  Noop
6a50: 4d 75 74 65 78 20 2a 70 3b 0a 20 20 70 20 3d 20  Mutex *p;.  p = 
6a60: 28 4e 6f 6f 70 4d 75 74 65 78 20 2a 29 6c 73 6d  (NoopMutex *)lsm
6a70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 45 6e 76 2c  MallocZero(pEnv,
6a80: 20 73 69 7a 65 6f 66 28 4e 6f 6f 70 4d 75 74 65   sizeof(NoopMute
6a90: 78 29 29 3b 0a 20 20 69 66 28 20 70 20 29 20 70  x));.  if( p ) p
6aa0: 2d 3e 70 45 6e 76 20 3d 20 70 45 6e 76 3b 0a 20  ->pEnv = pEnv;. 
6ab0: 20 2a 70 70 4e 65 77 20 3d 20 28 6c 73 6d 5f 6d   *ppNew = (lsm_m
6ac0: 75 74 65 78 20 2a 29 70 3b 0a 20 20 72 65 74 75  utex *)p;.  retu
6ad0: 72 6e 20 28 70 20 3f 20 4c 53 4d 5f 4f 4b 20 3a  rn (p ? LSM_OK :
6ae0: 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29   LSM_NOMEM_BKPT)
6af0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6b00: 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 44  lsmWin32OsMutexD
6b10: 65 6c 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d  el(lsm_mutex *pM
6b20: 75 74 65 78 29 20 20 7b 0a 20 20 4e 6f 6f 70 4d  utex)  {.  NoopM
6b30: 75 74 65 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d  utex *p = (NoopM
6b40: 75 74 65 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20  utex *)pMutex;. 
6b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 53 74 61   assert( p->bSta
6b60: 74 69 63 3d 3d 30 20 26 26 20 70 2d 3e 70 45 6e  tic==0 && p->pEn
6b70: 76 20 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  v );.  lsmFree(p
6b80: 2d 3e 70 45 6e 76 2c 20 70 29 3b 0a 7d 0a 73 74  ->pEnv, p);.}.st
6b90: 61 74 69 63 20 76 6f 69 64 20 6c 73 6d 57 69 6e  atic void lsmWin
6ba0: 33 32 4f 73 4d 75 74 65 78 45 6e 74 65 72 28 6c  32OsMutexEnter(l
6bb0: 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75 74 65 78  sm_mutex *pMutex
6bc0: 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65 78 20 2a  ){.  NoopMutex *
6bd0: 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65 78 20 2a  p = (NoopMutex *
6be0: 29 70 4d 75 74 65 78 3b 0a 20 20 61 73 73 65 72  )pMutex;.  asser
6bf0: 74 28 20 70 2d 3e 62 48 65 6c 64 3d 3d 30 20 29  t( p->bHeld==0 )
6c00: 3b 0a 20 20 70 2d 3e 62 48 65 6c 64 20 3d 20 31  ;.  p->bHeld = 1
6c10: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  ;.}.static int l
6c20: 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 54 72  smWin32OsMutexTr
6c30: 79 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75  y(lsm_mutex *pMu
6c40: 74 65 78 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65  tex){.  NoopMute
6c50: 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65  x *p = (NoopMute
6c60: 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 61 73  x *)pMutex;.  as
6c70: 73 65 72 74 28 20 70 2d 3e 62 48 65 6c 64 3d 3d  sert( p->bHeld==
6c80: 30 20 29 3b 0a 20 20 70 2d 3e 62 48 65 6c 64 20  0 );.  p->bHeld 
6c90: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  = 1;.  return 0;
6ca0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
6cb0: 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 4c 65  smWin32OsMutexLe
6cc0: 61 76 65 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70  ave(lsm_mutex *p
6cd0: 4d 75 74 65 78 29 7b 0a 20 20 4e 6f 6f 70 4d 75  Mutex){.  NoopMu
6ce0: 74 65 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75  tex *p = (NoopMu
6cf0: 74 65 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20  tex *)pMutex;.  
6d00: 61 73 73 65 72 74 28 20 70 2d 3e 62 48 65 6c 64  assert( p->bHeld
6d10: 3d 3d 31 20 29 3b 0a 20 20 70 2d 3e 62 48 65 6c  ==1 );.  p->bHel
6d20: 64 20 3d 20 30 3b 0a 7d 0a 23 69 66 64 65 66 20  d = 0;.}.#ifdef 
6d30: 4c 53 4d 5f 44 45 42 55 47 0a 73 74 61 74 69 63  LSM_DEBUG.static
6d40: 20 69 6e 74 20 6c 73 6d 57 69 6e 33 32 4f 73 4d   int lsmWin32OsM
6d50: 75 74 65 78 48 65 6c 64 28 6c 73 6d 5f 6d 75 74  utexHeld(lsm_mut
6d60: 65 78 20 2a 70 4d 75 74 65 78 29 7b 0a 20 20 4e  ex *pMutex){.  N
6d70: 6f 6f 70 4d 75 74 65 78 20 2a 70 20 3d 20 28 4e  oopMutex *p = (N
6d80: 6f 6f 70 4d 75 74 65 78 20 2a 29 70 4d 75 74 65  oopMutex *)pMute
6d90: 78 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  x;.  return p ? 
6da0: 70 2d 3e 62 48 65 6c 64 20 3a 20 31 3b 0a 7d 0a  p->bHeld : 1;.}.
6db0: 73 74 61 74 69 63 20 69 6e 74 20 6c 73 6d 57 69  static int lsmWi
6dc0: 6e 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48 65 6c  n32OsMutexNotHel
6dd0: 64 28 6c 73 6d 5f 6d 75 74 65 78 20 2a 70 4d 75  d(lsm_mutex *pMu
6de0: 74 65 78 29 7b 0a 20 20 4e 6f 6f 70 4d 75 74 65  tex){.  NoopMute
6df0: 78 20 2a 70 20 3d 20 28 4e 6f 6f 70 4d 75 74 65  x *p = (NoopMute
6e00: 78 20 2a 29 70 4d 75 74 65 78 3b 0a 20 20 72 65  x *)pMutex;.  re
6e10: 74 75 72 6e 20 70 20 3f 20 21 70 2d 3e 62 48 65  turn p ? !p->bHe
6e20: 6c 64 20 3a 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  ld : 1;.}.#endif
6e30: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
6e80: 65 6e 64 69 66 20 2f 2a 20 65 6c 73 65 20 4c 53  endif /* else LS
6e90: 4d 5f 4d 55 54 45 58 5f 4e 4f 4e 45 20 2a 2f 0a  M_MUTEX_NONE */.
6ea0: 0a 2f 2a 20 57 69 74 68 6f 75 74 20 4c 53 4d 5f  ./* Without LSM_
6eb0: 44 45 42 55 47 2c 20 74 68 65 20 4d 75 74 65 78  DEBUG, the Mutex
6ec0: 48 65 6c 64 20 74 65 73 74 73 20 61 72 65 20 6e  Held tests are n
6ed0: 65 76 65 72 20 63 61 6c 6c 65 64 20 2a 2f 0a 23  ever called */.#
6ee0: 69 66 6e 64 65 66 20 4c 53 4d 5f 44 45 42 55 47  ifndef LSM_DEBUG
6ef0: 0a 23 20 64 65 66 69 6e 65 20 6c 73 6d 57 69 6e  .# define lsmWin
6f00: 33 32 4f 73 4d 75 74 65 78 48 65 6c 64 20 20 20  32OsMutexHeld   
6f10: 20 30 0a 23 20 64 65 66 69 6e 65 20 6c 73 6d 57   0.# define lsmW
6f20: 69 6e 33 32 4f 73 4d 75 74 65 78 4e 6f 74 48 65  in32OsMutexNotHe
6f30: 6c 64 20 30 0a 23 65 6e 64 69 66 0a 0a 6c 73 6d  ld 0.#endif..lsm
6f40: 5f 65 6e 76 20 2a 6c 73 6d 5f 64 65 66 61 75 6c  _env *lsm_defaul
6f50: 74 5f 65 6e 76 28 76 6f 69 64 29 7b 0a 20 20 73  t_env(void){.  s
6f60: 74 61 74 69 63 20 6c 73 6d 5f 65 6e 76 20 77 69  tatic lsm_env wi
6f70: 6e 33 32 5f 65 6e 76 20 3d 20 7b 0a 20 20 20 20  n32_env = {.    
6f80: 73 69 7a 65 6f 66 28 6c 73 6d 5f 65 6e 76 29 2c  sizeof(lsm_env),
6f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 42 79 74           /* nByt
6fa0: 65 20 2a 2f 0a 20 20 20 20 31 2c 20 20 20 20 20  e */.    1,     
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
6fd0: 0a 20 20 20 20 2f 2a 2a 2a 2a 2a 20 66 69 6c 65  .    /***** file
6fe0: 20 69 2f 6f 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   i/o ***********
6ff0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 30 2c 20  *******/.    0, 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 20 20 20 20 20 20 2f 2a 20 70 56 66 73 43 74 78        /* pVfsCtx
7020: 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32   */.    lsmWin32
7030: 4f 73 46 75 6c 6c 70 61 74 68 2c 20 20 20 20 20  OsFullpath,     
7040: 20 2f 2a 20 78 46 75 6c 6c 70 61 74 68 20 2a 2f   /* xFullpath */
7050: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4f  .    lsmWin32OsO
7060: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pen,          /*
7070: 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 6c 73   xOpen */.    ls
7080: 6d 57 69 6e 33 32 4f 73 52 65 61 64 2c 20 20 20  mWin32OsRead,   
7090: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
70a0: 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f  */.    lsmWin32O
70b0: 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
70c0: 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  /* xWrite */.   
70d0: 20 6c 73 6d 57 69 6e 33 32 4f 73 54 72 75 6e 63   lsmWin32OsTrunc
70e0: 61 74 65 2c 20 20 20 20 20 20 2f 2a 20 78 54 72  ate,      /* xTr
70f0: 75 6e 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 73  uncate */.    ls
7100: 6d 57 69 6e 33 32 4f 73 53 79 6e 63 2c 20 20 20  mWin32OsSync,   
7110: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
7120: 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f  */.    lsmWin32O
7130: 73 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  sSectorSize,    
7140: 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
7150: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
7160: 52 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 2f  Remap,         /
7170: 2a 20 78 52 65 6d 61 70 20 2a 2f 0a 20 20 20 20  * xRemap */.    
7180: 6c 73 6d 57 69 6e 33 32 4f 73 46 69 6c 65 69 64  lsmWin32OsFileid
7190: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c  ,        /* xFil
71a0: 65 69 64 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  eid */.    lsmWi
71b0: 6e 33 32 4f 73 43 6c 6f 73 65 2c 20 20 20 20 20  n32OsClose,     
71c0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
71d0: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 55  .    lsmWin32OsU
71e0: 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 2f 2a  nlink,        /*
71f0: 20 78 55 6e 6c 69 6e 6b 20 2a 2f 0a 20 20 20 20   xUnlink */.    
7200: 6c 73 6d 57 69 6e 33 32 4f 73 4c 6f 63 6b 2c 20  lsmWin32OsLock, 
7210: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
7220: 6b 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33  k */.    lsmWin3
7230: 32 4f 73 54 65 73 74 4c 6f 63 6b 2c 20 20 20 20  2OsTestLock,    
7240: 20 20 2f 2a 20 78 54 65 73 74 4c 6f 63 6b 20 2a    /* xTestLock *
7250: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
7260: 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 2f  ShmMap,        /
7270: 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 20  * xShmMap */.   
7280: 20 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d 42 61   lsmWin32OsShmBa
7290: 72 72 69 65 72 2c 20 20 20 20 2f 2a 20 78 53 68  rrier,    /* xSh
72a0: 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 20 20  mBarrier */.    
72b0: 6c 73 6d 57 69 6e 33 32 4f 73 53 68 6d 55 6e 6d  lsmWin32OsShmUnm
72c0: 61 70 2c 20 20 20 20 20 20 2f 2a 20 78 53 68 6d  ap,      /* xShm
72d0: 55 6e 6d 61 70 20 2a 2f 0a 20 20 20 20 2f 2a 2a  Unmap */.    /**
72e0: 2a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  *** memory alloc
72f0: 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ation *********/
7300: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7320: 20 70 4d 65 6d 43 74 78 20 2a 2f 0a 20 20 20 20   pMemCtx */.    
7330: 6c 73 6d 57 69 6e 33 32 4f 73 4d 61 6c 6c 6f 63  lsmWin32OsMalloc
7340: 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 4d 61 6c  ,        /* xMal
7350: 6c 6f 63 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69  loc */.    lsmWi
7360: 6e 33 32 4f 73 52 65 61 6c 6c 6f 63 2c 20 20 20  n32OsRealloc,   
7370: 20 20 20 20 2f 2a 20 78 52 65 61 6c 6c 6f 63 20      /* xRealloc 
7380: 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f  */.    lsmWin32O
7390: 73 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  sFree,          
73a0: 2f 2a 20 78 46 72 65 65 20 2a 2f 0a 20 20 20 20  /* xFree */.    
73b0: 6c 73 6d 57 69 6e 33 32 4f 73 4d 53 69 7a 65 2c  lsmWin32OsMSize,
73c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 69 7a           /* xSiz
73d0: 65 20 2a 2f 0a 20 20 20 20 2f 2a 2a 2a 2a 2a 20  e */.    /***** 
73e0: 6d 75 74 65 78 65 73 20 2a 2a 2a 2a 2a 2a 2a 2a  mutexes ********
73f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20  *************/. 
7400: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
7410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
7420: 4d 75 74 65 78 43 74 78 20 2a 2f 0a 20 20 20 20  MutexCtx */.    
7430: 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 53  lsmWin32OsMutexS
7440: 74 61 74 69 63 2c 20 20 20 2f 2a 20 78 4d 75 74  tatic,   /* xMut
7450: 65 78 53 74 61 74 69 63 20 2a 2f 0a 20 20 20 20  exStatic */.    
7460: 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74 65 78 4e  lsmWin32OsMutexN
7470: 65 77 2c 20 20 20 20 20 20 2f 2a 20 78 4d 75 74  ew,      /* xMut
7480: 65 78 4e 65 77 20 2a 2f 0a 20 20 20 20 6c 73 6d  exNew */.    lsm
7490: 57 69 6e 33 32 4f 73 4d 75 74 65 78 44 65 6c 2c  Win32OsMutexDel,
74a0: 20 20 20 20 20 20 2f 2a 20 78 4d 75 74 65 78 44        /* xMutexD
74b0: 65 6c 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e  el */.    lsmWin
74c0: 33 32 4f 73 4d 75 74 65 78 45 6e 74 65 72 2c 20  32OsMutexEnter, 
74d0: 20 20 20 2f 2a 20 78 4d 75 74 65 78 45 6e 74 65     /* xMutexEnte
74e0: 72 20 2a 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33  r */.    lsmWin3
74f0: 32 4f 73 4d 75 74 65 78 54 72 79 2c 20 20 20 20  2OsMutexTry,    
7500: 20 20 2f 2a 20 78 4d 75 74 65 78 54 72 79 20 2a    /* xMutexTry *
7510: 2f 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73  /.    lsmWin32Os
7520: 4d 75 74 65 78 4c 65 61 76 65 2c 20 20 20 20 2f  MutexLeave,    /
7530: 2a 20 78 4d 75 74 65 78 4c 65 61 76 65 20 2a 2f  * xMutexLeave */
7540: 0a 20 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d  .    lsmWin32OsM
7550: 75 74 65 78 48 65 6c 64 2c 20 20 20 20 20 2f 2a  utexHeld,     /*
7560: 20 78 4d 75 74 65 78 48 65 6c 64 20 2a 2f 0a 20   xMutexHeld */. 
7570: 20 20 20 6c 73 6d 57 69 6e 33 32 4f 73 4d 75 74     lsmWin32OsMut
7580: 65 78 4e 6f 74 48 65 6c 64 2c 20 20 2f 2a 20 78  exNotHeld,  /* x
7590: 4d 75 74 65 78 4e 6f 74 48 65 6c 64 20 2a 2f 0a  MutexNotHeld */.
75a0: 20 20 20 20 2f 2a 2a 2a 2a 2a 20 6f 74 68 65 72      /***** other
75b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
75c0: 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 6c 73 6d 57  ******/.    lsmW
75d0: 69 6e 33 32 4f 73 53 6c 65 65 70 2c 20 20 20 20  in32OsSleep,    
75e0: 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
75f0: 2f 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20  /.  };.  return 
7600: 26 77 69 6e 33 32 5f 65 6e 76 3b 0a 7d 0a 0a 23  &win32_env;.}..#
7610: 65 6e 64 69 66 0a                                endif.