forked from Imagelibrary/rtems
Added support for message priority as required by POSIX.
This commit is contained in:
@@ -56,6 +56,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
|
int priority;
|
||||||
CORE_message_queue_Buffer Contents;
|
CORE_message_queue_Buffer Contents;
|
||||||
} CORE_message_queue_Buffer_control;
|
} CORE_message_queue_Buffer_control;
|
||||||
|
|
||||||
@@ -72,12 +73,17 @@ typedef enum {
|
|||||||
* The following enumerated type details the modes in which a message
|
* The following enumerated type details the modes in which a message
|
||||||
* may be submitted to a message queue. The message may be posted
|
* may be submitted to a message queue. The message may be posted
|
||||||
* in a send or urgent fashion.
|
* in a send or urgent fashion.
|
||||||
|
*
|
||||||
|
* NOTE: All other values are message priorities. Numerically smaller
|
||||||
|
* priorities indicate higher priority messages.
|
||||||
|
*
|
||||||
|
* XXX these constants should be changed to be compiler dependent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef enum {
|
#define CORE_MESSAGE_QUEUE_SEND_REQUEST 0x7fffffff
|
||||||
CORE_MESSAGE_QUEUE_SEND_REQUEST = 0,
|
#define CORE_MESSAGE_QUEUE_URGENT_REQUEST -(0x7fffffff)
|
||||||
CORE_MESSAGE_QUEUE_URGENT_REQUEST = 1
|
|
||||||
} CORE_message_queue_Submit_types;
|
typedef int CORE_message_queue_Submit_types;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Core Message queue handler return statuses.
|
* Core Message queue handler return statuses.
|
||||||
|
|||||||
@@ -422,6 +422,7 @@ CORE_message_queue_Status _CORE_message_queue_Submit(
|
|||||||
|
|
||||||
_CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
|
_CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
|
||||||
the_message->Contents.size = size;
|
the_message->Contents.size = size;
|
||||||
|
the_message->priority = submit_type;
|
||||||
|
|
||||||
the_message_queue->number_of_pending_messages += 1;
|
the_message_queue->number_of_pending_messages += 1;
|
||||||
|
|
||||||
@@ -432,7 +433,38 @@ CORE_message_queue_Status _CORE_message_queue_Submit(
|
|||||||
case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
|
case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
|
||||||
_CORE_message_queue_Prepend( the_message_queue, the_message );
|
_CORE_message_queue_Prepend( the_message_queue, the_message );
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
/* XXX interrupt critical section needs to be addressed */
|
||||||
|
{
|
||||||
|
CORE_message_queue_Buffer_control *this_message;
|
||||||
|
Chain_Node *the_node;
|
||||||
|
|
||||||
|
the_message->priority = submit_type;
|
||||||
|
for ( the_node = the_message_queue->Pending_messages.first ;
|
||||||
|
!_Chain_Is_tail( &the_message_queue->Pending_messages, the_node ) ;
|
||||||
|
the_node = the_node->next ) {
|
||||||
|
|
||||||
|
this_message = (CORE_message_queue_Buffer_control *) the_node;
|
||||||
|
|
||||||
|
if ( this_message->priority >= the_message->priority )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_Chain_Insert( the_node, &the_message->Node );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* According to POSIX, does this happen before or after the message
|
||||||
|
* is actually enqueued. It is logical to think afterwards, because
|
||||||
|
* the message is actually in the queue at this point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( the_message_queue->number_of_pending_messages == 1 &&
|
||||||
|
the_message_queue->notify_handler )
|
||||||
|
(*the_message_queue->notify_handler)( the_message_queue->notify_argument );
|
||||||
|
|
||||||
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
|
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Chain_Node Node;
|
Chain_Node Node;
|
||||||
|
int priority;
|
||||||
CORE_message_queue_Buffer Contents;
|
CORE_message_queue_Buffer Contents;
|
||||||
} CORE_message_queue_Buffer_control;
|
} CORE_message_queue_Buffer_control;
|
||||||
|
|
||||||
@@ -72,12 +73,17 @@ typedef enum {
|
|||||||
* The following enumerated type details the modes in which a message
|
* The following enumerated type details the modes in which a message
|
||||||
* may be submitted to a message queue. The message may be posted
|
* may be submitted to a message queue. The message may be posted
|
||||||
* in a send or urgent fashion.
|
* in a send or urgent fashion.
|
||||||
|
*
|
||||||
|
* NOTE: All other values are message priorities. Numerically smaller
|
||||||
|
* priorities indicate higher priority messages.
|
||||||
|
*
|
||||||
|
* XXX these constants should be changed to be compiler dependent.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef enum {
|
#define CORE_MESSAGE_QUEUE_SEND_REQUEST 0x7fffffff
|
||||||
CORE_MESSAGE_QUEUE_SEND_REQUEST = 0,
|
#define CORE_MESSAGE_QUEUE_URGENT_REQUEST -(0x7fffffff)
|
||||||
CORE_MESSAGE_QUEUE_URGENT_REQUEST = 1
|
|
||||||
} CORE_message_queue_Submit_types;
|
typedef int CORE_message_queue_Submit_types;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Core Message queue handler return statuses.
|
* Core Message queue handler return statuses.
|
||||||
|
|||||||
@@ -422,6 +422,7 @@ CORE_message_queue_Status _CORE_message_queue_Submit(
|
|||||||
|
|
||||||
_CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
|
_CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
|
||||||
the_message->Contents.size = size;
|
the_message->Contents.size = size;
|
||||||
|
the_message->priority = submit_type;
|
||||||
|
|
||||||
the_message_queue->number_of_pending_messages += 1;
|
the_message_queue->number_of_pending_messages += 1;
|
||||||
|
|
||||||
@@ -432,7 +433,38 @@ CORE_message_queue_Status _CORE_message_queue_Submit(
|
|||||||
case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
|
case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
|
||||||
_CORE_message_queue_Prepend( the_message_queue, the_message );
|
_CORE_message_queue_Prepend( the_message_queue, the_message );
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
/* XXX interrupt critical section needs to be addressed */
|
||||||
|
{
|
||||||
|
CORE_message_queue_Buffer_control *this_message;
|
||||||
|
Chain_Node *the_node;
|
||||||
|
|
||||||
|
the_message->priority = submit_type;
|
||||||
|
for ( the_node = the_message_queue->Pending_messages.first ;
|
||||||
|
!_Chain_Is_tail( &the_message_queue->Pending_messages, the_node ) ;
|
||||||
|
the_node = the_node->next ) {
|
||||||
|
|
||||||
|
this_message = (CORE_message_queue_Buffer_control *) the_node;
|
||||||
|
|
||||||
|
if ( this_message->priority >= the_message->priority )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_Chain_Insert( the_node, &the_message->Node );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* According to POSIX, does this happen before or after the message
|
||||||
|
* is actually enqueued. It is logical to think afterwards, because
|
||||||
|
* the message is actually in the queue at this point.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( the_message_queue->number_of_pending_messages == 1 &&
|
||||||
|
the_message_queue->notify_handler )
|
||||||
|
(*the_message_queue->notify_handler)( the_message_queue->notify_argument );
|
||||||
|
|
||||||
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
|
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user