PageRenderTime 28ms CodeModel.GetById 8ms app.highlight 17ms RepoModel.GetById 1ms app.codeStats 0ms

/services/common_time/common_clock_service.cpp

https://github.com/aizuzi/platform_frameworks_base
C++ | 157 lines | 112 code | 29 blank | 16 comment | 15 complexity | f03fc05ba6bde65b664620618b80073d MD5 | raw file
  1/*
  2 * Copyright (C) 2011 The Android Open Source Project
  3 *
  4 * Licensed under the Apache License, Version 2.0 (the "License");
  5 * you may not use this file except in compliance with the License.
  6 * You may obtain a copy of the License at
  7 *
  8 *      http://www.apache.org/licenses/LICENSE-2.0
  9 *
 10 * Unless required by applicable law or agreed to in writing, software
 11 * distributed under the License is distributed on an "AS IS" BASIS,
 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 * See the License for the specific language governing permissions and
 14 * limitations under the License.
 15 */
 16
 17#include <common_time/local_clock.h>
 18#include <utils/String8.h>
 19
 20#include "common_clock_service.h"
 21#include "common_clock.h"
 22#include "common_time_server.h"
 23
 24namespace android {
 25
 26sp<CommonClockService> CommonClockService::instantiate(
 27        CommonTimeServer& timeServer) {
 28    sp<CommonClockService> tcc = new CommonClockService(timeServer);
 29    if (tcc == NULL)
 30        return NULL;
 31
 32    defaultServiceManager()->addService(ICommonClock::kServiceName, tcc);
 33    return tcc;
 34}
 35
 36status_t CommonClockService::dump(int fd, const Vector<String16>& args) {
 37    Mutex::Autolock lock(mRegistrationLock);
 38    return mTimeServer.dumpClockInterface(fd, args, mListeners.size());
 39}
 40
 41status_t CommonClockService::isCommonTimeValid(bool* valid,
 42                                               uint32_t* timelineID) {
 43    return mTimeServer.isCommonTimeValid(valid, timelineID);
 44}
 45
 46status_t CommonClockService::commonTimeToLocalTime(int64_t  commonTime,
 47                                                   int64_t* localTime) {
 48    return mTimeServer.getCommonClock().commonToLocal(commonTime, localTime);
 49}
 50
 51status_t CommonClockService::localTimeToCommonTime(int64_t  localTime,
 52                                                   int64_t* commonTime) {
 53    return mTimeServer.getCommonClock().localToCommon(localTime, commonTime);
 54}
 55
 56status_t CommonClockService::getCommonTime(int64_t* commonTime) {
 57    return localTimeToCommonTime(mTimeServer.getLocalClock().getLocalTime(), commonTime);
 58}
 59
 60status_t CommonClockService::getCommonFreq(uint64_t* freq) {
 61    *freq = mTimeServer.getCommonClock().getCommonFreq();
 62    return OK;
 63}
 64
 65status_t CommonClockService::getLocalTime(int64_t* localTime) {
 66    *localTime = mTimeServer.getLocalClock().getLocalTime();
 67    return OK;
 68}
 69
 70status_t CommonClockService::getLocalFreq(uint64_t* freq) {
 71    *freq = mTimeServer.getLocalClock().getLocalFreq();
 72    return OK;
 73}
 74
 75status_t CommonClockService::getEstimatedError(int32_t* estimate) {
 76    *estimate = mTimeServer.getEstimatedError();
 77    return OK;
 78}
 79
 80status_t CommonClockService::getTimelineID(uint64_t* id) {
 81    *id = mTimeServer.getTimelineID();
 82    return OK;
 83}
 84
 85status_t CommonClockService::getState(State* state) {
 86    *state = mTimeServer.getState();
 87    return OK;
 88}
 89
 90status_t CommonClockService::getMasterAddr(struct sockaddr_storage* addr) {
 91    return mTimeServer.getMasterAddr(addr);
 92}
 93
 94status_t CommonClockService::registerListener(
 95        const sp<ICommonClockListener>& listener) {
 96    Mutex::Autolock lock(mRegistrationLock);
 97
 98    {   // scoping for autolock pattern
 99        Mutex::Autolock lock(mCallbackLock);
100        // check whether this is a duplicate
101        for (size_t i = 0; i < mListeners.size(); i++) {
102            if (mListeners[i]->asBinder() == listener->asBinder())
103                return ALREADY_EXISTS;
104        }
105    }
106
107    mListeners.add(listener);
108    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
109    return listener->asBinder()->linkToDeath(this);
110}
111
112status_t CommonClockService::unregisterListener(
113        const sp<ICommonClockListener>& listener) {
114    Mutex::Autolock lock(mRegistrationLock);
115    status_t ret_val = NAME_NOT_FOUND;
116
117    {   // scoping for autolock pattern
118        Mutex::Autolock lock(mCallbackLock);
119        for (size_t i = 0; i < mListeners.size(); i++) {
120            if (mListeners[i]->asBinder() == listener->asBinder()) {
121                mListeners[i]->asBinder()->unlinkToDeath(this);
122                mListeners.removeAt(i);
123                ret_val = OK;
124                break;
125            }
126        }
127    }
128
129    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
130    return ret_val;
131}
132
133void CommonClockService::binderDied(const wp<IBinder>& who) {
134    Mutex::Autolock lock(mRegistrationLock);
135
136    {   // scoping for autolock pattern
137        Mutex::Autolock lock(mCallbackLock);
138        for (size_t i = 0; i < mListeners.size(); i++) {
139            if (mListeners[i]->asBinder() == who) {
140                mListeners.removeAt(i);
141                break;
142            }
143        }
144    }
145
146    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
147}
148
149void CommonClockService::notifyOnTimelineChanged(uint64_t timelineID) {
150    Mutex::Autolock lock(mCallbackLock);
151
152    for (size_t i = 0; i < mListeners.size(); i++) {
153        mListeners[i]->onTimelineChanged(timelineID);
154    }
155}
156
157}; // namespace android