brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 4fbe294 Raw
71 lines · cpp
1//===-- memprof_descriptions.cpp -------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of MemProfiler, a memory profiler.10//11// MemProf functions for getting information about an address and/or printing12// it.13//===----------------------------------------------------------------------===//14 15#include "memprof_descriptions.h"16#include "memprof_mapping.h"17#include "memprof_stack.h"18#include "sanitizer_common/sanitizer_stackdepot.h"19 20namespace __memprof {21 22MemprofThreadIdAndName::MemprofThreadIdAndName(MemprofThreadContext *t) {23  Init(t->tid, t->name);24}25 26MemprofThreadIdAndName::MemprofThreadIdAndName(u32 tid) {27  if (tid == kInvalidTid) {28    Init(tid, "");29  } else {30    memprofThreadRegistry().CheckLocked();31    MemprofThreadContext *t = GetThreadContextByTidLocked(tid);32    Init(tid, t->name);33  }34}35 36void MemprofThreadIdAndName::Init(u32 tid, const char *tname) {37  int len = internal_snprintf(name, sizeof(name), "T%d", tid);38  CHECK(((unsigned int)len) < sizeof(name));39  if (tname[0] != '\0')40    internal_snprintf(&name[len], sizeof(name) - len, " (%s)", tname);41}42 43void DescribeThread(MemprofThreadContext *context) {44  CHECK(context);45  memprofThreadRegistry().CheckLocked();46  // No need to announce the main thread.47  if (context->tid == kMainTid || context->announced) {48    return;49  }50  context->announced = true;51  InternalScopedString str;52  str.AppendF("Thread %s", MemprofThreadIdAndName(context).c_str());53  if (context->parent_tid == kInvalidTid) {54    str.Append(" created by unknown thread\n");55    Printf("%s", str.data());56    return;57  }58  str.AppendF(" created by %s here:\n",59              MemprofThreadIdAndName(context->parent_tid).c_str());60  Printf("%s", str.data());61  StackDepotGet(context->stack_id).Print();62  // Recursively described parent thread if needed.63  if (flags()->print_full_thread_history) {64    MemprofThreadContext *parent_context =65        GetThreadContextByTidLocked(context->parent_tid);66    DescribeThread(parent_context);67  }68}69 70} // namespace __memprof71