]> git.sur5r.net Git - freertos/commitdiff
Another backup check-in during process of optimising task pool for FreeRTOS. This...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 23 Jul 2019 00:00:37 +0000 (00:00 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 23 Jul 2019 00:00:37 +0000 (00:00 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2694 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS-Plus/Source/FreeRTOS-Plus-IoT-SDK/c_sdk/standard/common/taskpool/iot_taskpool.c

index f0826281ad6a3fd1b9932b0eebe9fa98956d0cce..2144ba5d803357baf868eec076ce09b18a356690 100644 (file)
@@ -190,16 +190,6 @@ static IotTaskPoolError_t _createTaskPool( const IotTaskPoolInfo_t * const pInfo
  */\r
 static void _destroyTaskPool( _taskPool_t * const pTaskPool );\r
 \r
-/**\r
- * Set the exit condition.\r
- *\r
- * @param[in] pTaskPool The task pool to destroy.\r
- * @param[in] threads The number of threads active in the task pool at shutdown time.\r
- *\r
- */\r
-static void _signalShutdown( _taskPool_t * const pTaskPool,\r
-                             uint32_t threads );\r
-\r
 /**\r
  * Places a job in the dispatch queue.\r
  *\r
@@ -725,7 +715,7 @@ static IotTaskPoolError_t _createTaskPool( const IotTaskPoolInfo_t * const pInfo
     if( TASKPOOL_FAILED( status ) )\r
     {\r
         /* Set the exit condition for the newly created threads. */\r
-        _signalShutdown( pTaskPool, threadsCreated );\r
+#pragma message( "Threads need to be created statically here to ensure creation cannot fail as there is no shutdown mechanism." )\r
         _destroyTaskPool( pTaskPool );\r
     }\r
 \r
@@ -742,11 +732,6 @@ static void _destroyTaskPool( _taskPool_t * const pTaskPool )
     {\r
         xTimerDelete( pTaskPool->timer, 0 );\r
     }\r
-\r
-    if( pTaskPool->dispatchSignal != NULL )\r
-    {\r
-        vSemaphoreDelete( pTaskPool->dispatchSignal );\r
-    }\r
 }\r
 \r
 /* ---------------------------------------------------------------------------------------------- */\r
@@ -756,26 +741,21 @@ static void _taskPoolWorker( void * pUserContext )
     IotTaskPool_Assert( pUserContext != NULL );\r
 \r
     IotTaskPoolRoutine_t userCallback = NULL;\r
-    bool running = true;\r
 \r
     /* Extract pTaskPool pointer from context. */\r
     _taskPool_t * pTaskPool = ( _taskPool_t * ) pUserContext;\r
 \r
-    /* OUTER LOOP: it controls the lifetiem of the worker thread: exit condition for a worker thread\r
-     * is setting maxThreads to zero. A worker thread is running until the maximum number of allowed\r
-     * threads is not zero and the active threads are less than the maximum number of allowed threads.\r
-     */\r
-    do\r
+    /* OUTER LOOP: it controls the lifetime of the worker thread. */\r
+    for( ;; )\r
     {\r
         IotLink_t * pFirst = NULL;\r
         _taskPoolJob_t * pJob = NULL;\r
 \r
         /* Wait on incoming notifications... */\r
+        configASSERT( pTaskPool->dispatchSignal );\r
         xSemaphoreTake( pTaskPool->dispatchSignal, portMAX_DELAY );\r
 \r
-        /* Acquire the lock to check the exit condition, and release the lock if the exit condition is verified,\r
-         * or before waiting for incoming notifications.\r
-         */\r
+        /* Acquire the lock to check for incoming notifications. */\r
         taskENTER_CRITICAL();\r
         {\r
             /* Dequeue the first job in FIFO order. */\r
@@ -809,13 +789,6 @@ static void _taskPoolWorker( void * pUserContext )
                 /* This job is finished, clear its pointer. */\r
                 pJob = NULL;\r
                 userCallback = NULL;\r
-\r
-                /* If this thread exceeded the quota, then let it terminate. */\r
-                if( running == false )\r
-                {\r
-                    /* Abandon the INNER LOOP. Execution will tranfer back to the OUTER LOOP condition. */\r
-                    break;\r
-                }\r
             }\r
 \r
             /* Acquire the lock before updating the job status. */\r
@@ -832,7 +805,7 @@ static void _taskPoolWorker( void * pUserContext )
                 {\r
                     taskEXIT_CRITICAL();\r
 \r
-                    /* Abandon the INNER LOOP. Execution will tranfer back to the OUTER LOOP condition. */\r
+                    /* Abandon the INNER LOOP. Execution will transfer back to the OUTER LOOP condition. */\r
                     break;\r
                 }\r
                 else\r
@@ -846,9 +819,7 @@ static void _taskPoolWorker( void * pUserContext )
             }\r
             taskEXIT_CRITICAL();\r
         }\r
