]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lwip.git/blobdiff - src/arch/sys_arch.c
mutex protection fixed; some not well working tries to make !NO_SYS version working
[pes-rpp/rpp-lwip.git] / src / arch / sys_arch.c
index 2a1fcac5370c9246d9457b871b7b2cb24b2a5eb0..ec28329a410237df2235408bed1335d46205cfef 100644 (file)
@@ -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 */
 }