mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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
 |