00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <config.h>
00017
00018 #include <stdarg.h>
00019 #include <string.h>
00020 #include <stdlib.h>
00021
00022 #include <drizzled/memory/multi_malloc.h>
00023 #include <drizzled/definitions.h>
00024
00025 namespace drizzled {
00026 namespace memory {
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 void* multi_malloc(bool zerofill, ...)
00044 {
00045 va_list args;
00046 void **ptr, *start;
00047 char *res;
00048 size_t tot_length,length;
00049
00050 va_start(args, zerofill);
00051 tot_length=0;
00052 while ((ptr=va_arg(args, void **)))
00053 {
00054
00055
00056
00057
00058 length=va_arg(args, unsigned int);
00059 tot_length+=ALIGN_SIZE(length);
00060 }
00061 va_end(args);
00062
00063 #ifdef HAVE_VALGRIND
00064 if (!(start= calloc(0, tot_length)))
00065 return 0;
00066 #else
00067 start= malloc(tot_length);
00068 if (zerofill)
00069 memset(start, 0, tot_length);
00070 #endif
00071
00072 va_start(args, zerofill);
00073 res= static_cast<char *>(start);
00074 while ((ptr=va_arg(args, void **)))
00075 {
00076 *ptr=res;
00077 length=va_arg(args,unsigned int);
00078 res+= ALIGN_SIZE(length);
00079 }
00080 va_end(args);
00081 return start;
00082 }
00083
00084 }
00085 }