@@ -959,7 +959,7 @@ inline void check_win32_9xa_dir_is_valid(win32_9xa_dir_handle const &h)
959
959
::fast_io::win32::win32_find_dataa wfda{};
960
960
tlc_win32_9xa_dir_handle_path_str temp_find_path{concat_tlc_win32_9xa_dir_handle_path_str (h.path , u8" \\ *" )};
961
961
auto find_struct{::fast_io::win32::FindFirstFileA (reinterpret_cast <char const *>(temp_find_path.c_str ()), __builtin_addressof (wfda))};
962
- if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 )))
962
+ if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 ))) [[unlikely]]
963
963
{
964
964
throw_win32_error (0x5 );
965
965
}
@@ -969,14 +969,39 @@ inline void check_win32_9xa_dir_is_valid(win32_9xa_dir_handle const &h)
969
969
}
970
970
}
971
971
972
+ inline bool get_win32_9xa_dir_validity (win32_9xa_dir_handle const &h)
973
+ {
974
+ ::fast_io::win32::win32_find_dataa wfda{};
975
+ tlc_win32_9xa_dir_handle_path_str temp_find_path{concat_tlc_win32_9xa_dir_handle_path_str (h.path , u8" \\ *" )};
976
+ auto find_struct{::fast_io::win32::FindFirstFileA (reinterpret_cast <char const *>(temp_find_path.c_str ()), __builtin_addressof (wfda))};
977
+ if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 ))) [[unlikely]]
978
+ {
979
+ return false ;
980
+ }
981
+ else
982
+ {
983
+ ::fast_io::win32::FindClose (find_struct);
984
+ return true ;
985
+ }
986
+ }
987
+
972
988
template <bool throw_eh = false >
973
989
inline void close_win32_9xa_dir_handle (win32_9xa_dir_handle &h) noexcept (!throw_eh)
974
990
{
975
991
if constexpr (throw_eh)
976
992
{
977
- check_win32_9xa_dir_is_valid (h);
993
+ // Make sure to successfully close even if an exception is thrown.
994
+ bool const is_win32_9xa_dir_validid{get_win32_9xa_dir_validity (h)};
995
+ h.path .clear ();
996
+ if (!is_win32_9xa_dir_validid) [[unlikely]]
997
+ {
998
+ throw_win32_error (0x5 );
999
+ }
1000
+ }
1001
+ else
1002
+ {
1003
+ h.path .clear ();
978
1004
}
979
- h.path .clear ();
980
1005
}
981
1006
982
1007
inline win32_9xa_dir_handle win32_9xa_dir_dup_impl (win32_9xa_dir_handle const &h)
0 commit comments