From ef053035d07318cba05c9766aa5ed69cb380a464 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 17 Jun 2016 17:44:45 +0200 Subject: util/HugeAllocator: throw std::bad_alloc on error --- src/util/HugeAllocator.cxx | 21 ++++++++++++++++++--- src/util/HugeAllocator.hxx | 27 ++++++++++++--------------- src/util/SliceBuffer.hxx | 7 ------- 3 files changed, 30 insertions(+), 25 deletions(-) (limited to 'src/util') diff --git a/src/util/HugeAllocator.cxx b/src/util/HugeAllocator.cxx index f26ffc814..bbff91650 100644 --- a/src/util/HugeAllocator.cxx +++ b/src/util/HugeAllocator.cxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Max Kellermann + * Copyright (C) 2013-2016 Max Kellermann * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -54,7 +54,7 @@ AlignToPageSize(size_t size) } void * -HugeAllocate(size_t size) +HugeAllocate(size_t size) throw(std::bad_alloc) { size = AlignToPageSize(size); @@ -63,7 +63,7 @@ HugeAllocate(size_t size) PROT_READ|PROT_WRITE, flags, -1, 0); if (p == (void *)-1) - return nullptr; + throw std::bad_alloc(); #ifdef MADV_HUGEPAGE /* allow the Linux kernel to use "Huge Pages", which reduces page @@ -94,4 +94,19 @@ HugeDiscard(void *p, size_t size) #endif } +#elif defined(WIN32) + +void * +HugeAllocate(size_t size) throw(std::bad_alloc) +{ + // TODO: use MEM_LARGE_PAGES + void *p = VirtualAlloc(nullptr, size, + MEM_COMMIT|MEM_RESERVE, + PAGE_READWRITE); + if (p == nullptr) + throw std::bad_alloc(); + + return p; +} + #endif diff --git a/src/util/HugeAllocator.hxx b/src/util/HugeAllocator.hxx index fa45e5610..7619c5b96 100644 --- a/src/util/HugeAllocator.hxx +++ b/src/util/HugeAllocator.hxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Max Kellermann + * Copyright (C) 2013-2016 Max Kellermann * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,6 +32,8 @@ #include "Compiler.h" +#include + #include #ifdef __linux__ @@ -43,7 +45,7 @@ */ gcc_malloc void * -HugeAllocate(size_t size); +HugeAllocate(size_t size) throw(std::bad_alloc); /** * @param p an allocation returned by HugeAllocate() @@ -67,14 +69,8 @@ HugeDiscard(void *p, size_t size); #include gcc_malloc -static inline void * -HugeAllocate(size_t size) -{ - // TODO: use MEM_LARGE_PAGES - return VirtualAlloc(nullptr, size, - MEM_COMMIT|MEM_RESERVE, - PAGE_READWRITE); -} +void * +HugeAllocate(size_t size) throw(std::bad_alloc); static inline void HugeFree(void *p, gcc_unused size_t size) @@ -92,19 +88,20 @@ HugeDiscard(void *p, size_t size) /* not Linux: fall back to standard C calls */ -#include +#include gcc_malloc static inline void * -HugeAllocate(size_t size) +HugeAllocate(size_t size) throw(std::bad_alloc) { - return malloc(size); + return new uint8_t[size]; } static inline void -HugeFree(void *p, size_t) +HugeFree(void *_p, size_t) { - free(p); + auto *p = (uint8_t *)_p; + delete[] p; } static inline void diff --git a/src/util/SliceBuffer.hxx b/src/util/SliceBuffer.hxx index f37ff7659..c3ff51840 100644 --- a/src/util/SliceBuffer.hxx +++ b/src/util/SliceBuffer.hxx @@ -88,13 +88,6 @@ public: SliceBuffer(const SliceBuffer &other) = delete; SliceBuffer &operator=(const SliceBuffer &other) = delete; - /** - * @return true if buffer allocation (by the constructor) has failed - */ - bool IsOOM() { - return data == nullptr; - } - unsigned GetCapacity() const { return n_max; } -- cgit v1.2.3