Changeset 7bb7dda for lib/trace.c


Ignore:
Timestamp:
04/11/05 12:52:37 (17 years ago)
Author:
Daniel Lawson <dlawson@…>
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:
808a478
Parents:
be02abd
Message:

improved trace_event() in the case of trace playback. Seems to work fine now :)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/trace.c

    r3cfa94a r7bb7dda  
    167167                int size;
    168168        } packet;
     169        double tdelta;
     170        double trace_start_ts;
     171        double real_start_ts;
     172        double trace_last_ts;
     173
    169174        double last_ts;
    170175        double start_ts;
    171         struct timeval start_tv;
    172176};
    173177
     
    202206        }
    203207        strncpy(scan,uri, (uridata - uri));
     208
     209        (*libtrace)->tdelta = 0.0;
    204210
    205211        if (!strncasecmp(scan,"erf",3)) {
     
    14481454 *  TRACE_EVENT_SLEEP   Next event in seconds
    14491455 *  TRACE_EVENT_PACKET  Packet arrived in buffer with size size
     1456 *  TRACE_EVENT_TERMINATE Trace terminated (perhaps with an error condition)
    14501457 * FIXME currently keeps a copy of the packet inside the trace pointer,
    14511458 * which in turn is stored inside the new packet object...
     
    14781485                                if (data>0) {
    14791486                                        event.size = trace_read_packet(trace,packet);
    1480                                         if (event.size < 0) {
    1481                                                 event.type = TRACE_EVENT_TERMINATE;
    1482                                                 return event;
    1483                                         }
    14841487                                        event.type = TRACE_EVENT_PACKET;
    14851488                                        return event;
     
    15001503                                if (data>0) {
    15011504                                        event.size = trace_read_packet(trace,packet);
    1502                                         if (event.size < 0) {
    1503                                                 event.type = TRACE_EVENT_TERMINATE;
    1504                                                 return event;
    1505                                         }
    15061505                                        event.type = TRACE_EVENT_PACKET;
    15071506                                        return event;
     
    15211520                                        trace->packet.size=
    15221521                                                trace_read_packet(trace,packet);
     1522                                        event.size = trace->packet.size;
    15231523                                        if (trace->packet.size > 0 ) {
    15241524                                                memcpy(trace->packet.buffer,packet->buffer,trace->packet.size);
     1525                                        } else {
     1526                                                // return here, the test for event.size will sort out the error
     1527                                                event.type = TRACE_EVENT_PACKET;
     1528                                                return event;
    15251529                                        }
    15261530                                }
    1527                                 event.size = trace->packet.size;
    1528 
    1529                                 if (event.size == 0) {
    1530                                         event.type = TRACE_EVENT_TERMINATE;
    1531                                         return event;
    1532                                 }
    15331531
    15341532                                ts=trace_get_seconds(packet);
    1535                                 if (trace->last_ts!=0) {
    1536                                         event.seconds = ts - trace->last_ts;
     1533                                if (trace->tdelta!=0) {
     1534                                        // Get the adjusted current time
    15371535                                        gettimeofday(&stv, NULL);
    15381536                                        now = stv.tv_sec + ((double)stv.tv_usec / 1000000.0);
     1537                                        now -= trace->tdelta; // adjust for trace delta
    15391538                                       
    1540                                         if (event.seconds > (now - trace->start_ts)) {
     1539                                       
     1540                                        // if the trace timestamp is still in the future,
     1541                                        // return a SLEEP event, otherwise fire the packet
     1542                                        if (ts > now) {
     1543                                                event.seconds = ts - trace->trace_last_ts;
    15411544                                                event.type = TRACE_EVENT_SLEEP;
    15421545                                                return event;
    15431546                                        }
    1544                                        
    1545                                 }
    1546                                 else {
     1547                                } else {
    15471548                                        gettimeofday(&stv, NULL);
    1548                                         trace->start_ts = stv.tv_sec + ((double)stv.tv_usec / 1000000.0);
    1549                                         trace->last_ts = ts;
     1549                                        // work out the difference between the start of trace replay,
     1550                                        // and the first packet in the trace
     1551                                        trace->tdelta = stv.tv_sec + ((double)stv.tv_usec / 1000000.0);
     1552                                        trace->tdelta -= ts;
     1553
    15501554                                }
    15511555                               
     1556                                        // This is the first packet, so just fire away.
    15521557                                packet->size = trace->packet.size;
    15531558                                memcpy(packet->buffer,trace->packet.buffer,trace->packet.size);
     
    15571562                                event.type = TRACE_EVENT_PACKET;
    15581563                               
    1559                                 gettimeofday(&stv, NULL);
    1560                                 trace->start_ts = stv.tv_sec + ((double)stv.tv_usec / 1000000.0);
    1561                                 trace->last_ts = ts;
    1562                                
     1564                                trace->trace_last_ts = ts;
     1565
    15631566                                return event;
    15641567                        }
Note: See TracChangeset for help on using the changeset viewer.