tools/testing/selftests/sync/sync_stress_parallelism.c
Source file repositories/reference/linux-study-clean/tools/testing/selftests/sync/sync_stress_parallelism.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/selftests/sync/sync_stress_parallelism.c- Extension
.c- Size
- 3398 bytes
- Lines
- 112
- 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
pthread.hsync.hsw_sync.hsynctest.h
Detected Declarations
function test_stress_two_threads_shared_timeline_threadfunction test_stress_two_threads_shared_timeline
Annotated Snippet
#include <pthread.h>
#include "sync.h"
#include "sw_sync.h"
#include "synctest.h"
static struct {
int iterations;
int timeline;
int counter;
} test_data_two_threads;
static int test_stress_two_threads_shared_timeline_thread(void *d)
{
int thread_id = (long)d;
int timeline = test_data_two_threads.timeline;
int iterations = test_data_two_threads.iterations;
int fence, valid, ret, i;
for (i = 0; i < iterations; i++) {
fence = sw_sync_fence_create(timeline, "fence",
i * 2 + thread_id);
valid = sw_sync_fence_is_valid(fence);
ASSERT(valid, "Failure allocating fence\n");
/* Wait on the prior thread to complete */
ret = sync_wait(fence, -1);
ASSERT(ret > 0, "Problem occurred on prior thread\n");
/*
* Confirm the previous thread's writes are visible
* and then increment
*/
ASSERT(test_data_two_threads.counter == i * 2 + thread_id,
"Counter got damaged!\n");
test_data_two_threads.counter++;
/* Kick off the other thread */
ret = sw_sync_timeline_inc(timeline, 1);
ASSERT(ret == 0, "Advancing timeline failed\n");
sw_sync_fence_destroy(fence);
}
return 0;
}
int test_stress_two_threads_shared_timeline(void)
{
pthread_t a, b;
int valid;
int timeline = sw_sync_timeline_create();
valid = sw_sync_timeline_is_valid(timeline);
ASSERT(valid, "Failure allocating timeline\n");
test_data_two_threads.iterations = 1 << 16;
test_data_two_threads.counter = 0;
test_data_two_threads.timeline = timeline;
/*
* Use a single timeline to synchronize two threads
* hammmering on the same counter.
*/
pthread_create(&a, NULL, (void *(*)(void *))
test_stress_two_threads_shared_timeline_thread,
(void *)0);
pthread_create(&b, NULL, (void *(*)(void *))
test_stress_two_threads_shared_timeline_thread,
(void *)1);
pthread_join(a, NULL);
pthread_join(b, NULL);
/* make sure the threads did not trample on one another */
ASSERT(test_data_two_threads.counter ==
test_data_two_threads.iterations * 2,
"Counter has unexpected value\n");
sw_sync_timeline_destroy(timeline);
return 0;
}
Annotation
- Immediate include surface: `pthread.h`, `sync.h`, `sw_sync.h`, `synctest.h`.
- Detected declarations: `function test_stress_two_threads_shared_timeline_thread`, `function test_stress_two_threads_shared_timeline`.
- 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.