[m-rev.] for review: use the Windows API file copying functions
Zoltan Somogyi
zoltan.somogyi at runbox.com
Sun Jan 7 20:42:30 AEDT 2024
On 2024-01-07 20:36 +11:00 AEDT, "Julien Fischer" <jfischer at opturion.com> wrote:
> On my Windows machine, this reduces the time required to compile
> samples/diff using mmc --make from ~30s (with --install-method external)
> to ~6s (with --install-method internal).
I presume the 6 seconds or so was with CopyFileW. What was the time with
the now renamed do_copy_file?
> Use the Windows API file copying functions.
... on Windows.
Just to prevent people from wondering how this would be done on Linux/MacOS.
> +:- func get_internal_copy_method = internal_copy_method.
> +
> +:- pragma foreign_proc("C",
> + get_internal_copy_method = (Method::out),
> + [will_not_call_mercury, thread_safe, promise_pure],
> +"
> +#if defined(MR_WIN32) && !defined(MR_CYGWIN)
> + Method = MC_ICM_WINDOWS_API;
> +#else
> + Method = MC_ICM_MERCURY_IMPL;
> +#endif
> +
> +").
> +
> +get_internal_copy_method = icm_mercury.
Add a comment on the last clause about applicability.
> +:- pred do_windows_copy_file(file_name::in, file_name::in, bool::out,
> + system_error::out, io::di, io::uo) is det.
> +
> +:- pragma foreign_proc("C",
> + do_windows_copy_file(Src::in, Dst::in, IsOk::out, SysErr::out,
> + _IO0::di, _IO::uo),
> + [will_not_call_mercury, promise_pure, thread_safe, tabled_for_io],
> +"
> +#if defined(MR_WIN32)
> + if (CopyFileW(MR_utf8_to_wide(Src), MR_utf8_to_wide(Dst), FALSE)) {
> + IsOk = MR_YES;
> + SysErr = 0;
> + } else {
> + IsOk = MR_NO;
> + SysErr = GetLastError();
> + }
> +#else
> + MR_fatal_error(""do_windows_copy_file/6 not supported on this system"");
> +#endif
> +").
I am far from a Windows native programmer, so you may want to ask
Peter as well, but that looks OK to me.
Zoltan.
More information about the reviews
mailing list