patch 8.2.2044: MS-Windows: swap file test sometimes fails

Problem:    MS-Windows: swap file test sometimes fails.
Solution:   Use a more reliable way to change the process ID. When "timeout"
            fails use "ping" to wait up to ten minutes. (Ken Takata,
            closes #7365)
This commit is contained in:
Bram Moolenaar
2020-11-25 12:43:28 +01:00
parent ff94bd9e47
commit 5ee0981fb5
3 changed files with 40 additions and 4 deletions

View File

@ -215,7 +215,8 @@ jobs:
:: Wait about 10 minutes.
for /L %%i in (1,1,60) do (
if exist done.txt goto exitloop
timeout 10
timeout 10 > NUL 2>&1
if ERRORLEVEL 1 ping -n 11 localhost > NUL
)
set timeout=1
:exitloop

View File

@ -403,6 +403,39 @@ func Test_swap_symlink()
call delete('Xswapdir', 'rf')
endfunc
func s:get_unused_pid(base)
if has('job')
" Execute 'echo' as a temporary job, and return its pid as an unused pid.
if has('win32')
let cmd = 'cmd /c echo'
else
let cmd = 'echo'
endif
let j = job_start(cmd)
while job_status(j) ==# 'run'
sleep 10m
endwhile
if job_status(j) ==# 'dead'
return job_info(j).process
endif
endif
" Must add four for MS-Windows to see it as a different one.
return a:base + 4
endfunc
func s:blob_to_pid(b)
return a:b[3] * 16777216 + a:b[2] * 65536 + a:b[1] * 256 + a:b[0]
endfunc
func s:pid_to_blob(i)
let b = 0z
let b[0] = and(a:i, 0xff)
let b[1] = and(a:i / 256, 0xff)
let b[2] = and(a:i / 65536, 0xff)
let b[3] = and(a:i / 16777216, 0xff)
return b
endfunc
func Test_swap_auto_delete()
" Create a valid swapfile by editing a file with a special extension.
split Xtest.scr
@ -416,9 +449,9 @@ func Test_swap_auto_delete()
" Forget about the file, recreate the swap file, then edit it again. The
" swap file should be automatically deleted.
bwipe!
" Change the process ID to avoid the "still running" warning. Must add four
" for MS-Windows to see it as a different one.
let swapfile_bytes[24] = swapfile_bytes[24] + 4
" Change the process ID to avoid the "still running" warning.
let swapfile_bytes[24:27] = s:pid_to_blob(s:get_unused_pid(
\ s:blob_to_pid(swapfile_bytes[24:27])))
call writefile(swapfile_bytes, swapfile_name)
edit Xtest.scr
" will end up using the same swap file after deleting the existing one

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2044,
/**/
2043,
/**/