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