MediaLogService.h revision 8349a91d0dd017404800dec638298caebab6677e
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#ifndef ANDROID_MEDIA_LOG_SERVICE_H
186f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#define ANDROID_MEDIA_LOG_SERVICE_H
196f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
206f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <binder/BinderService.h>
216f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <media/IMediaLogService.h>
226f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#include <media/nbaio/NBLog.h>
236f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
246f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastennamespace android {
256f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
266f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenclass MediaLogService : public BinderService<MediaLogService>, public BnMediaLogService
276f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten{
286f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    friend class BinderService<MediaLogService>;    // for MediaLogService()
296f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenpublic:
306f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    MediaLogService() : BnMediaLogService() { }
316f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual ~MediaLogService() { }
326f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual void onFirstRef() { }
336f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
346f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    static const char*  getServiceName() { return "media.log"; }
356f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
366f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    static const size_t kMinSize = 0x100;
376f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    static const size_t kMaxSize = 0x10000;
386f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual void        registerWriter(const sp<IMemory>& shared, size_t size, const char *name);
396f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual void        unregisterWriter(const sp<IMemory>& shared);
406f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
416f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual status_t    dump(int fd, const Vector<String16>& args);
426f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    virtual status_t    onTransact(uint32_t code, const Parcel& data, Parcel* reply,
436f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten                                uint32_t flags);
446f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
456f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenprivate:
468349a91d0dd017404800dec638298caebab6677eEric Laurent
478349a91d0dd017404800dec638298caebab6677eEric Laurent    // Internal dump
488349a91d0dd017404800dec638298caebab6677eEric Laurent    static const int kDumpLockRetries = 50;
498349a91d0dd017404800dec638298caebab6677eEric Laurent    static const int kDumpLockSleepUs = 20000;
508349a91d0dd017404800dec638298caebab6677eEric Laurent    static bool dumpTryLock(Mutex& mutex);
518349a91d0dd017404800dec638298caebab6677eEric Laurent
526f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Mutex               mLock;
536f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    class NamedReader {
546f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    public:
556f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        NamedReader() : mReader(0) { mName[0] = '\0'; } // for Vector
566f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        NamedReader(const sp<NBLog::Reader>& reader, const char *name) : mReader(reader)
576f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten            { strlcpy(mName, name, sizeof(mName)); }
586f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        ~NamedReader() { }
596f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        const sp<NBLog::Reader>&  reader() const { return mReader; }
606f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        const char*               name() const { return mName; }
616f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    private:
626f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        sp<NBLog::Reader>   mReader;
636f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        static const size_t kMaxName = 32;
646f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten        char                mName[kMaxName];
656f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    };
666f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Vector<NamedReader> mNamedReaders;
676f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten};
686f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
696f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}   // namespace android
706f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
716f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#endif  // ANDROID_MEDIA_LOG_SERVICE_H
72