aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Host/common/ThisThread.cpp
blob: 2fea0a10c97d950944cf50cf1e8c80cde2f73ba2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//===-- ThisThread.cpp ------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Host/ThisThread.h"
#include "lldb/Core/Error.h"
#include "lldb/Host/HostInfo.h"

#include "llvm/ADT/STLExtras.h"

#include <algorithm>

using namespace lldb;
using namespace lldb_private;

void ThisThread::SetName(llvm::StringRef name, int max_length) {
  std::string truncated_name(name.data());

  // Thread names are coming in like '<lldb.comm.debugger.edit>' and
  // '<lldb.comm.debugger.editline>'.  So just chopping the end of the string
  // off leads to a lot of similar named threads.  Go through the thread name
  // and search for the last dot and use that.

  if (max_length > 0 &&
      truncated_name.length() > static_cast<size_t>(max_length)) {
    // First see if we can get lucky by removing any initial or final braces.
    std::string::size_type begin = truncated_name.find_first_not_of("(<");
    std::string::size_type end = truncated_name.find_last_not_of(")>.");
    if (end - begin > static_cast<size_t>(max_length)) {
      // We're still too long.  Since this is a dotted component, use everything
      // after the last
      // dot, up to a maximum of |length| characters.
      std::string::size_type last_dot = truncated_name.rfind('.');
      if (last_dot != std::string::npos)
        begin = last_dot + 1;

      end = std::min(end, begin + max_length);
    }

    std::string::size_type count = end - begin + 1;
    truncated_name = truncated_name.substr(begin, count);
  }

  SetName(truncated_name.c_str());
}