text: /*
   * Copyright (c) 2018 Intel Corporation
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  #include <kernel.h>
  #include <cmsis_os.h>
  #include <string.h>
  
  #define TIME_OUT	100
  
  /**
   * @brief Create and Initialize a memory pool.
   */
  osPoolId osPoolCreate(const osPoolDef_t *pool_def)
  {
  	if (k_is_in_isr()) {
  		return NULL;
  	}
  
  	return (osPoolId)pool_def;
  }
  
  /**
   * @brief Allocate a memory block from a memory pool.
   */
  void *osPoolAlloc(osPoolId pool_id)
  {
  	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
  	void *ptr;
  
  	if (k_mem_slab_alloc((struct k_mem_slab *)(osPool->pool),
  				&ptr, TIME_OUT) == 0) {
  		return ptr;
  	} else {
  		return NULL;
  	}
  }
  
  /**
   * @brief Allocate a memory block from a memory pool and set it to zero.
   */
  void *osPoolCAlloc(osPoolId pool_id)
  {
  	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
  	void *ptr;
  
  	if (k_mem_slab_alloc((struct k_mem_slab *)(osPool->pool),
  				&ptr, TIME_OUT) == 0) {
  		(void)memset(ptr, 0, osPool->item_sz);
  		return ptr;
  	} else {
  		return NULL;
  	}
  }
  
  /**
   * @brief Return an allocated memory block back to a specific memory pool.
   */
  osStatus osPoolFree(osPoolId pool_id, void *block)
  {
  	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
  
  	/* Note: Below 2 error codes are not supported.
  	 *       osErrorValue: block does not belong to the memory pool.
  	 *       osErrorParameter: a parameter is invalid or outside of a
  	 *                         permitted range.
  	 */
  
  	k_mem_slab_free((struct k_mem_slab *)(osPool->pool), (void *)&block);
  
  	return osOK;
  }
  