1 /* Copyright (c) 2000, 2002, 2003, 2007 MySQL AB 2 Use is subject to license terms 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; version 2 of the License. 7 8 This program is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with this program; if not, write to the Free Software 15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ 16 17 #include "mysys_priv.h" 18 #include <stdarg.h> 19 20 /* 21 Malloc many pointers at the same time 22 Only ptr1 can be free'd, and doing this will free all 23 the memory allocated. ptr2, etc all point inside big allocated 24 memory area. 25 26 SYNOPSIS 27 my_multi_malloc() 28 myFlags Flags 29 ptr1, length1 Multiple arguments terminated by null ptr 30 ptr2, length2 ... 31 ... 32 NULL 33 */ 34 35 void* my_multi_malloc(myf myFlags, ...) 36 { 37 va_list args; 38 char **ptr,*start,*res; 39 size_t tot_length,length; 40 DBUG_ENTER("my_multi_malloc"); 41 42 va_start(args,myFlags); 43 tot_length=0; 44 while ((ptr=va_arg(args, char **))) 45 { 46 length=va_arg(args,uint); 47 tot_length+=ALIGN_SIZE(length); 48 } 49 va_end(args); 50 51 if (!(start=(char *) my_malloc(tot_length,myFlags))) 52 DBUG_RETURN(0); /* purecov: inspected */ 53 54 va_start(args,myFlags); 55 res=start; 56 while ((ptr=va_arg(args, char **))) 57 { 58 *ptr=res; 59 length=va_arg(args,uint); 60 res+=ALIGN_SIZE(length); 61 } create_temp_file(char * to,const char * dir,const char * prefix,int mode,myf MyFlags)62 va_end(args); 63 DBUG_RETURN((void*) start); 64 } 65 66 67 /* 68 Same as my_multi_malloc, but each entry can be over 4G 69 70 SYNOPSIS 71 my_multi_malloc() 72 myFlags Flags 73 ptr1, length1 Multiple arguments terminated by null ptr 74 ptr2, length2 ... 75 ... 76 NULL 77 */ 78 79 void *my_multi_malloc_large(myf myFlags, ...) 80 { 81 va_list args; 82 char **ptr,*start,*res; 83 ulonglong tot_length,length; 84 DBUG_ENTER("my_multi_malloc"); 85 86 va_start(args,myFlags); 87 tot_length=0; 88 while ((ptr=va_arg(args, char **))) 89 { 90 length=va_arg(args,ulonglong); 91 tot_length+=ALIGN_SIZE(length); 92 } 93 va_end(args); 94 95 if (!(start=(char *) my_malloc((size_t) tot_length, myFlags))) 96 DBUG_RETURN(0); /* purecov: inspected */ 97 98 va_start(args,myFlags); 99 res=start; 100 while ((ptr=va_arg(args, char **))) 101 { 102 *ptr=res; 103 length=va_arg(args,ulonglong); 104 res+=ALIGN_SIZE(length); 105 } 106 va_end(args); 107 DBUG_RETURN((void*) start); 108 } 109