Browse Source

kernel: mem_slab: Optimize mem_slab_free

Changed algorithm of checking for pending thread in mem_slab.
Check for pending thread now is done only if there is
no memory left.

Signed-off-by: Kamil Lazowski <Kamil.Lazowski@nordicsemi.no>
pull/30484/head
Kamil Lazowski 5 years ago committed by Carles Cufí
parent
commit
303fca9f2a
  1. 23
      kernel/mem_slab.c

23
kernel/mem_slab.c

@ -143,16 +143,19 @@ int k_mem_slab_alloc(struct k_mem_slab *slab, void **mem, k_timeout_t timeout) @@ -143,16 +143,19 @@ int k_mem_slab_alloc(struct k_mem_slab *slab, void **mem, k_timeout_t timeout)
void k_mem_slab_free(struct k_mem_slab *slab, void **mem)
{
k_spinlock_key_t key = k_spin_lock(&lock);
struct k_thread *pending_thread = z_unpend_first_thread(&slab->wait_q);
if (pending_thread != NULL) {
z_thread_return_value_set_with_data(pending_thread, 0, *mem);
z_ready_thread(pending_thread);
z_reschedule(&lock, key);
} else {
**(char ***)mem = slab->free_list;
slab->free_list = *(char **)mem;
slab->num_used--;
k_spin_unlock(&lock, key);
if (slab->free_list == NULL) {
struct k_thread *pending_thread = z_unpend_first_thread(&slab->wait_q);
if (pending_thread != NULL) {
z_thread_return_value_set_with_data(pending_thread, 0, *mem);
z_ready_thread(pending_thread);
z_reschedule(&lock, key);
return;
}
}
**(char ***) mem = slab->free_list;
slab->free_list = *(char **) mem;
slab->num_used--;
k_spin_unlock(&lock, key);
}

Loading…
Cancel
Save