1/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2// vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4:
3/* -*- mode: C; c-basic-offset: 4 -*- */
4#ident "$Id$"
5/*======
6This file is part of TokuDB
7
8
9Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
10
11 TokuDBis is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License, version 2,
13 as published by the Free Software Foundation.
14
15 TokuDB is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with TokuDB. If not, see <http://www.gnu.org/licenses/>.
22
23======= */
24
25#ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved."
26
27#ifndef _TOKUDB_MEMORY_H
28#define _TOKUDB_MEMORY_H
29
30#include "hatoku_defines.h"
31
32namespace tokudb {
33namespace memory {
34
35void* malloc(size_t s, myf flags);
36void* realloc(void* p, size_t s, myf flags);
37void free(void* ptr);
38char* strdup(const char* p, myf flags);
39void* multi_malloc(myf myFlags, ...);
40
41
42inline void* malloc(size_t s, myf flags) {
43#if 50700 <= MYSQL_VERSION_ID && MYSQL_VERSION_ID <= 50799
44 return ::my_malloc(0, s, flags);
45#else
46 return ::my_malloc(s, flags);
47#endif
48}
49inline void* realloc(void* p, size_t s, myf flags) {
50 if (s == 0)
51 return p;
52#if 50700 <= MYSQL_VERSION_ID && MYSQL_VERSION_ID <= 50799
53 return ::my_realloc(0, p, s, flags);
54#else
55 return ::my_realloc(p, s, flags | MY_ALLOW_ZERO_PTR);
56#endif
57}
58inline void free(void* ptr) {
59 if (ptr)
60 ::my_free(ptr);
61}
62inline char* strdup(const char* p, myf flags) {
63#if 50700 <= MYSQL_VERSION_ID && MYSQL_VERSION_ID <= 50799
64 return ::my_strdup(0, p, flags);
65#else
66 return ::my_strdup(p, flags);
67#endif
68}
69inline void* multi_malloc(myf myFlags, ...) {
70 va_list args;
71 char** ptr;
72 char* start;
73 char* res;
74 size_t tot_length,length;
75
76 va_start(args,myFlags);
77 tot_length = 0;
78 while ((ptr = va_arg(args, char**))) {
79 length = va_arg(args, uint);
80 tot_length += ALIGN_SIZE(length);
81 }
82 va_end(args);
83
84 if (!(start = (char*)malloc(tot_length, myFlags))) {
85 return 0;
86 }
87
88 va_start(args, myFlags);
89 res = start;
90 while ((ptr = va_arg(args, char**))) {
91 *ptr = res;
92 length = va_arg(args,uint);
93 res += ALIGN_SIZE(length);
94 }
95 va_end(args);
96 return start;
97}
98
99} // namespace thread
100} // namespace tokudb
101
102#endif // _TOKUDB_MEMORY_H
103