1 /**************************************************************************/
2 /* */
3 /* Copyright (c) Microsoft Corporation. All rights reserved. */
4 /* */
5 /* This software is licensed under the Microsoft Software License */
6 /* Terms for Microsoft Azure RTOS. Full text of the license can be */
7 /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
8 /* and in the root directory of this software. */
9 /* */
10 /**************************************************************************/
11
12
13 /**************************************************************************/
14 /**************************************************************************/
15 /** */
16 /** POSIX wrapper for THREADX */
17 /** */
18 /** */
19 /** */
20 /**************************************************************************/
21 /**************************************************************************/
22
23 /* Include necessary system files. */
24
25 #include "tx_api.h" /* Threadx API */
26 #include "pthread.h" /* Posix API */
27 #include "px_int.h" /* Posix helper functions */
28
29
30 /**************************************************************************/
31 /* */
32 /* FUNCTION RELEASE */
33 /* */
34 /* posix_get_new_sem PORTABLE C */
35 /* 6.1.7 */
36 /* AUTHOR */
37 /* */
38 /* William E. Lamie, Microsoft Corporation */
39 /* */
40 /* DESCRIPTION */
41 /* */
42 /* This function attempts to acquire a ThreadX semaphore from */
43 /* the POSIX semaphore pool. */
44 /* */
45 /* INPUT */
46 /* */
47 /* None */
48 /* */
49 /* OUTPUT */
50 /* */
51 /* tx_sem ThreadX semaphore pointer */
52 /* */
53 /* CALLS */
54 /* */
55 /* None */
56 /* */
57 /* CALLED BY */
58 /* */
59 /* POSIX internal Code */
60 /* */
61 /* RELEASE HISTORY */
62 /* */
63 /* DATE NAME DESCRIPTION */
64 /* */
65 /* 06-02-2021 William E. Lamie Initial Version 6.1.7 */
66 /* */
67 /**************************************************************************/
posix_get_new_sem(VOID)68 TX_SEMAPHORE * posix_get_new_sem(VOID)
69 {
70
71 ULONG i;
72 TX_SEMAPHORE *tx_sem;
73 sem_t *sem_ptr;
74
75 /* Loop through the list of semaphores - */
76 /* try to find one that is not "in use" */
77 /* Start out pessimistic - assume we won't find a match. */
78 tx_sem = (TX_SEMAPHORE *)0;
79
80 /* Search the semaphore pool for an available semaphore. */
81 for (i = 0, sem_ptr = &(posix_sem_pool[0]);
82 i < SEM_NSEMS_MAX;
83 i++, sem_ptr++)
84 {
85 /* Make sure the semaphore is not already "in use". */
86 if (sem_ptr->in_use == TX_FALSE)
87 {
88
89 /* Found one! */
90 tx_sem = MAKE_TX_SEM(sem_ptr);
91
92 /* This semaphore is now in use. */
93 sem_ptr->in_use = TX_TRUE;
94
95 break;
96 }
97 }
98 return(tx_sem);
99 }
100