Changeset 3438


Ignore:
Timestamp:
May 12, 2009, 12:55:01 PM (11 years ago)
Author:
Pascal Terjan
Message:
  • Avoid a memcpy and allocating 128K on the stack
Location:
neercs/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/main.c

    r3431 r3438  
    8383    long long unsigned int last_key_time = 0;
    8484    int mainret = -1;
    85 
     85#define NEERCS_RECV_BUFSIZE 128*1024
     86    char * buf = NULL;
    8687
    8788    screen_list = create_screen_list();
     
    157158        int ret = 0;
    158159        ssize_t n;
    159         char buf[128*1024];
    160160        if(!screen_list) goto end;
    161         if(screen_list->socket[SOCK_CLIENT] && (n = read(screen_list->socket[SOCK_CLIENT], buf, sizeof(buf)-1)) > 0)
     161        buf = malloc(NEERCS_RECV_BUFSIZE);
     162        if(!buf)
     163        {
     164            debug("Failed to allocate memory");
     165            goto end;
     166        }
     167        if(screen_list->socket[SOCK_CLIENT] && (n = read(screen_list->socket[SOCK_CLIENT], buf, NEERCS_RECV_BUFSIZE-1)) > 0)
    162168        {
    163169            buf[n] = 0;
     
    170176            else if(!strncmp("REFRESH ", buf, 8))
    171177            {
    172                 ssize_t l2 = 0, lb = n-8;
    173                 char * buf2 = NULL;
     178                ssize_t l2, lb = n-8;
     179                char * buf2;
    174180                size_t l = caca_import_memory(screen_list->cv, buf+8, lb, "caca");
     181                l2 = lb;
    175182                /* 0 means we have valid data but incomplete, so read the rest */
    176                 if(l == 0)
    177                 {
    178                     buf2 = realloc(buf2, lb+l2);
    179                     memcpy(buf2+l2, buf+8, lb);
    180                     l2 += lb;
    181                 }
    182183                while(l == 0)
    183184                {
     185                    buf2 = realloc(buf, l2+8 + NEERCS_RECV_BUFSIZE);
     186                    if(!buf2)
     187                    {
     188                        debug("Failed to allocate memory");
     189                        goto end;
     190                    }
     191                    buf = buf2;
    184192                    fcntl(screen_list->socket[SOCK_CLIENT], F_SETFL, 0);
    185                     lb = read(screen_list->socket[SOCK_CLIENT], buf, sizeof(buf)-1);
     193                    lb = read(screen_list->socket[SOCK_CLIENT], buf+l2+8, NEERCS_RECV_BUFSIZE-1);
    186194                    if(lb < 0)
    187195                    {
     
    192200                    {
    193201                        debug("Got %d more bytes", lb);
    194                         buf2 = realloc(buf2, lb+l2);
    195                         memcpy(buf2+l2, buf, lb);
    196202                        l2 += lb;
    197                         l = caca_import_memory(screen_list->cv, buf2, l2, "caca");
     203                        l = caca_import_memory(screen_list->cv, buf+8, l2, "caca");
    198204                    }
    199205                }
     
    233239    mainret = 0;
    234240end:
     241    if(buf)
     242        free(buf);
    235243    if(screen_list)
    236244    {
  • neercs/trunk/src/server.c

    r3434 r3438  
    114114        getsockopt(screen_list->socket[SOCK_CLIENT], SOL_SOCKET, SO_SNDBUF,
    115115                   &bufsize, &optlen);
     116        bufsize /= 2;
     117        debug("bufsize=%d", bufsize);
    116118        written = write(screen_list->socket[SOCK_CLIENT],
    117119                        buf2,
     
    119121        if(written <= 0 && errno != EAGAIN)
    120122        {
    121             debug("Can't refresh (%s), with %d bytes", strerror(errno), towrite);
     123            debug("Can't refresh (%s), with %d bytes (out of %d)", strerror(errno), towrite > bufsize ? bufsize : towrite, towrite);
    122124            return -1;
    123125        }
Note: See TracChangeset for help on using the changeset viewer.