annotate foosdk/sdk/pfc/bigmem.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "bigmem.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void bigmem::resize(size_t newSize) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 m_data.set_size((newSize + slice - 1) / slice);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 m_data.fill_null();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 for (size_t walk = 0; walk < m_data.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 size_t thisSlice = slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 if (walk + 1 == m_data.get_size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 size_t cut = newSize % slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (cut) thisSlice = cut;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void* ptr = malloc(thisSlice);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (ptr == NULL) { clear(); throw std::bad_alloc(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 m_data[walk] = (uint8_t*)ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 m_size = newSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void bigmem::clear() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 for (size_t walk = 0; walk < m_data.get_size(); ++walk) free(m_data[walk]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 m_data.set_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 m_size = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void bigmem::read(void* ptrOut, size_t bytes, size_t offset) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 PFC_ASSERT(offset + bytes <= size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 uint8_t* outWalk = (uint8_t*)ptrOut;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 while (bytes > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 size_t o1 = offset / slice, o2 = offset % slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 size_t delta = slice - o2; if (delta > bytes) delta = bytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 memcpy(outWalk, m_data[o1] + o2, delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 offset += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 bytes -= delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 outWalk += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void bigmem::write(const void* ptrIn, size_t bytes, size_t offset) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 PFC_ASSERT(offset + bytes <= size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 const uint8_t* inWalk = (const uint8_t*)ptrIn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 while (bytes > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 size_t o1 = offset / slice, o2 = offset % slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 size_t delta = slice - o2; if (delta > bytes) delta = bytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 memcpy(m_data[o1] + o2, inWalk, delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 offset += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 bytes -= delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 inWalk += delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 uint8_t* bigmem::_slicePtr(size_t which) { return m_data[which]; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 size_t bigmem::_sliceCount() { return m_data.get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 size_t bigmem::_sliceSize(size_t which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (which + 1 == _sliceCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 size_t s = m_size % slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (s) return s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 return slice;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }