1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "CameraTraces" 18 #define ATRACE_TAG ATRACE_TAG_CAMERA 19 //#define LOG_NDEBUG 0 20 21 #include "utils/CameraTraces.h" 22 #include <utils/ProcessCallStack.h> 23 24 #include <utils/Mutex.h> 25 #include <utils/List.h> 26 27 #include <utils/Log.h> 28 #include <cutils/trace.h> 29 30 namespace android { 31 namespace camera3 { 32 33 struct CameraTracesImpl { 34 Mutex tracesLock; 35 List<ProcessCallStack> pcsList; 36 }; // class CameraTraces::Impl; 37 38 static CameraTracesImpl gImpl; 39 CameraTracesImpl& CameraTraces::sImpl = gImpl; 40 41 void CameraTraces::saveTrace() { 42 ALOGV("%s: begin", __FUNCTION__); 43 ATRACE_BEGIN("CameraTraces::saveTrace"); 44 Mutex::Autolock al(sImpl.tracesLock); 45 46 List<ProcessCallStack>& pcsList = sImpl.pcsList; 47 48 // Insert new ProcessCallStack, and immediately crawl all the threads 49 pcsList.push_front(ProcessCallStack()); 50 ProcessCallStack& pcs = *pcsList.begin(); 51 pcs.update(); 52 53 if (pcsList.size() > MAX_TRACES) { 54 // Prune list periodically and discard oldest entry 55 pcsList.erase(--pcsList.end()); 56 } 57 58 IF_ALOGV() { 59 pcs.log(LOG_TAG, ANDROID_LOG_VERBOSE); 60 } 61 62 ALOGD("Process trace saved. Use dumpsys media.camera to view."); 63 64 ATRACE_END(); 65 } 66 67 status_t CameraTraces::dump(int fd, const Vector<String16> &args __attribute__((unused))) { 68 ALOGV("%s: fd = %d", __FUNCTION__, fd); 69 Mutex::Autolock al(sImpl.tracesLock); 70 List<ProcessCallStack>& pcsList = sImpl.pcsList; 71 72 if (fd < 0) { 73 ALOGW("%s: Negative FD (%d)", __FUNCTION__, fd); 74 return BAD_VALUE; 75 } 76 77 fdprintf(fd, "Camera traces (%zu):\n", pcsList.size()); 78 79 if (pcsList.empty()) { 80 fdprintf(fd, " No camera traces collected.\n"); 81 } 82 83 // Print newest items first 84 List<ProcessCallStack>::iterator it, end; 85 for (it = pcsList.begin(), end = pcsList.end(); it != end; ++it) { 86 const ProcessCallStack& pcs = *it; 87 pcs.dump(fd, DUMP_INDENT); 88 } 89 90 return OK; 91 } 92 93 }; // namespace camera3 94 }; // namespace android 95