changeset 22995:94656f3ff304 v8.2.2044

patch 8.2.2044: MS-Windows: swap file test sometimes fails Commit: https://github.com/vim/vim/commit/5ee0981fb5259f94900ab25207caddf1fa61010d Author: Bram Moolenaar <Bram@vim.org> Date: Wed Nov 25 12:43:28 2020 +0100 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)
author Bram Moolenaar <Bram@vim.org>
date Wed, 25 Nov 2020 12:45:03 +0100
parents 1d635e77266d
children 00ca79a2ae52
files .github/workflows/ci-windows.yaml src/testdir/test_swap.vim src/version.c
diffstat 3 files changed, 40 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/.github/workflows/ci-windows.yaml
+++ b/.github/workflows/ci-windows.yaml
@@ -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
--- a/src/testdir/test_swap.vim
+++ b/src/testdir/test_swap.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2044,
+/**/
     2043,
 /**/
     2042,