summaryrefslogtreecommitdiff
path: root/utility/rtos_compatibility_layers/posix
diff options
context:
space:
mode:
Diffstat (limited to 'utility/rtos_compatibility_layers/posix')
-rw-r--r--utility/rtos_compatibility_layers/posix/px_int.h15
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_arrange_msg.c149
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_create.c11
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_open.c10
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_priority_search.c27
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_receive.c17
-rw-r--r--utility/rtos_compatibility_layers/posix/px_mq_send.c30
-rw-r--r--utility/rtos_compatibility_layers/posix/px_nanosleep.c91
-rw-r--r--utility/rtos_compatibility_layers/posix/px_pth_create.c17
-rw-r--r--utility/rtos_compatibility_layers/posix/px_pth_init.c30
-rw-r--r--utility/rtos_compatibility_layers/posix/px_pth_kill.c12
-rw-r--r--utility/rtos_compatibility_layers/posix/px_pth_sigmask.c9
-rw-r--r--utility/rtos_compatibility_layers/posix/px_sem_open.c8
-rw-r--r--utility/rtos_compatibility_layers/posix/px_sem_unlink.c8
-rw-r--r--utility/rtos_compatibility_layers/posix/px_system_manager.c36
-rw-r--r--utility/rtos_compatibility_layers/posix/readme_threadx_posix.txt2
-rw-r--r--utility/rtos_compatibility_layers/posix/signal.h9
-rw-r--r--utility/rtos_compatibility_layers/posix/tx_posix.h18
18 files changed, 291 insertions, 208 deletions
diff --git a/utility/rtos_compatibility_layers/posix/px_int.h b/utility/rtos_compatibility_layers/posix/px_int.h
index c907d312..9c10a60f 100644
--- a/utility/rtos_compatibility_layers/posix/px_int.h
+++ b/utility/rtos_compatibility_layers/posix/px_int.h
@@ -24,7 +24,7 @@
/* EKP DEFINITIONS RELEASE */
/* */
/* px_int.h PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -39,7 +39,9 @@
/* */
/* 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 Remove unneeded values, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
@@ -52,14 +54,9 @@
#define TX_INITIALIZE_IN_PROGRESS 0xF0F0F0F0UL
#define TX_INITIALIZE_ALMOST_DONE 0xF0F0F0F1UL
-/* Include necessary definition for memory related routines(from tx_byt.c). */
-#define TX_BYTE_BLOCK_FREE 0xFFFFEEEEUL
-#define TX_BYTE_BLOCK_ALLOC 0xAAAAAAAAUL
-#define TX_BYTE_POOL_ID 0x42595445UL
-
/* Threadx min and max priority */
#define TX_HIGHEST_PRIORITY 1
-#define TX_LOWEST_PRIORITY 31
+#define TX_LOWEST_PRIORITY 31
#define PX_HIGHEST_PRIORITY 31
#define PX_LOWEST_PRIORITY 1
@@ -194,7 +191,7 @@ VOID posix_thread_wrapper(ULONG pthr_ptr);
VOID set_default_pthread_attr(pthread_attr_t *attr);
-VOID set_default_mutexattr(pthread_mutexattr_t *attr);
+VOID set_default_mutexattr(pthread_mutexattr_t *attr);
INT posix_allocate_pthread_t(POSIX_TCB **ptcb_ptr);
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_arrange_msg.c b/utility/rtos_compatibility_layers/posix/px_mq_arrange_msg.c
index 6bddee43..2a3a3131 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_arrange_msg.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_arrange_msg.c
@@ -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 )
+ /* If there is 0 or 1 message, no rearranging is needed. */
+ if (numMsgs < 2)
+ {
return(OK);
+ }
- for( msg = 0; msg < numMsgs; msg ++)
+ for (msg = 0; msg < numMsgs; msg++)
{
-
- /* Advance Qread by two pointers to read the priority of the message. */
- Qread = Qread + 2 ;
+ /* 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;
-
- /* Determine if we are at the end. */
- if ( Qread >= Queue ->tx_queue_end)
+ else
+ {
+ /* Not highest priority, go to next message. */
+ q_read = q_read + (TX_POSIX_MESSAGE_SIZE - TX_POSIX_QUEUE_PRIORITY_OFFSET);
+ }
- /* 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);
}
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_create.c b/utility/rtos_compatibility_layers/posix/px_mq_create.c
index 19a55921..e52cefa5 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_create.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_create.c
@@ -26,13 +26,12 @@
#include "pthread.h" /* Posix API */
#include "px_int.h" /* Posix helper functions */
-
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* posix_mq_create PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -74,7 +73,9 @@
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
POSIX_MSG_QUEUE * posix_mq_create (const CHAR * mq_name,
@@ -125,9 +126,9 @@ TX_QUEUE *TheQ;
to store only the message pointer and message length. */
temp1 = tx_queue_create((&(posix_q->queue)),
(CHAR *)mq_name,
- TX_4_ULONG,
+ TX_POSIX_MESSAGE_SIZE,
posix_q->storage,
- (msgq_attr->mq_maxmsg * 16));
+ (msgq_attr->mq_maxmsg * (sizeof(ULONG) * TX_POSIX_MESSAGE_SIZE)));
/* Make sure it worked. */
if (temp1 != TX_SUCCESS)
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_open.c b/utility/rtos_compatibility_layers/posix/px_mq_open.c
index b88c465d..bb041e09 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_open.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_open.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* mq_open PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -68,7 +68,9 @@
/* */
/* 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 Update comparison with NULL, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
mqd_t mq_open(const CHAR * mqName, ULONG oflags,...)
@@ -115,7 +117,7 @@ ULONG temp1;
}
/* Check if name is exist. NULL if successful. */
- if(posix_queue = posix_find_queue(mqName))
+ if((posix_queue = posix_find_queue(mqName)) != NULL)
{
if(posix_queue->unlink_flag == TX_TRUE)
{
@@ -172,7 +174,7 @@ ULONG temp1;
case O_RDWR:
case O_NONBLOCK:
/* Check if name is exist. NULL if successful. */
- if(posix_queue = posix_find_queue(mqName))
+ if((posix_queue = posix_find_queue(mqName)) != NULL)
{
if(posix_queue->unlink_flag == TX_TRUE)
{
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_priority_search.c b/utility/rtos_compatibility_layers/posix/px_mq_priority_search.c
index 5846c94e..07444666 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_priority_search.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_priority_search.c
@@ -12,8 +12,8 @@
/**************************************************************************/
/**************************************************************************/
-/** */
-/** POSIX wrapper for THREADX */
+/** */
+/** POSIX wrapper for THREADX */
/** */
/** */
/** */
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* posix_priority_search PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -63,15 +63,17 @@
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
-ULONG posix_priority_search(mqd_t msgQId ,ULONG priority)
+ULONG posix_priority_search(mqd_t msgQId, ULONG priority)
{
TX_QUEUE *queue;
POSIX_MSG_QUEUE *q_ptr;
-ULONG order;
+ULONG order = 1;
ULONG numMsgs;
UINT index;
ULONG *source;
@@ -87,18 +89,21 @@ ULONG msgp;
source = q_ptr->queue.tx_queue_read;
/* check for same priority. */
- for(index = 0,order = 1;index <= numMsgs ;index++)
+ for(index = 0; index < numMsgs; index++)
{
- source += 2;
+ source += TX_POSIX_QUEUE_PRIORITY_OFFSET;
msgp = *source;
- source += 2;
+ source += (TX_POSIX_MESSAGE_SIZE - TX_POSIX_QUEUE_PRIORITY_OFFSET);
+ /* If we're at end of queue, go to start. */
if(source == q_ptr->queue.tx_queue_end)
source = q_ptr->queue.tx_queue_start;
-
+
+ /* Increment priority count. */
if(priority == msgp)
order += 1;
}
- /* Returns the number of same priority messages. */
+
+ /* Return the number of same priority messages. */
return(order);
}
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_receive.c b/utility/rtos_compatibility_layers/posix/px_mq_receive.c
index 693017d1..f012e187 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_receive.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_receive.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* mq_receive PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -71,7 +71,9 @@
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
ssize_t mq_receive( mqd_t mqdes, VOID * pMsg, size_t msgLen, ULONG *pMsgPrio)
@@ -141,7 +143,7 @@ VOID * message_source;
/* Try to get a message from the message queue. */
/* Create a temporary buffer to get message pointer and message length. */
- temp1 = posix_memory_allocate((sizeof(ULONG)) * 4 , (VOID**)&msgbuf1);
+ temp1 = posix_memory_allocate((sizeof(ULONG)) * TX_POSIX_MESSAGE_SIZE, (VOID**)&msgbuf1);
if(temp1 != TX_SUCCESS )
{
/* Return generic error. */
@@ -212,11 +214,18 @@ VOID * message_source;
my_ptr = ( ULONG *)msgbuf1;
/* Retrieve Message pointer, message Length and message priority. */
+#ifdef TX_64_BIT
+ this_ptr = (CHAR *)((((ALIGN_TYPE)my_ptr[0]) << 32) | my_ptr[1]);
+ length_of_message = my_ptr[2];
+ priority_of_message = my_ptr[3];
+#else
this_ptr = (CHAR *)(*my_ptr);
- message_source = (VOID *)this_ptr;
length_of_message = *(++my_ptr);
priority_of_message = *(++my_ptr);
+#endif
+ message_source = (VOID *)this_ptr;
+
/* Copy message into supplied buffer. */
msgbuf2 = (UCHAR *)pMsg;
diff --git a/utility/rtos_compatibility_layers/posix/px_mq_send.c b/utility/rtos_compatibility_layers/posix/px_mq_send.c
index da566db6..f8cacc09 100644
--- a/utility/rtos_compatibility_layers/posix/px_mq_send.c
+++ b/utility/rtos_compatibility_layers/posix/px_mq_send.c
@@ -26,7 +26,6 @@
#include "pthread.h" /* Posix API */
#include "px_int.h" /* Posix helper functions */
-
/**************************************************************************/
/* */
/* FUNCTION RELEASE */
@@ -73,7 +72,9 @@
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
INT mq_send( mqd_t mqdes, const CHAR * msg_ptr, size_t msg_len,
@@ -88,7 +89,7 @@ UCHAR *source;
UCHAR *destination;
UCHAR *save_ptr;
ULONG mycount;
-ULONG msg[4];
+ULONG msg[TX_POSIX_MESSAGE_SIZE];
/* Assign a temporary variable for clarity. */
Queue = &(mqdes->f_data->queue);
@@ -99,7 +100,7 @@ ULONG msg[4];
{
/* Queue pointer is invalid, return appropriate error code. */
posix_errno = EBADF;
- posix_set_pthread_errno(EBADF);
+ posix_set_pthread_errno(EBADF);
/* Return ERROR. */
return(ERROR);
@@ -110,7 +111,7 @@ ULONG msg[4];
{
/* POSIX doesn't have error for this, hence give default. */
posix_errno = EINTR ;
- posix_set_pthread_errno(EINTR);
+ posix_set_pthread_errno(EINTR);
/* Return ERROR. */
return(ERROR);
@@ -121,7 +122,7 @@ ULONG msg[4];
{
/* Queue descriptor is invalid, set appropriate error code. */
posix_errno = EBADF ;
- posix_set_pthread_errno(EBADF);
+ posix_set_pthread_errno(EBADF);
/* Return ERROR. */
return(ERROR);
@@ -130,7 +131,7 @@ ULONG msg[4];
{
/* Queue pointer is invalid, return appropriate error code. */
posix_errno = EBADF;
- posix_set_pthread_errno(EBADF);
+ posix_set_pthread_errno(EBADF);
/* Return ERROR. */
return(ERROR);
@@ -139,7 +140,7 @@ ULONG msg[4];
{
/* Return appropriate error. */
posix_errno = EINVAL;
- posix_set_pthread_errno(EINVAL);
+ posix_set_pthread_errno(EINVAL);
/* Return error. */
return(ERROR);
@@ -149,7 +150,7 @@ ULONG msg[4];
{
/* POSIX doesn't have error for this, hence give default. */
posix_errno = EINTR ;
- posix_set_pthread_errno(EINTR);
+ posix_set_pthread_errno(EINTR);
/* Return ERROR. */
return(ERROR);
@@ -160,7 +161,7 @@ ULONG msg[4];
{
/* Return message length exceeds max length. */
posix_errno = EMSGSIZE ;
- posix_set_pthread_errno(EMSGSIZE);
+ posix_set_pthread_errno(EMSGSIZE);
/* Return ERROR. */
return(ERROR);
@@ -192,11 +193,18 @@ ULONG msg[4];
/* Restore the pointer of save message. */
source = save_ptr ;
/* Create message that holds saved message pointer and message length. */
+#ifdef TX_64_BIT
+ msg[0] = (ULONG)((ALIGN_TYPE)source >> 32);
+ msg[1] = (ULONG)((ALIGN_TYPE)source);
+ msg[2] = msg_len;
+ msg[3] = msg_prio;
+ msg[4] = posix_priority_search(mqdes, msg_prio);
+#else
msg[0] = (ULONG)source;
msg[1] = msg_len;
msg[2] = msg_prio;
msg[3] = posix_priority_search(mqdes, msg_prio);
-
+#endif
/* Attempt to post the message to the queue. */
temp1 = tx_queue_send(Queue, msg, TX_WAIT_FOREVER);
if ( temp1 != TX_SUCCESS)
diff --git a/utility/rtos_compatibility_layers/posix/px_nanosleep.c b/utility/rtos_compatibility_layers/posix/px_nanosleep.c
index 45f6b040..c9e21cd3 100644
--- a/utility/rtos_compatibility_layers/posix/px_nanosleep.c
+++ b/utility/rtos_compatibility_layers/posix/px_nanosleep.c
@@ -12,40 +12,38 @@
/**************************************************************************/
/**************************************************************************/
-/** */
-/** POSIX wrapper for THREADX */
-/** */
/** */
+/** POSIX wrapper for THREADX */
/** */
/**************************************************************************/
/**************************************************************************/
/* Include necessary system files. */
-#include "tx_api.h" /* Threadx API */
-#include "pthread.h" /* Posix API */
-#include "px_int.h" /* Posix helper functions */
-
+#include "tx_api.h" /* Threadx API */
+#include "pthread.h" /* Posix API */
+#include "px_int.h" /* Posix helper functions */
+#include <limits.h>
-/**************************************************************************/
-/* */
-/* FUNCTION RELEASE */
-/* */
-/* nanosleep PORTABLE C */
-/* 6.1.7 */
+/**************************************************************************/
+/* */
+/* FUNCTION RELEASE */
+/* */
+/* nanosleep PORTABLE C */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
/* */
-/* DESCRIPTION */
+/* DESCRIPTION */
/* */
/* This function shall cause the current thread to be suspended from */
/* execution until the time interval specified by the req argument has */
-/* elapsed */
+/* elapsed. */
/* */
-/* INPUT */
+/* INPUT */
/* */
-/* req Is the number of real-time (as opposed */
+/* req The number of real-time (as opposed */
/* to CPU-time) seconds and nanoseconds to */
/* suspend the calling thread. */
/* rem Points to a structure to receive the */
@@ -53,61 +51,62 @@
/* interrupted by a signal. This pointer */
/* may be NULL. */
/* */
-/* OUTPUT */
-/* */
+/* OUTPUT */
+/* */
/* zero If the function returns because the */
/* requested time has elapsed. */
/* */
/* -1 If this functions fails if req argument */
-/* specified a value less than zero or */
-/* greater than or equal to 1 000 million. */
+/* specified a nanosecond value greater */
+/* than or equal to 1 billion. */
/* */
/* */
-/* CALLS */
+/* CALLS */
/* */
/* tx_thread_sleep ThreadX thread sleep service */
/* */
-/* CALLED BY */
-/* */
-/* Application Code */
-/* */
-/* RELEASE HISTORY */
-/* */
+/* CALLED BY */
+/* */
+/* Application Code */
+/* */
+/* RELEASE HISTORY */
+/* */
/* 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 Fix bounds check, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
INT nanosleep(struct timespec *req, struct timespec *rem)
{
ULONG timer_ticks;
-
- /* Check for valid inputs */
- /* The nanosecond value must be greater than zero or less than 1 000 million. */
- if ( (!req) || ((req->tv_nsec) <= 0) || (req->tv_nsec > 999999999 )) /* 08-11-2005 */
+ /* Check for valid inputs - the nanosecond value must be less than 1 billion
+ and not roll over when converting to ThreadX timer ticks. */
+ if ( (!req) || (req->tv_nsec > 999999999) || ((timer_ticks = (req->tv_sec * CPU_TICKS_PER_SECOND + req->tv_nsec/NANOSECONDS_IN_CPU_TICK)) < req->tv_sec) )
{
posix_errno = EINVAL;
posix_set_pthread_errno(EINVAL);
return(ERROR);
}
-
- /* Convert sleep time into Clock ticks */
- /* Also add some padding so that the thread will sleep no less than the
- specified time */
-
- timer_ticks = (ULONG) ( ( req->tv_sec * CPU_TICKS_PER_SECOND ) + ( req->tv_nsec/ NANOSECONDS_IN_CPU_TICK) + 1 ); /* 08-11-2005 */
- /* Now call ThreadX thread sleep service */
+ /* Add padding of 1 so that the thread will sleep no less than the specified time,
+ except in the case that timer_ticks is ULONG_MAX */
+ if(timer_ticks != ULONG_MAX)
+ {
+ timer_ticks = timer_ticks + 1;
+ }
+
+ /* Now call ThreadX thread sleep service. */
tx_thread_sleep(timer_ticks);
- /* Sleep completed */
- if ( rem ) /* 08-11-2005 */
+ /* Sleep completed. */
+ if (rem)
{
- rem->tv_nsec = 0;
- rem->tv_sec = 0; /* 08-11-2005 */
- }
+ rem->tv_nsec = 0;
+ rem->tv_sec = 0;
+ }
return(OK);
-
}
diff --git a/utility/rtos_compatibility_layers/posix/px_pth_create.c b/utility/rtos_compatibility_layers/posix/px_pth_create.c
index 511026db..60b79f84 100644
--- a/utility/rtos_compatibility_layers/posix/px_pth_create.c
+++ b/utility/rtos_compatibility_layers/posix/px_pth_create.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* pthread_create PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -98,7 +98,10 @@
/* */
/* 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 Add 64-bit support, */
+/* remove double parenthesis, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
INT pthread_create (pthread_t *thread, pthread_attr_t *attr,
@@ -211,7 +214,7 @@ INT status,retval;
status = posix_memory_allocate( pthread_ptr->stack_size, &(pthread_ptr->stack_address));
/* problem allocating stack space */
- if ((status == ERROR))
+ if (status == ERROR)
{
/* Configuration/resource error. */
return(EAGAIN);
@@ -227,17 +230,19 @@ INT status,retval;
/* Now actually create and start the thread. */
/* convert Posix priorities to Threadx priority */
- retval += tx_thread_create( thread_ptr,
+ retval += tx_thread_create(thread_ptr,
"pthr",
posix_thread_wrapper,
- (ULONG)pthread_ptr,
+ (ULONG)(ALIGN_TYPE)pthread_ptr,
pthread_ptr->stack_address,
pthread_ptr->stack_size,
(TX_LOWEST_PRIORITY - pthread_ptr->current_priority + 1),
(TX_LOWEST_PRIORITY - pthread_ptr->threshold + 1),
pthread_ptr->time_slice,
TX_AUTO_START);
-
+
+ TX_THREAD_EXTENSION_PTR_SET(thread_ptr, pthread_ptr)
+
/* See if ThreadX encountered an error */
if (retval)
{
diff --git a/utility/rtos_compatibility_layers/posix/px_pth_init.c b/utility/rtos_compatibility_layers/posix/px_pth_init.c
index d0e54606..1225692c 100644
--- a/utility/rtos_compatibility_layers/posix/px_pth_init.c
+++ b/utility/rtos_compatibility_layers/posix/px_pth_init.c
@@ -318,7 +318,7 @@ ULONG index;
/* FUNCTION RELEASE */
/* */
/* posix_thread_wrapper PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -352,7 +352,9 @@ ULONG index;
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
VOID posix_thread_wrapper(ULONG pthr_ptr)
@@ -362,7 +364,8 @@ POSIX_TCB *pthread_ptr;
VOID *value_ptr;
/* The input argument is really a pointer to the pthread's control block */
- pthread_ptr = (POSIX_TCB *) pthr_ptr;
+ TX_THREAD_EXTENSION_PTR_GET(pthread_ptr, POSIX_TCB, pthr_ptr)
+
/* Invoke the pthread start routine with appropriate arguments */
value_ptr = (pthread_ptr->start_routine)((VOID *)pthread_ptr->entry_parameter);
@@ -668,7 +671,7 @@ POSIX_TCB *pthread;
/* FUNCTION RELEASE */
/* */
/* posix_destroy_pthread PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -701,19 +704,28 @@ POSIX_TCB *pthread;
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
VOID posix_destroy_pthread(POSIX_TCB *pthread_ptr, VOID *value_ptr)
{
-ULONG request[WORK_REQ_SIZE];
-INT status;
+ULONG request[WORK_REQ_SIZE];
+UINT status;
/* Build the request. */
-
- request[0] = (ULONG)pthread_ptr;
+
+#ifdef TX_64_BIT
+ request[0] = (ULONG)((ALIGN_TYPE)pthread_ptr >> 32);
+ request[1] = (ULONG)((ALIGN_TYPE)pthread_ptr);
+ request[2] = (ULONG)((ALIGN_TYPE)value_ptr >> 32);
+ request[3] = (ULONG)((ALIGN_TYPE)value_ptr);
+#else
+ request[0] = (ULONG)pthread_ptr;
request[1] = (ULONG)value_ptr;
+#endif
/* Send a message to the SysMgr supervisor thread, asking it to delete */
/* the pthread. Since the SysMgr supervisor thread is the highest */
diff --git a/utility/rtos_compatibility_layers/posix/px_pth_kill.c b/utility/rtos_compatibility_layers/posix/px_pth_kill.c
index dacdbba0..f84bceb2 100644
--- a/utility/rtos_compatibility_layers/posix/px_pth_kill.c
+++ b/utility/rtos_compatibility_layers/posix/px_pth_kill.c
@@ -33,7 +33,7 @@
/* FUNCTION RELEASE */
/* */
/* pthread_kill PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -73,11 +73,13 @@
/* */
/* 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 Remove double parenthesis, */
+/* update argument type, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
-
-int pthread_kill(ULONG thread_id, int sig)
+int pthread_kill(ALIGN_TYPE thread_id, int sig)
{
TX_INTERRUPT_SAVE_AREA
@@ -197,7 +199,7 @@ UINT retval;
status = posix_memory_allocate(new_signal_thread -> stack_size, &new_signal_thread -> stack_address);
/* problem allocating stack space */
- if ((status == ERROR))
+ if (status == ERROR)
{
/* Mark the previously allocated control block as available. */
diff --git a/utility/rtos_compatibility_layers/posix/px_pth_sigmask.c b/utility/rtos_compatibility_layers/posix/px_pth_sigmask.c
index e2dab686..fa9d1f79 100644
--- a/utility/rtos_compatibility_layers/posix/px_pth_sigmask.c
+++ b/utility/rtos_compatibility_layers/posix/px_pth_sigmask.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* pthread_sigmask PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -68,7 +68,10 @@
/* */
/* 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 Update pthread_kill argument */
+/* cast, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
@@ -188,7 +191,7 @@ ULONG reissue_flag;
base_thread -> signals.signal_pending.signal_set = base_thread -> signals.signal_pending.signal_set & ~(((unsigned long) 1) << signal_number);
/* Call pthread_kill to reissue the signal. */
- pthread_kill((ULONG) base_thread, signal_number);
+ pthread_kill((ALIGN_TYPE) base_thread, signal_number);
/* Set the reissue flag. */
reissue_flag = TX_TRUE;
diff --git a/utility/rtos_compatibility_layers/posix/px_sem_open.c b/utility/rtos_compatibility_layers/posix/px_sem_open.c
index 72b92027..ca97c4e8 100644
--- a/utility/rtos_compatibility_layers/posix/px_sem_open.c
+++ b/utility/rtos_compatibility_layers/posix/px_sem_open.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* sem_open PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -69,7 +69,9 @@
/* */
/* 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 Update comparison with NULL, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
sem_t * sem_open(const CHAR * name, ULONG oflag, ...)
@@ -110,7 +112,7 @@ mode_t mode;
}
/* Check if semaphore exists. */
- if(semid= posix_find_sem( name))
+ if((semid = posix_find_sem(name)) != NULL)
{
if(semid->unlink_flag ==TX_TRUE )
{
diff --git a/utility/rtos_compatibility_layers/posix/px_sem_unlink.c b/utility/rtos_compatibility_layers/posix/px_sem_unlink.c
index 2d7c1e69..564bb224 100644
--- a/utility/rtos_compatibility_layers/posix/px_sem_unlink.c
+++ b/utility/rtos_compatibility_layers/posix/px_sem_unlink.c
@@ -32,7 +32,7 @@
/* FUNCTION RELEASE */
/* */
/* sem_unlink PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -65,7 +65,9 @@
/* */
/* 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 Remove double parenthesis, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
INT sem_unlink(const CHAR * name)
@@ -102,7 +104,7 @@ ULONG len;
sem->unlink_flag =TX_TRUE;
/* Check for the count. */
- if ((sem->count == 0) )
+ if(sem->count == 0)
{
posix_sem_reset(sem );
sem = NULL;
diff --git a/utility/rtos_compatibility_layers/posix/px_system_manager.c b/utility/rtos_compatibility_layers/posix/px_system_manager.c
index 8204b4e3..0e6c6a32 100644
--- a/utility/rtos_compatibility_layers/posix/px_system_manager.c
+++ b/utility/rtos_compatibility_layers/posix/px_system_manager.c
@@ -31,7 +31,7 @@
/* FUNCTION RELEASE */
/* */
/* posix_system_manager_entry PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -63,7 +63,9 @@
/* */
/* 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 Add 64-bit support, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
VOID posix_system_manager_entry(ULONG input)
@@ -72,25 +74,35 @@ VOID posix_system_manager_entry(ULONG input)
UINT status;
ULONG request[WORK_REQ_SIZE];
-
- /* Avoid compiler warning. */
- if (input) { }
+POSIX_TCB *pthread_ptr;
+VOID *value_ptr;
+
+ /* Avoid compiler warning. */
+ TX_PARAMETER_NOT_USED(input);
/* Loop forever, waiting for work requests. */
while(1)
{
- /* Wait forever for the next work request. */
+ /* Wait forever for the next work request. */
status = tx_queue_receive(&posix_work_queue, &request, TX_WAIT_FOREVER);
/* Make sure we didn't encounter any trouble. */
if (status != TX_SUCCESS)
{
- /* Hmmmm... should not happen. */
- /* Anywayjust go back and get the next message. */
- continue;
+ /* Get the next message. */
+ continue;
}
- /* Go delete the pthread */
- posix_do_pthread_delete((POSIX_TCB *)request[0], (VOID *)request[1] );
- } /* System Manager forever loop */
+ #ifdef TX_64_BIT
+ pthread_ptr = (POSIX_TCB *)((((ALIGN_TYPE)request[0]) << 32) | request[1]);
+ value_ptr = (VOID *)((((ALIGN_TYPE)request[2]) << 32) | request[3]);
+ #else
+ pthread_ptr = (POSIX_TCB *)request[0];
+ value_ptr = (VOID *)request[1];
+ #endif
+
+ /* Delete the pthread */
+ posix_do_pthread_delete(pthread_ptr, value_ptr);
+
+ } /* System Manager forever loop */
}
diff --git a/utility/rtos_compatibility_layers/posix/readme_threadx_posix.txt b/utility/rtos_compatibility_layers/posix/readme_threadx_posix.txt
index 82977a8c..5aeb5d52 100644
--- a/utility/rtos_compatibility_layers/posix/readme_threadx_posix.txt
+++ b/utility/rtos_compatibility_layers/posix/readme_threadx_posix.txt
@@ -173,7 +173,7 @@ INT sched_get_priority_min(INT policy)
INT pthread_once (pthread_once_t * once_control, VOID (*init_routine) (VOID))
-INT pthread_kill(ULONG thread_id, int sig)
+INT pthread_kill(ALIGN_TYPE thread_id, int sig)
INT pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask)
diff --git a/utility/rtos_compatibility_layers/posix/signal.h b/utility/rtos_compatibility_layers/posix/signal.h
index 156c88d9..58657684 100644
--- a/utility/rtos_compatibility_layers/posix/signal.h
+++ b/utility/rtos_compatibility_layers/posix/signal.h
@@ -24,7 +24,7 @@
/* EKP DEFINITIONS RELEASE */
/* */
/* signal.h PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -39,7 +39,10 @@
/* */
/* 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 Update pthread_kill argument */
+/* type, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
@@ -100,7 +103,7 @@ typedef struct signal_info_struct
/* Define public POSIX routines. */
int signal(int signo, void (*func)(int));
-int pthread_kill(ULONG thread, int sig);
+int pthread_kill(ALIGN_TYPE thread, int sig);
int sigwait(const sigset_t *set, int *sig);
int sigemptyset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
diff --git a/utility/rtos_compatibility_layers/posix/tx_posix.h b/utility/rtos_compatibility_layers/posix/tx_posix.h
index e6f8406c..db85e00b 100644
--- a/utility/rtos_compatibility_layers/posix/tx_posix.h
+++ b/utility/rtos_compatibility_layers/posix/tx_posix.h
@@ -24,7 +24,7 @@
/* EKP DEFINITIONS RELEASE */
/* */
/* tx_posix.h PORTABLE C */
-/* 6.1.7 */
+/* 6.2.0 */
/* AUTHOR */
/* */
/* William E. Lamie, Microsoft Corporation */
@@ -39,7 +39,10 @@
/* */
/* 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 Update WORK_REQ_SIZE value, */
+/* update pthread_t typedef, */
+/* resulting in version 6.2.0 */
/* */
/**************************************************************************/
@@ -65,6 +68,13 @@
#define MQ_FLAGS 0
#define MQ_PRIO_MAX 32 /* Maximum priority of message. */
+#ifdef TX_64_BIT
+#define TX_POSIX_MESSAGE_SIZE 5
+#define TX_POSIX_QUEUE_PRIORITY_OFFSET 3
+#else
+#define TX_POSIX_MESSAGE_SIZE 4
+#define TX_POSIX_QUEUE_PRIORITY_OFFSET 2
+#endif
/************************************************************************/
/* Global Variables */
/************************************************************************/
@@ -254,7 +264,7 @@ typedef ULONG BOOL;
/* these constants control internal working of the systemmanager thread */
-#define WORK_REQ_SIZE TX_2_ULONG
+#define WORK_REQ_SIZE (TX_2_ULONG * (sizeof(ALIGN_TYPE)/sizeof(ULONG)))
#define WORK_QUEUE_DEPTH 10
#define SYSMGR_PRIORITY 0
@@ -279,7 +289,7 @@ typedef struct pthread_attr_obj
typedef INT ssize_t ; /* this should be pulled in from sys\types.h */
-typedef ULONG pthread_t;
+typedef ALIGN_TYPE pthread_t;
typedef ULONG mode_t;