summaryrefslogtreecommitdiff
path: root/allocate.h
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2019-09-28 18:22:11 -0400
committerJeffrey Walton <noloader@gmail.com>2019-09-28 18:22:11 -0400
commit1190da17eaae1874610a27cb2303cb91d6da20dc (patch)
treedc691f2566530dc153e1875c4dd0b3b3f257905d /allocate.h
parent5be96f92f2b0078eb764f40f4cdd16f1ccbcbcf9 (diff)
downloadcryptopp-git-1190da17eaae1874610a27cb2303cb91d6da20dc.tar.gz
Avoid circular dependency using AlignedAllocate (GH #885)
Diffstat (limited to 'allocate.h')
-rw-r--r--allocate.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/allocate.h b/allocate.h
new file mode 100644
index 00000000..cf056f9f
--- /dev/null
+++ b/allocate.h
@@ -0,0 +1,74 @@
+// allocate.h - written and placed in the public domain by Jeffrey Walton
+
+// The functions in allocate.h and allocate.cpp were originally in misc.h
+// and misc.cpp. They were extracted in September 2019 to sidestep a circular
+// dependency with misc.h and secblock.h.
+
+/// \file allocate.h
+/// \brief Functions for allocating aligned buffers
+
+#ifndef CRYPTOPP_ALLOCATE_H
+#define CRYPTOPP_ALLOCATE_H
+
+#include "config.h"
+#include "cryptlib.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+/// \brief Attempts to reclaim unused memory
+/// \throws bad_alloc
+/// \details In the normal course of running a program, a request for memory
+/// normally succeeds. If a call to AlignedAllocate or UnalignedAllocate fails,
+/// then CallNewHandler is called in n effort to recover. Internally,
+/// CallNewHandler calls set_new_handler(nullptr) in an effort to free memory.
+/// There is no guarantee CallNewHandler will be able to obtain more memory so
+/// an allocation succeeds. If the call to set_new_handler fails, then CallNewHandler
+/// throws a bad_alloc exception.
+/// \throws bad_alloc on failure
+/// \since Crypto++ 5.0
+/// \sa AlignedAllocate, AlignedDeallocate, UnalignedAllocate, UnalignedDeallocate
+CRYPTOPP_DLL void CRYPTOPP_API CallNewHandler();
+
+/// \brief Allocates a buffer on 16-byte boundary
+/// \param size the size of the buffer
+/// \details AlignedAllocate is primarily used when the data will be
+/// proccessed by SSE, NEON, ARMv8 or PowerPC instructions. The assembly
+/// language routines rely on the alignment. If the alignment is not
+/// respected, then a SIGBUS could be generated on Unix and Linux, and an
+/// EXCEPTION_DATATYPE_MISALIGNMENT could be generated on Windows.
+/// \details Formerly, AlignedAllocate and AlignedDeallocate were only
+/// available on certain platforms when CRYTPOPP_DISABLE_ASM was not in
+/// effect. However, Android and iOS debug simulator builds got into a
+/// state where the aligned allocator was not available and caused link
+/// failures.
+/// \since AlignedAllocate for SIMD since Crypto++ 1.0, AlignedAllocate
+/// for all builds since Crypto++ 8.1
+/// \sa AlignedDeallocate, UnalignedAllocate, UnalignedDeallocate, CallNewHandler,
+/// <A HREF="http://github.com/weidai11/cryptopp/issues/779">Issue 779</A>
+CRYPTOPP_DLL void* CRYPTOPP_API AlignedAllocate(size_t size);
+
+/// \brief Frees a buffer allocated with AlignedAllocate
+/// \param ptr the buffer to free
+/// \since AlignedDeallocate for SIMD since Crypto++ 1.0, AlignedAllocate
+/// for all builds since Crypto++ 8.1
+/// \sa AlignedAllocate, UnalignedAllocate, UnalignedDeallocate, CallNewHandler,
+/// <A HREF="http://github.com/weidai11/cryptopp/issues/779">Issue 779</A>
+CRYPTOPP_DLL void CRYPTOPP_API AlignedDeallocate(void *ptr);
+
+/// \brief Allocates a buffer
+/// \param size the size of the buffer
+/// \since Crypto++ 1.0
+/// \sa AlignedAllocate, AlignedDeallocate, UnalignedDeallocate, CallNewHandler,
+/// <A HREF="http://github.com/weidai11/cryptopp/issues/779">Issue 779</A>
+CRYPTOPP_DLL void * CRYPTOPP_API UnalignedAllocate(size_t size);
+
+/// \brief Frees a buffer allocated with UnalignedAllocate
+/// \param ptr the buffer to free
+/// \since Crypto++ 1.0
+/// \sa AlignedAllocate, AlignedDeallocate, UnalignedAllocate, CallNewHandler,
+/// <A HREF="http://github.com/weidai11/cryptopp/issues/779">Issue 779</A>
+CRYPTOPP_DLL void CRYPTOPP_API UnalignedDeallocate(void *ptr);
+
+NAMESPACE_END
+
+#endif // CRYPTOPP_ALLOCATE_H