16f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten/*
26f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Copyright (C) 2013 The Android Open Source Project
36f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten *
46f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
56f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * you may not use this file except in compliance with the License.
66f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * You may obtain a copy of the License at
76f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten *
86f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
96f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten *
106f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * Unless required by applicable law or agreed to in writing, software
116f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
126f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * See the License for the specific language governing permissions and
146f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten * limitations under the License.
156f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten */
166f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
176f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#define LOG_TAG "MediaLog"
186f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten//#define LOG_NDEBUG 0
196f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
206f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <sys/mman.h>
216f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <utils/Log.h>
22bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten#include <binder/PermissionCache.h>
236f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <media/nbaio/NBLog.h>
246f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <private/android_filesystem_config.h>
256f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include "MediaLogService.h"
266f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
276f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastennamespace android {
286f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
296f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenvoid MediaLogService::registerWriter(const sp<IMemory>& shared, size_t size, const char *name)
306f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{
316f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    if (IPCThreadState::self()->getCallingUid() != AID_MEDIA || shared == 0 ||
326f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            size < kMinSize || size > kMaxSize || name == NULL ||
336f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            shared->size() < NBLog::Timeline::sharedSize(size)) {
346f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        return;
356f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    }
366f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    sp<NBLog::Reader> reader(new NBLog::Reader(size, shared));
376f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    NamedReader namedReader(reader, name);
386f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Mutex::Autolock _l(mLock);
396f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    mNamedReaders.add(namedReader);
406f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}
416f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
426f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenvoid MediaLogService::unregisterWriter(const sp<IMemory>& shared)
436f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{
446f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    if (IPCThreadState::self()->getCallingUid() != AID_MEDIA || shared == 0) {
456f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        return;
466f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    }
476f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Mutex::Autolock _l(mLock);
486f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    for (size_t i = 0; i < mNamedReaders.size(); ) {
496f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        if (mNamedReaders[i].reader()->isIMemory(shared)) {
506f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            mNamedReaders.removeAt(i);
516f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        } else {
526f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            i++;
536f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        }
546f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    }
556f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}
566f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
570f11b51a57bc9062c4fe8af73747319cedabc5d6Glenn Kastenstatus_t MediaLogService::dump(int fd, const Vector<String16>& args __unused)
586f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{
59bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten    // FIXME merge with similar but not identical code at services/audioflinger/ServiceUtilities.cpp
60bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten    static const String16 sDump("android.permission.DUMP");
61bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten    if (!(IPCThreadState::self()->getCallingUid() == AID_MEDIA ||
62bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten            PermissionCache::checkCallingPermission(sDump))) {
638b5f642eb2364ea7fe46a5b3af51b48b58f12183Elliott Hughes        dprintf(fd, "Permission Denial: can't dump media.log from pid=%d, uid=%d\n",
645ea77ae380a7ad9268fdbda1d7d3aa14b5839065Glenn Kasten                IPCThreadState::self()->getCallingPid(),
655ea77ae380a7ad9268fdbda1d7d3aa14b5839065Glenn Kasten                IPCThreadState::self()->getCallingUid());
66bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten        return NO_ERROR;
67bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten    }
68bc5120797e0d2995b63a96306b638d1d0d8457d0Glenn Kasten
696f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Vector<NamedReader> namedReaders;
706f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    {
716f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        Mutex::Autolock _l(mLock);
726f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        namedReaders = mNamedReaders;
736f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    }
746f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    for (size_t i = 0; i < namedReaders.size(); i++) {
756f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        const NamedReader& namedReader = namedReaders[i];
766f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        if (fd >= 0) {
778b5f642eb2364ea7fe46a5b3af51b48b58f12183Elliott Hughes            dprintf(fd, "\n%s:\n", namedReader.name());
786f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        } else {
796f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            ALOGI("%s:", namedReader.name());
806f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        }
816f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        namedReader.reader()->dump(fd, 0 /*indent*/);
826f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    }
836f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    return NO_ERROR;
846f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}
856f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
866f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenstatus_t MediaLogService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
876f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        uint32_t flags)
886f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{
896f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    return BnMediaLogService::onTransact(code, data, reply, flags);
906f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}
916f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
926f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}   // namespace android
93