Lines Matching refs:mp
28 static void (*rt_mp_alloc_hook)(struct rt_mempool *mp, void *block);
29 static void (*rt_mp_free_hook)(struct rt_mempool *mp, void *block);
43 void rt_mp_alloc_sethook(void (*hook)(struct rt_mempool *mp, void *block)) in rt_mp_alloc_sethook() argument
54 void rt_mp_free_sethook(void (*hook)(struct rt_mempool *mp, void *block)) in rt_mp_free_sethook() argument
84 rt_err_t rt_mp_init(struct rt_mempool *mp, in rt_mp_init() argument
94 RT_ASSERT(mp != RT_NULL); in rt_mp_init()
100 rt_object_init(&(mp->parent), RT_Object_Class_MemPool, name); in rt_mp_init()
103 mp->start_address = start; in rt_mp_init()
104 mp->size = RT_ALIGN_DOWN(size, RT_ALIGN_SIZE); in rt_mp_init()
108 mp->block_size = block_size; in rt_mp_init()
111 mp->block_total_count = mp->size / (mp->block_size + sizeof(rt_uint8_t *)); in rt_mp_init()
112 mp->block_free_count = mp->block_total_count; in rt_mp_init()
115 rt_list_init(&(mp->suspend_thread)); in rt_mp_init()
118 block_ptr = (rt_uint8_t *)mp->start_address; in rt_mp_init()
119 for (offset = 0; offset < mp->block_total_count; offset ++) in rt_mp_init()
128 mp->block_list = block_ptr; in rt_mp_init()
129 rt_spin_lock_init(&(mp->spinlock)); in rt_mp_init()
142 rt_err_t rt_mp_detach(struct rt_mempool *mp) in rt_mp_detach() argument
147 RT_ASSERT(mp != RT_NULL); in rt_mp_detach()
148 RT_ASSERT(rt_object_get_type(&mp->parent) == RT_Object_Class_MemPool); in rt_mp_detach()
149 RT_ASSERT(rt_object_is_systemobject(&mp->parent)); in rt_mp_detach()
151 level = rt_spin_lock_irqsave(&(mp->spinlock)); in rt_mp_detach()
153 rt_susp_list_resume_all(&mp->suspend_thread, RT_ERROR); in rt_mp_detach()
156 rt_object_detach(&(mp->parent)); in rt_mp_detach()
157 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_detach()
181 struct rt_mempool *mp; in rt_mp_create() local
191 mp = (struct rt_mempool *)rt_object_allocate(RT_Object_Class_MemPool, name); in rt_mp_create()
193 if (mp == RT_NULL) in rt_mp_create()
198 mp->block_size = block_size; in rt_mp_create()
199 mp->size = (block_size + sizeof(rt_uint8_t *)) * block_count; in rt_mp_create()
202 mp->start_address = rt_malloc((block_size + sizeof(rt_uint8_t *)) * in rt_mp_create()
204 if (mp->start_address == RT_NULL) in rt_mp_create()
207 rt_object_delete(&(mp->parent)); in rt_mp_create()
212 mp->block_total_count = block_count; in rt_mp_create()
213 mp->block_free_count = mp->block_total_count; in rt_mp_create()
216 rt_list_init(&(mp->suspend_thread)); in rt_mp_create()
219 block_ptr = (rt_uint8_t *)mp->start_address; in rt_mp_create()
220 for (offset = 0; offset < mp->block_total_count; offset ++) in rt_mp_create()
229 mp->block_list = block_ptr; in rt_mp_create()
230 rt_spin_lock_init(&(mp->spinlock)); in rt_mp_create()
232 return mp; in rt_mp_create()
243 rt_err_t rt_mp_delete(rt_mp_t mp) in rt_mp_delete() argument
250 RT_ASSERT(mp != RT_NULL); in rt_mp_delete()
251 RT_ASSERT(rt_object_get_type(&mp->parent) == RT_Object_Class_MemPool); in rt_mp_delete()
252 RT_ASSERT(rt_object_is_systemobject(&mp->parent) == RT_FALSE); in rt_mp_delete()
254 level = rt_spin_lock_irqsave(&(mp->spinlock)); in rt_mp_delete()
256 rt_susp_list_resume_all(&mp->suspend_thread, RT_ERROR); in rt_mp_delete()
258 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_delete()
261 rt_free(mp->start_address); in rt_mp_delete()
264 rt_object_delete(&(mp->parent)); in rt_mp_delete()
281 void *rt_mp_alloc(rt_mp_t mp, rt_int32_t time) in rt_mp_alloc() argument
289 RT_ASSERT(mp != RT_NULL); in rt_mp_alloc()
294 level = rt_spin_lock_irqsave(&(mp->spinlock)); in rt_mp_alloc()
296 while (mp->block_free_count == 0) in rt_mp_alloc()
301 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_alloc()
313 … rt_thread_suspend_to_list(thread, &mp->suspend_thread, RT_IPC_FLAG_FIFO, RT_UNINTERRUPTIBLE); in rt_mp_alloc()
328 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_alloc()
342 level = rt_spin_lock_irqsave(&(mp->spinlock)); in rt_mp_alloc()
346 mp->block_free_count--; in rt_mp_alloc()
349 block_ptr = mp->block_list; in rt_mp_alloc()
353 mp->block_list = *(rt_uint8_t **)block_ptr; in rt_mp_alloc()
356 *(rt_uint8_t **)block_ptr = (rt_uint8_t *)mp; in rt_mp_alloc()
358 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_alloc()
361 (mp, (rt_uint8_t *)(block_ptr + sizeof(rt_uint8_t *)))); in rt_mp_alloc()
375 struct rt_mempool *mp; in rt_mp_free() local
383 mp = (struct rt_mempool *)*block_ptr; in rt_mp_free()
385 RT_OBJECT_HOOK_CALL(rt_mp_free_hook, (mp, block)); in rt_mp_free()
387 level = rt_spin_lock_irqsave(&(mp->spinlock)); in rt_mp_free()
390 mp->block_free_count ++; in rt_mp_free()
393 *block_ptr = mp->block_list; in rt_mp_free()
394 mp->block_list = (rt_uint8_t *)block_ptr; in rt_mp_free()
396 if (rt_susp_list_dequeue(&mp->suspend_thread, RT_EOK)) in rt_mp_free()
398 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_free()
405 rt_spin_unlock_irqrestore(&(mp->spinlock), level); in rt_mp_free()