1*042d53a7SEvalZero /* 2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one 3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file 4*042d53a7SEvalZero * distributed with this work for additional information 5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file 6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the 7*042d53a7SEvalZero * "License"); you may not use this file except in compliance 8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at 9*042d53a7SEvalZero * 10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0 11*042d53a7SEvalZero * 12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing, 13*042d53a7SEvalZero * software distributed under the License is distributed on an 14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15*042d53a7SEvalZero * KIND, either express or implied. See the License for the 16*042d53a7SEvalZero * specific language governing permissions and limitations 17*042d53a7SEvalZero * under the License. 18*042d53a7SEvalZero */ 19*042d53a7SEvalZero 20*042d53a7SEvalZero #include <assert.h> 21*042d53a7SEvalZero #include <stdint.h> 22*042d53a7SEvalZero #include <string.h> 23*042d53a7SEvalZero #include "os/os.h" 24*042d53a7SEvalZero #include "nimble/nimble_npl.h" 25*042d53a7SEvalZero 26*042d53a7SEvalZero #include <pthread.h> 27*042d53a7SEvalZero 28*042d53a7SEvalZero ble_npl_error_t ble_npl_mutex_init(struct ble_npl_mutex * mu)29*042d53a7SEvalZeroble_npl_mutex_init(struct ble_npl_mutex *mu) 30*042d53a7SEvalZero { 31*042d53a7SEvalZero pthread_mutexattr_t mu_attr; 32*042d53a7SEvalZero 33*042d53a7SEvalZero if (!mu) { 34*042d53a7SEvalZero return BLE_NPL_INVALID_PARAM; 35*042d53a7SEvalZero } 36*042d53a7SEvalZero 37*042d53a7SEvalZero pthread_mutexattr_settype(&mu_attr, PTHREAD_MUTEX_RECURSIVE_NP); 38*042d53a7SEvalZero pthread_mutex_init(&mu->lock, &mu_attr); 39*042d53a7SEvalZero 40*042d53a7SEvalZero return BLE_NPL_OK; 41*042d53a7SEvalZero } 42*042d53a7SEvalZero 43*042d53a7SEvalZero ble_npl_error_t ble_npl_mutex_release(struct ble_npl_mutex * mu)44*042d53a7SEvalZeroble_npl_mutex_release(struct ble_npl_mutex *mu) 45*042d53a7SEvalZero { 46*042d53a7SEvalZero if (!mu) { 47*042d53a7SEvalZero return BLE_NPL_INVALID_PARAM; 48*042d53a7SEvalZero } 49*042d53a7SEvalZero 50*042d53a7SEvalZero if (pthread_mutex_unlock(&mu->lock)) { 51*042d53a7SEvalZero return BLE_NPL_BAD_MUTEX; 52*042d53a7SEvalZero } 53*042d53a7SEvalZero 54*042d53a7SEvalZero return BLE_NPL_OK; 55*042d53a7SEvalZero } 56*042d53a7SEvalZero 57*042d53a7SEvalZero ble_npl_error_t ble_npl_mutex_pend(struct ble_npl_mutex * mu,uint32_t timeout)58*042d53a7SEvalZeroble_npl_mutex_pend(struct ble_npl_mutex *mu, uint32_t timeout) 59*042d53a7SEvalZero { 60*042d53a7SEvalZero struct timespec wait; 61*042d53a7SEvalZero 62*042d53a7SEvalZero if (!mu) { 63*042d53a7SEvalZero return BLE_NPL_INVALID_PARAM; 64*042d53a7SEvalZero } 65*042d53a7SEvalZero 66*042d53a7SEvalZero assert(&mu->lock); 67*042d53a7SEvalZero 68*042d53a7SEvalZero wait.tv_sec = timeout / 1000; 69*042d53a7SEvalZero wait.tv_nsec = (timeout % 1000) * 1000000; 70*042d53a7SEvalZero wait.tv_nsec %= 1000000000; 71*042d53a7SEvalZero 72*042d53a7SEvalZero if (pthread_mutex_timedlock(&mu->lock, &wait)) { 73*042d53a7SEvalZero return BLE_NPL_TIMEOUT; 74*042d53a7SEvalZero } 75*042d53a7SEvalZero 76*042d53a7SEvalZero return BLE_NPL_OK; 77*042d53a7SEvalZero } 78