/**
 * @file llheartbeat.h
 * @brief Class encapsulating logic for telling a watchdog that we live.
 *
 * $LicenseInfo:firstyear=2008&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_LLHEARTBEAT_H
#define LL_LLHEARTBEAT_H

#include "linden_common.h"

#include "lltimer.h"

// Note: Win32 does not support the heartbeat/smackdown system;
//   heartbeat-delivery turns into a no-op there.

class LL_COMMON_API LLHeartbeat
{
public:
    // secs_between_heartbeat: after a heartbeat is successfully delivered,
    //   we suppress sending more for this length of time.
    // aggressive_heartbeat_panic_secs: if we've been failing to
    //   successfully deliver heartbeats for this length of time then
    //   we block for a while until we're really sure we got one delivered.
    // aggressive_heartbeat_max_blocking_secs: this is the length of
    //   time we block for when we're aggressively ensuring that a 'panic'
    //   heartbeat was delivered.
    LLHeartbeat(F32 secs_between_heartbeat = 5.0f,
            F32 aggressive_heartbeat_panic_secs = 10.0f,
            F32 aggressive_heartbeat_max_blocking_secs = 4.0f);
    ~LLHeartbeat();

    bool send(F32 timeout_sec = 0.0f);
    void setSuppressed(bool is_suppressed);

private:
    int rawSend();
    int rawSendWithTimeout(F32 timeout_sec);
    F32 mSecsBetweenHeartbeat;
    F32 mAggressiveHeartbeatPanicSecs;
    F32 mAggressiveHeartbeatMaxBlockingSecs;
    bool mSuppressed;
    LLTimer mBeatTimer;
    LLTimer mPanicTimer;
    LLTimer mTimeoutTimer;
};

#endif // LL_HEARTBEAT_H