Changeset 2ffda28 for lib/format_rt.c


Ignore:
Timestamp:
03/19/06 15:27:22 (15 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:
25efeac
Parents:
eea0f87
Message:

Make sure we do large reads in format_rt to keep system % cpu down.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_rt.c

    r32f365f r2ffda28  
    9696        int input_fd;
    9797        int reliable;
    98 
     98        char *pkt_buffer;
     99        char *buf_current;
     100        int buf_left;
     101
     102       
    99103        struct libtrace_t *dummy_erf;
    100104        struct libtrace_t *dummy_pcap;
     
    158162                case RT_HELLO:
    159163                        /* do something with options */
    160                         printf("Hello\n");     
    161164                        if (recv(RT_INFO->input_fd, &hello_opts,
    162165                                                sizeof(rt_hello_t), 0)
     
    189192        RT_INFO->dummy_pcap = NULL;
    190193        RT_INFO->dummy_wag = NULL;
     194        RT_INFO->pkt_buffer = NULL;
     195        RT_INFO->buf_current = NULL;
     196        RT_INFO->buf_left = 0;
    191197       
    192198        if (strlen(uridata) == 0) {
     
    219225        start_msg.length = sizeof(rt_start_t);
    220226
    221         printf("Sending start - len: %d\n", start_msg.length);
    222227       
    223228        /* Need to send start message to server */
     
    257262}
    258263
    259 static int rt_read(struct libtrace_t *libtrace, void *buffer, size_t len) {
     264#define RT_BUF_SIZE 4000
     265
     266static int rt_read(struct libtrace_t *libtrace, void **buffer, size_t len) {
    260267        int numbytes;
    261268
    262         while(1) {
     269        assert(len <= RT_BUF_SIZE);
     270       
     271        if (!RT_INFO->pkt_buffer) {
     272                RT_INFO->pkt_buffer = malloc(RT_BUF_SIZE);
     273                RT_INFO->buf_current = RT_INFO->pkt_buffer;
     274                RT_INFO->buf_left = 0;
     275        }
     276
     277       
     278        if (len > RT_INFO->buf_left) {
     279                memcpy(RT_INFO->pkt_buffer, RT_INFO->buf_current,
     280                                RT_INFO->buf_left);
     281                RT_INFO->buf_current = RT_INFO->pkt_buffer;
     282
    263283#ifndef MSG_NOSIGNAL
    264284#  define MSG_NOSIGNAL 0
    265285#endif
    266                 if ((numbytes = recv(RT_INFO->input_fd,
    267                                                 buffer,
    268                                                 len,
     286                while (len > RT_INFO->buf_left) {
     287                        if ((numbytes = recv(RT_INFO->input_fd,
     288                                                RT_INFO->pkt_buffer +
     289                                                RT_INFO->buf_left,
     290                                                RT_BUF_SIZE-RT_INFO->buf_left,
    269291                                                MSG_NOSIGNAL)) == -1) {
    270                         if (errno == EINTR) {
    271                                 /* ignore EINTR in case
    272                                  * a caller is using signals
    273                                  */
    274                                 continue;
    275                         }
    276                         perror("recv");
    277                         return -1;
    278                 }
    279                 break;
     292                                if (errno == EINTR) {
     293                                        /* ignore EINTR in case
     294                                         * a caller is using signals
     295                                         */
     296                                        continue;
     297                                }
     298                                perror("recv");
     299                                return -1;
     300                        }
     301                        RT_INFO->buf_left+=numbytes;
     302                }
    280303
    281304        }
    282         return numbytes;
     305        *buffer = RT_INFO->buf_current;
     306        RT_INFO->buf_current += len;
     307        RT_INFO->buf_left -= len;
     308        assert(RT_INFO->buf_left >= 0);
     309        return len;
    283310}
    284311
     
    385412       
    386413static int rt_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
    387        
    388         rt_header_t pkt_hdr;
     414        rt_header_t rt_hdr;
     415        rt_header_t *pkt_hdr = &rt_hdr;
    389416        int pkt_size = 0;
    390417       
    391         void *buffer = 0;
    392 
     418       
    393419        if (packet->buf_control == TRACE_CTRL_EXTERNAL || !packet->buffer) {
    394420                packet->buf_control = TRACE_CTRL_PACKET;
     
    396422        }
    397423
    398         buffer = packet->buffer;
    399424        packet->header = packet->buffer;
    400425
    401426        /* FIXME: Better error handling required */
    402         if (rt_read(libtrace, &pkt_hdr, sizeof(rt_header_t)) !=
     427        if (rt_read(libtrace, (void **)&pkt_hdr, sizeof(rt_header_t)) !=
    403428                        sizeof(rt_header_t)) {
    404429                printf("Error receiving rt header\n");
     
    406431        }
    407432
    408         packet->type = pkt_hdr.type;
    409         pkt_size = pkt_hdr.length;
    410         packet->size = pkt_hdr.length;
     433        packet->type = pkt_hdr->type;
     434        pkt_size = pkt_hdr->length;
     435        packet->size = pkt_hdr->length;
    411436
    412437        if (packet->type >= RT_DATA_SIMPLE) {
    413                 if (rt_read(libtrace, buffer, pkt_size) != pkt_size) {
     438                if (rt_read(libtrace, &packet->buffer, pkt_size) != pkt_size) {
    414439                        printf("Error receiving packet\n");
    415440                        return -1;
     
    423448                if (reliability > 0) {
    424449                       
    425                         if (rt_send_ack(libtrace, pkt_hdr.sequence)
     450                        if (rt_send_ack(libtrace, pkt_hdr->sequence)
    426451                                        == -1)
    427452                        {
     
    433458                        case RT_STATUS:
    434459                        case RT_DUCK:
    435                                 if (rt_read(libtrace, buffer, pkt_size) !=
     460                                if (rt_read(libtrace, &packet->buffer,
     461                                                        pkt_size) !=
    436462                                                pkt_size) {
    437463                                        printf("Error receiving status packet\n");
     
    439465                                }
    440466                                packet->header = 0;
    441                                 packet->payload = buffer;
     467                                packet->payload = packet->buffer;
    442468                                break;
    443469                        case RT_END_DATA:
     
    453479                        default:
    454480                                printf("Bad rt type for client receipt: %d\n",
    455                                         pkt_hdr.type);
     481                                        pkt_hdr->type);
    456482                }
    457483        }
Note: See TracChangeset for help on using the changeset viewer.