commit 11edb8d: [Project] Allow mempool allocated mime strings

Vsevolod Stakhov vsevolod at highsecure.ru
Fri Oct 1 19:28:04 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-10-01 20:24:20 +0100
URL: https://github.com/rspamd/rspamd/commit/11edb8d089395d439b0dd18f376c83404e9bebfd (HEAD -> master)

[Project] Allow mempool allocated mime strings

---
 src/libmime/mime_string.hxx | 12 ++++++++++++
 src/libutil/mem_pool.h      | 30 ++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/src/libmime/mime_string.hxx b/src/libmime/mime_string.hxx
index 259788cd5..7474c6381 100644
--- a/src/libmime/mime_string.hxx
+++ b/src/libmime/mime_string.hxx
@@ -24,6 +24,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <iosfwd>
+#include "libutil/mem_pool.h"
 #include "function2/function2.hpp"
 #include "unicode/utf8.h"
 #include "contrib/fastutf8/fastutf8.h"
@@ -42,6 +43,7 @@ template<class T=char, class Allocator = std::allocator<T>,
 		class Functor = fu2::function_view<UChar32(UChar32)>> class basic_mime_string;
 
 using mime_string = basic_mime_string<char>;
+using mime_pool_string = basic_mime_string<char, mempool_allocator<char>>;
 
 /* Helpers for type safe flags */
 enum class mime_string_flags : std::uint8_t {
@@ -361,6 +363,16 @@ public:
 			append_c_string_unfiltered(other.data(), other.size());
 		}
 	}
+	auto assign_copy(const view_type &other) {
+		storage.clear();
+
+		if (filter_func) {
+			append_c_string_filtered(other.data(), other.size());
+		}
+		else {
+			append_c_string_unfiltered(other.data(), other.size());
+		}
+	}
 
 	/* Mutators */
 	auto append(const CharT* str, std::size_t size) -> std::size_t {
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h
index d4488ac55..d3927a1bc 100644
--- a/src/libutil/mem_pool.h
+++ b/src/libutil/mem_pool.h
@@ -397,4 +397,34 @@ GList *rspamd_mempool_glist_append (rspamd_mempool_t *pool,
 }
 #endif
 
+#ifdef  __cplusplus
+#include <memory> /* For allocator */
+namespace rspamd {
+
+template<class T>
+class mempool_allocator {
+public:
+	typedef T value_type;
+
+	mempool_allocator() = delete;
+	template<class U>
+	mempool_allocator(const mempool_allocator<U> &other) : pool(other.pool) {}
+	mempool_allocator(rspamd_mempool_t *_pool) : pool(_pool) {}
+	[[nodiscard]] constexpr T* allocate(std::size_t n)
+	{
+		if (G_MAXSIZE / 2 / sizeof(T) > n) {
+			throw std::runtime_error("integer overflow");
+		}
+		return reinterpret_cast<T*>(rspamd_mempool_alloc(pool, n * sizeof(T)));
+	}
+	constexpr void deallocate(T* p, std::size_t n) {
+		/* Do nothing */
+	}
+private:
+	rspamd_mempool_t *pool;
+};
+
+}
+#endif
+
 #endif


More information about the Commits mailing list