job_workaround.hpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright (c) 2016 Klemens D. Morgenstern
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
  6. #define BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_
  7. #include <boost/winapi/config.hpp>
  8. #include <boost/winapi/basic_types.hpp>
  9. #include <boost/winapi/dll.hpp>
  10. namespace boost { namespace process { namespace detail { namespace windows { namespace workaround {
  11. //this import workaround is to keep it a header-only library. and enums cannot be imported from the winapi.
  12. extern "C"
  13. {
  14. typedef enum _JOBOBJECTINFOCLASS_ {
  15. JobObjectBasicAccountingInformation_ = 1, JobObjectBasicLimitInformation_,
  16. JobObjectBasicProcessIdList_, JobObjectBasicUIRestrictions_,
  17. JobObjectSecurityLimitInformation_, JobObjectEndOfJobTimeInformation_,
  18. JobObjectAssociateCompletionPortInformation_, JobObjectBasicAndIoAccountingInformation_,
  19. JobObjectExtendedLimitInformation_, JobObjectJobSetInformation_,
  20. JobObjectGroupInformation_,
  21. JobObjectNotificationLimitInformation_,
  22. JobObjectLimitViolationInformation_,
  23. JobObjectGroupInformationEx_,
  24. JobObjectCpuRateControlInformation_,
  25. JobObjectCompletionFilter_,
  26. JobObjectCompletionCounter_,
  27. JobObjectReserved1Information_ = 18,
  28. JobObjectReserved2Information_,
  29. JobObjectReserved3Information_,
  30. JobObjectReserved4Information_,
  31. JobObjectReserved5Information_,
  32. JobObjectReserved6Information_,
  33. JobObjectReserved7Information_,
  34. JobObjectReserved8Information_,
  35. MaxJobObjectInfoClass_
  36. } JOBOBJECTINFOCLASS_;
  37. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION_ {
  38. ::boost::winapi::LARGE_INTEGER_ PerProcessUserTimeLimit;
  39. ::boost::winapi::LARGE_INTEGER_ PerJobUserTimeLimit;
  40. ::boost::winapi::DWORD_ LimitFlags;
  41. ::boost::winapi::SIZE_T_ MinimumWorkingSetSize;
  42. ::boost::winapi::SIZE_T_ MaximumWorkingSetSize;
  43. ::boost::winapi::DWORD_ ActiveProcessLimit;
  44. ::boost::winapi::ULONG_PTR_ Affinity;
  45. ::boost::winapi::DWORD_ PriorityClass;
  46. ::boost::winapi::DWORD_ SchedulingClass;
  47. } JOBOBJECT_BASIC_LIMIT_INFORMATION_;
  48. typedef struct _IO_COUNTERS_ {
  49. ::boost::winapi::ULONGLONG_ ReadOperationCount;
  50. ::boost::winapi::ULONGLONG_ WriteOperationCount;
  51. ::boost::winapi::ULONGLONG_ OtherOperationCount;
  52. ::boost::winapi::ULONGLONG_ ReadTransferCount;
  53. ::boost::winapi::ULONGLONG_ WriteTransferCount;
  54. ::boost::winapi::ULONGLONG_ OtherTransferCount;
  55. } IO_COUNTERS_;
  56. typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION_ {
  57. JOBOBJECT_BASIC_LIMIT_INFORMATION_ BasicLimitInformation;
  58. IO_COUNTERS_ IoInfo;
  59. ::boost::winapi::SIZE_T_ ProcessMemoryLimit;
  60. ::boost::winapi::SIZE_T_ JobMemoryLimit;
  61. ::boost::winapi::SIZE_T_ PeakProcessMemoryUsed;
  62. ::boost::winapi::SIZE_T_ PeakJobMemoryUsed;
  63. } JOBOBJECT_EXTENDED_LIMIT_INFORMATION_;
  64. /*BOOL WINAPI QueryInformationJobObject(
  65. _In_opt_ HANDLE hJob,
  66. _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
  67. _Out_ LPVOID lpJobObjectInfo,
  68. _In_ DWORD cbJobObjectInfoLength,
  69. _Out_opt_ LPDWORD lpReturnLength
  70. );
  71. */
  72. typedef ::boost::winapi::BOOL_ (*query_information_job_object_p)(
  73. ::boost::winapi::HANDLE_,
  74. JOBOBJECTINFOCLASS_,
  75. void *,
  76. ::boost::winapi::DWORD_,
  77. ::boost::winapi::DWORD_ *);
  78. inline ::boost::winapi::BOOL_ query_information_job_object(
  79. ::boost::winapi::HANDLE_ hJob,
  80. JOBOBJECTINFOCLASS_ JobObjectInfoClass,
  81. void * lpJobObjectInfo,
  82. ::boost::winapi::DWORD_ cbJobObjectInfoLength,
  83. ::boost::winapi::DWORD_ *lpReturnLength)
  84. {
  85. static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(L"Kernel32.dll");
  86. static query_information_job_object_p f = reinterpret_cast<query_information_job_object_p>(::boost::winapi::get_proc_address(h, "QueryInformationJobObject"));
  87. return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength, lpReturnLength);
  88. }
  89. /*BOOL WINAPI SetInformationJobObject(
  90. _In_ HANDLE hJob,
  91. _In_ JOBOBJECTINFOCLASS JobObjectInfoClass,
  92. _In_ LPVOID lpJobObjectInfo,
  93. _In_ DWORD cbJobObjectInfoLength
  94. );*/
  95. typedef ::boost::winapi::BOOL_ (*set_information_job_object_p)(
  96. ::boost::winapi::HANDLE_,
  97. JOBOBJECTINFOCLASS_,
  98. void *,
  99. ::boost::winapi::DWORD_);
  100. }
  101. inline ::boost::winapi::BOOL_ set_information_job_object(
  102. ::boost::winapi::HANDLE_ hJob,
  103. JOBOBJECTINFOCLASS_ JobObjectInfoClass,
  104. void * lpJobObjectInfo,
  105. ::boost::winapi::DWORD_ cbJobObjectInfoLength)
  106. {
  107. static ::boost::winapi::HMODULE_ h = ::boost::winapi::get_module_handle(L"Kernel32.dll");
  108. static set_information_job_object_p f = reinterpret_cast<set_information_job_object_p>(::boost::winapi::get_proc_address(h, "SetInformationJobObject"));
  109. return (*f)(hJob, JobObjectInfoClass, lpJobObjectInfo, cbJobObjectInfoLength);
  110. }
  111. constexpr static ::boost::winapi::DWORD_ JOB_OBJECT_LIMIT_BREAKAWAY_OK_ = 0x00000800;
  112. }}}}}
  113. #endif /* BOOST_PROCESS_DETAIL_WINDOWS_JOB_WORKAROUND_HPP_ */