code: def make_info(cols, cuda, uses_cuda_mutex: bool):
      def info(df, canvas_shape):
          ret = tuple(c.apply(df, cuda) for c in cols)
          if uses_cuda_mutex:
              import cupy  # Guaranteed to be available if uses_cuda_mutex is True
              import numba
              from packaging.version import Version
  
              if Version(numba.__version__) >= Version("0.57"):
                  mutex_array = cupy.zeros(
                      canvas_shape, dtype=np.uint32
                  )
              else:
                  mutex_array = cupy.zeros((1,), dtype=np.uint32)
              ret += (mutex_array,)
          return ret
  
      return info
  
imports: from __future__ import annotations
  from itertools import count
  import logging
  from typing import TYPE_CHECKING
  from toolz import unique, concat, pluck, get, memoize
  from numba import literal_unroll
  import numpy
  import xarray
  from .antialias import AntialiasCombination
  from .reductions import SpecialColumn, UsesCudaMutex, by, category_codes, summary
  from .utils import isnull, ngjit, nanmax_in_place, nanmin_in_place, nansum_in_place, nanfirst_in_place, nanlast_in_place, nanmax_n_in_place_3d, nanmax_n_in_place_4d, nanmin_n_in_place_3d, nanmin_n_in_place_4d, nanfirst_n_in_place_3d, nanfirst_n_in_place_4d, nanlast_n_in_place_3d, nanlast_n_in_place_4d, row_min_in_place, row_min_n_in_place_3d, row_min_n_in_place_4d, row_max_in_place, row_max_n_in_place_3d, row_max_n_in_place_4d
label_desc: Use image node_id 7 for calling a global function with example usage: make_info(cols, cuda, uses_cuda_mutex) and returns: info, ret