time.cc revision 1762
14120Sgblack@eecs.umich.edu/* 24120Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 37087Snate@binkert.org * All rights reserved. 47087Snate@binkert.org * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * neither the name of the copyright holders nor the names of its 137087Snate@binkert.org * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 154120Sgblack@eecs.umich.edu * 164120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274120Sgblack@eecs.umich.edu */ 284120Sgblack@eecs.umich.edu 294120Sgblack@eecs.umich.edu#include <sys/types.h> 304120Sgblack@eecs.umich.edu#include <sys/time.h> 314120Sgblack@eecs.umich.edu#include <time.h> 324120Sgblack@eecs.umich.edu#include <iostream> 334120Sgblack@eecs.umich.edu#include <string> 344120Sgblack@eecs.umich.edu 354120Sgblack@eecs.umich.edu#include "base/time.hh" 364120Sgblack@eecs.umich.edu 374120Sgblack@eecs.umich.eduusing namespace std; 384120Sgblack@eecs.umich.edu 394120Sgblack@eecs.umich.edustruct _timeval 404120Sgblack@eecs.umich.edu{ 414120Sgblack@eecs.umich.edu timeval tv; 424120Sgblack@eecs.umich.edu}; 434202Sbinkertn@umich.edu 445069Sgblack@eecs.umich.edudouble 454202Sbinkertn@umich.educonvert(const timeval &tv) 465659Sgblack@eecs.umich.edu{ 474601Sgblack@eecs.umich.edu return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; 485124Sgblack@eecs.umich.edu} 497966Sgblack@eecs.umich.edu 505083Sgblack@eecs.umich.eduTime::Time(bool set_now) 514679Sgblack@eecs.umich.edu{ 526515Sgblack@eecs.umich.edu time = new _timeval; 535083Sgblack@eecs.umich.edu if (set_now) 544679Sgblack@eecs.umich.edu set(); 554679Sgblack@eecs.umich.edu} 568745Sgblack@eecs.umich.edu 576313Sgblack@eecs.umich.eduTime::Time(const timeval &val) 586365Sgblack@eecs.umich.edu{ 595124Sgblack@eecs.umich.edu time = new _timeval; 608752Sgblack@eecs.umich.edu set(val); 614249Sgblack@eecs.umich.edu} 624240Sgblack@eecs.umich.edu 634202Sbinkertn@umich.eduTime::Time(const Time &val) 644997Sgblack@eecs.umich.edu{ 657624Sgblack@eecs.umich.edu time = new _timeval; 665135Sgblack@eecs.umich.edu set(val.get()); 674997Sgblack@eecs.umich.edu} 688745Sgblack@eecs.umich.edu 696365Sgblack@eecs.umich.eduTime::~Time() 708740Sgblack@eecs.umich.edu{ 716365Sgblack@eecs.umich.edu delete time; 728740Sgblack@eecs.umich.edu} 738745Sgblack@eecs.umich.edu 748752Sgblack@eecs.umich.educonst timeval & 758752Sgblack@eecs.umich.eduTime::get() const 768335Snate@binkert.org{ 778335Snate@binkert.org return time->tv; 784120Sgblack@eecs.umich.edu} 794202Sbinkertn@umich.edu 805649Sgblack@eecs.umich.eduvoid 815132Sgblack@eecs.umich.eduTime::set() 825132Sgblack@eecs.umich.edu{ 834202Sbinkertn@umich.edu ::gettimeofday(&time->tv, NULL); 845299Sgblack@eecs.umich.edu} 855132Sgblack@eecs.umich.edu 865086Sgblack@eecs.umich.eduvoid 875086Sgblack@eecs.umich.eduTime::set(const timeval &tv) 884202Sbinkertn@umich.edu{ 894202Sbinkertn@umich.edu memcpy(&time->tv, &tv, sizeof(timeval)); 904120Sgblack@eecs.umich.edu} 914202Sbinkertn@umich.edu 924202Sbinkertn@umich.edudouble 934202Sbinkertn@umich.eduTime::operator()() const 944120Sgblack@eecs.umich.edu{ 955069Sgblack@eecs.umich.edu return convert(get()); 965081Sgblack@eecs.umich.edu} 975081Sgblack@eecs.umich.edu 985081Sgblack@eecs.umich.edustring 995081Sgblack@eecs.umich.eduTime::date(string format) const 1005081Sgblack@eecs.umich.edu{ 1015081Sgblack@eecs.umich.edu const timeval &tv = get(); 1025081Sgblack@eecs.umich.edu time_t sec = tv.tv_sec; 1035081Sgblack@eecs.umich.edu char buf[256]; 1045081Sgblack@eecs.umich.edu 1055081Sgblack@eecs.umich.edu if (format.empty()) { 1065081Sgblack@eecs.umich.edu ctime_r(&sec, buf); 1075081Sgblack@eecs.umich.edu buf[24] = '\0'; 1085081Sgblack@eecs.umich.edu return buf; 1095081Sgblack@eecs.umich.edu } 1105081Sgblack@eecs.umich.edu 1115081Sgblack@eecs.umich.edu struct tm *tm = localtime(&sec); 1125081Sgblack@eecs.umich.edu strftime(buf, sizeof(buf), format.c_str(), tm); 1135081Sgblack@eecs.umich.edu return buf; 1145081Sgblack@eecs.umich.edu} 1155081Sgblack@eecs.umich.edu 1165081Sgblack@eecs.umich.eduostream & 1175081Sgblack@eecs.umich.eduoperator<<(ostream &out, const Time &start) 1185081Sgblack@eecs.umich.edu{ 1195081Sgblack@eecs.umich.edu out << start.date(); 1205081Sgblack@eecs.umich.edu return out; 1215081Sgblack@eecs.umich.edu} 1225081Sgblack@eecs.umich.edu 1235081Sgblack@eecs.umich.eduTime 1245081Sgblack@eecs.umich.eduoperator-(const Time &l, const Time &r) 1255081Sgblack@eecs.umich.edu{ 1265081Sgblack@eecs.umich.edu timeval tv; 1275081Sgblack@eecs.umich.edu timersub(&l.get(), &r.get(), &tv); 1285081Sgblack@eecs.umich.edu return tv; 1295081Sgblack@eecs.umich.edu} 1305081Sgblack@eecs.umich.edu 1315081Sgblack@eecs.umich.educonst Time Time::start(true); 1325081Sgblack@eecs.umich.edu