]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lwip.git/blobdiff - src/arch/sys_arch.c
Remove inline from non-static functions
[pes-rpp/rpp-lwip.git] / src / arch / sys_arch.c
index 2a1fcac5370c9246d9457b871b7b2cb24b2a5eb0..726e2dd77dd7bfb9f20318c0d9bd102dfd5819d7 100644 (file)
@@ -58,17 +58,17 @@ err_t sys_mutex_new(sys_mutex_t *mutex)
     return ERR_MEM;
 }
 /* locks a mutex */
-void inline sys_mutex_lock(sys_mutex_t *mutex)
+void sys_mutex_lock(sys_mutex_t *mutex)
 {
        xSemaphoreTake(*mutex,portMAX_DELAY); /* block time changed from 0 to portMAX_DELAY -- it might break timers! - just testing stability */
 }
 /* unlocks a mutex */
-void inline sys_mutex_unlock(sys_mutex_t *mutex)
+void sys_mutex_unlock(sys_mutex_t *mutex)
 {
        xSemaphoreGive(*mutex);
 }
 /* frees memory space formerly taken by mutex */
-void inline sys_mutex_free(sys_mutex_t *mutex)
+void sys_mutex_free(sys_mutex_t *mutex)
 {
        vSemaphoreDelete(*mutex);
 }
@@ -82,7 +82,7 @@ err_t sys_sem_new(sys_sem_t *sem, u8_t count)
     return ERR_MEM;
 }
 /* signals a semaphore */
-void inline sys_sem_signal(sys_sem_t *sem)
+void sys_sem_signal(sys_sem_t *sem)
 {
        xSemaphoreGive(*sem);
 }
@@ -102,7 +102,7 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)
     return ( (xTaskGetTickCount() - ticksBeforeSemphr) / portTICK_RATE_MS ); /* return time spent waiting for the semaphore - u can use xTaskGetTickCount() */
 }
 /* deletes a semaphore */
-void inline sys_sem_free(sys_sem_t *sem)
+void sys_sem_free(sys_sem_t *sem)
 {
        vSemaphoreDelete(*sem);
 }
@@ -115,7 +115,7 @@ err_t sys_mbox_new(sys_mbox_t *mbox, int size)
        return ERR_OK;
 }
 /* posts the "msg" to the mailbox, blocks if mbox full */
-void inline sys_mbox_post(sys_mbox_t *mbox, void *msg)
+void sys_mbox_post(sys_mbox_t *mbox, void *msg)
 {
        while(xQueueSendToBack(*mbox, &msg, portMAX_DELAY) == errQUEUE_FULL);
 }
@@ -160,7 +160,7 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)
        return 0; /* we waited 0ms */
 }
 /* deletes a mbox */
-void inline sys_mbox_free(sys_mbox_t *mbox)
+void sys_mbox_free(sys_mbox_t *mbox)
 {
        vQueueDelete(*mbox);
 }
@@ -175,8 +175,10 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
 
 #endif /* NO_SYS */
 
+
 #if SYS_ARCH_SEMPHR_PROTECT
 sys_mutex_t sys_arch_prot_semphr;
+xTaskHandle protectedTask = NULL;
 #endif /* SYS_ARCH_SEMPHR_PROTECT */
 
 /* void sys_init(void). lwIP system initialization. This function is called before the any other
@@ -237,17 +239,31 @@ sys_prot_t sys_arch_protect(void)
     status = (IntMasterStatusGet() & 0xFF);
 
     _disable_IRQ();
-    _disable_FIQ();
+    /* while interrupts ethernet related or interrupt for context switch don't use FIQ, we dont need to disable it */
+/*    _disable_FIQ(); */
     return status;
 #else /* !SYS_ARCH_SEMPHR_PROTECT */
-    if(xSemaphoreTake(sys_arch_prot_semphr,0) == pdFALSE) /* if semphr was already taken */
-    {
-       return TRUE;
-    }
-    else
-    {
-       return FALSE;
+    taskENTER_CRITICAL();
+    if(protectedTask == xTaskGetCurrentTaskHandle()){ /* if protected task calls nested sys_arch_protect we let it know that it was protected already */
+        taskEXIT_CRITICAL();
+        return TRUE;
+    } else {
+       while(1)
+       {
+               sys_mutex_lock(&sys_arch_prot_semphr);
+               if(protectedTask == NULL)
+               {
+               protectedTask = xTaskGetCurrentTaskHandle();
+               break;
+               }
+               else
+               {
+                       sys_mutex_unlock(&sys_arch_prot_semphr); /* we shouldn't get here ever */
+               }
+       }
     }
+    taskEXIT_CRITICAL();
+    return FALSE;
 #endif /* !SYS_ARCH_SEMPHR_PROTECT */
 }
 
@@ -268,14 +284,18 @@ void sys_arch_unprotect(sys_prot_t lev)
     if((lev & 0x80) == 0) {
         _enable_IRQ();
     }
-    if((lev & 0x40) == 0) {
+    /* while interrupts ethernet related or interrupt for context switch don't use FIQ, we dont need to protect against it */
+/*    if((lev & 0x40) == 0) {
         _enable_FIQ();
-    }
+    }*/
 #else /* !SYS_ARCH_SEMPHR_PROTECT */
-    if(!lev) /* if semaphore was unlocked */
+    taskENTER_CRITICAL();
+    if(!lev) /* if task wasn't already protected when sys_arch_protect() was called, unprotect it now */
     {
+       protectedTask = NULL;
        sys_mutex_unlock(&sys_arch_prot_semphr);
     }
+    taskEXIT_CRITICAL();
 #endif /* !SYS_ARCH_SEMPHR_PROTECT */
 }