Remove __ASSUME_GETCPU_SYSCALL.
[platform/upstream/glibc.git] / malloc / scratch_buffer_grow.c
1 /* Variable-sized buffer with on-stack default allocation.
2    Copyright (C) 2015-2017 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
18
19 #include <scratch_buffer.h>
20 #include <errno.h>
21
22 bool
23 __libc_scratch_buffer_grow (struct scratch_buffer *buffer)
24 {
25   void *new_ptr;
26   size_t new_length = buffer->length * 2;
27
28   /* Discard old buffer.  */
29   scratch_buffer_free (buffer);
30
31   /* Check for overflow.  */
32   if (__glibc_likely (new_length >= buffer->length))
33     new_ptr = malloc (new_length);
34   else
35     {
36       __set_errno (ENOMEM);
37       new_ptr = NULL;
38     }
39
40   if (__glibc_unlikely (new_ptr == NULL))
41     {
42       /* Buffer must remain valid to free.  */
43       scratch_buffer_init (buffer);
44       return false;
45     }
46
47   /* Install new heap-based buffer.  */
48   buffer->data = new_ptr;
49   buffer->length = new_length;
50   return true;
51 }
52 libc_hidden_def (__libc_scratch_buffer_grow);