SysLink-IPC: RCM - Fix corner cases in RCM worker thread pool design
authorSuman Anna <s-anna@ti.com>
Mon, 1 Nov 2010 22:25:54 +0000 (17:25 -0500)
committerSuman Anna <s-anna@ti.com>
Mon, 1 Nov 2010 22:39:04 +0000 (17:39 -0500)
commit98333d2c0e05558bc2e6c308e8d6a5183030d160
treeabd6158f88575d87b3f41bfb4cb0523039bf6007
parent7536aa31c029cf92b5b0cb8a56a06e2cb1ad853f
SysLink-IPC: RCM - Fix corner cases in RCM worker thread pool design

Fixes have been made to the following corner cases in the current
RCM worker thread pool design:
1. The worker thread, upon processing a message with a specific
   job id, looks up the corresponding job stream and fetches the
   next packet. If this packet belongs to a different pool, the
   thread places it on the corresponding pool's readyQueue but
   still has ownership of it. If the packet belongs to the same
   pool, it continues processing this message without picking
   up the message from the pool's readyQueue, thereby starving
   the messages on the readyQueue. The fix is to put the packet
   onto the corresponding readyQueue and wait for to be signalled
   again, thus preserving the order of messages on the readyQueue.
2. The above original execution flow also results in a packet being
   unhandled, if the worker thread is signalled to terminate. The
   above fix will also handle this orphaned message.
3. Any unprocessed messages on a pool's readyQueue are lost in the
   current implementation. These messages are sent back to the
   client after the pool's threads are all terminated.
4. If the server thread picks up a message, and is signalled to
   terminate at the same time, the termination is taking precedence
   over the picked up message resulting in a unprocessed message.
   The current fix is to process the message before exiting the
   server thread function.

Messages left over on the server MessageQ (and any the client has
added) after the server thread has terminated are currently not
handled, and needs to be fixed in the future.

Signed-off-by: Suman Anna <s-anna@ti.com>
packages/ti/sdo/rcm/RcmServer.c