16c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen/* 26c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Copyright (C) 2011 The Android Open Source Project 36c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 46c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License"); 56c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * you may not use this file except in compliance with the License. 66c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * You may obtain a copy of the License at 76c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 86c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * http://www.apache.org/licenses/LICENSE-2.0 96c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Unless required by applicable law or agreed to in writing, software 116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS, 126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * See the License for the specific language governing permissions and 146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * limitations under the License. 156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen */ 166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <common_time/local_clock.h> 186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <utils/String8.h> 196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_clock_service.h" 216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_clock.h" 226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_time_server.h" 236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chennamespace android { 256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chensp<CommonClockService> CommonClockService::instantiate( 276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen CommonTimeServer& timeServer) { 286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen sp<CommonClockService> tcc = new CommonClockService(timeServer); 296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (tcc == NULL) 306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return NULL; 316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen defaultServiceManager()->addService(ICommonClock::kServiceName, tcc); 336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return tcc; 346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::dump(int fd, const Vector<String16>& args) { 376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mRegistrationLock); 386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return mTimeServer.dumpClockInterface(fd, args, mListeners.size()); 396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 416c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::isCommonTimeValid(bool* valid, 426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen uint32_t* timelineID) { 436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return mTimeServer.isCommonTimeValid(valid, timelineID); 446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::commonTimeToLocalTime(int64_t commonTime, 476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t* localTime) { 486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return mTimeServer.getCommonClock().commonToLocal(commonTime, localTime); 496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::localTimeToCommonTime(int64_t localTime, 526c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t* commonTime) { 536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return mTimeServer.getCommonClock().localToCommon(localTime, commonTime); 546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getCommonTime(int64_t* commonTime) { 576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return localTimeToCommonTime(mTimeServer.getLocalClock().getLocalTime(), commonTime); 586c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 596c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 606c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getCommonFreq(uint64_t* freq) { 616c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *freq = mTimeServer.getCommonClock().getCommonFreq(); 626c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 636c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 646c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 656c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getLocalTime(int64_t* localTime) { 666c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *localTime = mTimeServer.getLocalClock().getLocalTime(); 676c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 686c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 696c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 706c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getLocalFreq(uint64_t* freq) { 716c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *freq = mTimeServer.getLocalClock().getLocalFreq(); 726c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 736c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 746c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 756c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getEstimatedError(int32_t* estimate) { 766c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *estimate = mTimeServer.getEstimatedError(); 776c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 786c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 796c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 806c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getTimelineID(uint64_t* id) { 816c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *id = mTimeServer.getTimelineID(); 826c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 836c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 846c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 856c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getState(State* state) { 866c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *state = mTimeServer.getState(); 876c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return OK; 886c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 896c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 906c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getMasterAddr(struct sockaddr_storage* addr) { 916c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return mTimeServer.getMasterAddr(addr); 926c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 936c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 946c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::registerListener( 956c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen const sp<ICommonClockListener>& listener) { 966c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mRegistrationLock); 976c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 986c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen { // scoping for autolock pattern 996c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mCallbackLock); 1006c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen // check whether this is a duplicate 1016c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (size_t i = 0; i < mListeners.size(); i++) { 1026c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (mListeners[i]->asBinder() == listener->asBinder()) 1036c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return ALREADY_EXISTS; 1046c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1056c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1066c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1076c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mListeners.add(listener); 1086c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mTimeServer.reevaluateAutoDisableState(0 != mListeners.size()); 1096c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return listener->asBinder()->linkToDeath(this); 1106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 1116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::unregisterListener( 1136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen const sp<ICommonClockListener>& listener) { 1146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mRegistrationLock); 1156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen status_t ret_val = NAME_NOT_FOUND; 1166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen { // scoping for autolock pattern 1186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mCallbackLock); 1196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (size_t i = 0; i < mListeners.size(); i++) { 1206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (mListeners[i]->asBinder() == listener->asBinder()) { 1216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mListeners[i]->asBinder()->unlinkToDeath(this); 1226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mListeners.removeAt(i); 1236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen ret_val = OK; 1246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen break; 1256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mTimeServer.reevaluateAutoDisableState(0 != mListeners.size()); 1306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen return ret_val; 1316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 1326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid CommonClockService::binderDied(const wp<IBinder>& who) { 1346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mRegistrationLock); 1356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen { // scoping for autolock pattern 1376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mCallbackLock); 1386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (size_t i = 0; i < mListeners.size(); i++) { 1396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen if (mListeners[i]->asBinder() == who) { 1406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mListeners.removeAt(i); 1416c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen break; 1426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mTimeServer.reevaluateAutoDisableState(0 != mListeners.size()); 1476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 1486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid CommonClockService::notifyOnTimelineChanged(uint64_t timelineID) { 1506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex::Autolock lock(mCallbackLock); 1516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1526c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen for (size_t i = 0; i < mListeners.size(); i++) { 1536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen mListeners[i]->onTimelineChanged(timelineID); 1546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } 1556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} 1566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 1576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}; // namespace android 158