time.cc revision 400
110553Salexandru.dutu@amd.com/* 210553Salexandru.dutu@amd.com * Copyright (c) 2003 The Regents of The University of Michigan 310553Salexandru.dutu@amd.com * All rights reserved. 410553Salexandru.dutu@amd.com * 510553Salexandru.dutu@amd.com * Redistribution and use in source and binary forms, with or without 610553Salexandru.dutu@amd.com * modification, are permitted provided that the following conditions are 710553Salexandru.dutu@amd.com * met: redistributions of source code must retain the above copyright 810553Salexandru.dutu@amd.com * notice, this list of conditions and the following disclaimer; 910553Salexandru.dutu@amd.com * redistributions in binary form must reproduce the above copyright 1010553Salexandru.dutu@amd.com * notice, this list of conditions and the following disclaimer in the 1110553Salexandru.dutu@amd.com * documentation and/or other materials provided with the distribution; 1210553Salexandru.dutu@amd.com * neither the name of the copyright holders nor the names of its 1310553Salexandru.dutu@amd.com * contributors may be used to endorse or promote products derived from 1410553Salexandru.dutu@amd.com * this software without specific prior written permission. 1510553Salexandru.dutu@amd.com * 1610553Salexandru.dutu@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710553Salexandru.dutu@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810553Salexandru.dutu@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910553Salexandru.dutu@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010553Salexandru.dutu@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110553Salexandru.dutu@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210553Salexandru.dutu@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310553Salexandru.dutu@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410553Salexandru.dutu@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510553Salexandru.dutu@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610553Salexandru.dutu@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710553Salexandru.dutu@amd.com */ 2810553Salexandru.dutu@amd.com 2910553Salexandru.dutu@amd.com#include <sys/types.h> 3010553Salexandru.dutu@amd.com#include <sys/time.h> 3110553Salexandru.dutu@amd.com#include <time.h> 3211793Sbrandon.potter@amd.com#include <iostream> 3311659Salexandru.dutu@amd.com#include <string> 3411800Sbrandon.potter@amd.com 3510553Salexandru.dutu@amd.com#include "base/time.hh" 3611800Sbrandon.potter@amd.com 3710553Salexandru.dutu@amd.comusing namespace std; 3810553Salexandru.dutu@amd.com 3910553Salexandru.dutu@amd.comstruct _timeval 4010553Salexandru.dutu@amd.com{ 4110553Salexandru.dutu@amd.com timeval tv; 4210553Salexandru.dutu@amd.com}; 4310553Salexandru.dutu@amd.com 4410553Salexandru.dutu@amd.comdouble 4510553Salexandru.dutu@amd.comconvert(const timeval &tv) 4610553Salexandru.dutu@amd.com{ 4710553Salexandru.dutu@amd.com return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; 4810553Salexandru.dutu@amd.com} 4910553Salexandru.dutu@amd.com 5010553Salexandru.dutu@amd.comTime::Time() 5110553Salexandru.dutu@amd.com{ 5211877Sbrandon.potter@amd.com time = new _timeval; 5311877Sbrandon.potter@amd.com ::gettimeofday(&time->tv, NULL); 5411877Sbrandon.potter@amd.com} 5513613Sgabeblack@google.com 5610553Salexandru.dutu@amd.comTime::Time(const timeval &val) 5710553Salexandru.dutu@amd.com{ 5810553Salexandru.dutu@amd.com time = new _timeval; 5910553Salexandru.dutu@amd.com set(val); 6010553Salexandru.dutu@amd.com} 6110553Salexandru.dutu@amd.com 6210553Salexandru.dutu@amd.comTime::Time(const Time &val) 6310553Salexandru.dutu@amd.com{ 6410553Salexandru.dutu@amd.com time = new _timeval; 6510553Salexandru.dutu@amd.com set(val.get()); 6610553Salexandru.dutu@amd.com} 6710553Salexandru.dutu@amd.com 6810553Salexandru.dutu@amd.comTime::~Time() 6910553Salexandru.dutu@amd.com{ 7010553Salexandru.dutu@amd.com delete time; 7111659Salexandru.dutu@amd.com} 7211659Salexandru.dutu@amd.com 7311659Salexandru.dutu@amd.comconst timeval & 7411659Salexandru.dutu@amd.comTime::get() const 7511659Salexandru.dutu@amd.com{ 7614010Sgabeblack@google.com return time->tv; 7714010Sgabeblack@google.com} 7811659Salexandru.dutu@amd.com 7911659Salexandru.dutu@amd.comvoid 8011659Salexandru.dutu@amd.comTime::set(const timeval &tv) 8111659Salexandru.dutu@amd.com{ 8211659Salexandru.dutu@amd.com memcpy(&time->tv, &tv, sizeof(timeval)); 8311659Salexandru.dutu@amd.com} 8411659Salexandru.dutu@amd.com 8511659Salexandru.dutu@amd.comvoid 8611659Salexandru.dutu@amd.comTime::reset() 8711659Salexandru.dutu@amd.com{ 8810553Salexandru.dutu@amd.com ::gettimeofday(&time->tv, NULL); 8910553Salexandru.dutu@amd.com} 9010553Salexandru.dutu@amd.com 91double 92Time::operator()() const 93{ 94 return convert(get()); 95} 96 97string 98Time::date(string format) const 99{ 100 const timeval &tv = get(); 101 time_t sec = tv.tv_sec; 102 char buf[256]; 103 104 if (format.empty()) { 105 ctime_r(&sec, buf); 106 buf[24] = '\0'; 107 return buf; 108 } 109 110 struct tm *tm = localtime(&sec); 111 strftime(buf, sizeof(buf), format.c_str(), tm); 112 return buf; 113} 114 115ostream & 116operator<<(ostream &out, const Time &start) 117{ 118 out << start.date(); 119 return out; 120} 121 122Time 123operator-(const Time &l, const Time &r) 124{ 125 timeval tv; 126 timersub(&l.get(), &r.get(), &tv); 127 return tv; 128} 129 130const Time Time::start; 131