Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 08:42:38

0001 // Copyright (c) 2016 Klemens D. Morgenstern
0002 //
0003 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0004 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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 //this import workaround is to keep it a header-only library. and enums cannot be imported from the winapi.
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 /*BOOL WINAPI QueryInformationJobObject(
0195   _In_opt_  HANDLE             hJob,
0196   _In_      JOBOBJECTINFOCLASS JobObjectInfoClass,
0197   _Out_     LPVOID             lpJobObjectInfo,
0198   _In_      DWORD              cbJobObjectInfoLength,
0199   _Out_opt_ LPDWORD            lpReturnLength
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 /*BOOL WINAPI SetInformationJobObject(
0227   _In_ HANDLE             hJob,
0228   _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
0229   _In_ LPVOID             lpJobObjectInfo,
0230   _In_ DWORD              cbJobObjectInfoLength
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 /* BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_ */