(root)/
strace-6.5/
src/
retval.c
       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  }