1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-15 04:42:04 +00:00
srs/trunk/3rdparty/srt-1-fit/srtcore/group_backup.h
john fe086dfc31
SRT: Upgrade libsrt from 1.4.1 to 1.5.1. v6.0.12 (#3362)
Co-authored-by: winlin <winlin@vip.126.com>
2023-01-04 19:56:33 +08:00

128 lines
4 KiB
C++

/*
* SRT - Secure, Reliable, Transport
* Copyright (c) 2021 Haivision Systems Inc.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
/*****************************************************************************
Written by
Haivision Systems Inc.
*****************************************************************************/
#ifndef INC_SRT_GROUP_BACKUP_H
#define INC_SRT_GROUP_BACKUP_H
#include "srt.h"
#include "common.h"
#include "group_common.h"
#include <list>
namespace srt
{
namespace groups
{
enum BackupMemberState
{
BKUPST_UNKNOWN = -1,
BKUPST_PENDING = 0,
BKUPST_STANDBY = 1,
BKUPST_BROKEN = 2,
BKUPST_ACTIVE_UNSTABLE = 3,
BKUPST_ACTIVE_UNSTABLE_WARY = 4,
BKUPST_ACTIVE_FRESH = 5,
BKUPST_ACTIVE_STABLE = 6,
BKUPST_E_SIZE = 7
};
const char* stateToStr(BackupMemberState state);
inline bool isStateActive(BackupMemberState state)
{
if (state == BKUPST_ACTIVE_FRESH
|| state == BKUPST_ACTIVE_STABLE
|| state == BKUPST_ACTIVE_UNSTABLE
|| state == BKUPST_ACTIVE_UNSTABLE_WARY)
{
return true;
}
return false;
}
struct BackupMemberStateEntry
{
BackupMemberStateEntry(SocketData* psock, BackupMemberState st)
: pSocketData(psock)
, socketID(psock->id)
, state(st)
{}
SocketData* pSocketData; // accessing pSocketDataIt requires m_GroupLock
SRTSOCKET socketID; // therefore socketID is saved separately (needed to close broken sockets)
BackupMemberState state;
};
/// @brief A context needed for main/backup sending function.
/// @todo Using gli_t here does not allow to safely store the context outside of the sendBackup calls.
class SendBackupCtx
{
public:
SendBackupCtx()
: m_stateCounter() // default init with zeros
, m_activeMaxWeight()
, m_standbyMaxWeight()
{
}
/// @brief Adds or updates a record of the member socket state.
/// @param pSocketDataIt Iterator to a socket
/// @param st State of the memmber socket
/// @todo Implement updating member state
void recordMemberState(SocketData* pSocketDataIt, BackupMemberState st);
/// @brief Updates a record of the member socket state.
/// @param pSocketDataIt Iterator to a socket
/// @param st State of the memmber socket
/// @todo To be replaced by recordMemberState
/// @todo Update max weights?
void updateMemberState(const SocketData* pSocketDataIt, BackupMemberState st);
/// @brief sorts members in order
/// Higher weight comes first, same weight: stable first, then fresh active.
void sortByWeightAndState();
BackupMemberState getMemberState(const SocketData* pSocketDataIt) const;
unsigned countMembersByState(BackupMemberState st) const;
const std::vector<BackupMemberStateEntry>& memberStates() const { return m_memberStates; }
uint16_t maxStandbyWeight() const { return m_standbyMaxWeight; }
uint16_t maxActiveWeight() const { return m_activeMaxWeight; }
std::string printMembers() const;
void setRateEstimate(const CRateEstimator& rate) { m_rateEstimate = rate; }
const CRateEstimator& getRateEstimate() const { return m_rateEstimate; }
private:
std::vector<BackupMemberStateEntry> m_memberStates; // TODO: consider std::map here?
unsigned m_stateCounter[BKUPST_E_SIZE];
uint16_t m_activeMaxWeight;
uint16_t m_standbyMaxWeight;
CRateEstimator m_rateEstimate; // The rate estimator state of the active link to copy to a backup on activation.
};
} // namespace groups
} // namespace srt
#endif // INC_SRT_GROUP_BACKUP_H