MUtilities development repository
修订版 | 4075bf405c5cd8fe54ab531af249dd2854af86a6 (tree) |
---|---|
时间 | 2017-01-04 07:47:59 |
作者 | ![]() |
Commiter | LoRd_MuldeR |
Some clean-up and simplification for JobObject class.
@@ -27,18 +27,18 @@ class QProcess; | ||
27 | 27 | |
28 | 28 | namespace MUtils |
29 | 29 | { |
30 | - class MUTILS_API JobObject_Private; | |
31 | - | |
32 | 30 | class MUTILS_API JobObject |
33 | 31 | { |
34 | 32 | public: |
35 | 33 | JobObject(void); |
36 | 34 | ~JobObject(void); |
37 | 35 | |
38 | - bool addProcessToJob(const QProcess *proc); | |
39 | - bool terminateJob(unsigned int exitCode); | |
36 | + bool isObjectCreated(void); | |
37 | + bool addProcessToJob(const QProcess *const process); | |
38 | + bool terminateJob(const quint32 &exitCode); | |
40 | 39 | |
41 | 40 | private: |
42 | - JobObject_Private *const p; | |
41 | + uintptr_t m_jobPtr; | |
42 | + MUTILS_NO_COPY(JobObject) | |
43 | 43 | }; |
44 | 44 | } |
@@ -30,44 +30,28 @@ | ||
30 | 30 | #define NOMINMAX |
31 | 31 | #define WIN32_LEAN_AND_MEAN 1 |
32 | 32 | #include <Windows.h> |
33 | -#include <MMSystem.h> | |
34 | -#include <ShellAPI.h> | |
35 | -#include <WinInet.h> | |
36 | 33 | |
37 | -namespace MUtils | |
38 | -{ | |
39 | - class JobObject_Private | |
40 | - { | |
41 | - friend class JobObject; | |
42 | - | |
43 | - protected: | |
44 | - JobObject_Private(void) | |
45 | - { | |
46 | - m_hJobObject = NULL; | |
47 | - } | |
48 | - | |
49 | - HANDLE m_hJobObject; | |
50 | - }; | |
51 | -} | |
34 | +//Utilities | |
35 | +#define PTR2HANDLE(X) reinterpret_cast<HANDLE>((X)) | |
36 | +#define HANDLE2PTR(X) reinterpret_cast<uintptr_t>((X)) | |
52 | 37 | |
53 | 38 | MUtils::JobObject::JobObject(void) |
54 | 39 | : |
55 | - p(new JobObject_Private()) | |
40 | + m_jobPtr(NULL) | |
56 | 41 | { |
57 | 42 | const HANDLE jobObject = CreateJobObject(NULL, NULL); |
58 | 43 | if((jobObject != NULL) && (jobObject != INVALID_HANDLE_VALUE)) |
59 | 44 | { |
60 | 45 | JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobExtendedLimitInfo; |
61 | 46 | memset(&jobExtendedLimitInfo, 0, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); |
62 | - memset(&jobExtendedLimitInfo.BasicLimitInformation, 0, sizeof(JOBOBJECT_BASIC_LIMIT_INFORMATION)); | |
63 | 47 | jobExtendedLimitInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION; |
64 | 48 | if(SetInformationJobObject(jobObject, JobObjectExtendedLimitInformation, &jobExtendedLimitInfo, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION))) |
65 | 49 | { |
66 | - p->m_hJobObject = jobObject; | |
50 | + m_jobPtr = HANDLE2PTR(jobObject); | |
67 | 51 | } |
68 | 52 | else |
69 | 53 | { |
70 | - qWarning("Failed to set job object information!"); | |
54 | + qWarning("Failed to set up job object limit information!"); | |
71 | 55 | CloseHandle(jobObject); |
72 | 56 | } |
73 | 57 | } |
@@ -79,24 +63,27 @@ MUtils::JobObject::JobObject(void) | ||
79 | 63 | |
80 | 64 | MUtils::JobObject::~JobObject(void) |
81 | 65 | { |
82 | - if(p->m_hJobObject) | |
66 | + if(m_jobPtr) | |
83 | 67 | { |
84 | - CloseHandle(p->m_hJobObject); | |
85 | - p->m_hJobObject = NULL; | |
68 | + CloseHandle(PTR2HANDLE(m_jobPtr)); | |
69 | + m_jobPtr = NULL; | |
86 | 70 | } |
71 | +} | |
87 | 72 | |
88 | - delete p; | |
73 | +bool MUtils::JobObject::isObjectCreated(void) | |
74 | +{ | |
75 | + return (bool) m_jobPtr; | |
89 | 76 | } |
90 | 77 | |
91 | -bool MUtils::JobObject::addProcessToJob(const QProcess *proc) | |
78 | +bool MUtils::JobObject::addProcessToJob(const QProcess *const process) | |
92 | 79 | { |
93 | - if(!p->m_hJobObject) | |
80 | + if(!m_jobPtr) | |
94 | 81 | { |
95 | 82 | qWarning("Cannot assign process to job: No job bject available!"); |
96 | 83 | return false; |
97 | 84 | } |
98 | 85 | |
99 | - if(Q_PID pid = proc->pid()) | |
86 | + if(const Q_PID pid = process->pid()) | |
100 | 87 | { |
101 | 88 | DWORD exitCode; |
102 | 89 | if(!GetExitCodeProcess(pid->hProcess, &exitCode)) |
@@ -104,19 +91,16 @@ bool MUtils::JobObject::addProcessToJob(const QProcess *proc) | ||
104 | 91 | qWarning("Cannot assign process to job: Failed to query process status!"); |
105 | 92 | return false; |
106 | 93 | } |
107 | - | |
108 | 94 | if(exitCode != STILL_ACTIVE) |
109 | 95 | { |
110 | 96 | qWarning("Cannot assign process to job: Process is not running anymore!"); |
111 | 97 | return false; |
112 | 98 | } |
113 | - | |
114 | - if(!AssignProcessToJobObject(p->m_hJobObject, pid->hProcess)) | |
99 | + if(!AssignProcessToJobObject(PTR2HANDLE(m_jobPtr), pid->hProcess)) | |
115 | 100 | { |
116 | 101 | qWarning("Failed to assign process to job object!"); |
117 | 102 | return false; |
118 | 103 | } |
119 | - | |
120 | 104 | return true; |
121 | 105 | } |
122 | 106 | else |
@@ -126,11 +110,11 @@ bool MUtils::JobObject::addProcessToJob(const QProcess *proc) | ||
126 | 110 | } |
127 | 111 | } |
128 | 112 | |
129 | -bool MUtils::JobObject::terminateJob(unsigned int exitCode) | |
113 | +bool MUtils::JobObject::terminateJob(const quint32 &exitCode) | |
130 | 114 | { |
131 | - if(p->m_hJobObject) | |
115 | + if(m_jobPtr) | |
132 | 116 | { |
133 | - if(TerminateJobObject(p->m_hJobObject, exitCode)) | |
117 | + if(TerminateJobObject(PTR2HANDLE(m_jobPtr), exitCode)) | |
134 | 118 | { |
135 | 119 | return true; |
136 | 120 | } |