1 /* 2 * Copyright (c) 2010, Texas Instruments Incorporated 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of Texas Instruments Incorporated nor the names of 17 * its contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * @file timm_osal_Mutexs.c 35 * This file contains methods that provides the functionality 36 * 37 * @path \ 38 * 39 */ 40 /* -------------------------------------------------------------------------- */ 41 /* ========================================================================= 42 *! 43 *! Revision History 44 *! =================================== 45 *! 04-Nov-2008 Maiya ShreeHarsha: Linux specific changes 46 *! 0.1: Created the first draft version, ksrini (at) ti.com 47 * ========================================================================= */ 48 49 /****************************************************************************** 50 * Includes 51 ******************************************************************************/ 52 53 54 #include "timm_osal_types.h" 55 #include "timm_osal_trace.h" 56 #include "timm_osal_error.h" 57 #include "timm_osal_memory.h" 58 #include "timm_osal_semaphores.h" 59 60 #include <errno.h> 61 62 #include <pthread.h> 63 #include <sys/time.h> 64 65 66 /* ========================================================================== */ 67 /** 68 * @fn TIMM_OSAL_MutexCreate function 69 * 70 * 71 */ 72 /* ========================================================================== */ 73 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexCreate(TIMM_OSAL_PTR * pMutex) 74 { 75 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN; 76 pthread_mutex_t *plMutex = TIMM_OSAL_NULL; 77 78 plMutex = 79 (pthread_mutex_t *) TIMM_OSAL_Malloc(sizeof(pthread_mutex_t), 0, 80 0, 0); 81 if (TIMM_OSAL_NULL == plMutex) 82 { 83 bReturnStatus = TIMM_OSAL_ERR_ALLOC; 84 goto EXIT; 85 } 86 87 /*if (SUCCESS != pthread_mutex_init(plMutex, pAttr)) */ 88 if (SUCCESS != pthread_mutex_init(plMutex, TIMM_OSAL_NULL)) 89 { 90 /*TIMM_OSAL_Error ("Mutex Create failed !"); */ 91 /*goto EXIT; */ 92 } else 93 { 94 /**pMutex = (TIMM_OSAL_PTR *)plMutex;*/ 95 *pMutex = (TIMM_OSAL_PTR) plMutex; 96 bReturnStatus = TIMM_OSAL_ERR_NONE; 97 } 98 EXIT: 99 /*if((TIMM_OSAL_ERR_NONE != bReturnStatus)) { 100 TIMM_OSAL_Free(plMutex); 101 } */ 102 if ((TIMM_OSAL_ERR_NONE != bReturnStatus) && 103 (TIMM_OSAL_NULL != plMutex)) 104 { 105 TIMM_OSAL_Free(plMutex); 106 } 107 return bReturnStatus; 108 109 /**********************************************************/ 110 /*return TIMM_OSAL_SemaphoreCreate(pMutex, 1);*/ 111 /**********************************************************/ 112 } 113 114 /* ========================================================================== */ 115 /** 116 * @fn TIMM_OSAL_MutexDelete function 117 * 118 * 119 */ 120 /* ========================================================================== */ 121 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexDelete(TIMM_OSAL_PTR pMutex) 122 { 123 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_NONE; 124 pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex; 125 126 if (plMutex == TIMM_OSAL_NULL) 127 { 128 bReturnStatus = TIMM_OSAL_ERR_PARAMETER; 129 goto EXIT; 130 } 131 /*can we do away with if or with switch case */ 132 if (SUCCESS != pthread_mutex_destroy(plMutex)) 133 { 134 /*TIMM_OSAL_Error("Delete Mutex failed !"); */ 135 bReturnStatus = TIMM_OSAL_ERR_UNKNOWN;; 136 } 137 138 TIMM_OSAL_Free(plMutex); 139 EXIT: 140 return bReturnStatus; 141 /**********************************************************/ 142 /*return TIMM_OSAL_SemaphoreDelete(pMutex);*/ 143 /**********************************************************/ 144 145 } 146 147 /* ========================================================================== */ 148 /** 149 * @fn TIMM_OSAL_MutexObtain function 150 * 151 * 152 */ 153 /* ========================================================================== */ 154 155 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexObtain(TIMM_OSAL_PTR pMutex, 156 TIMM_OSAL_U32 uTimeOut) 157 { 158 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN; 159 struct timespec abs_timeout; 160 struct timeval ltime_now; 161 TIMM_OSAL_U32 ltimenow_us; 162 pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex; 163 164 if (plMutex == TIMM_OSAL_NULL) 165 { 166 bReturnStatus = TIMM_OSAL_ERR_PARAMETER; 167 goto EXIT; 168 } 169 170 if (TIMM_OSAL_SUSPEND == uTimeOut) 171 { 172 if (SUCCESS != pthread_mutex_lock(plMutex)) 173 { 174 /*TIMM_OSAL_Error("Lock Mutex failed !"); */ 175 goto EXIT; 176 } 177 } else if (TIMM_OSAL_NO_SUSPEND == uTimeOut) 178 { 179 if (SUCCESS != pthread_mutex_trylock(plMutex)) 180 { 181 /*TIMM_OSAL_Error("Lock Mutex failed !"); */ 182 goto EXIT; 183 } 184 } else 185 { 186 gettimeofday(<ime_now, NULL); 187 /*uTimeOut is assumed to be in milliseconds */ 188 ltimenow_us = ltime_now.tv_usec + 1000 * uTimeOut; 189 abs_timeout.tv_sec = ltime_now.tv_sec + uTimeOut / 1000; 190 abs_timeout.tv_nsec = (ltimenow_us % 1000000) * 1000; 191 192 #ifdef _POSIX_VERSION_1_ 193 if (SUCCESS != pthread_mutex_lock(plMutex)) 194 { //Some Posix versions dont support timeout 195 #else 196 if (SUCCESS != pthread_mutex_timedlock(plMutex, &abs_timeout)) 197 { 198 #endif 199 /*TIMM_OSAL_Error("Lock Mutex failed !"); */ 200 goto EXIT; 201 } 202 } 203 bReturnStatus = TIMM_OSAL_ERR_NONE; 204 205 EXIT: 206 return bReturnStatus; 207 /**********************************************************/ 208 /*return TIMM_OSAL_SemaphoreObtain(pMutex, uTimeOut);*/ 209 /**********************************************************/ 210 } 211 212 213 214 /* ========================================================================== */ 215 /** 216 * @fn TIMM_OSAL_MutexRelease function 217 * 218 * 219 */ 220 /* ========================================================================== */ 221 TIMM_OSAL_ERRORTYPE TIMM_OSAL_MutexRelease(TIMM_OSAL_PTR pMutex) 222 { 223 TIMM_OSAL_ERRORTYPE bReturnStatus = TIMM_OSAL_ERR_UNKNOWN; 224 pthread_mutex_t *plMutex = (pthread_mutex_t *) pMutex; 225 226 if (TIMM_OSAL_NULL == plMutex) 227 { 228 bReturnStatus = TIMM_OSAL_ERR_PARAMETER; 229 goto EXIT; 230 } 231 232 if (SUCCESS != pthread_mutex_unlock(plMutex)) 233 { 234 /*TIMM_OSAL_Error("Unlock Mutex failed !"); */ 235 } else 236 { 237 bReturnStatus = TIMM_OSAL_ERR_NONE; 238 } 239 EXIT: 240 return bReturnStatus; 241 /**********************************************************/ 242 /*return TIMM_OSAL_SemaphoreRelease(pMutex);*/ 243 /**********************************************************/ 244 } 245