include/kunit/static_stub.h
Source file repositories/reference/linux-study-clean/include/kunit/static_stub.h
File Facts
- System
- Linux kernel
- Corpus path
include/kunit/static_stub.h- Extension
.h- Size
- 3686 bytes
- Lines
- 114
- Domain
- Repository Root And Misc
- Bucket
- include
- Inferred role
- Repository Root And Misc: implementation source
- Status
- source implementation candidate
Why This File Exists
Top-level or miscellaneous repository surface. Use this as map coverage unless a later manual pass promotes the file into a deeper subsystem dossier.
- Top-level or miscellaneous repository surface. Use this as map coverage unless a later manual pass promotes the file into a deeper subsystem dossier.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
kunit/test.hkunit/test-bug.hlinux/compiler.hlinux/sched.h
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
#ifndef _KUNIT_STATIC_STUB_H
#define _KUNIT_STATIC_STUB_H
#if !IS_ENABLED(CONFIG_KUNIT)
/* If CONFIG_KUNIT is not enabled, these stubs quietly disappear. */
#define KUNIT_STATIC_STUB_REDIRECT(real_fn_name, args...) do {} while (0)
#else
#include <kunit/test.h>
#include <kunit/test-bug.h>
#include <linux/compiler.h> /* for {un,}likely() */
#include <linux/sched.h> /* for task_struct */
/**
* KUNIT_STATIC_STUB_REDIRECT() - call a replacement 'static stub' if one exists
* @real_fn_name: The name of this function (as an identifier, not a string)
* @args: All of the arguments passed to this function
*
* This is a function prologue which is used to allow calls to the current
* function to be redirected by a KUnit test. KUnit tests can call
* kunit_activate_static_stub() to pass a replacement function in. The
* replacement function will be called by KUNIT_STATIC_STUB_REDIRECT(), which
* will then return from the function. If the caller is not in a KUnit context,
* the function will continue execution as normal.
*
* Example:
*
* .. code-block:: c
*
* int real_func(int n)
* {
* KUNIT_STATIC_STUB_REDIRECT(real_func, n);
* return 0;
* }
*
* int replacement_func(int n)
* {
* return 42;
* }
*
* void example_test(struct kunit *test)
* {
* kunit_activate_static_stub(test, real_func, replacement_func);
* KUNIT_EXPECT_EQ(test, real_func(1), 42);
* }
*
*/
#define KUNIT_STATIC_STUB_REDIRECT(real_fn_name, args...) \
do { \
typeof(&real_fn_name) replacement; \
struct kunit *current_test = kunit_get_current_test(); \
\
if (likely(!current_test)) \
break; \
\
replacement = kunit_hooks.get_static_stub_address(current_test, \
&real_fn_name); \
\
if (unlikely(replacement)) \
return replacement(args); \
} while (0)
/* Helper function for kunit_activate_static_stub(). The macro does
* typechecking, so use it instead.
*/
void __kunit_activate_static_stub(struct kunit *test,
void *real_fn_addr,
void *replacement_addr);
/**
* kunit_activate_static_stub() - replace a function using static stubs.
* @test: A pointer to the 'struct kunit' test context for the current test.
* @real_fn_addr: The address of the function to replace.
* @replacement_addr: The address of the function to replace it with.
*
* When activated, calls to real_fn_addr from within this test (even if called
* indirectly) will instead call replacement_addr. The function pointed to by
* real_fn_addr must begin with the static stub prologue in
* KUNIT_STATIC_STUB_REDIRECT() for this to work. real_fn_addr and
* replacement_addr must have the same type.
*
* The redirection can be disabled again with kunit_deactivate_static_stub().
*/
#define kunit_activate_static_stub(test, real_fn_addr, replacement_addr) do { \
typecheck_fn(typeof(&replacement_addr), real_fn_addr); \
__kunit_activate_static_stub(test, real_fn_addr, replacement_addr); \
Annotation
- Immediate include surface: `kunit/test.h`, `kunit/test-bug.h`, `linux/compiler.h`, `linux/sched.h`.
- Atlas domain: Repository Root And Misc / include.
- 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.