16c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen/* 26c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Copyright (C) 2011 The Android Open Source Project 36c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 46c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License"); 56c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * you may not use this file except in compliance with the License. 66c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * You may obtain a copy of the License at 76c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 86c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * http://www.apache.org/licenses/LICENSE-2.0 96c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * 106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Unless required by applicable law or agreed to in writing, software 116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS, 126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * See the License for the specific language governing permissions and 146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * limitations under the License. 156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen */ 166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#ifndef __DIAG_THREAD_H__ 186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#define __DIAG_THREAD_H__ 196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <utils/List.h> 216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <utils/threads.h> 226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chennamespace android { 246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenclass CommonClock; 266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenclass LocalClock; 276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenclass DiagThread : public Thread { 296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen public: 306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen DiagThread(CommonClock* common_clock, LocalClock* local_clock); 316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen ~DiagThread(); 326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen status_t startWorkThread(); 346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen void stopWorkThread(); 356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen virtual bool threadLoop(); 366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen void pushDisciplineEvent(int64_t observed_local_time, 386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t observed_common_time, 396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t nominal_common_time, 406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int32_t total_correction, 4111bc45fcba96cf7ccc5f67b3c47088c2c89c8e7aKent Ryhorchuk int32_t rtt); 426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen private: 446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen typedef struct { 456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t event_id; 466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t action_local_time; 476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t action_common_time; 486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t observed_local_time; 496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t observed_common_time; 506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t nominal_common_time; 516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int32_t total_correction; 5211bc45fcba96cf7ccc5f67b3c47088c2c89c8e7aKent Ryhorchuk int32_t rtt; 536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen } DisciplineEventRecord; 546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen bool openListenSocket(); 566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen void cleanupListenSocket(); 576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen void cleanupDataSocket(); 586c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen void resetLogIDs(); 596c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 606c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen CommonClock* common_clock_; 616c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen LocalClock* local_clock_; 626c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int listen_fd_; 636c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int data_fd_; 646c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 656c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t kernel_logID_basis_; 666c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen bool kernel_logID_basis_known_; 676c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 686c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen static const size_t kMaxDisciplineLogSize = 16; 696c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen Mutex discipline_log_lock_; 706c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen List<DisciplineEventRecord> discipline_log_; 716c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen int64_t discipline_log_ID_; 726c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}; 736c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 746c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen} // namespace android 756c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen 766c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#endif //__ DIAG_THREAD_H__ 77