Nested semaphore locking

Hello, is there any simple way to extend FreeRTOS semaphores to add nesting?  Like in:    xSemaphoreTake(s, portMAX_DELAY); /* obtains s */    xSemaphoreTake(s, portMAX_DELAY); /* does not deadlock! */    xSemaphoreGive(s); /* does not free s */    xSemaphoreGive(s); /* really frees s */ I tried to implement it on top of FreeRTOS semaphores, but it’s quite tricky.

Nested semaphore locking

I’ve solved the problem like this. Does it look sane? typedef struct Semaphore {     xSemaphoreHandle lock;     xTaskHandle      owner;     int              nest_count; } Semaphore; void sem_obtain(struct Semaphore *s) {     if (s->owner != xTaskGetCurrentTaskHandle())         xSemaphoreTake(s->lock, portMAX_DELAY);     s->owner = xTaskGetCurrentTaskHandle();     s->nest_count++; } void sem_release(struct Semaphore *s) {     ASSERT(s->owner == xTaskGetCurrentTaskHandle());     if (–s->nest_count == 0)     {         /* Disown semaphore */         s->owner = NULL;         xSemaphoreGive(s->lock);     } }

Nested semaphore locking

Probably very sane, as I don’t really under stand it :-)