File indexing completed on 2025-04-19 08:42:38
0001
0002
0003
0004
0005
0006 #ifndef BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
0007 #define BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
0008
0009 #include <boost/process/v1/detail/config.hpp>
0010 #include <boost/winapi/config.hpp>
0011 #include <boost/winapi/basic_types.hpp>
0012 #include <boost/winapi/dll.hpp>
0013 #include <boost/winapi/overlapped.hpp>
0014
0015 #if defined( BOOST_USE_WINDOWS_H )
0016 #include <windows.h>
0017 #else
0018 extern "C"
0019 {
0020 BOOST_SYMBOL_IMPORT ::boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC CreateIoCompletionPort(
0021 ::boost::winapi::HANDLE_ FileHandle,
0022 ::boost::winapi::HANDLE_ ExistingCompletionPort,
0023 ::boost::winapi::ULONG_PTR_ CompletionKey,
0024 ::boost::winapi::DWORD_ NumberOfConcurrentThreads
0025 );
0026
0027 BOOST_SYMBOL_IMPORT ::boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC GetQueuedCompletionStatus(
0028 ::boost::winapi::HANDLE_ CompletionPort,
0029 ::boost::winapi::LPDWORD_ lpNumberOfBytes,
0030 ::boost::winapi::ULONG_PTR_ *lpCompletionKey,
0031 _OVERLAPPED **lpOverlapped,
0032 ::boost::winapi::DWORD_ dwMilliseconds
0033 );
0034
0035 }
0036 #endif
0037 namespace boost { namespace process { BOOST_PROCESS_V1_INLINE namespace v1 { namespace detail { namespace windows { namespace workaround {
0038
0039 extern "C"
0040 {
0041
0042 struct JOBOBJECT_ASSOCIATE_COMPLETION_PORT_
0043 {
0044 ::boost::winapi::PVOID_ CompletionKey;
0045 ::boost::winapi::HANDLE_ CompletionPort;
0046 };
0047
0048 constexpr static int JOB_OBJECT_MSG_END_OF_JOB_TIME_ = 1;
0049 constexpr static int JOB_OBJECT_MSG_END_OF_PROCESS_TIME_ = 2;
0050 constexpr static int JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT_ = 3;
0051 constexpr static int JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO_ = 4;
0052 constexpr static int JOB_OBJECT_MSG_NEW_PROCESS_ = 6;
0053 constexpr static int JOB_OBJECT_MSG_EXIT_PROCESS_ = 7;
0054 constexpr static int JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS_ = 8;
0055 constexpr static int JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT_ = 9;
0056 constexpr static int JOB_OBJECT_MSG_JOB_MEMORY_LIMIT_ = 10;
0057 constexpr static int JOB_OBJECT_MSG_NOTIFICATION_LIMIT_ = 11;
0058 constexpr static int JOB_OBJECT_MSG_JOB_CYCLE_TIME_LIMIT_ = 12;
0059 constexpr static int JOB_OBJECT_MSG_SILO_TERMINATED_ = 13;
0060
0061 }
0062
0063 BOOST_FORCEINLINE ::boost::winapi::BOOL_ get_queued_completion_status(
0064 ::boost::winapi::HANDLE_ CompletionPort,
0065 ::boost::winapi::LPDWORD_ lpNumberOfBytes,
0066 ::boost::winapi::ULONG_PTR_ *lpCompletionKey,
0067 ::boost::winapi::LPOVERLAPPED_ *lpOverlapped,
0068 ::boost::winapi::DWORD_ dwMilliseconds)
0069 {
0070 return ::GetQueuedCompletionStatus(
0071 CompletionPort,
0072 lpNumberOfBytes,
0073 lpCompletionKey,
0074 reinterpret_cast<::_OVERLAPPED**>(lpOverlapped),
0075 dwMilliseconds);
0076 }
0077
0078 #if defined( BOOST_USE_WINDOWS_H )
0079
0080 constexpr auto static JobObjectExtendedLimitInformation_ = ::JobObjectExtendedLimitInformation;
0081 constexpr auto static JobObjectAssociateCompletionPortInformation_ = ::JobObjectAssociateCompletionPortInformation;
0082 constexpr auto static JobObjectBasicAccountingInformation_ = ::JobObjectBasicAccountingInformation;
0083
0084 using JOBOBJECT_BASIC_LIMIT_INFORMATION_ = ::JOBOBJECT_BASIC_LIMIT_INFORMATION;
0085 using JOBOBJECTINFOCLASS_ = ::JOBOBJECTINFOCLASS;
0086 using IO_COUNTERS_ = ::IO_COUNTERS;
0087 using JOBOBJECT_EXTENDED_LIMIT_INFORMATION_ = ::JOBOBJECT_EXTENDED_LIMIT_INFORMATION;
0088 using JOBOBJECT_BASIC_ACCOUNTING_INFORMATION_ = ::JOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
0089
0090 inline ::boost::winapi::BOOL_ query_information_job_object(
0091 ::boost::winapi::HANDLE_ hJob,
0092 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
0093 void * lpJobObjectInfo,
0094 ::boost::winapi::DWORD_ cbJobObjectInfoLength,
0095 ::boost::winapi::DWORD_ *lpReturnLength)
0096 {
0097 return ::QueryInformationJobObject(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength, lpReturnLength);
0098 }
0099
0100 inline ::boost::winapi::BOOL_ set_information_job_object(
0101 ::boost::winapi::HANDLE_ hJob,
0102 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
0103 void * lpJobObjectInfo,
0104 ::boost::winapi::DWORD_ cbJobObjectInfoLength)
0105 {
0106 return ::SetInformationJobObject(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength);
0107 }
0108
0109
0110 #else
0111
0112
0113
0114 extern "C"
0115 {
0116
0117 typedef enum _JOBOBJECTINFOCLASS_
0118 {
0119 JobObjectBasicAccountingInformation_ = 1,
0120 JobObjectBasicLimitInformation_,
0121 JobObjectBasicProcessIdList_,
0122 JobObjectBasicUIRestrictions_,
0123 JobObjectSecurityLimitInformation_,
0124 JobObjectEndOfJobTimeInformation_,
0125 JobObjectAssociateCompletionPortInformation_,
0126 JobObjectBasicAndIoAccountingInformation_,
0127 JobObjectExtendedLimitInformation_,
0128 JobObjectJobSetInformation_,
0129 JobObjectGroupInformation_,
0130 JobObjectNotificationLimitInformation_,
0131 JobObjectLimitViolationInformation_,
0132 JobObjectGroupInformationEx_,
0133 JobObjectCpuRateControlInformation_,
0134 JobObjectCompletionFilter_,
0135 JobObjectCompletionCounter_,
0136 JobObjectReserved1Information_ = 18,
0137 JobObjectReserved2Information_,
0138 JobObjectReserved3Information_,
0139 JobObjectReserved4Information_,
0140 JobObjectReserved5Information_,
0141 JobObjectReserved6Information_,
0142 JobObjectReserved7Information_,
0143 JobObjectReserved8Information_,
0144 MaxJobObjectInfoClass_
0145 } JOBOBJECTINFOCLASS_;
0146
0147 typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION_
0148 {
0149 ::boost::winapi::LARGE_INTEGER_ PerProcessUserTimeLimit;
0150 ::boost::winapi::LARGE_INTEGER_ PerJobUserTimeLimit;
0151 ::boost::winapi::DWORD_ LimitFlags;
0152 ::boost::winapi::SIZE_T_ MinimumWorkingSetSize;
0153 ::boost::winapi::SIZE_T_ MaximumWorkingSetSize;
0154 ::boost::winapi::DWORD_ ActiveProcessLimit;
0155 ::boost::winapi::ULONG_PTR_ Affinity;
0156 ::boost::winapi::DWORD_ PriorityClass;
0157 ::boost::winapi::DWORD_ SchedulingClass;
0158 } JOBOBJECT_BASIC_LIMIT_INFORMATION_;
0159
0160
0161 typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION_ {
0162 ::boost::winapi::LARGE_INTEGER_ TotalUserTime;
0163 ::boost::winapi::LARGE_INTEGER_ TotalKernelTime;
0164 ::boost::winapi::LARGE_INTEGER_ ThisPeriodTotalUserTime;
0165 ::boost::winapi::LARGE_INTEGER_ ThisPeriodTotalKernelTime;
0166 ::boost::winapi::DWORD_ TotalPageFaultCount;
0167 ::boost::winapi::DWORD_ TotalProcesses;
0168 ::boost::winapi::DWORD_ ActiveProcesses;
0169 ::boost::winapi::DWORD_ TotalTerminatedProcesses;
0170 } JOBOBJECT_BASIC_ACCOUNTING_INFORMATION_;
0171
0172 typedef struct _IO_COUNTERS_
0173 {
0174 ::boost::winapi::ULONGLONG_ ReadOperationCount;
0175 ::boost::winapi::ULONGLONG_ WriteOperationCount;
0176 ::boost::winapi::ULONGLONG_ OtherOperationCount;
0177 ::boost::winapi::ULONGLONG_ ReadTransferCount;
0178 ::boost::winapi::ULONGLONG_ WriteTransferCount;
0179 ::boost::winapi::ULONGLONG_ OtherTransferCount;
0180 } IO_COUNTERS_;
0181
0182
0183 typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION_
0184 {
0185 JOBOBJECT_BASIC_LIMIT_INFORMATION_ BasicLimitInformation;
0186 IO_COUNTERS_ IoInfo;
0187 ::boost::winapi::SIZE_T_ ProcessMemoryLimit;
0188 ::boost::winapi::SIZE_T_ JobMemoryLimit;
0189 ::boost::winapi::SIZE_T_ PeakProcessMemoryUsed;
0190 ::boost::winapi::SIZE_T_ PeakJobMemoryUsed;
0191 } JOBOBJECT_EXTENDED_LIMIT_INFORMATION_;
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202 typedef ::boost::winapi::BOOL_ (BOOST_WINAPI_WINAPI_CC *query_information_job_object_p)(
0203 ::boost::winapi::HANDLE_,
0204 JOBOBJECTINFOCLASS_,
0205 void *,
0206 ::boost::winapi::DWORD_,
0207 ::boost::winapi::DWORD_ *);
0208
0209
0210 inline ::boost::winapi::BOOL_ query_information_job_object(
0211 ::boost::winapi::HANDLE_ hJob,
0212 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
0213 void *lpJobObjectInfo,
0214 ::boost::winapi::DWORD_ cbJobObjectInfoLength,
0215 ::boost::winapi::DWORD_ *lpReturnLength)
0216 {
0217 static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(
0218 L"Kernel32.dll");
0219 static query_information_job_object_p f = reinterpret_cast<query_information_job_object_p>(::boost::winapi::get_proc_address(
0220 h, "QueryInformationJobObject"));
0221
0222 return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo,
0223 cbJobObjectInfoLength, lpReturnLength);
0224 }
0225
0226
0227
0228
0229
0230
0231
0232
0233 typedef ::boost::winapi::BOOL_ (BOOST_WINAPI_WINAPI_CC *set_information_job_object_p)(
0234 ::boost::winapi::HANDLE_,
0235 JOBOBJECTINFOCLASS_,
0236 void *,
0237 ::boost::winapi::DWORD_);
0238
0239 }
0240
0241 inline ::boost::winapi::BOOL_ set_information_job_object(
0242 ::boost::winapi::HANDLE_ hJob,
0243 JOBOBJECTINFOCLASS_ JobObjectInfoClass,
0244 void *lpJobObjectInfo,
0245 ::boost::winapi::DWORD_ cbJobObjectInfoLength)
0246 {
0247 static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(
0248 L"Kernel32.dll");
0249 static set_information_job_object_p f = reinterpret_cast<set_information_job_object_p>(::boost::winapi::get_proc_address(
0250 h, "SetInformationJobObject"));
0251
0252 return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo,
0253 cbJobObjectInfoLength);
0254 }
0255
0256 #endif
0257
0258 constexpr static ::boost::winapi::DWORD_ JOB_OBJECT_LIMIT_BREAKAWAY_OK_ = 0x00000800;
0259
0260 }}}}}}
0261
0262 #endif