]> git.sur5r.net Git - freertos/commitdiff
Changes from V4.1.2
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 22 Oct 2006 20:28:16 +0000 (20:28 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 22 Oct 2006 20:28:16 +0000 (20:28 +0000)
+ Tasks that block with a timeout of portMAX_DELAY are now blocked
  indefinitely.  Previously portMAX_DELAY was just the longest block time
  possible.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@49 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/tasks.c

index 3d6f3175f8b8b080a3b6070b92aa7f9b177d8f81..9b722bf756dcdd5bfaf95e681060f835097c426c 100644 (file)
@@ -181,6 +181,12 @@ Changes from V4.0.5
 \r
        + Added utility functions and xOverflowCount variable to facilitate the\r
          queue.c changes.\r
+\r
+Changes from V4.1.2\r
+       \r
+       + Tasks that block with a timeout of portMAX_DELAY are now blocked \r
+         indefinitely.  Previously portMAX_DELAY was just the longest block time\r
+         possible.\r
 */\r
 \r
 #include <stdio.h>\r
@@ -1418,26 +1424,36 @@ portTickType xTimeToWake;
        is the first to be woken by the event. */\r
        vListInsert( ( xList * ) pxEventList, ( xListItem * ) &( pxCurrentTCB->xEventListItem ) );\r
 \r
-       /* Calculate the time at which the task should be woken if the event does\r
-       not occur.  This may overflow but this doesn't matter. */\r
-       xTimeToWake = xTickCount + xTicksToWait;\r
-\r
        /* We must remove ourselves from the ready list before adding ourselves\r
        to the blocked list as the same list item is used for both lists.  We have\r
        exclusive access to the ready lists as the scheduler is locked. */\r
        vListRemove( ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
 \r
-       listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );\r
-\r
-       if( xTimeToWake < xTickCount )\r
+       if( xTicksToWait == portMAX_DELAY )\r
        {\r
-               /* Wake time has overflowed.  Place this item in the overflow list. */\r
-               vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
+               /* Add ourselves to the suspended task list instead of a delayed task\r
+               list to ensure we are not woken by a timing event.  We will block\r
+               indefinitely. */\r
+               vListInsertEnd( ( xList * ) &xSuspendedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
        }\r
        else\r
        {\r
-               /* The wake time has not overflowed, so we can use the current block list. */\r
-               vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
+               /* Calculate the time at which the task should be woken if the event does\r
+               not occur.  This may overflow but this doesn't matter. */\r
+               xTimeToWake = xTickCount + xTicksToWait;\r
+       \r
+               listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake );\r
+       \r
+               if( xTimeToWake < xTickCount )\r
+               {\r
+                       /* Wake time has overflowed.  Place this item in the overflow list. */\r
+                       vListInsert( ( xList * ) pxOverflowDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
+               }\r
+               else\r
+               {\r
+                       /* The wake time has not overflowed, so we can use the current block list. */\r
+                       vListInsert( ( xList * ) pxDelayedTaskList, ( xListItem * ) &( pxCurrentTCB->xGenericListItem ) );\r
+               }\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r