12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- #include <alloc_buffer.h>
- #include <libc-pointer-arith.h>
- void *
- __libc_alloc_buffer_alloc_array (struct alloc_buffer *buf, size_t element_size,
- size_t align, size_t count)
- {
- size_t current = buf->__alloc_buffer_current;
-
- size_t aligned = ALIGN_UP (current, align);
- size_t size;
- bool overflow = __builtin_mul_overflow (element_size, count, &size);
- size_t new_current = aligned + size;
- if (!overflow
- && aligned >= current
- && new_current >= size
- && new_current <= buf->__alloc_buffer_end)
- {
- buf->__alloc_buffer_current = new_current;
- return (void *) aligned;
- }
- else
- {
- alloc_buffer_mark_failed (buf);
- return NULL;
- }
- }
- libc_hidden_def (__libc_alloc_buffer_alloc_array)
|