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