Changeset 6c248a9 for lib/trace.c


Ignore:
Timestamp:
03/01/06 11:52:01 (16 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:
30c0246
Parents:
4aa4615
Message:

Add support for the other seek formats.
Fix bugs in other formats to do with _start()/_pause()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/trace.c

    r4aa4615 r6c248a9  
    16891689        }
    16901690        else {
    1691                 /*FIXME: can this be transmuted into seek_seconds, or
    1692                  * seek_timeval?
    1693                  */
     1691                if (trace->format->seek_timeval) {
     1692                        struct timeval tv;
     1693#if __BYTE_ORDER == __BIG_ENDIAN
     1694                        tv.tv_sec = ts & 0xFFFFFFFF;
     1695#elif __BYTE_ORDER == __LITTLE_ENDIAN
     1696                        tv.tv_sec = ts >> 32;
     1697#else
     1698#error "What on earth are you running this on?"
     1699#endif
     1700                        tv.tv_usec = ((ts&0xFFFFFFFF)*1000000)>>32;
     1701                        if (tv.tv_usec >= 1000000) {
     1702                                tv.tv_usec -= 1000000;
     1703                                tv.tv_sec += 1;
     1704                        }
     1705                        return trace->format->seek_timeval(trace,tv);
     1706                }
     1707                if (trace->format->seek_seconds) {
     1708                        double seconds = 
     1709                                (ts>>32) + ((ts & UINT_MAX)*1.0 / UINT_MAX);
     1710                        return trace->format->seek_seconds(trace,seconds);
     1711                }
    16941712                trace_set_err(trace,
    16951713                                TRACE_ERR_OPTION_UNAVAIL,
     
    16991717}
    17001718
     1719int trace_seek_seconds(libtrace_t *trace, double seconds)
     1720{
     1721        if (trace->format->seek_seconds) {
     1722                return trace->format->seek_seconds(trace,seconds);
     1723        }
     1724        else {
     1725                if (trace->format->seek_timeval) {
     1726                        struct timeval tv;
     1727                        tv.tv_sec = (uint32_t)seconds;
     1728                        tv.tv_usec = (uint32_t)(((seconds - tv.tv_sec) * 1000000)/UINT_MAX);
     1729                        return trace->format->seek_timeval(trace,tv);
     1730                }
     1731                if (trace->format->seek_erf) {
     1732                        uint64_t timestamp =
     1733                                ((uint64_t)((uint32_t)seconds) << 32) + \
     1734                            (( seconds - (uint32_t)seconds   ) * UINT_MAX);
     1735                        return trace->format->seek_erf(trace,timestamp);
     1736                }
     1737                trace_set_err(trace,
     1738                                TRACE_ERR_OPTION_UNAVAIL,
     1739                                "Feature unimplemented");
     1740                return -1;
     1741        }
     1742}
     1743
     1744int trace_seek_timeval(libtrace_t *trace, struct timeval tv)
     1745{
     1746        if (trace->format->seek_timeval) {
     1747                return trace->format->seek_timeval(trace,tv);
     1748        }
     1749        else {
     1750                if (trace->format->seek_erf) {
     1751                        uint64_t timestamp = ((((uint64_t)tv.tv_sec) << 32) + \
     1752                                (((uint64_t)tv.tv_usec * UINT_MAX)/1000000));
     1753                        return trace->format->seek_erf(trace,timestamp);
     1754                }
     1755                if (trace->format->seek_seconds) {
     1756                        double seconds = tv.tv_sec + ((tv.tv_usec * UINT_MAX * 1.0)/1000000);
     1757                        return trace->format->seek_seconds(trace,seconds);
     1758                }
     1759                trace_set_err(trace,
     1760                                TRACE_ERR_OPTION_UNAVAIL,
     1761                                "Feature unimplemented");
     1762                return -1;
     1763        }
     1764}
     1765
Note: See TracChangeset for help on using the changeset viewer.