1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

for #742, refine code for recv thread.

This commit is contained in:
winlin 2017-01-23 16:38:23 +08:00
parent a07986f4ee
commit 4583a63789
2 changed files with 130 additions and 110 deletions

View file

@ -45,36 +45,48 @@ class SrsRequest;
class SrsConsumer;
/**
* for the recv thread to handle the message.
* The message consumer which consume a message.
*/
class ISrsMessageHandler
class ISrsMessageConsumer
{
public:
ISrsMessageHandler();
virtual ~ISrsMessageHandler();
ISrsMessageConsumer();
virtual ~ISrsMessageConsumer();
public:
/**
* whether the handler can handle,
* for example, when queue recv handler got an message,
* it wait the user to process it, then the recv thread
* never recv message util the handler is ok.
*/
virtual bool can_handle() = 0;
/**
* process the received message.
* Consume the received message.
* @remark user must free this message.
*/
virtual int handle(SrsCommonMessage* msg) = 0;
virtual int consume(SrsCommonMessage* msg) = 0;
};
/**
* The message pumper to pump messages to processer.
*/
class ISrsMessagePumper : public ISrsMessageConsumer
{
public:
ISrsMessagePumper();
virtual ~ISrsMessagePumper();
public:
/**
* when recv message error.
*/
virtual void on_recv_error(int ret) = 0;
* Whether the pumper is interrupted.
* For example, when pumpter is busy, it's interrupted,
* please wait for a while then try to feed the pumper.
*/
virtual bool interrupted() = 0;
/**
* when thread start or stop,
* for example, the message handler can set whether auto response.
*/
virtual void on_thread_start() = 0;
virtual void on_thread_stop() = 0;
* Interrupt the pumper for a error.
*/
virtual void interrupt(int error) = 0;
/**
* When start the pumper.
*/
virtual void on_start() = 0;
/**
* When stop the pumper.
*/
virtual void on_stop() = 0;
};
/**
@ -84,14 +96,14 @@ class SrsRecvThread : public ISrsReusableThread2Handler
{
protected:
SrsReusableThread2* trd;
ISrsMessageHandler* handler;
ISrsMessagePumper* pumper;
SrsRtmpServer* rtmp;
// The recv timeout in ms.
int timeout;
public:
// Constructor.
// @param tm The receive timeout in ms.
SrsRecvThread(ISrsMessageHandler* msg_handler, SrsRtmpServer* rtmp_sdk, int tm);
SrsRecvThread(ISrsMessagePumper* p, SrsRtmpServer* r, int tm);
virtual ~SrsRecvThread();
public:
virtual int cid();
@ -112,7 +124,7 @@ public:
* @see: SrsRtmpConn::playing
* @see: https://github.com/ossrs/srs/issues/217
*/
class SrsQueueRecvThread : public ISrsMessageHandler
class SrsQueueRecvThread : public ISrsMessagePumper
{
private:
std::vector<SrsCommonMessage*> queue;
@ -132,24 +144,23 @@ public:
virtual int size();
virtual SrsCommonMessage* pump();
virtual int error_code();
// interface ISrsMessagePumper
public:
virtual bool can_handle();
virtual int handle(SrsCommonMessage* msg);
virtual void on_recv_error(int ret);
public:
virtual void on_thread_start();
virtual void on_thread_stop();
virtual int consume(SrsCommonMessage* msg);
virtual bool interrupted();
virtual void interrupt(int ret);
virtual void on_start();
virtual void on_stop();
};
/**
* the publish recv thread got message and callback the source method to process message.
* @see: https://github.com/ossrs/srs/issues/237
*/
class SrsPublishRecvThread : virtual public ISrsMessageHandler
class SrsPublishRecvThread : virtual public ISrsMessagePumper, virtual public ISrsReloadHandler
#ifdef SRS_PERF_MERGED_READ
, virtual public IMergeReadHandler
#endif
, virtual public ISrsReloadHandler
{
private:
SrsRecvThread trd;
@ -195,13 +206,13 @@ public:
public:
virtual int start();
virtual void stop();
virtual void on_thread_start();
virtual void on_thread_stop();
// interface ISrsMessageHandler
// interface ISrsMessagePumper
public:
virtual bool can_handle();
virtual int handle(SrsCommonMessage* msg);
virtual void on_recv_error(int ret);
virtual int consume(SrsCommonMessage* msg);
virtual bool interrupted();
virtual void interrupt(int ret);
virtual void on_start();
virtual void on_stop();
// interface IMergeReadHandler
public:
#ifdef SRS_PERF_MERGED_READ