1 /*************************************************************************** 2 * Copyright (c) 2024 Microsoft Corporation 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the MIT License which is available at 6 * https://opensource.org/licenses/MIT. 7 * 8 * SPDX-License-Identifier: MIT 9 **************************************************************************/ 10 11 12 /**************************************************************************/ 13 /**************************************************************************/ 14 /** */ 15 /** POSIX wrapper for THREADX */ 16 /** */ 17 /** */ 18 /** */ 19 /**************************************************************************/ 20 /**************************************************************************/ 21 22 /* Include necessary system files. */ 23 24 #include "tx_api.h" /* Threadx API */ 25 #include "pthread.h" /* Posix API */ 26 #include "px_int.h" /* Posix helper functions */ 27 28 29 /**************************************************************************/ 30 /* */ 31 /* FUNCTION RELEASE */ 32 /* */ 33 /* pthread_mutex_unlock PORTABLE C */ 34 /* 6.1.7 */ 35 /* AUTHOR */ 36 /* */ 37 /* William E. Lamie, Microsoft Corporation */ 38 /* */ 39 /* DESCRIPTION */ 40 /* */ 41 /* This function shall release the mutex object referenced by mutex. */ 42 /* The manner in which a mutex is released is dependent upon the mutex */ 43 /* type attribute. If there are threads blocked on the mutex object */ 44 /* referenced by mutex when pthread_mutex_unlock() is called,resulting */ 45 /* in the mutex becoming available,the scheduling policy shall */ 46 /* determine which thread shall acquire the mutex. */ 47 /* */ 48 /* INPUT */ 49 /* */ 50 /* mutex Address of the mutex */ 51 /* */ 52 /* OUTPUT */ 53 /* */ 54 /* 0 if successful */ 55 /* Value in case of any error */ 56 /* */ 57 /* CALLS */ 58 /* */ 59 /* tx_mutex_put ThreadX Mutex service */ 60 /* */ 61 /* CALLED BY */ 62 /* */ 63 /* Application Code */ 64 /* */ 65 /* RELEASE HISTORY */ 66 /* */ 67 /* DATE NAME DESCRIPTION */ 68 /* */ 69 /* 06-02-2021 William E. Lamie Initial Version 6.1.7 */ 70 /* */ 71 /**************************************************************************/ pthread_mutex_unlock(pthread_mutex_t * mutex)72INT pthread_mutex_unlock(pthread_mutex_t *mutex ) 73 { 74 75 TX_MUTEX *mutex_ptr; 76 INT retval,status; 77 78 79 /* convert pthread mutex object to ThreadX mutex */ 80 mutex_ptr = (TX_MUTEX*)mutex; 81 status = tx_mutex_put( mutex_ptr); 82 switch ( status) 83 { 84 case TX_SUCCESS: 85 retval = OK; 86 break; 87 88 case TX_MUTEX_ERROR: 89 posix_errno = EINVAL; 90 posix_set_pthread_errno(EINVAL); 91 retval = EINVAL; 92 break; 93 94 case TX_NOT_OWNED: 95 posix_errno = EPERM; 96 posix_set_pthread_errno(EPERM); 97 retval = EPERM; 98 break; 99 100 default: 101 posix_errno = EINVAL; 102 posix_set_pthread_errno(EINVAL); 103 retval = EINVAL; 104 break; 105 } 106 return (retval); 107 } 108