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