lib/kunit/string-stream.c
Source file repositories/reference/linux-study-clean/lib/kunit/string-stream.c
File Facts
- System
- Linux kernel
- Corpus path
lib/kunit/string-stream.c- Extension
.c- Size
- 4639 bytes
- Lines
- 208
- Domain
- Kernel Services
- Bucket
- lib
- Inferred role
- Kernel Services: implementation source
- Status
- source implementation candidate
Why This File Exists
Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
kunit/static_stub.hkunit/test.hlinux/list.hlinux/slab.hstring-stream.h
Detected Declarations
function Copyrightfunction string_stream_fragment_destroyfunction string_stream_vaddfunction string_stream_addfunction string_stream_clearfunction string_stream_appendfunction string_stream_is_emptyfunction string_stream_destroyfunction resource_free_string_streamfunction kunit_free_string_stream
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* C++ stream style string builder used in KUnit for building messages.
*
* Copyright (C) 2019, Google LLC.
* Author: Brendan Higgins <brendanhiggins@google.com>
*/
#include <kunit/static_stub.h>
#include <kunit/test.h>
#include <linux/list.h>
#include <linux/slab.h>
#include "string-stream.h"
static struct string_stream_fragment *alloc_string_stream_fragment(int len, gfp_t gfp)
{
struct string_stream_fragment *frag;
frag = kzalloc_obj(*frag, gfp);
if (!frag)
return ERR_PTR(-ENOMEM);
frag->fragment = kmalloc(len, gfp);
if (!frag->fragment) {
kfree(frag);
return ERR_PTR(-ENOMEM);
}
return frag;
}
static void string_stream_fragment_destroy(struct string_stream_fragment *frag)
{
list_del(&frag->node);
kfree(frag->fragment);
kfree(frag);
}
int string_stream_vadd(struct string_stream *stream,
const char *fmt,
va_list args)
{
struct string_stream_fragment *frag_container;
int buf_len, result_len;
va_list args_for_counting;
/* Make a copy because `vsnprintf` could change it */
va_copy(args_for_counting, args);
/* Evaluate length of formatted string */
buf_len = vsnprintf(NULL, 0, fmt, args_for_counting);
va_end(args_for_counting);
if (buf_len == 0)
return 0;
/* Reserve one extra for possible appended newline. */
if (stream->append_newlines)
buf_len++;
/* Need space for null byte. */
buf_len++;
frag_container = alloc_string_stream_fragment(buf_len, stream->gfp);
if (IS_ERR(frag_container))
return PTR_ERR(frag_container);
if (stream->append_newlines) {
/* Don't include reserved newline byte in writeable length. */
result_len = vsnprintf(frag_container->fragment, buf_len - 1, fmt, args);
/* Append newline if necessary. */
if (frag_container->fragment[result_len - 1] != '\n')
result_len = strlcat(frag_container->fragment, "\n", buf_len);
} else {
result_len = vsnprintf(frag_container->fragment, buf_len, fmt, args);
}
spin_lock(&stream->lock);
stream->length += result_len;
list_add_tail(&frag_container->node, &stream->fragments);
spin_unlock(&stream->lock);
return 0;
}
int string_stream_add(struct string_stream *stream, const char *fmt, ...)
Annotation
- Immediate include surface: `kunit/static_stub.h`, `kunit/test.h`, `linux/list.h`, `linux/slab.h`, `string-stream.h`.
- Detected declarations: `function Copyright`, `function string_stream_fragment_destroy`, `function string_stream_vadd`, `function string_stream_add`, `function string_stream_clear`, `function string_stream_append`, `function string_stream_is_empty`, `function string_stream_destroy`, `function resource_free_string_stream`, `function kunit_free_string_stream`.
- Atlas domain: Kernel Services / lib.
- 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.