// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_INTER_PROCESS_TIME_TICKS_CONVERTER_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_INTER_PROCESS_TIME_TICKS_CONVERTER_H_ #include <stdint.h> #include "base/time/time.h" #include "third_party/blink/public/common/common_export.h" namespace blink { // SiteSpecificTimeDelta<T> is base::TimeDelta with a type tag. It it // essentially base::TimeDelta, but SiteSpecificTimeDelta<T> is different from // SiteSpecificTimeDelta<U> if T is different from U. template <typename T> class SiteSpecificTimeDelta final { … }; // For logging use only. template <typename T> std::ostream& operator<<(std::ostream& os, SiteSpecificTimeDelta<T> delta) { … } // SiteSpecificTimeTicks<T> is base::TimeTicks with a type tag. It is // essentially base::TimeTicks, but SiteSpecificTimeTicks<T> is different from // SiteSpecificTimeTicks<U> if T is different from U. template <typename T> class SiteSpecificTimeTicks final { … }; // For logging use only. template <typename T> std::ostream& operator<<(std::ostream& os, SiteSpecificTimeTicks<T> time_ticks) { … } class SiteSpecificTimeLocalTag; LocalTimeTicks; LocalTimeDelta; class SiteSpecificTimeRemoteTag; RemoteTimeTicks; RemoteTimeDelta; // On Windows, TimeTicks are not always consistent between processes as // indicated by |TimeTicks::IsConsistentAcrossProcesses()|. Often, the values on // one process have a static offset relative to another. Occasionally, these // offsets shift while running. // // To combat this, any TimeTicks values sent from the remote process to the // local process must be tweaked in order to appear monotonic. // // In order to properly tweak ticks, we need 4 reference points: // // - |local_lower_bound|: A known point, recorded on the local process, that // occurs before any remote values that will be // converted. // - |remote_lower_bound|: The equivalent point on the remote process. This // should be recorded immediately after // |local_lower_bound|. // - |local_upper_bound|: A known point, recorded on the local process, that // occurs after any remote values that will be // converted. // - |remote_upper_bound|: The equivalent point on the remote process. This // should be recorded immediately before // |local_upper_bound|. // // Once these bounds are determined, values within the remote process's range // can be converted to the local process's range. The values are converted as // follows: // // 1. If the remote's range exceeds the local's range, it is scaled to fit. // Any values converted will have the same scale factor applied. // // 2. The remote's range is shifted so that it is centered within the // local's range. Any values converted will be shifted the same amount. class BLINK_COMMON_EXPORT InterProcessTimeTicksConverter { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_INTER_PROCESS_TIME_TICKS_CONVERTER_H_