| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #define LOG_TAG "VehicleMonitor" |
| |
| #include <assert.h> |
| |
| #include <binder/PermissionCache.h> |
| #include <utils/Errors.h> |
| #include <utils/SystemClock.h> |
| |
| #include "VehicleMonitorService.h" |
| |
| //#define DBG_VERBOSE |
| #ifdef DBG_VERBOSE |
| #define LOG_VERBOSE(x...) ALOGD(x) |
| #else |
| #define LOG_VERBOSE(x...) |
| #endif |
| |
| namespace android { |
| |
| const nsecs_t monitorInterval = 15000000000; // 15s |
| |
| VehicleMonitorMessageHandler::VehicleMonitorMessageHandler(const sp<Looper>& looper, |
| VehicleMonitorService& service) |
| : mLooper(looper), |
| mService(service), |
| mLastDispatchTime(0) { |
| mLooper->sendMessageDelayed(monitorInterval, this, Message(COLLECT_DATA)); |
| } |
| |
| VehicleMonitorMessageHandler::~VehicleMonitorMessageHandler() { |
| } |
| |
| void VehicleMonitorMessageHandler::dump(String8& msg) { |
| msg.appendFormat("mLastDispatchTime:%" PRId64 "\n", mLastDispatchTime); |
| mProcessMonitor.dump(msg); |
| } |
| |
| void VehicleMonitorMessageHandler::doHandleCollectData() { |
| { |
| std::lock_guard<std::mutex> autoLock(mLock); |
| mLastDispatchTime = elapsedRealtime(); |
| mProcessMonitor.process(); |
| } |
| |
| // TODO: do better timing for sendMessage |
| mLooper->sendMessageDelayed(monitorInterval, this, Message(COLLECT_DATA)); |
| } |
| |
| void VehicleMonitorMessageHandler::handleMessage(const Message& message) { |
| switch (message.what) { |
| case COLLECT_DATA: |
| doHandleCollectData(); |
| break; |
| default: |
| // TODO? |
| break; |
| } |
| } |
| |
| // ---------------------------------------------------- |
| VehicleMonitorService* VehicleMonitorService::sInstance = NULL; |
| |
| status_t VehicleMonitorService::dump(int fd, const Vector<String16>& /*args*/) { |
| static const String16 sDump("android.permission.DUMP"); |
| String8 msg; |
| if (!PermissionCache::checkCallingPermission(sDump)) { |
| msg.appendFormat("Permission Denial: " |
| "can't dump VMS from pid=%d, uid=%d\n", |
| IPCThreadState::self()->getCallingPid(), |
| IPCThreadState::self()->getCallingUid()); |
| write(fd, msg.string(), msg.size()); |
| return NO_ERROR; |
| } |
| msg.appendFormat("*Handler, now in ms:%" PRId64 "\n", elapsedRealtime()); |
| mHandler->dump(msg); |
| write(fd, msg.string(), msg.size()); |
| return NO_ERROR; |
| } |
| |
| VehicleMonitorService::VehicleMonitorService() { |
| sInstance = this; |
| } |
| |
| VehicleMonitorService::~VehicleMonitorService() { |
| sInstance = NULL; |
| } |
| |
| void VehicleMonitorService::binderDied(const wp<IBinder>& who) { |
| std::lock_guard<std::mutex> autoLock(mLock); |
| sp<IBinder> ibinder = who.promote(); |
| ibinder->unlinkToDeath(this); |
| // TODO: reset all priorities set by CarService. |
| } |
| |
| void VehicleMonitorService::release() { |
| std::lock_guard<std::mutex> autoLock(mLock); |
| mHandlerThread->quit(); |
| } |
| |
| void VehicleMonitorService::onFirstRef() { |
| std::lock_guard<std::mutex> autoLock(mLock); |
| mHandlerThread = new HandlerThread(); |
| status_t r = mHandlerThread->start("VMS.NATIVE_LOOP"); |
| if (r != NO_ERROR) { |
| ALOGE("cannot start handler thread, error:%d", r); |
| return; |
| } |
| sp<VehicleMonitorMessageHandler> handler( |
| new VehicleMonitorMessageHandler(mHandlerThread->getLooper(), *this)); |
| assert(handler.get() != NULL); |
| mHandler = handler; |
| } |
| |
| status_t VehicleMonitorService::setAppPriority(uint32_t, uint32_t, vehicle_app_priority) { |
| //TODO |
| return NO_ERROR; |
| } |
| |
| status_t VehicleMonitorService::setMonitorListener( |
| const sp<IVehicleMonitorListener> &listener) { |
| sp<IBinder> ibinder = IInterface::asBinder(listener); |
| LOG_VERBOSE("setMonitorListener, binder 0x%x", ibinder.get()); |
| //TODO |
| return NO_ERROR; |
| } |
| |
| }; // namespace android |