18abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* 28abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project 38abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * 48abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License"); 58abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * you may not use this file except in compliance with the License. 68abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * You may obtain a copy of the License at 78abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * 88abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * http://www.apache.org/licenses/LICENSE-2.0 98abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * 108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software 118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS, 128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * See the License for the specific language governing permissions and 148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * limitations under the License. 158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */ 16b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 17b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <pthread.h> 18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#ifndef __WIFI_HAL_SYNC_H__ 20b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define __WIFI_HAL_SYNC_H__ 21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 22b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass Mutex 23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 24b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate: 25b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_t mMutex; 26b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic: 27b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde Mutex() { 28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_init(&mMutex, NULL); 29b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 30b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde ~Mutex() { 31b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_destroy(&mMutex); 32b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 33b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int tryLock() { 34b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde return pthread_mutex_trylock(&mMutex); 35b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 36b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int lock() { 37b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde return pthread_mutex_lock(&mMutex); 38b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 39b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde void unlock() { 40b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_unlock(&mMutex); 41b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 42b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}; 43b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 44b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass Condition 45b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{ 46b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate: 47b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_cond_t mCondition; 48b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_t mMutex; 49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 50b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic: 51b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde Condition() { 52b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_init(&mMutex, NULL); 53b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_cond_init(&mCondition, NULL); 54b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 55b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde ~Condition() { 56b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_cond_destroy(&mCondition); 57b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_mutex_destroy(&mMutex); 58b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 59b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 60b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde int wait() { 61b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde return pthread_cond_wait(&mCondition, &mMutex); 62b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 63b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam int wait(struct timespec abstime) 658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam struct timeval now; 678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam gettimeofday(&now,NULL); 698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_sec += now.tv_sec; 718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam if(((abstime.tv_nsec + now.tv_usec*1000) > 1000*1000*1000) || (abstime.tv_nsec + now.tv_usec*1000 < 0)) 728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_sec += 1; 748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_nsec += now.tv_usec * 1000; 758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_nsec -= 1000*1000*1000; 768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam else 788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam { 798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam abstime.tv_nsec += now.tv_usec * 1000; 808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam return pthread_cond_timedwait(&mCondition, &mMutex, &abstime); 828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam } 838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam 84b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde void signal() { 85b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde pthread_cond_signal(&mCondition); 86b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde } 87b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}; 88b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde 898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#endif 90