Skip to content

Commit 1610500

Browse files
mrjerryjohnswoody-applebzbarsky-apple
authored andcommitted
Split CHIPClusters.cpp to speed up compilation. (#11091)
* Split CHIPClusters.cpp This splits up CHIPClusters.cpp into a couple of different files: - CHIPClusters.cpp contains no template specialized methods. - CHIPClustersInvoke.cpp contains all template specialized methods for invoking commands. - CHIPClustersWrite.cpp contains all template specialized methods for doing writes. This resulted in a speed-up of about 30s (from 1m50s to 1m20s) when doing an incremental compilation of chip-tool after touching CHIPClusters.cpp. It does this by better leveraging -jX builds to parallelize compilation. More importantly, this might also provide a pattern for others (like Android) that is running into OOM issues with clang compiling CHIPClusters.cpp. * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Fix regen breakaga * Address review feedback Co-authored-by: Justin Wood <woody@apple.com> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
1 parent 7abbb0c commit 1610500

40 files changed

+2786
-1975
lines changed

src/app/chip_data_model.gni

+2
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ template("chip_data_model") {
151151
sources += [
152152
"${invoker.zap_pregenerated_dir}/CHIPClusters.cpp",
153153
"${invoker.zap_pregenerated_dir}/CHIPClusters.h",
154+
"${invoker.zap_pregenerated_dir}/CHIPClustersInvoke.cpp",
155+
"${invoker.zap_pregenerated_dir}/CHIPClustersWrite.cpp",
154156
"${invoker.zap_pregenerated_dir}/attribute-size.cpp",
155157
"${invoker.zap_pregenerated_dir}/callback-stub.cpp",
156158
]

src/app/zap-templates/app-templates.json

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@
8383
"path": "templates/app/CHIPClusters-src.zapt",
8484
"name": "C++ ZCL API",
8585
"output": "CHIPClusters.cpp"
86+
},
87+
{
88+
"path": "templates/app/CHIPClustersInvoke-src.zapt",
89+
"name": "C++ ZCL Invoke API",
90+
"output": "CHIPClustersInvoke.cpp"
91+
},
92+
{
93+
"path": "templates/app/CHIPClustersWrite-src.zapt",
94+
"name": "C++ ZCL Write API",
95+
"output": "CHIPClustersWrite.cpp"
8696
}
8797
]
8898
}

src/app/zap-templates/templates/app/CHIPClusters-src.zapt

