• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

llnl / dftracer-utils / 27052412546

06 Jun 2026 04:20AM UTC coverage: 50.862% (+1.0%) from 49.905%
27052412546

Pull #73

github

web-flow
Merge 734572730 into 88a3c8457
Pull Request #73: add portable dependencies wheel support

31801 of 79859 branches covered (39.82%)

Branch coverage included in aggregate %.

32491 of 46545 relevant lines covered (69.81%)

9947.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

39.02
/src/dftracer/utils/python/memoryview_batch.cpp
1
#define PY_SSIZE_T_CLEAN
2
#include <dftracer/utils/python/memoryview_batch.h>
3

4
#include <cstring>
5

6
namespace dftracer::utils::python {
7

8
static void MemoryViewBatch_dealloc(MemoryViewBatchObject *self) {
×
9
    delete self->data;
×
10
    Py_TYPE(self)->tp_free((PyObject *)self);
×
11
}
×
12

13
static int MemoryViewBatch_getbuffer(MemoryViewBatchObject *self,
×
14
                                     Py_buffer *view, int flags) {
15
    if (!self->data || self->data->buffer.empty()) {
×
16
        PyErr_SetString(PyExc_BufferError, "MemoryViewBatch has no data");
×
17
        return -1;
×
18
    }
19
    return PyBuffer_FillInfo(view, (PyObject *)self, self->data->buffer.data(),
×
20
                             static_cast<Py_ssize_t>(self->data->buffer.size()),
×
21
                             1, flags);
×
22
}
×
23

24
static Py_ssize_t MemoryViewBatch_length(MemoryViewBatchObject *self) {
×
25
    if (!self->data) return 0;
×
26
    return static_cast<Py_ssize_t>(self->data->num_entries());
×
27
}
×
28

29
PyObject *MemoryViewBatch_item(MemoryViewBatchObject *self, Py_ssize_t i) {
1,151✔
30
    if (!self->data) {
1,151!
31
        PyErr_SetString(PyExc_IndexError, "MemoryViewBatch has no data");
×
32
        return NULL;
×
33
    }
34
    Py_ssize_t n = static_cast<Py_ssize_t>(self->data->num_entries());
1,151✔
35
    if (i < 0 || i >= n) {
1,151!
36
        PyErr_SetString(PyExc_IndexError, "MemoryViewBatch index out of range");
×
37
        return NULL;
×
38
    }
39

40
    Py_buffer buf;
41
    std::memset(&buf, 0, sizeof(buf));
1,151✔
42
    buf.buf = self->data->buffer.data() + self->data->offsets[i];
1,151✔
43
    buf.obj = (PyObject *)self;
1,151✔
44
    Py_INCREF(self);
1,151✔
45
    buf.len = self->data->lengths[i];
1,151✔
46
    buf.itemsize = 1;
1,151✔
47
    buf.readonly = 1;
1,151✔
48
    buf.ndim = 1;
1,151✔
49
    buf.format = const_cast<char *>("B");
1,151✔
50
    buf.shape = &buf.len;
1,151✔
51
    buf.strides = &buf.itemsize;
1,151✔
52
    buf.suboffsets = NULL;
1,151✔
53
    buf.internal = NULL;
1,151✔
54
    return PyMemoryView_FromBuffer(&buf);
1,151✔
55
}
1,151✔
56

57
static PyBufferProcs MemoryViewBatch_as_buffer = {
58
    (getbufferproc)MemoryViewBatch_getbuffer,
59
    NULL,
60
};
61

62
static PySequenceMethods MemoryViewBatch_as_sequence = {
63
    (lenfunc)MemoryViewBatch_length,
64
    NULL,
65
    NULL,
66
    (ssizeargfunc)MemoryViewBatch_item,
67
};
68

69
static PyObject *MemoryViewBatch_get_num_entries(MemoryViewBatchObject *self,
×
70
                                                 void *) {
71
    if (!self->data) return PyLong_FromLong(0);
×
72
    return PyLong_FromSsize_t(
×
73
        static_cast<Py_ssize_t>(self->data->num_entries()));
×
74
}
×
75

76
static PyObject *MemoryViewBatch_get_num_bytes(MemoryViewBatchObject *self,
×
77
                                               void *) {
78
    if (!self->data) return PyLong_FromLong(0);
×
79
    return PyLong_FromSsize_t(
×
80
        static_cast<Py_ssize_t>(self->data->buffer.size()));
×
81
}
×
82

83
static PyGetSetDef MemoryViewBatch_getsetters[] = {
84
    {"num_entries", (getter)MemoryViewBatch_get_num_entries, NULL,
85
     "Number of entries", NULL},
86
    {"num_bytes", (getter)MemoryViewBatch_get_num_bytes, NULL,
87
     "Total buffer size in bytes", NULL},
88
    {NULL}};
89

90
PyTypeObject MemoryViewBatchType = {
91
    .ob_base = PyVarObject_HEAD_INIT(NULL, 0).tp_name =
92
        "dftracer_utils_ext._MemoryViewBatch",
93
    .tp_basicsize = sizeof(MemoryViewBatchObject),
94
    .tp_itemsize = 0,
95
    .tp_dealloc = (destructor)MemoryViewBatch_dealloc,
96
    .tp_as_sequence = &MemoryViewBatch_as_sequence,
97
    .tp_as_buffer = &MemoryViewBatch_as_buffer,
98
    .tp_flags = Py_TPFLAGS_DEFAULT,
99
    .tp_doc = "Zero-copy batch of byte entries backed by a contiguous buffer",
100
    .tp_getset = MemoryViewBatch_getsetters,
101
};
102

103
int init_memoryview_batch(PyObject *m) {
1✔
104
    if (PyType_Ready(&MemoryViewBatchType) < 0) return -1;
1!
105
    Py_INCREF(&MemoryViewBatchType);
1✔
106
    if (PyModule_AddObject(m, "_MemoryViewBatch",
2!
107
                           (PyObject *)&MemoryViewBatchType) < 0) {
1✔
108
        Py_DECREF(&MemoryViewBatchType);
×
109
        return -1;
×
110
    }
111
    return 0;
1✔
112
}
1✔
113

114
}  // namespace dftracer::utils::python
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc