Ignore:
Timestamp:
Nov 14, 2016 11:35:41 AM (3 years ago)
Author:
ldelgass
Message:

merge r6576:6577 from nanovis trunk (timeout option)

Location:
nanovis/branches/1.2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • nanovis/branches/1.2

  • nanovis/branches/1.2/Command.cpp

    r6392 r6619  
    23402340int
    23412341nv::processCommands(Tcl_Interp *interp,
    2342                     ReadBuffer *inBufPtr, int fdOut)
     2342                    ReadBuffer *inBufPtr,
     2343                    int fdOut,
     2344                    struct timeval *timeout)
    23432345{
    23442346    int ret = 1;
     
    23522354    FD_ZERO(&readFds);
    23532355    FD_SET(inBufPtr->file(), &readFds);
    2354     tvPtr = NULL;                       /* Wait for the first read. This is so
    2355                                          * that we don't spin when no data is
    2356                                          * available. */
     2356
     2357    bool polling = false;
     2358    if (timeout->tv_sec >= 0L) {
     2359        tv.tv_sec = timeout->tv_sec;
     2360        tv.tv_usec = timeout->tv_usec;
     2361        polling = tv.tv_sec == 0 && tv.tv_usec == 0;
     2362        tvPtr = &tv;
     2363    } else {
     2364        // Block until data available
     2365        tvPtr = NULL;
     2366        TRACE("Blocking on select()");
     2367    }
    23572368    while (inBufPtr->isLineAvailable() ||
    2358            (select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr) > 0)) {
     2369           ((ret = select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr)) > 0)) {
    23592370        size_t numBytes;
    23602371        unsigned char *buffer;
     
    23932404                }
    23942405            }
    2395         }
    2396 
     2406            if (status == TCL_OK) {
     2407                ret = 3;
     2408            }
     2409        }
     2410
     2411        polling = true;
    23972412        tv.tv_sec = tv.tv_usec = 0L;    /* On successive reads, we break out
    23982413                                         * if no data is available. */
    23992414        FD_SET(inBufPtr->file(), &readFds);
    24002415        tvPtr = &tv;
     2416    }
     2417    if (!polling && ret == 0 && timeout->tv_sec > 0L) {
     2418        // If idle timeout expired, disconnect
     2419        TRACE("Exiting server after timeout waiting for client command");
     2420        return -1;
    24012421    }
    24022422
Note: See TracChangeset for help on using the changeset viewer.