tools/testing/selftests/sync/sync_fence.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/sync/sync_fence.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/sync/sync_fence.c- Extension
.c- Size
- 4750 bytes
- Lines
- 133
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
Dependency Surface
sync.hsw_sync.hsynctest.h
Detected Declarations
function filesfunction test_fence_one_timeline_merge
Annotated Snippet
#include "sync.h"
#include "sw_sync.h"
#include "synctest.h"
int test_fence_one_timeline_wait(void)
{
int fence, valid, ret;
int timeline = sw_sync_timeline_create();
valid = sw_sync_timeline_is_valid(timeline);
ASSERT(valid, "Failure allocating timeline\n");
fence = sw_sync_fence_create(timeline, "allocFence", 5);
valid = sw_sync_fence_is_valid(fence);
ASSERT(valid, "Failure allocating fence\n");
/* Wait on fence until timeout */
ret = sync_wait(fence, 0);
ASSERT(ret == 0, "Failure waiting on fence until timeout\n");
/* Advance timeline from 0 -> 1 */
ret = sw_sync_timeline_inc(timeline, 1);
ASSERT(ret == 0, "Failure advancing timeline\n");
/* Wait on fence until timeout */
ret = sync_wait(fence, 0);
ASSERT(ret == 0, "Failure waiting on fence until timeout\n");
/* Signal the fence */
ret = sw_sync_timeline_inc(timeline, 4);
ASSERT(ret == 0, "Failure signaling the fence\n");
/* Wait successfully */
ret = sync_wait(fence, 0);
ASSERT(ret > 0, "Failure waiting on fence\n");
/* Go even further, and confirm wait still succeeds */
ret = sw_sync_timeline_inc(timeline, 10);
ASSERT(ret == 0, "Failure going further\n");
ret = sync_wait(fence, 0);
ASSERT(ret > 0, "Failure waiting ahead\n");
sw_sync_fence_destroy(fence);
sw_sync_timeline_destroy(timeline);
return 0;
}
int test_fence_one_timeline_merge(void)
{
int a, b, c, d, valid;
int timeline = sw_sync_timeline_create();
/* create fence a,b,c and then merge them all into fence d */
a = sw_sync_fence_create(timeline, "allocFence", 1);
b = sw_sync_fence_create(timeline, "allocFence", 2);
c = sw_sync_fence_create(timeline, "allocFence", 3);
valid = sw_sync_fence_is_valid(a) &&
sw_sync_fence_is_valid(b) &&
sw_sync_fence_is_valid(c);
ASSERT(valid, "Failure allocating fences\n");
d = sync_merge("mergeFence", b, a);
d = sync_merge("mergeFence", c, d);
valid = sw_sync_fence_is_valid(d);
ASSERT(valid, "Failure merging fences\n");
/* confirm all fences have one active point (even d) */
ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,
"a has too many active fences!\n");
ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,
"b has too many active fences!\n");
ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,
"c has too many active fences!\n");
ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_ACTIVE) == 1,
"d has too many active fences!\n");
/* confirm that d is not signaled until the max of a,b,c */
sw_sync_timeline_inc(timeline, 1);
ASSERT(sync_fence_count_with_status(a, FENCE_STATUS_SIGNALED) == 1,
"a did not signal!\n");
ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1,
"d signaled too early!\n");
sw_sync_timeline_inc(timeline, 1);
ASSERT(sync_fence_count_with_status(b, FENCE_STATUS_SIGNALED) == 1,
"b did not signal!\n");
ASSERT(sync_fence_count_with_status(d, FENCE_STATUS_ACTIVE) == 1,
"d signaled too early!\n");
Annotation
- Immediate include surface: `sync.h`, `sw_sync.h`, `synctest.h`.
- Detected declarations: `function files`, `function test_fence_one_timeline_merge`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.