12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2014, 2016, The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without modification, are permitted 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* provided that the following conditions are met: 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright notice, this list of 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* conditions and the following disclaimer. 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above copyright notice, this list of 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* conditions and the following disclaimer in the documentation and/or other materials provided 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* endorse or promote products derived from this software without specific prior written 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* permission. 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdarg.h> 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdio.h> 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <string.h> 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h> 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "dump_impl.h" 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl* DumpImpl::dump_list_[] = { 0 }; 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t DumpImpl::dump_count_ = 0; 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError DumpInterface::GetDump(char *buffer, uint32_t length) { 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!buffer || !length) { 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorParameters; 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel buffer[0] = '\0'; 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DumpImpl::AppendString(buffer, length, "\n-------- Snapdragon Display Manager --------"); 442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (uint32_t i = 0; i < DumpImpl::dump_count_; i++) { 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DumpImpl::dump_list_[i]->AppendDump(buffer, length); 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DumpImpl::AppendString(buffer, length, "\n\n"); 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl::DumpImpl() { 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Register(this); 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl::~DumpImpl() { 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Unregister(this); 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::AppendString(char *buffer, uint32_t length, const char *format, ...) { 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t filled = UINT32(strlen(buffer)); 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Reserve one byte for null terminating character 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if ((filled + 1) >= length) { 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return; 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel buffer += filled; 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel va_list list; 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel va_start(list, format); 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel vsnprintf(buffer, length - filled -1, format, list); 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Every object is created or destroyed through display core only, which itself protects the 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// the access, so no need to protect registration or de-registration. 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::Register(DumpImpl *dump_impl) { 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (dump_count_ < kMaxDumpObjects) { 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dump_list_[dump_count_] = dump_impl; 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dump_count_++; 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::Unregister(DumpImpl *dump_impl) { 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (uint32_t i = 0; i < dump_count_; i++) { 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (dump_list_[i] == dump_impl) { 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dump_count_--; 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (; i < dump_count_; i++) { 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel dump_list_[i] = dump_list_[i + 1]; 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} // namespace sdm 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 95