Changeset 6576 for nanovis


Ignore:
Timestamp:
Nov 7, 2016, 6:26:21 PM (2 years ago)
Author:
ldelgass
Message:

Add optional idle timeout to nanovis server. Allows server to close connection
and exit after a specified period without commands from the client.

Location:
nanovis/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • nanovis/trunk/Command.cpp

    r6390 r6576  
    22322232int
    22332233nv::processCommands(Tcl_Interp *interp,
    2234                     ReadBuffer *inBufPtr, int fdOut)
     2234                    ReadBuffer *inBufPtr,
     2235                    int fdOut,
     2236                    struct timeval *timeout)
    22352237{
    22362238    int ret = 1;
     
    22442246    FD_ZERO(&readFds);
    22452247    FD_SET(inBufPtr->file(), &readFds);
    2246     tvPtr = NULL;                       /* Wait for the first read. This is so
    2247                                          * that we don't spin when no data is
    2248                                          * available. */
     2248
     2249    bool polling = false;
     2250    if (timeout->tv_sec >= 0L) {
     2251        tv.tv_sec = timeout->tv_sec;
     2252        tv.tv_usec = timeout->tv_usec;
     2253        polling = tv.tv_sec == 0 && tv.tv_usec == 0;
     2254        tvPtr = &tv;
     2255    } else {
     2256        // Block until data available
     2257        tvPtr = NULL;
     2258        TRACE("Blocking on select()");
     2259    }
    22492260    while (inBufPtr->isLineAvailable() ||
    2250            (select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr) > 0)) {
     2261           ((ret = select(inBufPtr->file()+1, &readFds, NULL, NULL, tvPtr)) > 0)) {
    22512262        size_t numBytes;
    22522263        unsigned char *buffer;
     
    22852296                }
    22862297            }
    2287         }
    2288 
     2298            if (status == TCL_OK) {
     2299                ret = 3;
     2300            }
     2301        }
     2302
     2303        polling = true;
    22892304        tv.tv_sec = tv.tv_usec = 0L;    /* On successive reads, we break out
    22902305                                         * if no data is available. */
    22912306        FD_SET(inBufPtr->file(), &readFds);
    22922307        tvPtr = &tv;
     2308    }
     2309    if (!polling && ret == 0 && timeout->tv_sec > 0L) {
     2310        // If idle timeout expired, disconnect
     2311        TRACE("Exiting server after timeout waiting for client command");
     2312        return -1;
    22932313    }
    22942314
  • nanovis/trunk/Command.h

    r4948 r6576  
    1313
    1414#include <unistd.h>
     15#include <sys/time.h>
    1516
    1617#include <tcl.h>
     
    3940extern int processCommands(Tcl_Interp *interp,
    4041                           ReadBuffer *inBufPtr,
    41                            int fdOut);
     42                           int fdOut,
     43                           struct timeval *timeout);
    4244
    4345extern int handleError(Tcl_Interp *interp,
  • nanovis/trunk/nanovisServer.cpp

    r6394 r6576  
    5656ResponseQueue *nv::g_queue = NULL;
    5757#endif
     58long nv::g_idleTimeout = -1L;
    5859
    5960#ifdef USE_THREADS
     
    382383    glutSetWindow(NanoVis::renderWindow);
    383384
    384     if (processCommands(NanoVis::interp, g_inBufPtr, g_fdOut) < 0) {
     385    struct timeval timeout;
     386    timeout->tv_sec = g_idleTimeout;
     387    timeout->tv_usec = 0L;
     388    if (processCommands(NanoVis::interp, g_inBufPtr, g_fdOut, &timeout) < 0) {
    385389        exitService(1);
    386390    }
     
    463467    const char *resourcePath = NULL;
    464468    while (1) {
    465         static struct option long_options[] = {
    466             {"debug",   no_argument,       NULL, 'd'},
    467             {"path",    required_argument, NULL, 'p'},
    468             {0, 0, 0, 0}
    469         };
    470         int option_index = 0;
    471         int c = getopt_long(argc, argv, "dp:i:o:", long_options, &option_index);
     469        int c = getopt(argc, argv, "dp:i:o:t:");
    472470        if (c == -1) {
    473471            break;
     
    493491            }
    494492        }
     493            break;
     494        case 't':
     495            // Idle timeout in seconds
     496            g_idleTimeout = atol(optarg);
    495497            break;
    496498        case '?':
  • nanovis/trunk/nanovisServer.h

    r4935 r6576  
    4949    extern ResponseQueue *g_queue;
    5050#endif
     51    extern long g_idleTimeout;
    5152
    5253#ifdef KEEPSTATS
Note: See TracChangeset for help on using the changeset viewer.