Changeset 6404


Ignore:
Timestamp:
Jun 21, 2016 12:53:52 AM (8 years ago)
Author:
ldelgass
Message:

Add optional idle timeout to geovis server

Location:
geovis/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/RenderServer.cpp

    r6386 r6404  
    232232
    233233static void
    234 exitService()
     234exitService(int code)
    235235{
    236236    TRACE("Enter");
    237237
    238     serverStats(g_stats, 0);
     238    serverStats(g_stats, code);
    239239
    240240    // close log file
     
    297297    std::string resourcePath;
    298298    double maxbitrate = 1.0e8;
     299    long idleTimeout = -1L;
    299300    while (1) {
    300         int c = getopt(argc, argv, "r:p:i:o:");
     301        int c = getopt(argc, argv, "r:p:i:o:t:");
    301302        if (c == -1) {
    302303            break;
     
    323324            }
    324325        }
     326            break;
     327        case 't':
     328            // Idle timeout in seconds
     329            idleTimeout = atol(optarg);
    325330            break;
    326331        case '?':
     
    365370    }
    366371    g_renderer->setResourcePath(resourcePath);
     372    g_renderer->setIdleTimeout(idleTimeout);
    367373
    368374    TRACE("Default Tcl encoding dir: %s", Tcl_GetDefaultEncodingDir());
     
    385391    // Start main server loop
    386392    for (;;) {
    387         long timeout = g_renderer->getTimeout();
     393        struct timeval timeout;
     394        g_renderer->getTimeout(&timeout);
    388395#ifdef SLEEP_AFTER_QUEUE_FRAME
    389396        g_renderer->markFrameStart();
    390397#endif
    391         int cmdStatus = processCommands(interp, NULL, g_inBufPtr, g_fdOut, timeout);
     398        int cmdStatus = processCommands(interp, NULL, g_inBufPtr, g_fdOut, &timeout);
    392399        if (cmdStatus < 0)
    393400            break;
     
    476483
    477484    closeLog();
    478     exitService();
     485    exitService(0);
    479486
    480487    return 0;
  • geovis/trunk/Renderer.cpp

    r6380 r6404  
    127127    _windowWidth(500),
    128128    _windowHeight(500),
     129    _idleTimeout(-1L),
    129130    _pickPending(false),
    130131    _scaleBarUnits(UNITS_METERS)
     
    28542855
    28552856/**
    2856  * \brief Get a timeout in usecs for select()
     2857 * \brief Get a timeout for select()
    28572858 *
    28582859 * If the paging thread is idle, returns <0 indicating that the
     
    28612862 * rate, return the remaining frame time.
    28622863 */
    2863 long Renderer::getTimeout()
    2864 {
    2865     if (!checkNeedToDoFrame())
     2864void Renderer::getTimeout(struct timeval *tv)
     2865{
     2866    if (!checkNeedToDoFrame()) {
    28662867        // <0 means no timeout, block until socket has data
    2867         return -1L;
    2868     if (_lastFrameTime < _minFrameTime) {
    2869         return (long)1.0e6*(_minFrameTime - _lastFrameTime);
     2868        // If _idleTimeout is positive, server will disconnect after timeout
     2869        tv->tv_sec = _idleTimeout;
     2870        tv->tv_usec = 0L;
     2871    } else if (_lastFrameTime < _minFrameTime) {
     2872        tv->tv_sec = 0L;
     2873        tv->tv_usec = (long)1.0e6*(_minFrameTime - _lastFrameTime);
    28702874    } else {
    28712875        // No timeout (poll)
    2872         return 0L;
     2876        tv->tv_sec = tv->tv_usec = 0L;
    28732877    }
    28742878}
  • geovis/trunk/Renderer.h

    r6380 r6404  
    99#define GEOVIS_RENDERER_H
    1010
     11#include <sys/time.h> // For struct timeval
    1112#include <ctime> // For time_t
    1213#include <string>
     
    528529    void markFrameEnd();
    529530
    530     long getTimeout();
     531    void setIdleTimeout(long timeout)
     532    {
     533        if (timeout != -1L &&
     534            (double)timeout < _minFrameTime) {
     535            ERROR("Timeout must be more than %g sec", _minFrameTime);
     536            return;
     537        }
     538        TRACE("Setting idle timeout to %ld sec", timeout);
     539        _idleTimeout = timeout;
     540    }
     541
     542    long getIdleTimeout()
     543    {
     544        return _idleTimeout;
     545    }
     546
     547    void getTimeout(struct timeval *tv);
    531548
    532549    void mapNodeUpdate();
     
    642659    float _bgColor[3];
    643660
     661    long _idleTimeout;
    644662    double _minFrameTime;
    645663    double _lastFrameTime;
  • geovis/trunk/RendererCmd.cpp

    r6387 r6404  
    1717#include <unistd.h>
    1818#include <sys/select.h>
     19#include <sys/time.h>
    1920#include <sys/uio.h>
    2021#include <tcl.h>
     
    9697    ReadBuffer::BufferStatus status;
    9798    status = g_inBufPtr->followingData((unsigned char *)bytes, len);
     99    g_stats.nDataBytes += len;
    98100    TRACE("followingData status: %d", status);
    99101    return (status == ReadBuffer::OK);
     
    24212423        }
    24222424        g_renderer->addModelLayer(name, geomOpts, pos, cache, lighting, visible);
    2423    } else if (type[0] == 't' && strcmp(type, "text") == 0) {
     2425    } else if (type[0] == 't' && strcmp(type, "text") == 0) {
    24242426        char *driver = Tcl_GetString(objv[5]);
    24252427        char *format = Tcl_GetString(objv[6]);
     
    37663768                        ReadBuffer *inBufPtr,
    37673769                        int fdOut,
    3768                         long timeout)
     3770                        struct timeval *timeout)
    37693771{
    37703772    int ret = 1;
     
    37783780    FD_ZERO(&readFds);
    37793781    FD_SET(inBufPtr->file(), &readFds);
    3780     tvPtr = NULL;                       /* Wait for the first read. This is so
    3781                                          * that we don't spin when no data is
    3782                                          * available. */
    3783     if (timeout >= 0L) {
    3784         tv.tv_sec = 0L;
    3785         tv.tv_usec = timeout;
     3782
     3783    bool polling = false;
     3784    if (timeout->tv_sec >= 0L) {
     3785        tv.tv_sec = timeout->tv_sec;
     3786        tv.tv_usec = timeout->tv_usec;
    37863787        tvPtr = &tv;
    37873788    } else {
     3789        // Block until data available
     3790        tvPtr = NULL;
    37883791        TRACE("Blocking on select()");
    37893792    }
     
    38423845        }
    38433846
     3847        polling = true;
    38443848        tv.tv_sec = tv.tv_usec = 0L;    /* On successive reads, we break out
    38453849                                         * if no data is available. */
    38463850        FD_SET(inBufPtr->file(), &readFds);
    38473851        tvPtr = &tv;
     3852    }
     3853    if (!polling && ret == 0 && timeout->tv_sec > 0L) {
     3854        // If idle timeout expired, disconnect
     3855        TRACE("Exiting server after timeout waiting for client command");
     3856        return -1;
    38483857    }
    38493858
  • geovis/trunk/RendererCmd.h

    r4028 r6404  
    99#define GEOVIS_RENDERERCMD_H
    1010
     11#include <sys/time.h>
    1112#include <cstdio>
    1213#include <tcl.h>
     
    3132                           ReadBuffer *inBufPtr,
    3233                           int fdOut,
    33                            long timeout = -1);
     34                           struct timeval *timeout);
    3435
    3536extern int handleError(Tcl_Interp *interp,
Note: See TracChangeset for help on using the changeset viewer.