summaryrefslogtreecommitdiff
path: root/src/lib/memory_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/memory_util.cc')
-rw-r--r--src/lib/memory_util.cc46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/lib/memory_util.cc b/src/lib/memory_util.cc
index 00117855d..cf8842615 100644
--- a/src/lib/memory_util.cc
+++ b/src/lib/memory_util.cc
@@ -30,12 +30,52 @@ LIBDCP_ENABLE_WARNINGS
void *
-wrapped_av_malloc (size_t s)
+wrapped_av_malloc(size_t s)
{
- auto p = av_malloc (s);
+ auto p = av_malloc(s);
if (!p) {
- throw std::bad_alloc ();
+ throw std::bad_alloc();
}
return p;
}
+
+void
+fill_memory(void* ptr, size_t bytes, uint64_t value)
+{
+ if (bytes == 0) {
+ return;
+ }
+
+ auto const start = std::min(bytes, sizeof(value) - reinterpret_cast<uintptr_t>(ptr) % sizeof(value));
+ auto start_ptr = reinterpret_cast<uint8_t*>(ptr);
+ if (start < 8) {
+ for (auto i = 0UL; i < start; ++i) {
+ *start_ptr++ = value & 0xff;
+ value = (value >> 8) | ((value & 0xff) << 56);
+ }
+
+ bytes -= start;
+ if (bytes == 0) {
+ return;
+ }
+ }
+
+ auto const main = (bytes - (bytes % sizeof(value))) / 8;
+ auto main_ptr = reinterpret_cast<uint64_t*>(start_ptr);
+ for (auto i = 0UL; i < main; ++i) {
+ *main_ptr++ = value;
+ }
+
+ bytes -= main * 8;
+ if (bytes == 0) {
+ return;
+ }
+
+ auto end_ptr = reinterpret_cast<uint8_t*>(main_ptr);
+ for (auto i = 0UL; i < bytes; ++i) {
+ *end_ptr++ = value & 0xff;
+ value = (value >> 8) | ((value & 0xff) << 56);
+ }
+}
+