diff options
author | Jesse Hall | 2017-02-12 18:32:39 -0600 |
---|---|---|
committer | Jesse Hall | 2017-02-23 20:44:50 -0600 |
commit | 836661616fcf4bc023b192d1c320f0727a9dfef9 (patch) | |
tree | 49e82464c7eca7aa4774f45ae099918ddb66d0e9 /libsync | |
parent | 89530820d7f5837f00f3f04e18dfa05c7506eb68 (diff) | |
download | platform-system-core-836661616fcf4bc023b192d1c320f0727a9dfef9.tar.gz platform-system-core-836661616fcf4bc023b192d1c320f0727a9dfef9.tar.xz platform-system-core-836661616fcf4bc023b192d1c320f0727a9dfef9.zip |
sync: implement sync_file_info
Also modifies sync-unit-test to use sync_file_info instead of the
deprecated sync_fence_info, but check that they match in several tests.
Bug: 35138793
Test: sync-unit-tests on bullhead
Change-Id: Ic672d1c89798435a8b71469500e82c770a66bf4d
Diffstat (limited to 'libsync')
-rw-r--r-- | libsync/sync.c | 57 | ||||
-rw-r--r-- | libsync/tests/sync_test.cpp | 55 |
2 files changed, 104 insertions, 8 deletions
diff --git a/libsync/sync.c b/libsync/sync.c index 6680f1102..f3e26e111 100644 --- a/libsync/sync.c +++ b/libsync/sync.c | |||
@@ -173,6 +173,46 @@ static struct sync_fence_info_data *sync_file_info_to_legacy_fence_info( | |||
173 | return legacy_info; | 173 | return legacy_info; |
174 | } | 174 | } |
175 | 175 | ||
176 | static struct sync_file_info* legacy_fence_info_to_sync_file_info( | ||
177 | struct sync_fence_info_data *legacy_info) | ||
178 | { | ||
179 | struct sync_file_info *info; | ||
180 | struct sync_pt_info *pt; | ||
181 | struct sync_fence_info *fence; | ||
182 | size_t num_fences; | ||
183 | int err; | ||
184 | |||
185 | pt = NULL; | ||
186 | num_fences = 0; | ||
187 | while ((pt = sync_pt_info(legacy_info, pt)) != NULL) | ||
188 | num_fences++; | ||
189 | |||
190 | info = calloc(1, sizeof(struct sync_file_info) + | ||
191 | num_fences * sizeof(struct sync_fence_info)); | ||
192 | if (!info) { | ||
193 | free(legacy_info); | ||
194 | return NULL; | ||
195 | } | ||
196 | info->sync_fence_info = (__u64)(uintptr_t)(info + 1); | ||
197 | |||
198 | strlcpy(info->name, legacy_info->name, sizeof(info->name)); | ||
199 | info->status = legacy_info->status; | ||
200 | info->num_fences = num_fences; | ||
201 | |||
202 | pt = NULL; | ||
203 | fence = sync_get_fence_info(info); | ||
204 | while ((pt = sync_pt_info(legacy_info, pt)) != NULL) { | ||
205 | strlcpy(fence->obj_name, pt->obj_name, sizeof(fence->obj_name)); | ||
206 | strlcpy(fence->driver_name, pt->driver_name, | ||
207 | sizeof(fence->driver_name)); | ||
208 | fence->status = pt->status; | ||
209 | fence->timestamp_ns = pt->timestamp_ns; | ||
210 | fence++; | ||
211 | } | ||
212 | |||
213 | return info; | ||
214 | } | ||
215 | |||
176 | struct sync_fence_info_data *sync_fence_info(int fd) | 216 | struct sync_fence_info_data *sync_fence_info(int fd) |
177 | { | 217 | { |
178 | struct sync_fence_info_data *legacy_info; | 218 | struct sync_fence_info_data *legacy_info; |
@@ -190,6 +230,23 @@ struct sync_fence_info_data *sync_fence_info(int fd) | |||
190 | return legacy_info; | 230 | return legacy_info; |
191 | } | 231 | } |
192 | 232 | ||
233 | struct sync_file_info* sync_file_info(int32_t fd) | ||
234 | { | ||
235 | struct sync_file_info *info; | ||
236 | struct sync_fence_info_data *legacy_info; | ||
237 | |||
238 | info = modern_sync_file_info(fd); | ||
239 | if (info || errno != ENOTTY) | ||
240 | return info; | ||
241 | |||
242 | legacy_info = legacy_sync_fence_info(fd); | ||
243 | if (!legacy_info) | ||
244 | return NULL; | ||
245 | info = legacy_fence_info_to_sync_file_info(legacy_info); | ||
246 | sync_fence_info_free(legacy_info); | ||
247 | return info; | ||
248 | } | ||
249 | |||
193 | struct sync_pt_info *sync_pt_info(struct sync_fence_info_data *info, | 250 | struct sync_pt_info *sync_pt_info(struct sync_fence_info_data *info, |
194 | struct sync_pt_info *itr) | 251 | struct sync_pt_info *itr) |
195 | { | 252 | { |
diff --git a/libsync/tests/sync_test.cpp b/libsync/tests/sync_test.cpp index 401aaeee5..7770fcb3a 100644 --- a/libsync/tests/sync_test.cpp +++ b/libsync/tests/sync_test.cpp | |||
@@ -172,20 +172,20 @@ public: | |||
172 | return sync_wait(m_fd, timeout); | 172 | return sync_wait(m_fd, timeout); |
173 | } | 173 | } |
174 | vector<SyncPointInfo> getInfo() const { | 174 | vector<SyncPointInfo> getInfo() const { |
175 | struct sync_pt_info *pointInfo = nullptr; | ||
176 | vector<SyncPointInfo> fenceInfo; | 175 | vector<SyncPointInfo> fenceInfo; |
177 | sync_fence_info_data *info = sync_fence_info(getFd()); | 176 | struct sync_file_info *info = sync_file_info(getFd()); |
178 | if (!info) { | 177 | if (!info) { |
179 | return fenceInfo; | 178 | return fenceInfo; |
180 | } | 179 | } |
181 | while ((pointInfo = sync_pt_info(info, pointInfo))) { | 180 | const auto fences = sync_get_fence_info(info); |
181 | for (uint32_t i = 0; i < info->num_fences; i++) { | ||
182 | fenceInfo.push_back(SyncPointInfo{ | 182 | fenceInfo.push_back(SyncPointInfo{ |
183 | pointInfo->driver_name, | 183 | fences[i].driver_name, |
184 | pointInfo->obj_name, | 184 | fences[i].obj_name, |
185 | pointInfo->timestamp_ns, | 185 | fences[i].timestamp_ns, |
186 | pointInfo->status}); | 186 | fences[i].status}); |
187 | } | 187 | } |
188 | sync_fence_info_free(info); | 188 | sync_file_info_free(info); |
189 | return fenceInfo; | 189 | return fenceInfo; |
190 | } | 190 | } |
191 | int getSize() const { | 191 | int getSize() const { |
@@ -212,6 +212,32 @@ private: | |||
212 | } | 212 | } |
213 | }; | 213 | }; |
214 | 214 | ||
215 | static void CheckModernLegacyInfoMatch(const SyncFence& f) { | ||
216 | struct sync_file_info* modern = sync_file_info(f.getFd()); | ||
217 | struct sync_fence_info_data* legacy = sync_fence_info(f.getFd()); | ||
218 | |||
219 | ASSERT_TRUE(modern != NULL); | ||
220 | ASSERT_TRUE(legacy != NULL); | ||
221 | |||
222 | EXPECT_STREQ(modern->name, legacy->name); | ||
223 | EXPECT_EQ(modern->status, legacy->status); | ||
224 | |||
225 | uint32_t fenceIdx = 0; | ||
226 | struct sync_pt_info* pt = sync_pt_info(legacy, NULL); | ||
227 | const struct sync_fence_info* fences = sync_get_fence_info(modern); | ||
228 | while (fenceIdx < modern->num_fences && pt != NULL) { | ||
229 | EXPECT_STREQ(fences[fenceIdx].obj_name, pt->obj_name); | ||
230 | EXPECT_STREQ(fences[fenceIdx].driver_name, pt->driver_name); | ||
231 | EXPECT_EQ(fences[fenceIdx].status, pt->status); | ||
232 | EXPECT_EQ(fences[fenceIdx].timestamp_ns, pt->timestamp_ns); | ||
233 | |||
234 | fenceIdx++; | ||
235 | pt = sync_pt_info(legacy, pt); | ||
236 | } | ||
237 | EXPECT_EQ(fenceIdx, modern->num_fences); | ||
238 | EXPECT_EQ(NULL, pt); | ||
239 | } | ||
240 | |||
215 | int SyncFence::s_fenceCount = 0; | 241 | int SyncFence::s_fenceCount = 0; |
216 | 242 | ||
217 | TEST(AllocTest, Timeline) { | 243 | TEST(AllocTest, Timeline) { |
@@ -225,6 +251,7 @@ TEST(AllocTest, Fence) { | |||
225 | 251 | ||
226 | SyncFence fence(timeline, 1); | 252 | SyncFence fence(timeline, 1); |
227 | ASSERT_TRUE(fence.isValid()); | 253 | ASSERT_TRUE(fence.isValid()); |
254 | CheckModernLegacyInfoMatch(fence); | ||
228 | } | 255 | } |
229 | 256 | ||
230 | TEST(AllocTest, FenceNegative) { | 257 | TEST(AllocTest, FenceNegative) { |
@@ -321,15 +348,21 @@ TEST(FenceTest, OneTimelineMerge) { | |||
321 | timeline.inc(1); | 348 | timeline.inc(1); |
322 | ASSERT_EQ(a.getSignaledCount(), 1); | 349 | ASSERT_EQ(a.getSignaledCount(), 1); |
323 | ASSERT_EQ(d.getActiveCount(), 1); | 350 | ASSERT_EQ(d.getActiveCount(), 1); |
351 | CheckModernLegacyInfoMatch(a); | ||
352 | CheckModernLegacyInfoMatch(d); | ||
324 | 353 | ||
325 | timeline.inc(1); | 354 | timeline.inc(1); |
326 | ASSERT_EQ(b.getSignaledCount(), 1); | 355 | ASSERT_EQ(b.getSignaledCount(), 1); |
327 | ASSERT_EQ(d.getActiveCount(), 1); | 356 | ASSERT_EQ(d.getActiveCount(), 1); |
357 | CheckModernLegacyInfoMatch(b); | ||
358 | CheckModernLegacyInfoMatch(d); | ||
328 | 359 | ||
329 | timeline.inc(1); | 360 | timeline.inc(1); |
330 | ASSERT_EQ(c.getSignaledCount(), 1); | 361 | ASSERT_EQ(c.getSignaledCount(), 1); |
331 | ASSERT_EQ(d.getActiveCount(), 0); | 362 | ASSERT_EQ(d.getActiveCount(), 0); |
332 | ASSERT_EQ(d.getSignaledCount(), 1); | 363 | ASSERT_EQ(d.getSignaledCount(), 1); |
364 | CheckModernLegacyInfoMatch(c); | ||
365 | CheckModernLegacyInfoMatch(d); | ||
333 | } | 366 | } |
334 | 367 | ||
335 | TEST(FenceTest, MergeSameFence) { | 368 | TEST(FenceTest, MergeSameFence) { |
@@ -343,9 +376,11 @@ TEST(FenceTest, MergeSameFence) { | |||
343 | ASSERT_TRUE(selfMergeFence.isValid()); | 376 | ASSERT_TRUE(selfMergeFence.isValid()); |
344 | 377 | ||
345 | ASSERT_EQ(selfMergeFence.getSignaledCount(), 0); | 378 | ASSERT_EQ(selfMergeFence.getSignaledCount(), 0); |
379 | CheckModernLegacyInfoMatch(selfMergeFence); | ||
346 | 380 | ||
347 | timeline.inc(5); | 381 | timeline.inc(5); |
348 | ASSERT_EQ(selfMergeFence.getSignaledCount(), 1); | 382 | ASSERT_EQ(selfMergeFence.getSignaledCount(), 1); |
383 | CheckModernLegacyInfoMatch(selfMergeFence); | ||
349 | } | 384 | } |
350 | 385 | ||
351 | TEST(FenceTest, PollOnDestroyedTimeline) { | 386 | TEST(FenceTest, PollOnDestroyedTimeline) { |
@@ -397,14 +432,17 @@ TEST(FenceTest, MultiTimelineWait) { | |||
397 | timelineA.inc(5); | 432 | timelineA.inc(5); |
398 | ASSERT_EQ(mergedFence.getActiveCount(), 2); | 433 | ASSERT_EQ(mergedFence.getActiveCount(), 2); |
399 | ASSERT_EQ(mergedFence.getSignaledCount(), 1); | 434 | ASSERT_EQ(mergedFence.getSignaledCount(), 1); |
435 | CheckModernLegacyInfoMatch(mergedFence); | ||
400 | 436 | ||
401 | timelineB.inc(5); | 437 | timelineB.inc(5); |
402 | ASSERT_EQ(mergedFence.getActiveCount(), 1); | 438 | ASSERT_EQ(mergedFence.getActiveCount(), 1); |
403 | ASSERT_EQ(mergedFence.getSignaledCount(), 2); | 439 | ASSERT_EQ(mergedFence.getSignaledCount(), 2); |
440 | CheckModernLegacyInfoMatch(mergedFence); | ||
404 | 441 | ||
405 | timelineC.inc(5); | 442 | timelineC.inc(5); |
406 | ASSERT_EQ(mergedFence.getActiveCount(), 0); | 443 | ASSERT_EQ(mergedFence.getActiveCount(), 0); |
407 | ASSERT_EQ(mergedFence.getSignaledCount(), 3); | 444 | ASSERT_EQ(mergedFence.getSignaledCount(), 3); |
445 | CheckModernLegacyInfoMatch(mergedFence); | ||
408 | 446 | ||
409 | // confirm you can successfully wait. | 447 | // confirm you can successfully wait. |
410 | ASSERT_EQ(mergedFence.wait(100), 0); | 448 | ASSERT_EQ(mergedFence.wait(100), 0); |
@@ -560,6 +598,7 @@ TEST_P(MergeStressTest, RandomMerge) { | |||
560 | // Merge. | 598 | // Merge. |
561 | fence = SyncFence(fence, SyncFence(timeline, syncPoint)); | 599 | fence = SyncFence(fence, SyncFence(timeline, syncPoint)); |
562 | ASSERT_TRUE(fence.isValid()); | 600 | ASSERT_TRUE(fence.isValid()); |
601 | CheckModernLegacyInfoMatch(fence); | ||
563 | } | 602 | } |
564 | 603 | ||
565 | // Confirm our map matches the fence. | 604 | // Confirm our map matches the fence. |