Kea 2.7.6
memory_segment.h
Go to the documentation of this file.
1// Copyright (C) 2012-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef MEMORY_SEGMENT_H
8#define MEMORY_SEGMENT_H
9
11
12#include <utility>
13
14#include <stdlib.h>
15
16namespace isc {
17namespace util {
18
22public:
23 MemorySegmentOpenError(const char* file, size_t line, const char* what) :
24 isc::Exception(file, line, what) {}
25};
26
32public:
33 MemorySegmentGrown(const char* file, size_t line, const char* what) :
34 isc::Exception(file, line, what) {}
35};
36
40public:
41 MemorySegmentError(const char* file, size_t line, const char* what) :
42 isc::Exception(file, line, what) {}
43};
44
55public:
57 virtual ~MemorySegment() {}
58
118 virtual void* allocate(size_t size) = 0;
119
145 virtual void deallocate(void* ptr, size_t size) = 0;
146
152 virtual bool allMemoryDeallocated() const = 0;
153
222 bool setNamedAddress(const char* name, void* addr) {
223 // This public method implements common validation. The actual
224 // work specific to the derived segment is delegated to the
225 // corresponding protected method.
226 validateName(name);
227 return (setNamedAddressImpl(name, addr));
228 }
229
231 typedef std::pair<bool, void*> NamedAddressResult;
232
258 NamedAddressResult getNamedAddress(const char* name) const {
259 // This public method implements common validation. The actual
260 // work specific to the derived segment is delegated to the
261 // corresponding protected method.
262 validateName(name);
263 return (getNamedAddressImpl(name));
264 }
265
286 bool clearNamedAddress(const char* name) {
287 // This public method implements common validation. The actual
288 // work specific to the derived segment is delegated to the
289 // corresponding protected method.
290 validateName(name);
291 return (clearNamedAddressImpl(name));
292 }
293
294private:
303 static void validateName(const char* name) {
304 if (!name) {
305 isc_throw(InvalidParameter, "NULL is invalid for a name.");
306 } else if (*name == '\0') {
307 isc_throw(InvalidParameter, "Empty names are invalid.");
308 } else if (*name == '_') {
309 isc_throw(InvalidParameter,
310 "Names beginning with '_' are reserved for "
311 "internal use only.");
312 }
313 }
314
315protected:
317 virtual bool setNamedAddressImpl(const char* name, void* addr) = 0;
318
320 virtual NamedAddressResult getNamedAddressImpl(const char* name) const = 0;
321
323 virtual bool clearNamedAddressImpl(const char* name) = 0;
324};
325
326} // namespace util
327} // namespace isc
328
329#endif // MEMORY_SEGMENT_H
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
General error that can be thrown by a MemorySegment implementation.
MemorySegmentError(const char *file, size_t line, const char *what)
Exception that is thrown, when allocating space in a MemorySegment results in growing the underlying ...
MemorySegmentGrown(const char *file, size_t line, const char *what)
Exception that can be thrown when constructing a MemorySegment object.
MemorySegmentOpenError(const char *file, size_t line, const char *what)
Memory Segment Class.
virtual ~MemorySegment()
Destructor.
bool clearNamedAddress(const char *name)
Delete a name previously associated with a segment address.
virtual void deallocate(void *ptr, size_t size)=0
Free/release a segment of memory.
virtual bool setNamedAddressImpl(const char *name, void *addr)=0
Implementation of setNamedAddress beyond common validation.
virtual bool clearNamedAddressImpl(const char *name)=0
Implementation of clearNamedAddress beyond common validation.
virtual bool allMemoryDeallocated() const =0
Check if all allocated memory was deallocated.
NamedAddressResult getNamedAddress(const char *name) const
Return the address in the segment that has the given name.
bool setNamedAddress(const char *name, void *addr)
Associate specified address in the segment with a given name.
std::pair< bool, void * > NamedAddressResult
Type definition for result returned by getNamedAddress()
virtual void * allocate(size_t size)=0
Allocate/acquire a fragment of memory.
virtual NamedAddressResult getNamedAddressImpl(const char *name) const =0
Implementation of getNamedAddress beyond common validation.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
Defines the logger used by the top-level component of kea-lfc.