Changeset 1aa4bf7 for lib/trace.c


Ignore:
Timestamp:
04/03/09 14:22:52 (13 years ago)
Author:
Perry Lorier <perry@…>
Branches:
4.0.1-hotfixes, cachetimestamps, develop, dpdk-ndag, etsilive, getfragoff, help, libtrace4, master, ndag_format, pfring, rc-4.0.1, rc-4.0.2, rc-4.0.3, rc-4.0.4, ringdecrementfix, ringperformance, ringtimestampfixes
Children:
327b1df
Parents:
af0918a
Message:

Support using timespec's for dealing with traces

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/trace.c

    r91b72d3 r1aa4bf7  
    902902 */
    903903DLLEXPORT uint64_t trace_get_erf_timestamp(const libtrace_packet_t *packet) {
    904         uint64_t timestamp = 0;
    905         double seconds = 0.0;
    906         struct timeval ts;
    907 
    908904        if (packet->trace->format->get_erf_timestamp) {
    909905                /* timestamp -> timestamp */
    910                 timestamp = packet->trace->format->get_erf_timestamp(packet);
     906                return packet->trace->format->get_erf_timestamp(packet);
     907        } else if (packet->trace->format->get_timespec) {
     908                /* timespec -> timestamp */
     909                struct timespec ts;
     910                ts = packet->trace->format->get_timespec(packet);
     911                return ((((uint64_t)ts.tv_sec) << 32) +
     912                                (((uint64_t)ts.tv_nsec << 32)/1000000000));
    911913        } else if (packet->trace->format->get_timeval) {
    912914                /* timeval -> timestamp */
    913                 ts = packet->trace->format->get_timeval(packet);
    914                 timestamp = ((((uint64_t)ts.tv_sec) << 32) +
    915                                 (((uint64_t)ts.tv_usec << 32)/1000000));
     915                struct timeval tv;
     916                tv = packet->trace->format->get_timeval(packet);
     917                return ((((uint64_t)tv.tv_sec) << 32) +
     918                                (((uint64_t)tv.tv_usec << 32)/1000000));
    916919        } else if (packet->trace->format->get_seconds) {
    917920                /* seconds -> timestamp */
    918                 seconds = packet->trace->format->get_seconds(packet);
    919                 timestamp = (((uint64_t)seconds)<<32)
     921                double seconds = packet->trace->format->get_seconds(packet);
     922                return (((uint64_t)seconds)<<32)
    920923                          + (uint64_t)((seconds-(uint64_t)seconds)*UINT_MAX);
     924        }
     925        else {
     926                return (uint64_t)0;
     927        }
    921928                     
    922         }
    923         return timestamp;
    924929}
    925930
     
    934939        struct timeval tv;
    935940        uint64_t ts = 0;
    936         double seconds = 0.0;
    937941        if (packet->trace->format->get_timeval) {
    938942                /* timeval -> timeval */
     
    953957                        tv.tv_sec += 1;
    954958                }
     959        } else if (packet->trace->format->get_timespec) {
     960                struct timespec ts = packet->trace->format->get_timespec(packet);
     961                tv.tv_sec = ts.tv_sec;
     962                tv.tv_usec = ts.tv_nsec/1000;
    955963        } else if (packet->trace->format->get_seconds) {
    956964                /* seconds -> timeval */
    957                 seconds = packet->trace->format->get_seconds(packet);
     965                double seconds = packet->trace->format->get_seconds(packet);
    958966                tv.tv_sec = (uint32_t)seconds;
    959967                tv.tv_usec = (uint32_t)(((seconds - tv.tv_sec) * 1000000)/UINT_MAX);
     
    966974        return tv;
    967975}
     976
     977DLLEXPORT struct timespec trace_get_timespec(const libtrace_packet_t *packet) {
     978        struct timespec ts;
     979
     980        if (packet->trace->format->get_timespec) {
     981                return packet->trace->format->get_timespec(packet);
     982        } else if (packet->trace->format->get_erf_timestamp) {
     983                /* timestamp -> timeval */
     984                uint64_t erfts = packet->trace->format->get_erf_timestamp(packet);
     985#if __BYTE_ORDER == __BIG_ENDIAN
     986                ts.tv_sec = erfts & 0xFFFFFFFF;
     987#elif __BYTE_ORDER == __LITTLE_ENDIAN
     988                ts.tv_sec = erfts >> 32;
     989#else
     990#error "What on earth are you running this on?"
     991#endif
     992                ts.tv_nsec = ((erfts&0xFFFFFFFF)*1000000000)>>32;
     993                if (ts.tv_nsec >= 1000000000) {
     994                        ts.tv_nsec -= 1000000000;
     995                        ts.tv_sec += 1;
     996                }
     997                return ts;
     998        } else if (packet->trace->format->get_timeval) {
     999                /* timeval -> timespec */
     1000                struct timeval tv = packet->trace->format->get_timeval(packet);
     1001                ts.tv_sec = tv.tv_sec;
     1002                ts.tv_nsec = tv.tv_usec*1000;
     1003                return ts;
     1004        } else if (packet->trace->format->get_seconds) {
     1005                /* seconds -> timespec */
     1006                double seconds = packet->trace->format->get_seconds(packet);
     1007                ts.tv_sec = (uint32_t)seconds;
     1008                ts.tv_nsec = (long)(((seconds - ts.tv_sec) * 1000000000)/UINT_MAX);
     1009                return ts;
     1010        }
     1011        else {
     1012                ts.tv_sec=-1;
     1013                ts.tv_nsec=-1;
     1014                return ts;
     1015        }
     1016}
     1017
    9681018
    9691019/* Get the current time in floating point seconds
     
    9741024DLLEXPORT double trace_get_seconds(const libtrace_packet_t *packet) {
    9751025        double seconds = 0.0;
    976         uint64_t ts = 0;
    977         struct timeval tv;
    9781026
    9791027        if (packet->trace->format->get_seconds) {
     
    9821030        } else if (packet->trace->format->get_erf_timestamp) {
    9831031                /* timestamp -> seconds */
     1032                uint64_t ts = 0;
    9841033                ts = packet->trace->format->get_erf_timestamp(packet);
    9851034                seconds =  (ts>>32) + ((ts & UINT_MAX)*1.0 / UINT_MAX);
     1035        } else if (packet->trace->format->get_timespec) {
     1036                /* timespec -> seconds */
     1037                struct timespec ts;
     1038                ts = packet->trace->format->get_timespec(packet);
     1039                seconds = ts.tv_sec + ((ts.tv_nsec * 1.0) / 1000000000);
    9861040        } else if (packet->trace->format->get_timeval) {
    9871041                /* timeval -> seconds */
     1042                struct timeval tv;
    9881043                tv = packet->trace->format->get_timeval(packet);
    9891044                seconds = tv.tv_sec + ((tv.tv_usec * 1.0) / 1000000);
Note: See TracChangeset for help on using the changeset viewer.