Loading include/media/stagefright/foundation/AHandler.h +6 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define A_HANDLER_H_ #include <media/stagefright/foundation/ALooper.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> namespace android { Loading @@ -27,7 +28,8 @@ struct AMessage; struct AHandler : public RefBase { AHandler() : mID(0) { : mID(0), mMessageCounter(0) { } ALooper::handler_id id() const { Loading @@ -48,6 +50,9 @@ private: mID = id; } uint32_t mMessageCounter; KeyedVector<uint32_t, uint32_t> mMessages; DISALLOW_EVIL_CONSTRUCTORS(AHandler); }; Loading include/media/stagefright/foundation/ALooperRoster.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <media/stagefright/foundation/ALooper.h> #include <utils/KeyedVector.h> #include <utils/String16.h> namespace android { Loading @@ -42,6 +43,8 @@ struct ALooperRoster { sp<ALooper> findLooper(ALooper::handler_id handlerID); void dump(int fd, const Vector<String16>& args); private: struct HandlerInfo { wp<ALooper> mLooper; Loading media/libmediaplayerservice/MediaPlayerService.cpp +13 −3 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ #include <media/stagefright/MediaErrors.h> #include <media/stagefright/AudioPlayer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/ALooperRoster.h> #include <system/audio.h> Loading Loading @@ -247,6 +248,9 @@ void unmarshallAudioAttributes(const Parcel& parcel, audio_attributes_t *attribu namespace android { extern ALooperRoster gLooperRoster; static bool checkPermission(const char* permissionString) { #ifndef HAVE_ANDROID_OS return true; Loading Loading @@ -428,6 +432,10 @@ status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) return NO_ERROR; } /** * The only arguments this understands right now are -c, -von and -voff, * which are parsed by ALooperRoster::dump() */ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; Loading Loading @@ -461,7 +469,7 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) } result.append(" Files opened and/or mapped:\n"); snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); snprintf(buffer, SIZE, "/proc/%d/maps", getpid()); FILE *f = fopen(buffer, "r"); if (f) { while (!feof(f)) { Loading @@ -481,13 +489,13 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) result.append("\n"); } snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); snprintf(buffer, SIZE, "/proc/%d/fd", getpid()); DIR *d = opendir(buffer); if (d) { struct dirent *ent; while((ent = readdir(d)) != NULL) { if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); snprintf(buffer, SIZE, "/proc/%d/fd/%s", getpid(), ent->d_name); struct stat s; if (lstat(buffer, &s) == 0) { if ((s.st_mode & S_IFMT) == S_IFLNK) { Loading Loading @@ -528,6 +536,8 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) result.append("\n"); } gLooperRoster.dump(fd, args); bool dumpMem = false; for (size_t i = 0; i < args.size(); i++) { if (args[i] == String16("-m")) { Loading media/libstagefright/foundation/ALooperRoster.cpp +82 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "ALooperRoster" #include <utils/Log.h> #include <utils/String8.h> #include "ALooperRoster.h" Loading @@ -26,6 +27,8 @@ namespace android { static bool verboseStats = false; ALooperRoster::ALooperRoster() : mNextHandlerID(1), mNextReplyID(1) { Loading Loading @@ -136,6 +139,17 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) { } handler->onMessageReceived(msg); handler->mMessageCounter++; if (verboseStats) { uint32_t what = msg->what(); ssize_t idx = handler->mMessages.indexOfKey(what); if (idx < 0) { handler->mMessages.add(what, 1); } else { handler->mMessages.editValueAt(idx)++; } } } sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) { Loading Loading @@ -196,4 +210,72 @@ void ALooperRoster::postReply(uint32_t replyID, const sp<AMessage> &reply) { mRepliesCondition.broadcast(); } static void makeFourCC(uint32_t fourcc, char *s) { s[0] = (fourcc >> 24) & 0xff; if (s[0]) { s[1] = (fourcc >> 16) & 0xff; s[2] = (fourcc >> 8) & 0xff; s[3] = fourcc & 0xff; s[4] = 0; } else { sprintf(s, "%u", fourcc); } } void ALooperRoster::dump(int fd, const Vector<String16>& args) { bool clear = false; bool oldVerbose = verboseStats; for (size_t i = 0;i < args.size(); i++) { if (args[i] == String16("-c")) { clear = true; } else if (args[i] == String16("-von")) { verboseStats = true; } else if (args[i] == String16("-voff")) { verboseStats = false; } } String8 s; if (verboseStats && !oldVerbose) { s.append("(verbose stats collection enabled, stats will be cleared)\n"); } Mutex::Autolock autoLock(mLock); size_t n = mHandlers.size(); s.appendFormat(" %zd registered handlers:\n", n); for (size_t i = 0; i < n; i++) { s.appendFormat(" %zd: ", i); HandlerInfo &info = mHandlers.editValueAt(i); sp<ALooper> looper = info.mLooper.promote(); if (looper != NULL) { s.append(looper->mName.c_str()); sp<AHandler> handler = info.mHandler.promote(); if (handler != NULL) { s.appendFormat(": %u messages processed", handler->mMessageCounter); if (verboseStats) { for (size_t j = 0; j < handler->mMessages.size(); j++) { char fourcc[15]; makeFourCC(handler->mMessages.keyAt(j), fourcc); s.appendFormat("\n %s: %d", fourcc, handler->mMessages.valueAt(j)); } } else { handler->mMessages.clear(); } if (clear || (verboseStats && !oldVerbose)) { handler->mMessageCounter = 0; handler->mMessages.clear(); } } else { s.append(": <stale handler>"); } } else { s.append("<stale>"); } s.append("\n"); } write(fd, s.string(), s.size()); } } // namespace android Loading
include/media/stagefright/foundation/AHandler.h +6 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #define A_HANDLER_H_ #include <media/stagefright/foundation/ALooper.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> namespace android { Loading @@ -27,7 +28,8 @@ struct AMessage; struct AHandler : public RefBase { AHandler() : mID(0) { : mID(0), mMessageCounter(0) { } ALooper::handler_id id() const { Loading @@ -48,6 +50,9 @@ private: mID = id; } uint32_t mMessageCounter; KeyedVector<uint32_t, uint32_t> mMessages; DISALLOW_EVIL_CONSTRUCTORS(AHandler); }; Loading
include/media/stagefright/foundation/ALooperRoster.h +3 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <media/stagefright/foundation/ALooper.h> #include <utils/KeyedVector.h> #include <utils/String16.h> namespace android { Loading @@ -42,6 +43,8 @@ struct ALooperRoster { sp<ALooper> findLooper(ALooper::handler_id handlerID); void dump(int fd, const Vector<String16>& args); private: struct HandlerInfo { wp<ALooper> mLooper; Loading
media/libmediaplayerservice/MediaPlayerService.cpp +13 −3 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ #include <media/stagefright/MediaErrors.h> #include <media/stagefright/AudioPlayer.h> #include <media/stagefright/foundation/ADebug.h> #include <media/stagefright/foundation/ALooperRoster.h> #include <system/audio.h> Loading Loading @@ -247,6 +248,9 @@ void unmarshallAudioAttributes(const Parcel& parcel, audio_attributes_t *attribu namespace android { extern ALooperRoster gLooperRoster; static bool checkPermission(const char* permissionString) { #ifndef HAVE_ANDROID_OS return true; Loading Loading @@ -428,6 +432,10 @@ status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args) return NO_ERROR; } /** * The only arguments this understands right now are -c, -von and -voff, * which are parsed by ALooperRoster::dump() */ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; Loading Loading @@ -461,7 +469,7 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) } result.append(" Files opened and/or mapped:\n"); snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); snprintf(buffer, SIZE, "/proc/%d/maps", getpid()); FILE *f = fopen(buffer, "r"); if (f) { while (!feof(f)) { Loading @@ -481,13 +489,13 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) result.append("\n"); } snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); snprintf(buffer, SIZE, "/proc/%d/fd", getpid()); DIR *d = opendir(buffer); if (d) { struct dirent *ent; while((ent = readdir(d)) != NULL) { if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); snprintf(buffer, SIZE, "/proc/%d/fd/%s", getpid(), ent->d_name); struct stat s; if (lstat(buffer, &s) == 0) { if ((s.st_mode & S_IFMT) == S_IFLNK) { Loading Loading @@ -528,6 +536,8 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args) result.append("\n"); } gLooperRoster.dump(fd, args); bool dumpMem = false; for (size_t i = 0; i < args.size(); i++) { if (args[i] == String16("-m")) { Loading
media/libstagefright/foundation/ALooperRoster.cpp +82 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "ALooperRoster" #include <utils/Log.h> #include <utils/String8.h> #include "ALooperRoster.h" Loading @@ -26,6 +27,8 @@ namespace android { static bool verboseStats = false; ALooperRoster::ALooperRoster() : mNextHandlerID(1), mNextReplyID(1) { Loading Loading @@ -136,6 +139,17 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) { } handler->onMessageReceived(msg); handler->mMessageCounter++; if (verboseStats) { uint32_t what = msg->what(); ssize_t idx = handler->mMessages.indexOfKey(what); if (idx < 0) { handler->mMessages.add(what, 1); } else { handler->mMessages.editValueAt(idx)++; } } } sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) { Loading Loading @@ -196,4 +210,72 @@ void ALooperRoster::postReply(uint32_t replyID, const sp<AMessage> &reply) { mRepliesCondition.broadcast(); } static void makeFourCC(uint32_t fourcc, char *s) { s[0] = (fourcc >> 24) & 0xff; if (s[0]) { s[1] = (fourcc >> 16) & 0xff; s[2] = (fourcc >> 8) & 0xff; s[3] = fourcc & 0xff; s[4] = 0; } else { sprintf(s, "%u", fourcc); } } void ALooperRoster::dump(int fd, const Vector<String16>& args) { bool clear = false; bool oldVerbose = verboseStats; for (size_t i = 0;i < args.size(); i++) { if (args[i] == String16("-c")) { clear = true; } else if (args[i] == String16("-von")) { verboseStats = true; } else if (args[i] == String16("-voff")) { verboseStats = false; } } String8 s; if (verboseStats && !oldVerbose) { s.append("(verbose stats collection enabled, stats will be cleared)\n"); } Mutex::Autolock autoLock(mLock); size_t n = mHandlers.size(); s.appendFormat(" %zd registered handlers:\n", n); for (size_t i = 0; i < n; i++) { s.appendFormat(" %zd: ", i); HandlerInfo &info = mHandlers.editValueAt(i); sp<ALooper> looper = info.mLooper.promote(); if (looper != NULL) { s.append(looper->mName.c_str()); sp<AHandler> handler = info.mHandler.promote(); if (handler != NULL) { s.appendFormat(": %u messages processed", handler->mMessageCounter); if (verboseStats) { for (size_t j = 0; j < handler->mMessages.size(); j++) { char fourcc[15]; makeFourCC(handler->mMessages.keyAt(j), fourcc); s.appendFormat("\n %s: %d", fourcc, handler->mMessages.valueAt(j)); } } else { handler->mMessages.clear(); } if (clear || (verboseStats && !oldVerbose)) { handler->mMessageCounter = 0; handler->mMessages.clear(); } } else { s.append(": <stale handler>"); } } else { s.append("<stale>"); } s.append("\n"); } write(fd, s.string(), s.size()); } } // namespace android