-    } while( running == true );\r
-\r
-    vTaskDelete( NULL );\r
+    }\r
 }\r
 \r
 /* ---------------------------------------------------------------------------------------------- */\r
@@ -904,7 +875,7 @@ static _taskPoolJob_t * _fetchOrAllocateJob( _taskPoolCache_t * const pCache )
         }\r
         else\r
         {\r
-            /* Log alocation failure for troubleshooting purposes. */\r
+            /* Log allocation failure for troubleshooting purposes. */\r
             IotLogInfo( "Failed to allocate job." );\r
         }\r
     }\r
@@ -969,30 +940,6 @@ static void _destroyJob( _taskPoolJob_t * const pJob )
 \r
 /* ---------------------------------------------------------------------------------------------- */\r
 \r
-static bool _IsShutdownStarted( const _taskPool_t * const pTaskPool )\r
-{\r
-    return( pTaskPool->running == false );\r
-}\r
-\r
-/*-----------------------------------------------------------*/\r
-\r
-static void _signalShutdown( _taskPool_t * const pTaskPool,\r
-                             uint32_t threads )\r
-{\r
-    uint32_t count;\r
-\r
-    /* Set the exit condition. */\r
-    pTaskPool->running = false;\r
-\r
-    /* Broadcast to all active threads to wake-up. Active threads do check the exit condition right after wakein up. */\r
-    for( count = 0; count < threads; ++count )\r
-    {\r
-        ( void ) xSemaphoreGive( pTaskPool->dispatchSignal );\r
-    }\r
-}\r
-\r
-/* ---------------------------------------------------------------------------------------------- */\r
-\r
 static IotTaskPoolError_t _scheduleInternal( _taskPool_t * const pTaskPool,\r
                                              _taskPoolJob_t * const pJob )\r
 {\r
@@ -1051,12 +998,12 @@ static IotTaskPoolError_t _tryCancelInternal( _taskPool_t * const pTaskPool,
             break;\r
 \r
         case IOT_TASKPOOL_STATUS_COMPLETED:\r
-            /* Log mesggesong purposes. */\r
+            /* Log message for debug purposes. */\r
             IotLogWarn( "Attempt to cancel a job that is already executing, or canceled." );\r
             break;\r
 \r
         default:\r
-            /* Log mesggesong purposes. */\r
+            /* Log message for debug purposes purposes. */\r
             IotLogError( "Attempt to cancel a job with an undefined state." );\r
             break;\r
     }\r
@@ -1199,7 +1146,7 @@ static void _timerCallback( TimerHandle_t xTimer )
      * If this mutex cannot be locked it means that another thread is manipulating the\r
      * timeouts list, and will reset the timer to fire again, although it will be late.\r
      */\r
-    taskENTER_CRITICAL();\r
+    taskENTER_CRITICAL(); //_RB_ Critical section is too long.\r
     {\r
         /* Dispatch all deferred job whose timer expired, then reset the timer for the next\r
          * job down the line. */\r