1 /*
2  * Copyright (c) 2018 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/kernel.h>
8 #include <cmsis_os.h>
9 #include <string.h>
10 
11 #define TIME_OUT	K_MSEC(100)
12 
13 /**
14  * @brief Create and Initialize a memory pool.
15  */
osPoolCreate(const osPoolDef_t * pool_def)16 osPoolId osPoolCreate(const osPoolDef_t *pool_def)
17 {
18 	if (k_is_in_isr()) {
19 		return NULL;
20 	}
21 
22 	return (osPoolId)pool_def;
23 }
24 
25 /**
26  * @brief Allocate a memory block from a memory pool.
27  */
osPoolAlloc(osPoolId pool_id)28 void *osPoolAlloc(osPoolId pool_id)
29 {
30 	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
31 	void *ptr;
32 
33 	if (k_mem_slab_alloc((struct k_mem_slab *)(osPool->pool),
34 				&ptr, TIME_OUT) == 0) {
35 		return ptr;
36 	} else {
37 		return NULL;
38 	}
39 }
40 
41 /**
42  * @brief Allocate a memory block from a memory pool and set it to zero.
43  */
osPoolCAlloc(osPoolId pool_id)44 void *osPoolCAlloc(osPoolId pool_id)
45 {
46 	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
47 	void *ptr;
48 
49 	if (k_mem_slab_alloc((struct k_mem_slab *)(osPool->pool),
50 				&ptr, TIME_OUT) == 0) {
51 		(void)memset(ptr, 0, osPool->item_sz);
52 		return ptr;
53 	} else {
54 		return NULL;
55 	}
56 }
57 
58 /**
59  * @brief Return an allocated memory block back to a specific memory pool.
60  */
osPoolFree(osPoolId pool_id,void * block)61 osStatus osPoolFree(osPoolId pool_id, void *block)
62 {
63 	osPoolDef_t *osPool = (osPoolDef_t *)pool_id;
64 
65 	/* Note: Below 2 error codes are not supported.
66 	 *       osErrorValue: block does not belong to the memory pool.
67 	 *       osErrorParameter: a parameter is invalid or outside of a
68 	 *                         permitted range.
69 	 */
70 
71 	k_mem_slab_free((struct k_mem_slab *)(osPool->pool), (void *)&block);
72 
73 	return osOK;
74 }
75