// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2016 Cyril Hrubis */ /** * DOC: Checkpoints introduction * * Checkpoints implements a futex based synchronization primitive for threads * and processes. When a process calls wait function its execution is suspended * until wake is called for a corresponding checkpoint. Checkpoints are * numbered from 0 and process can use at least hundred of them. * * In order to use checkpoints the test must set the tst_test.needs_checkpoints * flag. */ #ifndef TST_CHECKPOINT__ #define TST_CHECKPOINT__ #include "tst_checkpoint_fn.h" /** * TST_CHECKPOINT_WAIT() - Waits for a checkpoint. * * @id: A checkpoint id a positive integer. * * Suspends thread/process execution until it's woken up with a wake. The call * does not wait indefinitely it gives up after 10 seconds. If an error * happened or timeout was reached the function calls tst_brk(TBROK, ...) which * exits the test. */ #define TST_CHECKPOINT_WAIT(id) \ tst_safe_checkpoint_wait(__FILE__, __LINE__, NULL, id, 0) /** * TST_CHECKPOINT_WAIT2() - Waits for a checkpoint. * * @id: A checkpoint id a positive integer. * @msec_timeout: A timeout. * * Suspends thread/process execution until it's woken up with a wake. If an * error happened or timeout was reached the function calls tst_brk(TBROK, ...) * which exits the test. */ #define TST_CHECKPOINT_WAIT2(id, msec_timeout) \ tst_safe_checkpoint_wait(__FILE__, __LINE__, NULL, id, msec_timeout) /** * TST_CHECKPOINT_WAKE() - Wakes up a checkpoint. * * @id: A checkpoint id a positive integer. * * Wakes up a process suspended on a checkpoint and retries if there is no * process suspended on the checkpoint yet. The call does not retry * indefinitely but gives up after 10 seconds. If an error happened or timeout * was reached the function calls tst_brk(TBROK, ...) which exits the test. */ #define TST_CHECKPOINT_WAKE(id) \ tst_safe_checkpoint_wake(__FILE__, __LINE__, NULL, id, 1) /** * TST_CHECKPOINT_WAKE2() - Wakes up several checkpoints. * * @id: A checkpoint id a positive integer. * @nr_wake: A number of processes to wake. * * Wakes up nr_wake processes suspended on a checkpoint and retries if there * wasn't enough process suspended on the checkpoint yet. The call does not * retry indefinitely but gives up if it does not wake nr_wake processes after * 10 seconds. If an error happened or timeout was reached the function calls * tst_brk(TBROK, ...) which exits the test. */ #define TST_CHECKPOINT_WAKE2(id, nr_wake) \ tst_safe_checkpoint_wake(__FILE__, __LINE__, NULL, id, nr_wake) /** * TST_CHECKPOINT_WAKE_AND_WAIT() - Wakes up a checkpoint and immediately waits on it. * * @id: A checkpoint id a positive integer. * * This is a combination of TST_CHECKPOINT_WAKE() and TST_CHECKPOINT_WAIT(). */ #define TST_CHECKPOINT_WAKE_AND_WAIT(id) do { \ tst_safe_checkpoint_wake(__FILE__, __LINE__, NULL, id, 1); \ tst_safe_checkpoint_wait(__FILE__, __LINE__, NULL, id, 0); \ } while (0) extern const char *tst_ipc_path; #endif /* TST_CHECKPOINT__ */