123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*
- * qpb_allocator.h
- *
- * @copyright Copyright (C) 2016 Sproute Networks, Inc.
- *
- * @author Avneesh Sachdev <avneesh@sproute.com>
- *
- * This file is part of Quagga.
- *
- * Quagga is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * Quagga is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Quagga; see the file COPYING. If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- */
- /*
- * Header file for quagga protobuf memory management code.
- */
- #ifndef _QPB_ALLOCATOR_H_
- #define _QPB_ALLOCATOR_H_
- #include <google/protobuf-c/protobuf-c.h>
- struct linear_allocator_t_;
- /*
- * Alias for ProtobufCAllocator that is easier on the fingers.
- */
- typedef ProtobufCAllocator qpb_allocator_t;
- /*
- * qpb_alloc
- */
- static inline void *
- qpb_alloc (qpb_allocator_t *allocator, size_t size)
- {
- return allocator->alloc (allocator->allocator_data, size);
- }
- /*
- * qpb_alloc_ptr_array
- *
- * Allocate space for the specified number of pointers.
- */
- static inline void *
- qpb_alloc_ptr_array (qpb_allocator_t *allocator, size_t num_ptrs)
- {
- return qpb_alloc (allocator, num_ptrs * sizeof (void *));
- }
- /*
- * qpb_free
- */
- static inline void
- qpb_free (qpb_allocator_t *allocator, void *ptr)
- {
- allocator->free (allocator->allocator_data, ptr);
- }
- /*
- * QPB_ALLOC
- *
- * Convenience macro to reduce the probability of allocating memory of
- * incorrect size. It returns enough memory to store the given type,
- * and evaluates to an appropriately typed pointer.
- */
- #define QPB_ALLOC(allocator, type) \
- (type *) qpb_alloc(allocator, sizeof(type))
- /*
- * Externs.
- */
- extern void qpb_allocator_init_linear (qpb_allocator_t *,
- struct linear_allocator_t_ *);
- /*
- * The following macros are for the common case where a qpb allocator
- * is being used alongside a linear allocator that allocates memory
- * off of the stack.
- */
- #define QPB_DECLARE_STACK_ALLOCATOR(allocator, size) \
- qpb_allocator_t allocator; \
- linear_allocator_t lin_ ## allocator; \
- char lin_ ## allocator ## _buf[size]
- #define QPB_INIT_STACK_ALLOCATOR(allocator) \
- do \
- { \
- linear_allocator_init(&(lin_ ## allocator), \
- lin_ ## allocator ## _buf, \
- sizeof(lin_ ## allocator ## _buf)); \
- qpb_allocator_init_linear(&allocator, &(lin_ ## allocator)); \
- } while (0)
- #define QPB_RESET_STACK_ALLOCATOR(allocator) \
- do \
- { \
- linear_allocator_reset (&(lin_ ## allocator)); \
- } while (0)
- #endif /* _QPB_ALLOCATOR_H_ */
|