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:
30dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    MediaLogService();
31dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    virtual ~MediaLogService() override;
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
45dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    virtual void        requestMergeWakeup() override;
46dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
476f1c1918d0dfece10f728711b055441e4d135c73Glenn Kastenprivate:
488349a91d0dd017404800dec638298caebab6677eEric Laurent
498349a91d0dd017404800dec638298caebab6677eEric Laurent    // Internal dump
508349a91d0dd017404800dec638298caebab6677eEric Laurent    static const int kDumpLockRetries = 50;
518349a91d0dd017404800dec638298caebab6677eEric Laurent    static const int kDumpLockSleepUs = 20000;
52537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet    // Size of merge buffer, in bytes
53537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet    static const size_t kMergeBufferSize = 64 * 1024; // TODO determine good value for this
548349a91d0dd017404800dec638298caebab6677eEric Laurent    static bool dumpTryLock(Mutex& mutex);
558349a91d0dd017404800dec638298caebab6677eEric Laurent
566f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten    Mutex               mLock;
5740a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
589c37337c402d6b19c2a2d1ee50002cbf56f3bc78Glenn Kasten    Vector<NBLog::NamedReader> mNamedReaders;   // protected by mLock
591c446273e6ebfe55ef293a0b7e78525b1b40ce84Glenn Kasten
601c446273e6ebfe55ef293a0b7e78525b1b40ce84Glenn Kasten    // FIXME Need comments on all of these, especially about locking
6140a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet    NBLog::Shared *mMergerShared;
6240a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet    NBLog::Merger mMerger;
6340a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet    NBLog::MergeReader mMergeReader;
64dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet    const sp<NBLog::MergeThread> mMergeThread;
656f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten};
666f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
676f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten}   // namespace android
686f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten
696f1c1918d0dfece10f728711b055441e4d135c73Glenn Kasten#endif  // ANDROID_MEDIA_LOG_SERVICE_H
70