Ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e0ba6b95ab71a441357ed5484e33498)
xmalloc.h
Go to the documentation of this file.
1#ifndef RBIMPL_XMALLOC_H /*-*-C++-*-vi:se ft=cpp:*/
2#define RBIMPL_XMALLOC_H
23#include "ruby/internal/config.h"
24
25#ifdef STDC_HEADERS
26# include <stddef.h>
27#endif
28
29#ifdef HAVE_STDLIB_H
30# include <stdlib.h>
31#endif
32
39
49#ifndef USE_GC_MALLOC_OBJ_INFO_DETAILS
50# define USE_GC_MALLOC_OBJ_INFO_DETAILS 0
51#endif
52
53#define xmalloc ruby_xmalloc
54#define xmalloc2 ruby_xmalloc2
55#define xcalloc ruby_xcalloc
56#define xrealloc ruby_xrealloc
57#define xrealloc2 ruby_xrealloc2
58#define xfree ruby_xfree
61
86void *ruby_xmalloc(size_t size)
87RBIMPL_ATTR_NOEXCEPT(malloc(size))
88;
89
117void *ruby_xmalloc2(size_t nelems, size_t elemsiz)
118RBIMPL_ATTR_NOEXCEPT(malloc(nelems * elemsiz))
119;
120
147void *ruby_xcalloc(size_t nelems, size_t elemsiz)
148RBIMPL_ATTR_NOEXCEPT(calloc(nelems, elemsiz))
149;
150
193void *ruby_xrealloc(void *ptr, size_t newsiz)
194RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newsiz))
195;
196
250void *ruby_xrealloc2(void *ptr, size_t newelems, size_t newsiz)
251RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newelems * newsiz))
252;
253
282void ruby_xfree(void *ptr)
283RBIMPL_ATTR_NOEXCEPT(free(ptr))
284;
285
286#if USE_GC_MALLOC_OBJ_INFO_DETAILS
287# define ruby_xmalloc(s1) ruby_xmalloc_with_location(s1, __FILE__, __LINE__)
288# define ruby_xmalloc2(s1, s2) ruby_xmalloc2_with_location(s1, s2, __FILE__, __LINE__)
289# define ruby_xcalloc(s1, s2) ruby_xcalloc_with_location(s1, s2, __FILE__, __LINE__)
290# define ruby_xrealloc(ptr, s1) ruby_xrealloc_with_location(ptr, s1, __FILE__, __LINE__)
291# define ruby_xrealloc2(ptr, s1, s2) ruby_xrealloc2_with_location(ptr, s1, s2, __FILE__, __LINE__)
292
297void *ruby_xmalloc_body(size_t size)
298RBIMPL_ATTR_NOEXCEPT(malloc(size))
299;
300
305void *ruby_xmalloc2_body(size_t nelems, size_t elemsiz)
306RBIMPL_ATTR_NOEXCEPT(malloc(nelems * elemsiz))
307;
308
313void *ruby_xcalloc_body(size_t nelems, size_t elemsiz)
314RBIMPL_ATTR_NOEXCEPT(calloc(nelems, elemsiz))
315;
316
320void *ruby_xrealloc_body(void *ptr, size_t newsiz)
321RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newsiz))
322;
323
327void *ruby_xrealloc2_body(void *ptr, size_t newelems, size_t newsiz)
328RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newelems * newsiz))
329;
330
331RUBY_EXTERN const char *ruby_malloc_info_file;
332RUBY_EXTERN int ruby_malloc_info_line;
333
334static inline void *
335ruby_xmalloc_with_location(size_t s, const char *file, int line)
336{
337 void *ptr;
338 ruby_malloc_info_file = file;
339 ruby_malloc_info_line = line;
340 ptr = ruby_xmalloc_body(s);
341 ruby_malloc_info_file = NULL;
342 return ptr;
343}
344
345static inline void *
346ruby_xmalloc2_with_location(size_t s1, size_t s2, const char *file, int line)
347{
348 void *ptr;
349 ruby_malloc_info_file = file;
350 ruby_malloc_info_line = line;
351 ptr = ruby_xmalloc2_body(s1, s2);
352 ruby_malloc_info_file = NULL;
353 return ptr;
354}
355
356static inline void *
357ruby_xcalloc_with_location(size_t s1, size_t s2, const char *file, int line)
358{
359 void *ptr;
360 ruby_malloc_info_file = file;
361 ruby_malloc_info_line = line;
362 ptr = ruby_xcalloc_body(s1, s2);
363 ruby_malloc_info_file = NULL;
364 return ptr;
365}
366
367static inline void *
368ruby_xrealloc_with_location(void *ptr, size_t s, const char *file, int line)
369{
370 void *rptr;
371 ruby_malloc_info_file = file;
372 ruby_malloc_info_line = line;
373 rptr = ruby_xrealloc_body(ptr, s);
374 ruby_malloc_info_file = NULL;
375 return rptr;
376}
377
378static inline void *
379ruby_xrealloc2_with_location(void *ptr, size_t s1, size_t s2, const char *file, int line)
380{
381 void *rptr;
382 ruby_malloc_info_file = file;
383 ruby_malloc_info_line = line;
384 rptr = ruby_xrealloc2_body(ptr, s1, s2);
385 ruby_malloc_info_file = NULL;
386 return rptr;
387}
388#endif
389
391
392#endif /* RBIMPL_XMALLOC_H */
Defines RBIMPL_ATTR_ALLOC_SIZE.
#define RBIMPL_ATTR_ALLOC_SIZE(tuple)
Wraps (or simulates) __attribute__((alloc_size))
Definition: alloc_size.h:27
Tweaking visibility of C variables/functions.
#define RUBY_EXTERN
Declaration of externally visible global variables.
Definition: dllexport.h:47
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
Definition: dllexport.h:106
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Definition: dllexport.h:97
Defines RBIMPL_ATTR_NODISCARD.
#define RBIMPL_ATTR_NODISCARD()
Wraps (or simulates) [[nodiscard]].
Definition: nodiscard.h:37
Defines RBIMPL_ATTR_NOEXCEPT.
#define RBIMPL_ATTR_NOEXCEPT(_)
Wraps (or simulates) C++11 noexcept
Definition: noexcept.h:73
Defines RBIMPL_ATTR_RESTRICT.
#define RBIMPL_ATTR_RESTRICT()
Wraps (or simulates) __declspec(restrict)
Definition: restrict.h:35
Defines RBIMPL_ATTR_RETURNS_NONNULL.
#define RBIMPL_ATTR_RETURNS_NONNULL()
Wraps (or simulates) __attribute__((returns_nonnull))
void * ruby_xrealloc(void *ptr, size_t newsiz)
Resize the storage instance.
Definition: gc.c:13695
void * ruby_xrealloc2(void *ptr, size_t newelems, size_t newsiz)
Identical to ruby_xrealloc(), except it resizes the given storage instance to newelems * newsiz bytes...
Definition: gc.c:13705
void ruby_xfree(void *ptr)
Deallocates a storage instance.
Definition: gc.c:11772
void * ruby_xmalloc2(size_t nelems, size_t elemsiz)
Identical to ruby_xmalloc(), except it allocates nelems * elemsiz bytes.
Definition: gc.c:13675
void * ruby_xmalloc(size_t size)
Allocates a storage instance.
Definition: gc.c:13665
void * ruby_xcalloc(size_t nelems, size_t elemsiz)
Identical to ruby_xmalloc2(), except it returns a zero-filled storage instance.
Definition: gc.c:13685