@@ -87,85 +87,60 @@ INLINE static void dealloc_entry(s_meta *meta, void *ptr) {
8787}
8888
8989__attribute__ ((malloc ))
90- static void * smalloc_impl (size_t size , int kind , f_destructor dtor , void * meta , size_t metasize ) {
91- if (!size )
90+ static void * smalloc_impl (s_smalloc_args * args ) {
91+ if (!args -> size )
9292 return NULL ;
9393
9494 // align the sizes to the size of a word
95- size_t aligned_metasize = align (metasize );
96- size = align (size );
95+ size_t aligned_metasize = align (args -> meta . size );
96+ size_t size = align (args -> size );
9797
98- size_t head_size = kind & SHARED ? sizeof (s_meta_shared ) : sizeof (s_meta );
98+ size_t head_size = args -> kind & SHARED ? sizeof (s_meta_shared ) : sizeof (s_meta );
9999 s_meta_shared * ptr = alloc_entry (head_size , size , aligned_metasize );
100100 if (ptr == NULL )
101101 return NULL ;
102102
103103 char * shifted = (char * ) ptr + head_size ;
104- if (metasize && meta )
105- memcpy (shifted , meta , metasize );
104+ if (args -> meta . size && args -> meta . data )
105+ memcpy (shifted , args -> meta . data , args -> meta . size );
106106
107107 size_t * sz = (size_t * ) (shifted + aligned_metasize );
108108 * sz = head_size + aligned_metasize ;
109109
110110 * (s_meta * ) ptr = (s_meta ) {
111- .kind = kind ,
112- .dtor = dtor ,
111+ .kind = args -> kind ,
112+ .dtor = args -> dtor ,
113113#ifndef NDEBUG
114114 .ptr = sz + 1
115115#endif
116116 };
117117
118- if (kind & SHARED )
118+ if (args -> kind & SHARED )
119119 ptr -> ref_count = ATOMIC_VAR_INIT (1 );
120120
121121 return sz + 1 ;
122122}
123123
124124__attribute__ ((malloc ))
125- INLINE static void * smalloc_array (size_t size , size_t nmemb , int kind , f_destructor dtor , void * meta , size_t metasize ) {
126- char new_meta [align (metasize + sizeof (s_meta_array ))];
125+ INLINE static void * smalloc_array (s_smalloc_args * args ) {
126+ char new_meta [align (args -> meta . size + sizeof (s_meta_array ))];
127127 s_meta_array * arr_meta = (void * ) new_meta ;
128128 * arr_meta = (s_meta_array ) {
129- .size = size ,
130- .nmemb = nmemb
129+ .size = args -> size ,
130+ .nmemb = args -> nmemb ,
131131 };
132- memcpy (arr_meta + 1 , meta , metasize );
133- return smalloc_impl (nmemb * size , kind | ARRAY , dtor , & new_meta , sizeof (new_meta ));
132+ memcpy (arr_meta + 1 , args -> meta .data , args -> meta .size );
133+ return smalloc_impl (& (s_smalloc_args ) {
134+ .size = args -> nmemb * args -> size ,
135+ .kind = args -> kind | ARRAY ,
136+ .dtor = args -> dtor ,
137+ .meta = { & new_meta , sizeof (new_meta ) },
138+ });
134139}
135140
136141__attribute__ ((malloc ))
137- void * smalloc (size_t size , size_t nmemb , int kind , int count , ...) {
138- va_list args ;
139-
140- int params = 0 ;
141- if (count == 2 ) {
142- ++ count ;
143- ++ params ;
144- }
145- if (count > 3 )
146- count = 3 ;
147-
148- va_start (args , count );
149-
150- struct {
151- f_destructor dtor ;
152- void * meta_ptr ;
153- size_t meta_size ;
154- } values = { NULL , NULL , 0 };
155-
156- while (params < count ) {
157- switch (params ++ ) {
158- case 0 : values .dtor = va_arg (args , f_destructor ); break ;
159- case 1 : values .meta_ptr = va_arg (args , void * ); break ;
160- case 2 : values .meta_size = va_arg (args , size_t ); break ;
161- }
162- }
163-
164- va_end (args );
165- if (nmemb == 0 )
166- return smalloc_impl (size , kind , values .dtor , values .meta_ptr , values .meta_size );
167- else
168- return smalloc_array (size , nmemb , kind , values .dtor , values .meta_ptr , values .meta_size );
142+ void * smalloc (s_smalloc_args * args ) {
143+ return (args -> nmemb == 0 ? smalloc_impl : smalloc_array )(args );
169144}
170145
171146void sfree (void * ptr ) {
0 commit comments