1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/win/startup_information.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base {
10*6777b538SAndroid Build Coastguard Worker namespace win {
11*6777b538SAndroid Build Coastguard Worker
StartupInformation()12*6777b538SAndroid Build Coastguard Worker StartupInformation::StartupInformation() : startup_info_() {
13*6777b538SAndroid Build Coastguard Worker startup_info_.StartupInfo.cb = sizeof(startup_info_);
14*6777b538SAndroid Build Coastguard Worker }
15*6777b538SAndroid Build Coastguard Worker
~StartupInformation()16*6777b538SAndroid Build Coastguard Worker StartupInformation::~StartupInformation() {
17*6777b538SAndroid Build Coastguard Worker if (startup_info_.lpAttributeList) {
18*6777b538SAndroid Build Coastguard Worker ::DeleteProcThreadAttributeList(startup_info_.lpAttributeList);
19*6777b538SAndroid Build Coastguard Worker }
20*6777b538SAndroid Build Coastguard Worker }
21*6777b538SAndroid Build Coastguard Worker
InitializeProcThreadAttributeList(DWORD attribute_count)22*6777b538SAndroid Build Coastguard Worker bool StartupInformation::InitializeProcThreadAttributeList(
23*6777b538SAndroid Build Coastguard Worker DWORD attribute_count) {
24*6777b538SAndroid Build Coastguard Worker if (startup_info_.StartupInfo.cb != sizeof(startup_info_) ||
25*6777b538SAndroid Build Coastguard Worker startup_info_.lpAttributeList) {
26*6777b538SAndroid Build Coastguard Worker return false;
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker SIZE_T size = 0;
30*6777b538SAndroid Build Coastguard Worker ::InitializeProcThreadAttributeList(nullptr, attribute_count, 0, &size);
31*6777b538SAndroid Build Coastguard Worker if (size == 0)
32*6777b538SAndroid Build Coastguard Worker return false;
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker auto attribute_list = std::make_unique<char[]>(size);
35*6777b538SAndroid Build Coastguard Worker auto* attribute_list_ptr =
36*6777b538SAndroid Build Coastguard Worker reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(attribute_list.get());
37*6777b538SAndroid Build Coastguard Worker if (!::InitializeProcThreadAttributeList(attribute_list_ptr, attribute_count,
38*6777b538SAndroid Build Coastguard Worker 0, &size)) {
39*6777b538SAndroid Build Coastguard Worker return false;
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker attribute_list_ = std::move(attribute_list);
43*6777b538SAndroid Build Coastguard Worker startup_info_.lpAttributeList = attribute_list_ptr;
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker return true;
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker
UpdateProcThreadAttribute(DWORD_PTR attribute,void * value,size_t size)48*6777b538SAndroid Build Coastguard Worker bool StartupInformation::UpdateProcThreadAttribute(DWORD_PTR attribute,
49*6777b538SAndroid Build Coastguard Worker void* value,
50*6777b538SAndroid Build Coastguard Worker size_t size) {
51*6777b538SAndroid Build Coastguard Worker if (!startup_info_.lpAttributeList)
52*6777b538SAndroid Build Coastguard Worker return false;
53*6777b538SAndroid Build Coastguard Worker return !!::UpdateProcThreadAttribute(startup_info_.lpAttributeList, 0,
54*6777b538SAndroid Build Coastguard Worker attribute, value, size, nullptr,
55*6777b538SAndroid Build Coastguard Worker nullptr);
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker } // namespace win
59*6777b538SAndroid Build Coastguard Worker } // namespace base
60