include/linux/call_once.h
Source file repositories/reference/linux-study-clean/include/linux/call_once.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/call_once.h- Extension
.h- Size
- 1707 bytes
- Lines
- 67
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/types.hlinux/mutex.h
Detected Declarations
struct oncefunction __once_initfunction call_once
Annotated Snippet
struct once {
atomic_t state;
struct mutex lock;
};
static inline void __once_init(struct once *once, const char *name,
struct lock_class_key *key)
{
atomic_set(&once->state, ONCE_NOT_STARTED);
__mutex_init(&once->lock, name, key);
}
#define once_init(once) \
do { \
static struct lock_class_key __key; \
__once_init((once), #once, &__key); \
} while (0)
/*
* call_once - Ensure a function has been called exactly once
*
* @once: Tracking struct
* @cb: Function to be called
*
* If @once has never completed successfully before, call @cb and, if
* it returns a zero or positive value, mark @once as completed. Return
* the value returned by @cb
*
* If @once has completed successfully before, return 0.
*
* The call to @cb is implicitly surrounded by a mutex, though for
* efficiency the * function avoids taking it after the first call.
*/
static inline int call_once(struct once *once, int (*cb)(struct once *))
{
int r, state;
/* Pairs with atomic_set_release() below. */
if (atomic_read_acquire(&once->state) == ONCE_COMPLETED)
return 0;
guard(mutex)(&once->lock);
state = atomic_read(&once->state);
if (unlikely(state != ONCE_NOT_STARTED))
return WARN_ON_ONCE(state != ONCE_COMPLETED) ? -EINVAL : 0;
atomic_set(&once->state, ONCE_RUNNING);
r = cb(once);
if (r < 0)
atomic_set(&once->state, ONCE_NOT_STARTED);
else
atomic_set_release(&once->state, ONCE_COMPLETED);
return r;
}
#endif /* _LINUX_CALL_ONCE_H */
Annotation
- Immediate include surface: `linux/types.h`, `linux/mutex.h`.
- Detected declarations: `struct once`, `function __once_init`, `function call_once`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.