xref: /relibc/pthreads-emb/pte_generic_osal.h (revision 062c5bc4dfeed2c1bed58ed4810dd27adb32c68d)
1*062c5bc4SJason Schmidlapp /*
2*062c5bc4SJason Schmidlapp  * pte_cancellable_wait.c
3*062c5bc4SJason Schmidlapp  *
4*062c5bc4SJason Schmidlapp  * Description:
5*062c5bc4SJason Schmidlapp  *
6*062c5bc4SJason Schmidlapp  * --------------------------------------------------------------------------
7*062c5bc4SJason Schmidlapp  *
8*062c5bc4SJason Schmidlapp  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
9*062c5bc4SJason Schmidlapp  *      Copyright(C) 2008 Jason Schmidlapp
10*062c5bc4SJason Schmidlapp  *
11*062c5bc4SJason Schmidlapp  *      Contact Email: jschmidlapp@users.sourceforge.net
12*062c5bc4SJason Schmidlapp  *
13*062c5bc4SJason Schmidlapp  *      This library is free software; you can redistribute it and/or
14*062c5bc4SJason Schmidlapp  *      modify it under the terms of the GNU Lesser General Public
15*062c5bc4SJason Schmidlapp  *      License as published by the Free Software Foundation; either
16*062c5bc4SJason Schmidlapp  *      version 2 of the License, or (at your option) any later version.
17*062c5bc4SJason Schmidlapp  *
18*062c5bc4SJason Schmidlapp  *      This library is distributed in the hope that it will be useful,
19*062c5bc4SJason Schmidlapp  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
20*062c5bc4SJason Schmidlapp  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21*062c5bc4SJason Schmidlapp  *      Lesser General Public License for more details.
22*062c5bc4SJason Schmidlapp  *
23*062c5bc4SJason Schmidlapp  *      You should have received a copy of the GNU Lesser General Public
24*062c5bc4SJason Schmidlapp  *      License along with this library in the file COPYING.LIB;
25*062c5bc4SJason Schmidlapp  *      if not, write to the Free Software Foundation, Inc.,
26*062c5bc4SJason Schmidlapp  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
27*062c5bc4SJason Schmidlapp  */
28*062c5bc4SJason Schmidlapp 
29*062c5bc4SJason Schmidlapp #ifndef _GENERIC_OS_SUPPORT_H_
30*062c5bc4SJason Schmidlapp #define _GENERIC_OS_SUPPORT_H_
31*062c5bc4SJason Schmidlapp 
32*062c5bc4SJason Schmidlapp #ifdef __cplusplus
33*062c5bc4SJason Schmidlapp extern "C" {
34*062c5bc4SJason Schmidlapp #endif // __cplusplus
35*062c5bc4SJason Schmidlapp 
36*062c5bc4SJason Schmidlapp /** @name Misc */
37*062c5bc4SJason Schmidlapp //@{
38*062c5bc4SJason Schmidlapp typedef enum pte_osResult
39*062c5bc4SJason Schmidlapp {
40*062c5bc4SJason Schmidlapp 
41*062c5bc4SJason Schmidlapp   /** Operation completed successfully */
42*062c5bc4SJason Schmidlapp   PTE_OS_OK = 0,
43*062c5bc4SJason Schmidlapp 
44*062c5bc4SJason Schmidlapp   /** Operation failed because there insufficient resources */
45*062c5bc4SJason Schmidlapp   PTE_OS_NO_RESOURCES,
46*062c5bc4SJason Schmidlapp 
47*062c5bc4SJason Schmidlapp   /** Operation failed due to a general failure */
48*062c5bc4SJason Schmidlapp   PTE_OS_GENERAL_FAILURE,
49*062c5bc4SJason Schmidlapp 
50*062c5bc4SJason Schmidlapp   /** Operation did not complete because a user specified timeout expired. */
51*062c5bc4SJason Schmidlapp   PTE_OS_TIMEOUT,
52*062c5bc4SJason Schmidlapp 
53*062c5bc4SJason Schmidlapp   /** The operation was interrupted before it could complete. */
54*062c5bc4SJason Schmidlapp   PTE_OS_INTERRUPTED,
55*062c5bc4SJason Schmidlapp 
56*062c5bc4SJason Schmidlapp   /** An invalid parameter was specified */
57*062c5bc4SJason Schmidlapp   PTE_OS_INVALID_PARAM
58*062c5bc4SJason Schmidlapp 
59*062c5bc4SJason Schmidlapp 
60*062c5bc4SJason Schmidlapp } pte_osResult;
61*062c5bc4SJason Schmidlapp 
62*062c5bc4SJason Schmidlapp /**
63*062c5bc4SJason Schmidlapp  * Provides a hook for the OSAL to implement any OS specific initialization.  This is guaranteed to be
64*062c5bc4SJason Schmidlapp  * called before any other OSAL function.
65*062c5bc4SJason Schmidlapp  */
66*062c5bc4SJason Schmidlapp pte_osResult pte_osInit(void);
67*062c5bc4SJason Schmidlapp //@}
68*062c5bc4SJason Schmidlapp 
69*062c5bc4SJason Schmidlapp /** @name Mutexes */
70*062c5bc4SJason Schmidlapp //@{
71*062c5bc4SJason Schmidlapp 
72*062c5bc4SJason Schmidlapp /**
73*062c5bc4SJason Schmidlapp  * Creates a mutex
74*062c5bc4SJason Schmidlapp  *
75*062c5bc4SJason Schmidlapp  * @param pHandle  Set to the handle of the newly created mutex.
76*062c5bc4SJason Schmidlapp  *
77*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Mutex successfully created
78*062c5bc4SJason Schmidlapp  * @return PTE_OS_NO_RESOURCESs - Insufficient resources to create mutex
79*062c5bc4SJason Schmidlapp  */
80*062c5bc4SJason Schmidlapp pte_osResult pte_osMutexCreate(pte_osMutexHandle *pHandle);
81*062c5bc4SJason Schmidlapp 
82*062c5bc4SJason Schmidlapp /**
83*062c5bc4SJason Schmidlapp  * Deletes a mutex and frees any associated resources.
84*062c5bc4SJason Schmidlapp  *
85*062c5bc4SJason Schmidlapp  * @param handle Handle of mutex to delete.
86*062c5bc4SJason Schmidlapp  *
87*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Mutex successfully deleted.
88*062c5bc4SJason Schmidlapp  */
89*062c5bc4SJason Schmidlapp pte_osResult pte_osMutexDelete(pte_osMutexHandle handle);
90*062c5bc4SJason Schmidlapp 
91*062c5bc4SJason Schmidlapp /**
92*062c5bc4SJason Schmidlapp  * Locks the mutex
93*062c5bc4SJason Schmidlapp  *
94*062c5bc4SJason Schmidlapp  * @param handle Handle of mutex to lock.
95*062c5bc4SJason Schmidlapp  *
96*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Mutex successfully locked.
97*062c5bc4SJason Schmidlapp  */
98*062c5bc4SJason Schmidlapp pte_osResult pte_osMutexLock(pte_osMutexHandle handle);
99*062c5bc4SJason Schmidlapp 
100*062c5bc4SJason Schmidlapp /**
101*062c5bc4SJason Schmidlapp  * Locks the mutex, returning after @p timeoutMsecs if the resources is not
102*062c5bc4SJason Schmidlapp  * available.  Can be used for polling mutex by using @p timeoutMsecs of zero.
103*062c5bc4SJason Schmidlapp  *
104*062c5bc4SJason Schmidlapp  * @param handle Handle of mutex to lock.
105*062c5bc4SJason Schmidlapp  * @param timeoutMsecs Number of milliseconds to wait for resource before returning.
106*062c5bc4SJason Schmidlapp  *
107*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Mutex successfully locked.
108*062c5bc4SJason Schmidlapp  * @return PTE_OS_TIMEOUT - Timeout expired before lock was obtained.
109*062c5bc4SJason Schmidlapp  */
110*062c5bc4SJason Schmidlapp pte_osResult pte_osMutexTimedLock(pte_osMutexHandle handle, unsigned int timeoutMsecs);
111*062c5bc4SJason Schmidlapp 
112*062c5bc4SJason Schmidlapp /**
113*062c5bc4SJason Schmidlapp  * Unlocks the mutex
114*062c5bc4SJason Schmidlapp  *
115*062c5bc4SJason Schmidlapp  * @param handle Handle of mutex to unlock
116*062c5bc4SJason Schmidlapp  *
117*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Mutex successfully unlocked.
118*062c5bc4SJason Schmidlapp  */
119*062c5bc4SJason Schmidlapp pte_osResult pte_osMutexUnlock(pte_osMutexHandle handle);
120*062c5bc4SJason Schmidlapp //@}
121*062c5bc4SJason Schmidlapp 
122*062c5bc4SJason Schmidlapp /** @name Threads */
123*062c5bc4SJason Schmidlapp //@{
124*062c5bc4SJason Schmidlapp typedef int (*pte_osThreadEntryPoint)(void *params);
125*062c5bc4SJason Schmidlapp 
126*062c5bc4SJason Schmidlapp 
127*062c5bc4SJason Schmidlapp /**
128*062c5bc4SJason Schmidlapp  * Creates a new thread.  The thread must be started in a suspended state - it will be
129*062c5bc4SJason Schmidlapp  * explicitly started when pte_osThreadStart() is called.
130*062c5bc4SJason Schmidlapp  *
131*062c5bc4SJason Schmidlapp  * @param entryPoint Entry point to the new thread.
132*062c5bc4SJason Schmidlapp  * @param stackSize The initial stack size, in bytes.  Note that this can be considered a minimum -
133*062c5bc4SJason Schmidlapp  *                  for instance if the OS requires a larger stack space than what the caller specified.
134*062c5bc4SJason Schmidlapp  * @param initialPriority The priority that the new thread should be initially set to.
135*062c5bc4SJason Schmidlapp  * @param argv Parameter to pass to the new thread.
136*062c5bc4SJason Schmidlapp  * @param ppte_osThreadHandle set to the handle of the new thread.
137*062c5bc4SJason Schmidlapp  *
138*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - New thread successfully created.
139*062c5bc4SJason Schmidlapp  * @return PTE_OS_NO_RESOURCESs - Insufficient resources to create thread
140*062c5bc4SJason Schmidlapp  */
141*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadCreate(pte_osThreadEntryPoint entryPoint,
142*062c5bc4SJason Schmidlapp                                 int stackSize,
143*062c5bc4SJason Schmidlapp                                 int initialPriority,
144*062c5bc4SJason Schmidlapp                                 void *argv,
145*062c5bc4SJason Schmidlapp                                 pte_osThreadHandle* ppte_osThreadHandle);
146*062c5bc4SJason Schmidlapp 
147*062c5bc4SJason Schmidlapp /**
148*062c5bc4SJason Schmidlapp  * Starts executing the specified thread.
149*062c5bc4SJason Schmidlapp  *
150*062c5bc4SJason Schmidlapp  * @param osThreadHandle handle of the thread to start.
151*062c5bc4SJason Schmidlapp  *
152*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - thread successfully started.
153*062c5bc4SJason Schmidlapp  */
154*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadStart(pte_osThreadHandle osThreadHandle);
155*062c5bc4SJason Schmidlapp 
156*062c5bc4SJason Schmidlapp /**
157*062c5bc4SJason Schmidlapp  * Causes the current thread to stop executing.
158*062c5bc4SJason Schmidlapp  *
159*062c5bc4SJason Schmidlapp  * @return Never returns (thread terminated)
160*062c5bc4SJason Schmidlapp  */
161*062c5bc4SJason Schmidlapp void pte_osThreadExit();
162*062c5bc4SJason Schmidlapp 
163*062c5bc4SJason Schmidlapp /**
164*062c5bc4SJason Schmidlapp  * Waits for the specified thread to end.  If the thread has already terminated, this returns
165*062c5bc4SJason Schmidlapp  * immediately.
166*062c5bc4SJason Schmidlapp  *
167*062c5bc4SJason Schmidlapp  * @param threadHandle Handle fo thread to wait for.
168*062c5bc4SJason Schmidlapp  *
169*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - specified thread terminated.
170*062c5bc4SJason Schmidlapp  */
171*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadWaitForEnd(pte_osThreadHandle threadHandle);
172*062c5bc4SJason Schmidlapp 
173*062c5bc4SJason Schmidlapp /**
174*062c5bc4SJason Schmidlapp  * Returns the handle of the currently executing thread.
175*062c5bc4SJason Schmidlapp  */
176*062c5bc4SJason Schmidlapp pte_osThreadHandle pte_osThreadGetHandle(void);
177*062c5bc4SJason Schmidlapp 
178*062c5bc4SJason Schmidlapp /**
179*062c5bc4SJason Schmidlapp  * Returns the priority of the specified thread.
180*062c5bc4SJason Schmidlapp  */
181*062c5bc4SJason Schmidlapp int pte_osThreadGetPriority(pte_osThreadHandle threadHandle);
182*062c5bc4SJason Schmidlapp 
183*062c5bc4SJason Schmidlapp /**
184*062c5bc4SJason Schmidlapp  * Sets the priority of the specified thread.
185*062c5bc4SJason Schmidlapp  *
186*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - thread priority successfully set
187*062c5bc4SJason Schmidlapp  */
188*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadSetPriority(pte_osThreadHandle threadHandle, int newPriority);
189*062c5bc4SJason Schmidlapp 
190*062c5bc4SJason Schmidlapp /**
191*062c5bc4SJason Schmidlapp  * Frees resources associated with the specified thread.  This is called after the thread has terminated
192*062c5bc4SJason Schmidlapp  * and is no longer needed (e.g. after pthread_join returns).  This call will always be made
193*062c5bc4SJason Schmidlapp  * from a different context than that of the target thread.
194*062c5bc4SJason Schmidlapp  */
195*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadDelete(pte_osThreadHandle handle);
196*062c5bc4SJason Schmidlapp 
197*062c5bc4SJason Schmidlapp /**
198*062c5bc4SJason Schmidlapp  * Frees resources associated with the specified thread and then causes the thread to exit.
199*062c5bc4SJason Schmidlapp  * This is called after the thread has terminated and is no longer needed (e.g. after
200*062c5bc4SJason Schmidlapp  * pthread_join returns).  This call will always be made from the context of the target thread.
201*062c5bc4SJason Schmidlapp  */
202*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadExitAndDelete(pte_osThreadHandle handle);
203*062c5bc4SJason Schmidlapp 
204*062c5bc4SJason Schmidlapp /**
205*062c5bc4SJason Schmidlapp  * Cancels the specified thread.  This should cause pte_osSemaphoreCancellablePend() and for pte_osThreadCheckCancel()
206*062c5bc4SJason Schmidlapp  * to return @p PTE_OS_INTERRUPTED.
207*062c5bc4SJason Schmidlapp  *
208*062c5bc4SJason Schmidlapp  * @param threadHandle handle to the thread to cancel.
209*062c5bc4SJason Schmidlapp  *
210*062c5bc4SJason Schmidlapp  * @return Thread successfully canceled.
211*062c5bc4SJason Schmidlapp  */
212*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadCancel(pte_osThreadHandle threadHandle);
213*062c5bc4SJason Schmidlapp 
214*062c5bc4SJason Schmidlapp /**
215*062c5bc4SJason Schmidlapp  * Check if pte_osThreadCancel() has been called on the specified thread.
216*062c5bc4SJason Schmidlapp  *
217*062c5bc4SJason Schmidlapp  * @param threadHandle handle of thread to check the state of.
218*062c5bc4SJason Schmidlapp  *
219*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Thread has not been cancelled
220*062c5bc4SJason Schmidlapp  * @return PTE_OS_INTERRUPTED - Thread has been cancelled.
221*062c5bc4SJason Schmidlapp  */
222*062c5bc4SJason Schmidlapp pte_osResult pte_osThreadCheckCancel(pte_osThreadHandle threadHandle);
223*062c5bc4SJason Schmidlapp 
224*062c5bc4SJason Schmidlapp /**
225*062c5bc4SJason Schmidlapp  * Causes the current thread to sleep for the specified number of milliseconds.
226*062c5bc4SJason Schmidlapp  */
227*062c5bc4SJason Schmidlapp void pte_osThreadSleep(unsigned int msecs);
228*062c5bc4SJason Schmidlapp 
229*062c5bc4SJason Schmidlapp /**
230*062c5bc4SJason Schmidlapp  * Returns the maximum allowable priority
231*062c5bc4SJason Schmidlapp  */
232*062c5bc4SJason Schmidlapp int pte_osThreadGetMaxPriority();
233*062c5bc4SJason Schmidlapp 
234*062c5bc4SJason Schmidlapp /**
235*062c5bc4SJason Schmidlapp  * Returns the minimum allowable priority
236*062c5bc4SJason Schmidlapp  */
237*062c5bc4SJason Schmidlapp int pte_osThreadGetMinPriority();
238*062c5bc4SJason Schmidlapp 
239*062c5bc4SJason Schmidlapp /**
240*062c5bc4SJason Schmidlapp  * Returns the priority that should be used if the caller to pthread_create doesn't
241*062c5bc4SJason Schmidlapp  * explicitly set one.
242*062c5bc4SJason Schmidlapp  */
243*062c5bc4SJason Schmidlapp int pte_osThreadGetDefaultPriority();
244*062c5bc4SJason Schmidlapp 
245*062c5bc4SJason Schmidlapp //@}
246*062c5bc4SJason Schmidlapp 
247*062c5bc4SJason Schmidlapp 
248*062c5bc4SJason Schmidlapp /** @name Semaphores */
249*062c5bc4SJason Schmidlapp //@{
250*062c5bc4SJason Schmidlapp 
251*062c5bc4SJason Schmidlapp /**
252*062c5bc4SJason Schmidlapp  * Creates a semaphore
253*062c5bc4SJason Schmidlapp  *
254*062c5bc4SJason Schmidlapp  * @param initialValue Initial value of the semaphore
255*062c5bc4SJason Schmidlapp  * @param pHandle  Set to the handle of the newly created semaphore.
256*062c5bc4SJason Schmidlapp  *
257*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Semaphore successfully created
258*062c5bc4SJason Schmidlapp  * @return PTE_OS_NO_RESOURCESs - Insufficient resources to create semaphore
259*062c5bc4SJason Schmidlapp  */
260*062c5bc4SJason Schmidlapp pte_osResult pte_osSemaphoreCreate(int initialValue, pte_osSemaphoreHandle *pHandle);
261*062c5bc4SJason Schmidlapp 
262*062c5bc4SJason Schmidlapp /**
263*062c5bc4SJason Schmidlapp  * Deletes a semaphore and frees any associated resources.
264*062c5bc4SJason Schmidlapp  *
265*062c5bc4SJason Schmidlapp  * @param handle Handle of semaphore to delete.
266*062c5bc4SJason Schmidlapp  *
267*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Semaphore successfully deleted.
268*062c5bc4SJason Schmidlapp  */
269*062c5bc4SJason Schmidlapp pte_osResult pte_osSemaphoreDelete(pte_osSemaphoreHandle handle);
270*062c5bc4SJason Schmidlapp 
271*062c5bc4SJason Schmidlapp /**
272*062c5bc4SJason Schmidlapp  * Posts to the semaphore
273*062c5bc4SJason Schmidlapp  *
274*062c5bc4SJason Schmidlapp  * @param handle Semaphore to release
275*062c5bc4SJason Schmidlapp  * @param count  Amount to increment the semaphore by.
276*062c5bc4SJason Schmidlapp  *
277*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - semaphore successfully released.
278*062c5bc4SJason Schmidlapp  */
279*062c5bc4SJason Schmidlapp pte_osResult pte_osSemaphorePost(pte_osSemaphoreHandle handle, int count);
280*062c5bc4SJason Schmidlapp 
281*062c5bc4SJason Schmidlapp /**
282*062c5bc4SJason Schmidlapp  * Acquire a semaphore, returning after @p timeoutMsecs if the semaphore is not
283*062c5bc4SJason Schmidlapp  * available.  Can be used for polling a semaphore by using @p timeoutMsecs of zero.
284*062c5bc4SJason Schmidlapp  *
285*062c5bc4SJason Schmidlapp  * @param handle Handle of semaphore to acquire.
286*062c5bc4SJason Schmidlapp  * @param pTimeout Pointer to the number of milliseconds to wait to acquire the semaphore
287*062c5bc4SJason Schmidlapp  *                 before returning.  If set to NULL, wait forever.
288*062c5bc4SJason Schmidlapp  *
289*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Semaphore successfully acquired.
290*062c5bc4SJason Schmidlapp  * @return PTE_OS_TIMEOUT - Timeout expired before semaphore was obtained.
291*062c5bc4SJason Schmidlapp  */
292*062c5bc4SJason Schmidlapp pte_osResult pte_osSemaphorePend(pte_osSemaphoreHandle handle, unsigned int *pTimeout);
293*062c5bc4SJason Schmidlapp 
294*062c5bc4SJason Schmidlapp /**
295*062c5bc4SJason Schmidlapp  * Acquire a semaphore, returning after @p timeoutMsecs if the semaphore is not
296*062c5bc4SJason Schmidlapp  * available.  Can be used for polling a semaphore by using @p timeoutMsecs of zero.
297*062c5bc4SJason Schmidlapp  * Call must return immediately if pte_osThreadCancel() is called on the thread waiting for
298*062c5bc4SJason Schmidlapp  * the semaphore.
299*062c5bc4SJason Schmidlapp  *
300*062c5bc4SJason Schmidlapp  * @param handle Handle of semaphore to acquire.
301*062c5bc4SJason Schmidlapp  * @param pTimeout Pointer to the number of milliseconds to wait to acquire the semaphore
302*062c5bc4SJason Schmidlapp  *                 before returning.  If set to NULL, wait forever.
303*062c5bc4SJason Schmidlapp  *
304*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - Semaphore successfully acquired.
305*062c5bc4SJason Schmidlapp  * @return PTE_OS_TIMEOUT - Timeout expired before semaphore was obtained.
306*062c5bc4SJason Schmidlapp  */
307*062c5bc4SJason Schmidlapp pte_osResult pte_osSemaphoreCancellablePend(pte_osSemaphoreHandle handle, unsigned int *pTimeout);
308*062c5bc4SJason Schmidlapp //@}
309*062c5bc4SJason Schmidlapp 
310*062c5bc4SJason Schmidlapp 
311*062c5bc4SJason Schmidlapp /** @name Thread Local Storage */
312*062c5bc4SJason Schmidlapp //@{
313*062c5bc4SJason Schmidlapp /**
314*062c5bc4SJason Schmidlapp  * Sets the thread specific value for the specified key for the
315*062c5bc4SJason Schmidlapp  * currently executing thread.
316*062c5bc4SJason Schmidlapp  *
317*062c5bc4SJason Schmidlapp  * @param index The TLS key for the value.
318*062c5bc4SJason Schmidlapp  * @param value The value to save
319*062c5bc4SJason Schmidlapp  */
320*062c5bc4SJason Schmidlapp pte_osResult pte_osTlsSetValue(unsigned int key, void * value);
321*062c5bc4SJason Schmidlapp 
322*062c5bc4SJason Schmidlapp /**
323*062c5bc4SJason Schmidlapp  * Retrieves the thread specific value for the specified key for
324*062c5bc4SJason Schmidlapp  * the currently executing thread.  If a value has not been set
325*062c5bc4SJason Schmidlapp  * for this key, NULL should be returned (i.e. TLS values default
326*062c5bc4SJason Schmidlapp  * to NULL).
327*062c5bc4SJason Schmidlapp  *
328*062c5bc4SJason Schmidlapp  * @param index The TLS key for the value.
329*062c5bc4SJason Schmidlapp  *
330*062c5bc4SJason Schmidlapp  * @return The value associated with @p key for the current thread.
331*062c5bc4SJason Schmidlapp  */
332*062c5bc4SJason Schmidlapp void * pte_osTlsGetValue(unsigned int key);
333*062c5bc4SJason Schmidlapp 
334*062c5bc4SJason Schmidlapp /**
335*062c5bc4SJason Schmidlapp  * Initializes the OS TLS support.  This is called by the PTE library
336*062c5bc4SJason Schmidlapp  * prior to performing ANY TLS operation.
337*062c5bc4SJason Schmidlapp  */
338*062c5bc4SJason Schmidlapp void pte_osTlsInit(void);
339*062c5bc4SJason Schmidlapp 
340*062c5bc4SJason Schmidlapp /**
341*062c5bc4SJason Schmidlapp  * Allocates a new TLS key.
342*062c5bc4SJason Schmidlapp  *
343*062c5bc4SJason Schmidlapp  * @param pKey On success will be set to the newly allocated key.
344*062c5bc4SJason Schmidlapp  *
345*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - TLS key successfully allocated.
346*062c5bc4SJason Schmidlapp  * @return PTE_OS_NO_RESOURCESs - Insufficient resources to allocate key (e.g.
347*062c5bc4SJason Schmidlapp  *                         maximum number of keys reached).
348*062c5bc4SJason Schmidlapp  */
349*062c5bc4SJason Schmidlapp pte_osResult pte_osTlsAlloc(unsigned int *pKey);
350*062c5bc4SJason Schmidlapp 
351*062c5bc4SJason Schmidlapp /**
352*062c5bc4SJason Schmidlapp  * Frees the specified TLS key.
353*062c5bc4SJason Schmidlapp  *
354*062c5bc4SJason Schmidlapp  * @param index TLS key to free
355*062c5bc4SJason Schmidlapp  *
356*062c5bc4SJason Schmidlapp  * @return PTE_OS_OK - TLS key was successfully freed.
357*062c5bc4SJason Schmidlapp  */
358*062c5bc4SJason Schmidlapp pte_osResult pte_osTlsFree(unsigned int key);
359*062c5bc4SJason Schmidlapp //@}
360*062c5bc4SJason Schmidlapp 
361*062c5bc4SJason Schmidlapp /** @name Atomic operations */
362*062c5bc4SJason Schmidlapp //@{
363*062c5bc4SJason Schmidlapp 
364*062c5bc4SJason Schmidlapp /**
365*062c5bc4SJason Schmidlapp  * Sets the target to the specified value as an atomic operation.
366*062c5bc4SJason Schmidlapp  *
367*062c5bc4SJason Schmidlapp  * \code
368*062c5bc4SJason Schmidlapp  * origVal = *ptarg
369*062c5bc4SJason Schmidlapp  * *ptarg = val
370*062c5bc4SJason Schmidlapp  * return origVal
371*062c5bc4SJason Schmidlapp  * \endcode
372*062c5bc4SJason Schmidlapp  *
373*062c5bc4SJason Schmidlapp  * @param pTarg Pointer to the value to be exchanged.
374*062c5bc4SJason Schmidlapp  * @param val Value to be exchanged
375*062c5bc4SJason Schmidlapp  *
376*062c5bc4SJason Schmidlapp  * @return original value of destination
377*062c5bc4SJason Schmidlapp  */
378*062c5bc4SJason Schmidlapp int pte_osAtomicExchange(int *pTarg, int val);
379*062c5bc4SJason Schmidlapp 
380*062c5bc4SJason Schmidlapp /**
381*062c5bc4SJason Schmidlapp  * Performs an atomic compare-and-exchange oepration on the specified
382*062c5bc4SJason Schmidlapp  * value.  That is:
383*062c5bc4SJason Schmidlapp  *
384*062c5bc4SJason Schmidlapp  * \code
385*062c5bc4SJason Schmidlapp  * origVal = *pdest
386*062c5bc4SJason Schmidlapp  * if (*pdest == comp)
387*062c5bc4SJason Schmidlapp  *   then *pdest = exchange
388*062c5bc4SJason Schmidlapp  * return origVal
389*062c5bc4SJason Schmidlapp  * \endcode
390*062c5bc4SJason Schmidlapp  *
391*062c5bc4SJason Schmidlapp  * @param pdest Pointer to the destination value.
392*062c5bc4SJason Schmidlapp  * @param exchange Exchange value (value to set destination to if destination == comparand)
393*062c5bc4SJason Schmidlapp  * @param comp The value to compare to destination.
394*062c5bc4SJason Schmidlapp  *
395*062c5bc4SJason Schmidlapp  * @return Original value of destination
396*062c5bc4SJason Schmidlapp  */
397*062c5bc4SJason Schmidlapp int pte_osAtomicCompareExchange(int *pdest, int exchange, int comp);
398*062c5bc4SJason Schmidlapp 
399*062c5bc4SJason Schmidlapp /**
400*062c5bc4SJason Schmidlapp  * Adds the value to target as an atomic operation
401*062c5bc4SJason Schmidlapp  *
402*062c5bc4SJason Schmidlapp  * \code
403*062c5bc4SJason Schmidlapp  * origVal = *pdest
404*062c5bc4SJason Schmidlapp  * *pAddend += value
405*062c5bc4SJason Schmidlapp  * return origVal
406*062c5bc4SJason Schmidlapp  * \endcode
407*062c5bc4SJason Schmidlapp  *
408*062c5bc4SJason Schmidlapp  * @param pdest Pointer to the variable to be updated.
409*062c5bc4SJason Schmidlapp  * @param value Value to be added to the variable.
410*062c5bc4SJason Schmidlapp  *
411*062c5bc4SJason Schmidlapp  * @return Original value of destination
412*062c5bc4SJason Schmidlapp  */
413*062c5bc4SJason Schmidlapp int  pte_osAtomicExchangeAdd(int volatile* pdest, int value);
414*062c5bc4SJason Schmidlapp 
415*062c5bc4SJason Schmidlapp /**
416*062c5bc4SJason Schmidlapp  * Decrements the destination.
417*062c5bc4SJason Schmidlapp  *
418*062c5bc4SJason Schmidlapp  * \code
419*062c5bc4SJason Schmidlapp  * origVal = *pdest
420*062c5bc4SJason Schmidlapp  * *pdest++
421*062c5bc4SJason Schmidlapp  * return origVal
422*062c5bc4SJason Schmidlapp  * \endcode
423*062c5bc4SJason Schmidlapp  *
424*062c5bc4SJason Schmidlapp  * @param pdest Destination value to decrement
425*062c5bc4SJason Schmidlapp  *
426*062c5bc4SJason Schmidlapp  * @return Original destination value
427*062c5bc4SJason Schmidlapp  */
428*062c5bc4SJason Schmidlapp int pte_osAtomicDecrement(int *pdest);
429*062c5bc4SJason Schmidlapp 
430*062c5bc4SJason Schmidlapp /**
431*062c5bc4SJason Schmidlapp  * Increments the destination value
432*062c5bc4SJason Schmidlapp  *
433*062c5bc4SJason Schmidlapp  * \code
434*062c5bc4SJason Schmidlapp  * origVal = *pdest;
435*062c5bc4SJason Schmidlapp  * *pdest++;
436*062c5bc4SJason Schmidlapp  * return origVal;
437*062c5bc4SJason Schmidlapp  */
438*062c5bc4SJason Schmidlapp int pte_osAtomicIncrement(int *pdest);
439*062c5bc4SJason Schmidlapp //@}
440*062c5bc4SJason Schmidlapp 
441*062c5bc4SJason Schmidlapp struct timeb;
442*062c5bc4SJason Schmidlapp 
443*062c5bc4SJason Schmidlapp int ftime(struct timeb *tb);
444*062c5bc4SJason Schmidlapp 
445*062c5bc4SJason Schmidlapp #ifdef __cplusplus
446*062c5bc4SJason Schmidlapp }
447*062c5bc4SJason Schmidlapp #endif // __cplusplus
448*062c5bc4SJason Schmidlapp 
449*062c5bc4SJason Schmidlapp #endif // _OS_SUPPORT_H_
450