-70
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,7 @@
33
{{#if (chip_has_client_clusters)}}
44
#include "CHIPClusters.h"
55

6-
#include <cstdint>
7-
8-
9-
#include <app/InteractionModelEngine.h>
10-
#include <app/chip-zcl-zpro-codec.h>
11-
#include <app/util/basic-types.h>
12-
#include <app/CommandSender.h>
13-
#include <app-common/zap-generated/cluster-objects.h>
146
#include <app-common/zap-generated/ids/Attributes.h>
15-
#include <controller/CommandSenderAllocator.h>
16-
#include <lib/core/CHIPSafeCasts.h>
17-
#include <lib/support/BufferWriter.h>
18-
#include <lib/support/CodeUtils.h>
19-
#include <lib/support/SafeInt.h>
20-
#include <lib/support/CHIPMem.h>
21-
#include <lib/support/logging/CHIPLogging.h>
22-
#include <system/SystemPacketBuffer.h>
237
#include <zap-generated/CHIPClientCallbacks.h>
248

259
namespace chip {
@@ -100,10 +84,6 @@ CHIP_ERROR {{asUpperCamelCase parent.name}}Cluster::ReadAttribute{{asUpperCamelC
10084
}
10185

10286
{{#if isWritableAttribute}}
103-
{{#*inline "attributeTypeInfo"}}chip::app::Clusters::{{asUpperCamelCase parent.name}}::Attributes::{{asUpperCamelCase name}}::TypeInfo{{/inline}}
104-
template CHIP_ERROR ClusterBase::WriteAttribute<{{>attributeTypeInfo}}>(const {{>attributeTypeInfo}}::Type & requestData, void *context,
105-
WriteResponseSuccessCallback successCb, WriteResponseFailureCallback failureCb);
106-
10787
CHIP_ERROR {{asUpperCamelCase parent.name}}Cluster::WriteAttribute{{asUpperCamelCase name}}(Callback::Cancelable * onSuccessCallback, Callback::Cancelable * onFailureCallback, {{chipType}} value)
10888
{
10989
app::WriteClientHandle handle;
@@ -132,58 +112,8 @@ CHIP_ERROR {{asUpperCamelCase parent.name}}Cluster::ReportAttribute{{asUpperCame
132112
{{/if}}
133113
{{/chip_server_cluster_attributes}}
134114

135-
{{#chip_cluster_commands}}
136-
{{#*inline "requestType"}}chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::Type{{/inline}}
137-
{{#*inline "responseType"}}chip::app::{{#if hasSpecificResponse}}Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase response.name}}::DecodableType{{else}}DataModel::NullObjectType{{/if}}{{/inline}}
138-
template CHIP_ERROR ClusterBase::InvokeCommand<{{>requestType}}, {{>responseType}}>(const {{>requestType}} &, void *, CommandResponseSuccessCallback<{{>responseType}}>, CommandResponseFailureCallback);
139-
{{/chip_cluster_commands}}
140115
{{/chip_client_clusters}}
141116

142-
template <typename RequestDataT, typename ResponseDataT>
143-
CHIP_ERROR ClusterBase::InvokeCommand(const RequestDataT & requestData, void * context,
144-
CommandResponseSuccessCallback<ResponseDataT> successCb, CommandResponseFailureCallback failureCb)
145-
{
146-
VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
147-
ReturnErrorOnFailure(mDevice->LoadSecureSessionParametersIfNeeded());
148-
149-
auto onSuccessCb = [context, successCb](const app::ConcreteCommandPath & commandPath, const app::StatusIB & aStatus, const ResponseDataT & responseData) {
150-
successCb(context, responseData);
151-
};
152-
153-
auto onFailureCb = [context, failureCb](const app::StatusIB & aStatus, CHIP_ERROR aError) {
154-
failureCb(context, app::ToEmberAfStatus(aStatus.mStatus));
155-
};
156-
157-
return InvokeCommandRequest<ResponseDataT>(mDevice->GetExchangeManager(), mDevice->GetSecureSession().Value(), mEndpoint,
158-
requestData, onSuccessCb, onFailureCb);
159-
};
160-
161-
template <typename AttributeInfo>
162-
CHIP_ERROR ClusterBase::WriteAttribute(const typename AttributeInfo::Type & requestData, void * context,
163-
WriteResponseSuccessCallback successCb, WriteResponseFailureCallback failureCb)
164-
{
165-
VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
166-
ReturnErrorOnFailure(mDevice->LoadSecureSessionParametersIfNeeded());
167-
168-
auto onSuccessCb = [context, successCb](const app::ConcreteAttributePath & commandPath) {
169-
if (successCb != nullptr)
170-
{
171-
successCb(context);
172-
}
173-
};
174-
175-
auto onFailureCb = [context, failureCb](const app::ConcreteAttributePath * commandPath,
176-
app::StatusIB status, CHIP_ERROR aError) {
177-
if (failureCb != nullptr)
178-
{
179-
failureCb(context, app::ToEmberAfStatus(status.mStatus));
180-
}
181-
};
182-
183-
return chip::Controller::WriteAttribute<AttributeInfo>(mDevice->GetExchangeManager(), mDevice->GetSecureSession().Value(), mEndpoint,
184-
requestData, onSuccessCb, onFailureCb);
185-
}
186-
187117
} // namespace Controller
188118
} // namespace chip
189119
{{/if}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{{> header}}
2+
3+
{{#if (chip_has_client_clusters)}}
4+
#include "CHIPClusters.h"
5+
6+
#include <app-common/zap-generated/cluster-objects.h>
7+
#include <app-common/zap-generated/ids/Attributes.h>
8+
9+
namespace chip {
10+
11+
using namespace app::Clusters;
12+
using namespace System;
13+
using namespace Encoding::LittleEndian;
14+
15+
namespace Controller {
16+
17+
{{#chip_client_clusters}}
18+
19+
{{#chip_cluster_commands}}
20+
{{#*inline "requestType"}}chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::Type{{/inline}}
21+
{{#*inline "responseType"}}chip::app::{{#if hasSpecificResponse}}Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase response.name}}::DecodableType{{else}}DataModel::NullObjectType{{/if}}{{/inline}}
22+
template CHIP_ERROR ClusterBase::InvokeCommand<{{>requestType}}, {{>responseType}}>(const {{>requestType}} &, void *, CommandResponseSuccessCallback<{{>responseType}}>, CommandResponseFailureCallback);
23+
{{/chip_cluster_commands}}
24+
{{/chip_client_clusters}}
25+
26+
template <typename RequestDataT, typename ResponseDataT>
27+
CHIP_ERROR ClusterBase::InvokeCommand(const RequestDataT & requestData, void * context,
28+
CommandResponseSuccessCallback<ResponseDataT> successCb, CommandResponseFailureCallback failureCb)
29+
{
30+
VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
31+
ReturnErrorOnFailure(mDevice->LoadSecureSessionParametersIfNeeded());
32+
33+
auto onSuccessCb = [context, successCb](const app::ConcreteCommandPath & commandPath, const app::StatusIB & aStatus, const ResponseDataT & responseData) {
34+
successCb(context, responseData);
35+
};
36+
37+
auto onFailureCb = [context, failureCb](const app::StatusIB & aStatus, CHIP_ERROR aError) {
38+
failureCb(context, app::ToEmberAfStatus(aStatus.mStatus));
39+
};
40+
41+
return InvokeCommandRequest<ResponseDataT>(mDevice->GetExchangeManager(), mDevice->GetSecureSession().Value(), mEndpoint,
42+
requestData, onSuccessCb, onFailureCb);
43+
};
44+
45+
} // namespace Controller
46+
} // namespace chip
47+
{{/if}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{{> header}}
2+
3+
{{#if (chip_has_client_clusters)}}
4+
#include "CHIPClusters.h"
5+
6+
#include <app-common/zap-generated/cluster-objects.h>
7+
#include <app-common/zap-generated/ids/Attributes.h>
8+
9+
namespace chip {
10+
11+
using namespace app::Clusters;
12+
using namespace System;
13+
using namespace Encoding::LittleEndian;
14+
15+
namespace Controller {
16+
17+
{{#chip_client_clusters}}
18+
19+
// {{asUpperCamelCase name}} Cluster Attributes
20+
{{#chip_server_cluster_attributes}}
21+
{{#if isWritableAttribute}}
22+
{{#*inline "attributeTypeInfo"}}chip::app::Clusters::{{asUpperCamelCase parent.name}}::Attributes::{{asUpperCamelCase name}}::TypeInfo{{/inline}}
23+
template CHIP_ERROR ClusterBase::WriteAttribute<{{>attributeTypeInfo}}>(const {{>attributeTypeInfo}}::Type & requestData, void *context,
24+
WriteResponseSuccessCallback successCb, WriteResponseFailureCallback failureCb);
25+
{{/if}}
26+
{{/chip_server_cluster_attributes}}
27+
{{/chip_client_clusters}}
28+
29+
template <typename AttributeInfo>
30+
CHIP_ERROR ClusterBase::WriteAttribute(const typename AttributeInfo::Type & requestData, void * context,
31+
WriteResponseSuccessCallback successCb, WriteResponseFailureCallback failureCb)
32+
{
33+
VerifyOrReturnError(mDevice != nullptr, CHIP_ERROR_INCORRECT_STATE);
34+
ReturnErrorOnFailure(mDevice->LoadSecureSessionParametersIfNeeded());
35+
36+
auto onSuccessCb = [context, successCb](const app::ConcreteAttributePath & commandPath) {
37+
if (successCb != nullptr)
38+
{
39+
successCb(context);
40+
}
41+
};
42+
43+
auto onFailureCb = [context, failureCb](const app::ConcreteAttributePath * commandPath,
44+
app::StatusIB status, CHIP_ERROR aError) {
45+
if (failureCb != nullptr)
46+
{
47+
failureCb(context, app::ToEmberAfStatus(status.mStatus));
48+
}
49+
};
50+
51+
return chip::Controller::WriteAttribute<AttributeInfo>(mDevice->GetExchangeManager(), mDevice->GetSecureSession().Value(), mEndpoint,
52+
requestData, onSuccessCb, onFailureCb);
53+
}
54+
55+
} // namespace Controller
56+
} // namespace chip
57+
{{/if}}

zzz_generated/all-clusters-app/zap-generated/CHIPClustersInvoke.cpp

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

zzz_generated/all-clusters-app/zap-generated/CHIPClustersWrite.cpp

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

zzz_generated/bridge-app/zap-generated/CHIPClustersInvoke.cpp

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

zzz_generated/bridge-app/zap-generated/CHIPClustersWrite.cpp

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)