File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / pimd / pim_time.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:11 2016 UTC (7 years, 8 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    1: /*
    2:   PIM for Quagga
    3:   Copyright (C) 2008  Everton da Silva Marques
    4: 
    5:   This program is free software; you can redistribute it and/or modify
    6:   it under the terms of the GNU General Public License as published by
    7:   the Free Software Foundation; either version 2 of the License, or
    8:   (at your option) any later version.
    9: 
   10:   This program is distributed in the hope that it will be useful, but
   11:   WITHOUT ANY WARRANTY; without even the implied warranty of
   12:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:   General Public License for more details.
   14:   
   15:   You should have received a copy of the GNU General Public License
   16:   along with this program; see the file COPYING; if not, write to the
   17:   Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
   18:   MA 02110-1301 USA
   19:   
   20:   $QuaggaId: $Format:%an, %ai, %h$ $
   21: */
   22: 
   23: #include <zebra.h>
   24: 
   25: #include <string.h>
   26: #include <sys/time.h>
   27: #include <time.h>
   28: 
   29: #include "log.h"
   30: #include "thread.h"
   31: 
   32: #include "pim_time.h"
   33: 
   34: static int gettime_monotonic(struct timeval *tv)
   35: {
   36:   int result;
   37: 
   38:   result = gettimeofday(tv, 0);
   39:   if (result) {
   40:     zlog_err("%s: gettimeofday() failure: errno=%d: %s",
   41: 	     __PRETTY_FUNCTION__,
   42: 	     errno, safe_strerror(errno));
   43:   }
   44: 
   45:   return result;
   46: }
   47: 
   48: /*
   49:   pim_time_monotonic_sec():
   50:   number of seconds since some unspecified starting point
   51: */
   52: int64_t pim_time_monotonic_sec()
   53: {
   54:   struct timeval now_tv;
   55: 
   56:   if (gettime_monotonic(&now_tv)) {
   57:     zlog_err("%s: gettime_monotonic() failure: errno=%d: %s",
   58: 	     __PRETTY_FUNCTION__,
   59: 	     errno, safe_strerror(errno));
   60:     return -1;
   61:   }
   62: 
   63:   return now_tv.tv_sec;
   64: }
   65: 
   66: /*
   67:   pim_time_monotonic_dsec():
   68:   number of deciseconds since some unspecified starting point
   69: */
   70: int64_t pim_time_monotonic_dsec()
   71: {
   72:   struct timeval now_tv;
   73:   int64_t        now_dsec;
   74: 
   75:   if (gettime_monotonic(&now_tv)) {
   76:     zlog_err("%s: gettime_monotonic() failure: errno=%d: %s",
   77: 	     __PRETTY_FUNCTION__,
   78: 	     errno, safe_strerror(errno));
   79:     return -1;
   80:   }
   81: 
   82:   now_dsec = ((int64_t) now_tv.tv_sec) * 10 + ((int64_t) now_tv.tv_usec) / 100000;
   83: 
   84:   return now_dsec;
   85: }
   86: 
   87: int pim_time_mmss(char *buf, int buf_size, long sec)
   88: {
   89:   long mm;
   90:   int wr;
   91: 
   92:   zassert(buf_size >= 5);
   93: 
   94:   mm = sec / 60;
   95:   sec %= 60;
   96:   
   97:   wr = snprintf(buf, buf_size, "%02ld:%02ld", mm, sec);
   98: 
   99:   return wr != 8;
  100: }
  101: 
  102: static int pim_time_hhmmss(char *buf, int buf_size, long sec)
  103: {
  104:   long hh;
  105:   long mm;
  106:   int wr;
  107: 
  108:   zassert(buf_size >= 8);
  109: 
  110:   hh = sec / 3600;
  111:   sec %= 3600;
  112:   mm = sec / 60;
  113:   sec %= 60;
  114:   
  115:   wr = snprintf(buf, buf_size, "%02ld:%02ld:%02ld", hh, mm, sec);
  116: 
  117:   return wr != 8;
  118: }
  119: 
  120: void pim_time_timer_to_mmss(char *buf, int buf_size, struct thread *t_timer)
  121: {
  122:   if (t_timer) {
  123:     pim_time_mmss(buf, buf_size,
  124: 		  thread_timer_remain_second(t_timer));
  125:   }
  126:   else {
  127:     snprintf(buf, buf_size, "--:--");
  128:   }
  129: }
  130: 
  131: void pim_time_timer_to_hhmmss(char *buf, int buf_size, struct thread *t_timer)
  132: {
  133:   if (t_timer) {
  134:     pim_time_hhmmss(buf, buf_size,
  135: 		    thread_timer_remain_second(t_timer));
  136:   }
  137:   else {
  138:     snprintf(buf, buf_size, "--:--:--");
  139:   }
  140: }
  141: 
  142: void pim_time_uptime(char *buf, int buf_size, int64_t uptime_sec)
  143: {
  144:   zassert(buf_size >= 8);
  145: 
  146:   pim_time_hhmmss(buf, buf_size, uptime_sec);
  147: }
  148: 
  149: void pim_time_uptime_begin(char *buf, int buf_size, int64_t now, int64_t begin)
  150: {
  151:   if (begin > 0)
  152:     pim_time_uptime(buf, buf_size, now - begin);
  153:   else
  154:     snprintf(buf, buf_size, "--:--:--");
  155: }
  156: 
  157: long pim_time_timer_remain_msec(struct thread *t_timer)
  158: {
  159:   /* FIXME: Actually fetch msec resolution from thread */
  160: 
  161:   /* no timer thread running means timer has expired: return 0 */
  162: 
  163:   return t_timer ?
  164:     1000 * thread_timer_remain_second(t_timer) :
  165:     0;
  166: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>