Release 6.2.0
This commit is contained in:
@@ -12,8 +12,8 @@
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/** */
|
||||
/** POSIX wrapper for THREADX */
|
||||
/** */
|
||||
/** POSIX wrapper for THREADX */
|
||||
/** */
|
||||
/** */
|
||||
/** */
|
||||
@@ -32,14 +32,14 @@
|
||||
/* FUNCTION RELEASE */
|
||||
/* */
|
||||
/* posix_arrange_msg PORTABLE C */
|
||||
/* 6.1.7 */
|
||||
/* 6.2.0 */
|
||||
/* AUTHOR */
|
||||
/* */
|
||||
/* William E. Lamie, Microsoft Corporation */
|
||||
/* */
|
||||
/* DESCRIPTION */
|
||||
/* */
|
||||
/* arrange messages from the queue */
|
||||
/* Return the oldest, highest priority message from the queue. */
|
||||
/* */
|
||||
/* INPUT */
|
||||
/* */
|
||||
@@ -62,117 +62,128 @@
|
||||
/* */
|
||||
/* DATE NAME DESCRIPTION */
|
||||
/* */
|
||||
/* 06-02-2021 William E. Lamie Initial Version 6.1.7 */
|
||||
/* 06-02-2021 William E. Lamie Initial Version 6.1.7 */
|
||||
/* 10-31-2022 Scott Larson Modified comments, */
|
||||
/* fixed message swap logic, */
|
||||
/* resulting in version 6.2.0 */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
ULONG posix_arrange_msg( TX_QUEUE *Queue, ULONG *pMsgPrio )
|
||||
ULONG posix_arrange_msg(TX_QUEUE *Queue, ULONG *pMsgPrio)
|
||||
{
|
||||
|
||||
ULONG* Qread; /* to store read ptr of the queue */
|
||||
ULONG* temp_q = TX_NULL; /* temp storage for the message pointer */
|
||||
ULONG numMsgs; /* no of messages queued */
|
||||
ULONG msg; /* temp variable for thr for loop */
|
||||
ULONG priority; /* priority of the message */
|
||||
ULONG maxPrio; /* max. priority of the messages in queue*/
|
||||
ULONG number2; /* messages */
|
||||
ULONG minNo; /* oldest message in the same priority */
|
||||
ULONG swap; /* temp.variable for the swapping of the */
|
||||
/* messages */
|
||||
ULONG* q_read; /* to store read ptr of the queue */
|
||||
ULONG* temp_q = TX_NULL; /* temp storage for the message pointer */
|
||||
ULONG numMsgs; /* no of messages queued */
|
||||
ULONG msg; /* temp variable for thr for loop */
|
||||
ULONG priority; /* priority of the message */
|
||||
ULONG maxPrio; /* max. priority of the messages in queue*/
|
||||
ULONG number2; /* messages */
|
||||
ULONG minNo; /* oldest message in the same priority */
|
||||
ULONG swap; /* temp.variable for the swapping of the */
|
||||
/* messages */
|
||||
|
||||
/* initialize the priority to the lowest priority. */
|
||||
maxPrio = 0;
|
||||
minNo=0;
|
||||
minNo = 0;
|
||||
|
||||
/* Copy read pointer to the temporary variable. */
|
||||
Qread = Queue -> tx_queue_read;
|
||||
q_read = Queue -> tx_queue_read;
|
||||
|
||||
/* Copy no. of messages in the queue to the temporary variable. */
|
||||
numMsgs = Queue -> tx_queue_enqueued;
|
||||
|
||||
if( numMsgs == 0 )
|
||||
return(OK);
|
||||
|
||||
for( msg = 0; msg < numMsgs; msg ++)
|
||||
/* If there is 0 or 1 message, no rearranging is needed. */
|
||||
if (numMsgs < 2)
|
||||
{
|
||||
return(OK);
|
||||
}
|
||||
|
||||
/* Advance Qread by two pointers to read the priority of the message. */
|
||||
Qread = Qread + 2 ;
|
||||
for (msg = 0; msg < numMsgs; msg++)
|
||||
{
|
||||
/* Advance q_read to read the priority of the message. */
|
||||
q_read = q_read + TX_POSIX_QUEUE_PRIORITY_OFFSET;
|
||||
|
||||
/* Priority of the message queued. */
|
||||
priority = *Qread;
|
||||
priority = *q_read;
|
||||
|
||||
/* check with maxpriority. */
|
||||
if( priority > maxPrio )
|
||||
{
|
||||
/* copy read pointer to temporary buffer. */
|
||||
temp_q = Qread-2;
|
||||
if (priority > maxPrio)
|
||||
{
|
||||
/* copy read pointer to temporary pointer. */
|
||||
temp_q = q_read-TX_POSIX_QUEUE_PRIORITY_OFFSET;
|
||||
|
||||
/* increment read pointer to point to order. */
|
||||
Qread++;
|
||||
q_read++;
|
||||
|
||||
/* copy FIFO order to the message */
|
||||
minNo = *Qread;
|
||||
minNo = *q_read;
|
||||
|
||||
/* Found higher priority message. */
|
||||
maxPrio = priority;
|
||||
|
||||
Qread++;
|
||||
q_read++;
|
||||
}
|
||||
|
||||
/* if more than one same priority messages are in the queue
|
||||
then check if this the oldest one. */
|
||||
else if ( priority == maxPrio )
|
||||
|
||||
/* if more than one message of the same priority is in the queue
|
||||
then check if this the oldest message. */
|
||||
else if (priority == maxPrio)
|
||||
{
|
||||
/* increment read pointer to point to read FIFO order */
|
||||
Qread++;
|
||||
q_read++;
|
||||
|
||||
/* copy number to the local varialble. */
|
||||
number2 = *Qread;
|
||||
Qread++;
|
||||
/* find the oldest of the messages in this priority level. */
|
||||
if( number2 < minNo )
|
||||
{
|
||||
/* founder older one */
|
||||
minNo = number2;
|
||||
/* copy read pointer to temporary buffer. */
|
||||
temp_q = Qread - 4;
|
||||
}
|
||||
|
||||
/* copy number to the local variable. */
|
||||
number2 = *q_read;
|
||||
|
||||
/* Go to next message. */
|
||||
q_read++;
|
||||
|
||||
/* find the oldest of the messages in this priority level. */
|
||||
if( number2 < minNo )
|
||||
{
|
||||
/* founder older one */
|
||||
minNo = number2;
|
||||
/* copy read pointer to temporary buffer. */
|
||||
temp_q = q_read - (TX_POSIX_MESSAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
Qread = Qread + 2;
|
||||
else
|
||||
{
|
||||
/* Not highest priority, go to next message. */
|
||||
q_read = q_read + (TX_POSIX_MESSAGE_SIZE - TX_POSIX_QUEUE_PRIORITY_OFFSET);
|
||||
}
|
||||
|
||||
/* Determine if we are at the end. */
|
||||
if ( Qread >= Queue ->tx_queue_end)
|
||||
|
||||
/* Yes, wrap around to the beginning. */
|
||||
Qread = Queue -> tx_queue_start;
|
||||
/* Determine if we are at the end. */
|
||||
if (q_read >= Queue -> tx_queue_end)
|
||||
{
|
||||
/* Yes, wrap around to the beginning. */
|
||||
q_read = Queue -> tx_queue_start;
|
||||
}
|
||||
}
|
||||
|
||||
/* All messages checked temp holds address of highest priority message and
|
||||
maxPrio holds the highest priority*/
|
||||
|
||||
if( pMsgPrio != NULL )
|
||||
/* Output priority if non-null */
|
||||
if (pMsgPrio != NULL)
|
||||
{
|
||||
/* copy message priority. */
|
||||
*pMsgPrio = maxPrio;
|
||||
}
|
||||
|
||||
/* All messages checked, temp_q holds address of oldest highest priority message
|
||||
and maxPrio holds the highest priority. */
|
||||
/* Get the current queue read pointer */
|
||||
Qread = Queue -> tx_queue_read;
|
||||
|
||||
/* if(*pMsgPrio != *(Qread + 2) || minNo < *(Qread + 3))*/
|
||||
q_read = Queue -> tx_queue_read;
|
||||
|
||||
if((temp_q != TX_NULL) && (temp_q != q_read))
|
||||
{
|
||||
/* Swap the messages. */
|
||||
for ( msg = 0; msg < 4; msg++)
|
||||
for (msg = 0; msg < TX_POSIX_MESSAGE_SIZE; msg++)
|
||||
{
|
||||
|
||||
swap = *temp_q;
|
||||
*temp_q = *Qread;
|
||||
*Qread = swap;
|
||||
*temp_q = *q_read;
|
||||
*q_read = swap;
|
||||
temp_q++;
|
||||
Qread++;
|
||||
q_read++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user