kernel: heap: Add support for CONFIG_MULTITHREADING=n

Ensure that k_heap is not attempt to block the thread when
timeout is set and space cannot be allocated.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2021-04-19 10:52:34 +02:00 committed by Carles Cufí
commit c482a572d4
2 changed files with 6 additions and 3 deletions

View file

@ -4841,7 +4841,7 @@ extern int k_mem_slab_init(struct k_mem_slab *slab, void *buffer,
* This routine allocates a memory block from a memory slab. * This routine allocates a memory block from a memory slab.
* *
* @note @a timeout must be set to K_NO_WAIT if called from ISR. * @note @a timeout must be set to K_NO_WAIT if called from ISR.
* @note When CONFIG_MULTITHREADING=n any @timeout is treated as K_NO_WAIT. * @note When CONFIG_MULTITHREADING=n any @a timeout is treated as K_NO_WAIT.
* *
* @funcprops \isr_ok * @funcprops \isr_ok
* *
@ -4962,6 +4962,7 @@ void k_heap_init(struct k_heap *h, void *mem, size_t bytes);
* k_heap_free(). * k_heap_free().
* *
* @note @a timeout must be set to K_NO_WAIT if called from ISR. * @note @a timeout must be set to K_NO_WAIT if called from ISR.
* @note When CONFIG_MULTITHREADING=n any @a timeout is treated as K_NO_WAIT.
* *
* @funcprops \isr_ok * @funcprops \isr_ok
* *
@ -4985,6 +4986,7 @@ void *k_heap_aligned_alloc(struct k_heap *h, size_t align, size_t bytes,
* the timeout, NULL will be returned. * the timeout, NULL will be returned.
* *
* @note @a timeout must be set to K_NO_WAIT if called from ISR. * @note @a timeout must be set to K_NO_WAIT if called from ISR.
* @note When CONFIG_MULTITHREADING=n any @a timeout is treated as K_NO_WAIT.
* *
* @funcprops \isr_ok * @funcprops \isr_ok
* *

View file

@ -39,7 +39,8 @@ void *k_heap_aligned_alloc(struct k_heap *h, size_t align, size_t bytes,
ret = sys_heap_aligned_alloc(&h->heap, align, bytes); ret = sys_heap_aligned_alloc(&h->heap, align, bytes);
now = sys_clock_tick_get(); now = sys_clock_tick_get();
if ((ret != NULL) || ((end - now) <= 0)) { if (!IS_ENABLED(CONFIG_MULTITHREADING) ||
(ret != NULL) || ((end - now) <= 0)) {
break; break;
} }
@ -58,7 +59,7 @@ void k_heap_free(struct k_heap *h, void *mem)
sys_heap_free(&h->heap, mem); sys_heap_free(&h->heap, mem);
if (z_unpend_all(&h->wait_q) != 0) { if (IS_ENABLED(CONFIG_MULTITHREADING) && z_unpend_all(&h->wait_q) != 0) {
z_reschedule(&h->lock, key); z_reschedule(&h->lock, key);
} else { } else {
k_spin_unlock(&h->lock, key); k_spin_unlock(&h->lock, key);