move YGMarkerLayout to event based system

Summary: Using layoutPassStart and LayoutPassEnd events instead of YGMarkerLayout for instrumentation

Reviewed By: davidaurelio

Differential Revision: D16048789

fbshipit-source-id: 041a35bc2cb1b7281ca83cf9d35041b4011cfeb9
This commit is contained in:
Sidharth Guglani
2019-07-10 08:43:41 -07:00
committed by Facebook Github Bot
parent ce517689ff
commit eeae39d707
3 changed files with 4 additions and 148 deletions

View File

@@ -67,136 +67,6 @@ struct MarkerTest : public ::testing::Test {
uniquePtr<YGConfig> config; uniquePtr<YGConfig> config;
}; };
TEST_F(MarkerTest, marker_start_works) {
auto root = makeNode();
decltype(MarkerSection<YGMarkerLayout>::data)* dataAddress;
{
MarkerSection<YGMarkerLayout> marker{root.get()};
dataAddress = &marker.data;
}
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(markerCookie.start.marker, YGMarkerLayout)
<< "wrong marker type passed to `startMarker`";
ASSERT_EQ(markerCookie.start.node, root.get())
<< "wrong node pointer passed to `startMarker`";
ASSERT_EQ(markerCookie.start.markerData.layout, dataAddress)
<< "wrong pointer to marker data passed to `startMarker`";
}
TEST_F(MarkerTest, marker_end_works) {
auto root = makeNode();
{ MarkerSection<YGMarkerLayout> marker{root.get()}; }
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(markerCookie.end.data.marker, markerCookie.start.marker)
<< "marker type passed to `endMarker` differs from type passed to "
"`startMarker`";
ASSERT_EQ(markerCookie.end.data.node, markerCookie.start.node)
<< "node passed to `endMarker` differs from node passed to `startMarker`";
ASSERT_EQ(
markerCookie.end.data.markerData.layout,
markerCookie.start.markerData.layout)
<< "marker data pointer passed to `endMarker` differs from pointer "
"passed to `startMarker`";
ASSERT_EQ(markerCookie.end.cookie, &markerCookie)
<< "pointer returned by `startMarker` was not passed to `endMarker`";
}
TEST_F(MarkerTest, layout_marker) {
auto root = makeNode();
calculateLayout(root);
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(markerCookie.start.marker, YGMarkerLayout);
ASSERT_EQ(markerCookie.start.node, root.get());
}
TEST_F(MarkerTest, layout_marker_counts_single_node_layout) {
auto root = makeNode();
calculateLayout(root);
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(
markerCookie.end.markerData.layout,
(YGMarkerLayoutData{.layouts = 1, .measures = 0, .maxMeasureCache = 1}));
}
TEST_F(MarkerTest, layout_marker_counts_multi_node_layout) {
auto root = makeNode();
auto childA = addChild(root);
auto childB = addChild(root);
calculateLayout(root);
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(
markerCookie.end.markerData.layout,
(YGMarkerLayoutData{.layouts = 3, .measures = 4, .maxMeasureCache = 3}));
}
TEST_F(MarkerTest, layout_marker_counts_cache_hits_single_node_layout) {
auto root = makeNode();
calculateLayout(root);
calculateLayout(root);
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(
markerCookie.end.markerData.layout,
(YGMarkerLayoutData{.layouts = 0,
.measures = 0,
.cachedLayouts = 1,
.cachedMeasures = 0}));
}
TEST_F(MarkerTest, layout_marker_counts_cache_hits_multi_node_layout) {
auto root = makeNode();
auto childA = addChild(root);
auto childB = addChild(root);
calculateLayout(root, 987, 654);
calculateLayout(root, 123, 456);
calculateLayout(root, 987, 654);
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(
markerCookie.end.markerData.layout,
(YGMarkerLayoutData{.layouts = 3,
.measures = 0,
.maxMeasureCache = 5,
.cachedLayouts = 0,
.cachedMeasures = 4}));
}
TEST_F(MarkerTest, layout_marker_has_max_measure_cache) {
auto root = makeNode();
auto a = addChild(root);
auto b = addChild(root);
YGNodeStyleSetFlexBasis(a.get(), 10.0f);
for (auto s : {20, 30, 40}) {
calculateLayout(root, s, s);
}
auto& markerCookie = findLastMarker(YGMarkerLayout);
ASSERT_EQ(
markerCookie.end.markerData.layout,
(YGMarkerLayoutData{.layouts = 3, .measures = 3, .maxMeasureCache = 7}));
}
TEST_F(MarkerTest, measure_functions_get_wrapped) { TEST_F(MarkerTest, measure_functions_get_wrapped) {
auto root = makeNode(); auto root = makeNode();
YGNodeSetMeasureFunc( YGNodeSetMeasureFunc(
@@ -244,9 +114,6 @@ void MarkerTest::endMarker(
auto cookie = static_cast<MarkerCookie*>(id); auto cookie = static_cast<MarkerCookie*>(id);
cookie->end = {{marker, node, data}, id, {}}; cookie->end = {{marker, node, data}, id, {}};
switch (marker) { switch (marker) {
case YGMarkerLayout:
cookie->end.markerData.layout = *marker::data<YGMarkerLayout>(data);
break;
case YGMarkerMeasure: case YGMarkerMeasure:
case YGMarkerBaselineFn: case YGMarkerBaselineFn:
break; break;
@@ -275,8 +142,6 @@ namespace {
const char* markerTypeName(YGMarker type) { const char* markerTypeName(YGMarker type) {
switch (type) { switch (type) {
case YGMarkerLayout:
return "YGMarkerLayout";
case YGMarkerMeasure: case YGMarkerMeasure:
return "YGMarkerMeasure"; return "YGMarkerMeasure";
case YGMarkerBaselineFn: case YGMarkerBaselineFn:

View File

@@ -14,7 +14,6 @@ typedef struct YGNode* YGNodeRef;
typedef struct YGConfig* YGConfigRef; typedef struct YGConfig* YGConfigRef;
typedef YG_ENUM_BEGIN(YGMarker){ typedef YG_ENUM_BEGIN(YGMarker){
YGMarkerLayout,
YGMarkerMeasure, YGMarkerMeasure,
YGMarkerBaselineFn, YGMarkerBaselineFn,
} YG_ENUM_END(YGMarker); } YG_ENUM_END(YGMarker);
@@ -33,7 +32,6 @@ typedef struct {
} YGMarkerNoData; } YGMarkerNoData;
typedef union { typedef union {
YGMarkerLayoutData* layout;
YGMarkerNoData* noData; YGMarkerNoData* noData;
} YGMarkerData; } YGMarkerData;
@@ -60,12 +58,6 @@ namespace detail {
template <YGMarker M> template <YGMarker M>
struct MarkerData; struct MarkerData;
template <>
struct MarkerData<YGMarkerLayout> {
using type = YGMarkerLayoutData;
static type*& get(YGMarkerData& d) { return d.layout; }
};
struct NoMarkerData { struct NoMarkerData {
using type = YGMarkerNoData; using type = YGMarkerNoData;
static type*& get(YGMarkerData& d) { return d.noData; } static type*& get(YGMarkerData& d) { return d.noData; }

View File

@@ -4063,7 +4063,7 @@ void YGNodeCalculateLayoutWithContext(
void* layoutContext) { void* layoutContext) {
Event::publish<Event::LayoutPassStart>(node, {layoutContext}); Event::publish<Event::LayoutPassStart>(node, {layoutContext});
marker::MarkerSection<YGMarkerLayout> marker{node}; YGMarkerLayoutData markerData = {};
// Increment the generation count. This will force the recursive routine to // Increment the generation count. This will force the recursive routine to
// visit all dirty nodes at least once. Subsequent visits will be skipped if // visit all dirty nodes at least once. Subsequent visits will be skipped if
@@ -4122,7 +4122,7 @@ void YGNodeCalculateLayoutWithContext(
true, true,
"initial", "initial",
node->getConfig(), node->getConfig(),
marker.data, markerData,
layoutContext, layoutContext,
0, // tree root 0, // tree root
gCurrentGenerationCount)) { gCurrentGenerationCount)) {
@@ -4141,8 +4141,7 @@ void YGNodeCalculateLayoutWithContext(
#endif #endif
} }
marker.end(); Event::publish<Event::LayoutPassEnd>(node, {layoutContext, &markerData});
Event::publish<Event::LayoutPassEnd>(node, {layoutContext, &marker.data});
// We want to get rid off `useLegacyStretchBehaviour` from YGConfig. But we // We want to get rid off `useLegacyStretchBehaviour` from YGConfig. But we
// aren't sure whether client's of yoga have gotten rid off this flag or not. // aren't sure whether client's of yoga have gotten rid off this flag or not.
@@ -4160,7 +4159,7 @@ void YGNodeCalculateLayoutWithContext(
gCurrentGenerationCount++; gCurrentGenerationCount++;
// Rerun the layout, and calculate the diff // Rerun the layout, and calculate the diff
unsetUseLegacyFlagRecursively(nodeWithoutLegacyFlag); unsetUseLegacyFlagRecursively(nodeWithoutLegacyFlag);
YGMarkerLayoutData layoutMarkerData; YGMarkerLayoutData layoutMarkerData = {};
if (YGLayoutNodeInternal( if (YGLayoutNodeInternal(
nodeWithoutLegacyFlag, nodeWithoutLegacyFlag,
width, width,