1 /*
2 * Copyright (c) 2018-2021 The strace developers.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 #include "defs.h"
9 #include "retval.h"
10
11 static kernel_long_t *retval_vec;
12 static size_t retval_vec_capacity; /* size of the arena */
13 static size_t retval_vec_size; /* size of the used arena */
14
15 static void
16 expand_retval_vec(void)
17 {
18 const size_t old_capacity = retval_vec_capacity;
19 retval_vec = xgrowarray(retval_vec, &retval_vec_capacity,
20 sizeof(*retval_vec));
21 memset(retval_vec + old_capacity, 0,
22 (retval_vec_capacity - old_capacity)
23 * sizeof(*retval_vec));
24 }
25
26 uint16_t
27 retval_new(const kernel_long_t rval)
28 {
29 const uint16_t idx = retval_vec_size;
30
31 if (idx < retval_vec_size)
32 error_func_msg_and_die("retval index overflow");
33
34 if (retval_vec_size == retval_vec_capacity)
35 expand_retval_vec();
36
37 retval_vec[idx] = rval;
38 ++retval_vec_size;
39
40 return idx;
41 }
42
43 kernel_long_t
44 retval_get(const uint16_t rval_idx)
45 {
46 if (rval_idx >= retval_vec_size)
47 error_func_msg_and_die("rval_idx >= retval_vec_size");
48
49 return retval_vec[rval_idx];
50 }