mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-29 08:39:44 +08:00
6dadd492b8
ProcStatReader.Threads is flaky because it relies on an internal, imprecise measurement of boot time. The flaky test asserts that a thread started after the main thread should have a start time >= the main thread. The start time is returned in a timeval, with microsecond precision, but the measurement of boot time requires two system calls and the time between those system calls can be approximately a microsecond. An unlucky event such as a change in system time could make this imprecision arbitrarily bad. This patch lets the caller of ProcStatReader.StartTime() inject the boot time, allowing ProcStatReader to guarantee that threads have correctly ordered time, given the same input boot time. Bug: 1016765 Change-Id: I6e4a944a1d58c3916090bab6a4b99573e71a89fc Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/1891588 Reviewed-by: Mark Mentovai <mark@chromium.org> Commit-Queue: Joshua Peraza <jperaza@chromium.org>
84 lines
2.7 KiB
C++
84 lines
2.7 KiB
C++
// Copyright 2017 The Crashpad Authors. All rights reserved.
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#ifndef CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_
|
||
#define CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_
|
||
|
||
#include <stddef.h>
|
||
#include <sys/time.h>
|
||
#include <sys/types.h>
|
||
|
||
#include <string>
|
||
|
||
#include "base/macros.h"
|
||
#include "util/linux/ptrace_connection.h"
|
||
#include "util/misc/initialization_state_dcheck.h"
|
||
|
||
namespace crashpad {
|
||
|
||
//! \brief Reads the /proc/[pid]/stat file for a thread.
|
||
class ProcStatReader {
|
||
public:
|
||
ProcStatReader();
|
||
~ProcStatReader();
|
||
|
||
//! \brief Initializes the reader.
|
||
//!
|
||
//! This method must be successfully called before calling any other.
|
||
//!
|
||
//! \param[in] connection A connection to the process to which the target
|
||
//! thread belongs.
|
||
//! \param[in] tid The thread ID to read the stat file for.
|
||
bool Initialize(PtraceConnection* connection, pid_t tid);
|
||
|
||
//! \brief Determines the time the thread has spent executing in user mode.
|
||
//!
|
||
//! \param[out] user_time The time spent executing in user mode.
|
||
//!
|
||
//! \return `true` on success, with \a user_time set. Otherwise, `false` with
|
||
//! a message logged.
|
||
bool UserCPUTime(timeval* user_time) const;
|
||
|
||
//! \brief Determines the time the thread has spent executing in system mode.
|
||
//!
|
||
//! \param[out] system_time The time spent executing in system mode.
|
||
//!
|
||
//! \return `true` on success, with \a system_time set. Otherwise, `false`
|
||
//! with a message logged.
|
||
bool SystemCPUTime(timeval* system_time) const;
|
||
|
||
//! \brief Determines the target thread’s start time.
|
||
//!
|
||
//! \param[in] boot_time The kernel boot time.
|
||
//! \param[out] start_time The time that the thread started.
|
||
//!
|
||
//! \return `true` on success, with \a start_time set. Otherwise, `false` with
|
||
//! a message logged.
|
||
bool StartTime(const timeval& boot_time, timeval* start_time) const;
|
||
|
||
private:
|
||
bool FindColumn(int index, const char** column) const;
|
||
bool ReadTimeAtIndex(int index, timeval* time_val) const;
|
||
|
||
std::string contents_;
|
||
size_t third_column_position_;
|
||
InitializationStateDcheck initialized_;
|
||
|
||
DISALLOW_COPY_AND_ASSIGN(ProcStatReader);
|
||
};
|
||
|
||
} // namespace crashpad
|
||
|
||
#endif // CRASHPAD_UTIL_LINUX_PROC_STAT_READER_H_
|