diff --git a/winsup/cygwin/ntdll.h b/winsup/cygwin/ntdll.h index 58d63425e..0112349d3 100644 --- a/winsup/cygwin/ntdll.h +++ b/winsup/cygwin/ntdll.h @@ -14,6 +14,10 @@ /* custom status code: */ #define STATUS_ILLEGAL_DLL_PSEUDO_RELOCATION ((NTSTATUS) 0xe0000269) +/* Simplify checking for a transactional error code. */ +#define NT_TRANSACTIONAL_ERROR(s) \ + (((ULONG)(s) >= (ULONG)STATUS_TRANSACTIONAL_CONFLICT) \ + && ((ULONG)(s) <= (ULONG)STATUS_TRANSACTION_NOT_ENLISTED)) #define NtCurrentProcess() ((HANDLE) (LONG_PTR) -1) #define NtCurrentThread() ((HANDLE) (LONG_PTR) -2) @@ -1601,5 +1605,36 @@ extern "C" && ebi.SignalState != 0; } + + static inline void + start_transaction (HANDLE &old_trans, HANDLE &trans) + { + NTSTATUS status = NtCreateTransaction (&trans, + SYNCHRONIZE | TRANSACTION_ALL_ACCESS, + NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + if (NT_SUCCESS (status)) + { + old_trans = RtlGetCurrentTransaction (); + RtlSetCurrentTransaction (trans); + } + else + { + debug_printf ("NtCreateTransaction failed, %y", status); + old_trans = trans = NULL; + } + } + + static inline NTSTATUS + stop_transaction (NTSTATUS status, HANDLE old_trans, HANDLE &trans) + { + RtlSetCurrentTransaction (old_trans); + if (NT_SUCCESS (status)) + status = NtCommitTransaction (trans, TRUE); + else + status = NtRollbackTransaction (trans, TRUE); + NtClose (trans); + trans = NULL; + return status; + } } #endif diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 9bae6dc0b..6d1085539 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -182,42 +182,6 @@ dup3 (int oldfd, int newfd, int flags) return res; } -/* Define macro to simplify checking for a transactional error code. */ -#define NT_TRANSACTIONAL_ERROR(s) \ - (((ULONG)(s) >= (ULONG)STATUS_TRANSACTIONAL_CONFLICT) \ - && ((ULONG)(s) <= (ULONG)STATUS_TRANSACTION_NOT_ENLISTED)) - -static inline void -start_transaction (HANDLE &old_trans, HANDLE &trans) -{ - NTSTATUS status = NtCreateTransaction (&trans, - SYNCHRONIZE | TRANSACTION_ALL_ACCESS, - NULL, NULL, NULL, 0, 0, 0, NULL, NULL); - if (NT_SUCCESS (status)) - { - old_trans = RtlGetCurrentTransaction (); - RtlSetCurrentTransaction (trans); - } - else - { - debug_printf ("NtCreateTransaction failed, %y", status); - old_trans = trans = NULL; - } -} - -static inline NTSTATUS -stop_transaction (NTSTATUS status, HANDLE old_trans, HANDLE &trans) -{ - RtlSetCurrentTransaction (old_trans); - if (NT_SUCCESS (status)) - status = NtCommitTransaction (trans, TRUE); - else - status = NtRollbackTransaction (trans, TRUE); - NtClose (trans); - trans = NULL; - return status; -} - static const char desktop_ini[] = "[.ShellClassInfo]\r\n" "CLSID={645FF040-5081-101B-9F08-00AA002F954E}\r\n"