fix the export project bug. wakeup connection when dispose server.

pull/444/head
winlin 10 years ago
parent 969ed7b0ae
commit 1f1776a0d8

@ -80,7 +80,7 @@ function build_module_hpp()
}
SRS_LIBRTMP_OBJS="${CORE_OBJS[@]}" && build_module_hpp
SRS_LIBRTMP_OBJS="${KERNEL_OBJS[@]}" && build_module_hpp
SRS_LIBRTMP_OBJS="${RTMP_OBJS[@]}" && build_module_hpp
SRS_LIBRTMP_OBJS="${PROTOCOL_OBJS[@]}" && build_module_hpp
SRS_LIBRTMP_OBJS="${LIBS_OBJS[@]}" && build_module_hpp
# module to cpp files.
function build_module_cpp()
@ -99,7 +99,7 @@ function build_module_cpp()
}
SRS_LIBRTMP_OBJS="${CORE_OBJS[@]}" && build_module_cpp
SRS_LIBRTMP_OBJS="${KERNEL_OBJS[@]}" && build_module_cpp
SRS_LIBRTMP_OBJS="${RTMP_OBJS[@]}" && build_module_cpp
SRS_LIBRTMP_OBJS="${PROTOCOL_OBJS[@]}" && build_module_cpp
SRS_LIBRTMP_OBJS="${LIBS_OBJS[@]}" && build_module_cpp
# create example.cpp

@ -88,6 +88,7 @@ SrsRtmpConn::SrsRtmpConn(SrsServer* svr, st_netfd_t c)
duration = 0;
kbps = new SrsKbps();
kbps->set_io(skt, skt);
wakable = NULL;
mw_sleep = SRS_PERF_MW_SLEEP;
mw_enabled = false;
@ -110,6 +111,16 @@ SrsRtmpConn::~SrsRtmpConn()
srs_freep(kbps);
}
void SrsRtmpConn::dispose()
{
SrsConnection::dispose();
// wakeup the handler which need to notice.
if (wakable) {
wakable->wakeup();
}
}
// TODO: return detail message when error for client.
int SrsRtmpConn::do_cycle()
{
@ -597,7 +608,9 @@ int SrsRtmpConn::playing(SrsSource* source)
}
// delivery messages for clients playing stream.
wakable = consumer;
ret = do_playing(source, consumer, &trd);
wakable = NULL;
// stop isolate recv thread
trd.stop();

@ -53,6 +53,7 @@ class SrsSharedPtrMessage;
class SrsQueueRecvThread;
class SrsPublishRecvThread;
class SrsSecurity;
class ISrsWakable;
/**
* the client provides the main logic control for RTMP clients.
@ -70,6 +71,8 @@ private:
SrsRefer* refer;
SrsBandwidth* bandwidth;
SrsSecurity* security;
// the wakable handler, maybe NULL.
ISrsWakable* wakable;
// elapse duration in ms
// for live play duration, for instance, rtmpdump to record.
// @see https://github.com/simple-rtmp-server/srs/issues/47
@ -85,6 +88,8 @@ private:
public:
SrsRtmpConn(SrsServer* svr, st_netfd_t c);
virtual ~SrsRtmpConn();
public:
virtual void dispose();
protected:
virtual int do_cycle();
// interface ISrsReloadHandler

@ -423,6 +423,14 @@ void SrsMessageQueue::clear()
av_start_time = av_end_time = -1;
}
ISrsWakable::ISrsWakable()
{
}
ISrsWakable::~ISrsWakable()
{
}
SrsConsumer::SrsConsumer(SrsSource* _source)
{
source = _source;
@ -551,14 +559,6 @@ void SrsConsumer::wait(int nb_msgs, int duration)
// use cond block wait for high performance mode.
st_cond_wait(mw_wait);
}
void SrsConsumer::wakeup()
{
if (mw_waiting) {
st_cond_signal(mw_wait);
mw_waiting = false;
}
}
#endif
int SrsConsumer::on_play_client_pause(bool is_pause)
@ -571,6 +571,16 @@ int SrsConsumer::on_play_client_pause(bool is_pause)
return ret;
}
void SrsConsumer::wakeup()
{
#ifdef SRS_PERF_QUEUE_COND_WAIT
if (mw_waiting) {
st_cond_signal(mw_wait);
mw_waiting = false;
}
#endif
}
SrsGopCache::SrsGopCache()
{
cached_video_count = 0;

@ -196,10 +196,28 @@ private:
virtual void clear();
};
/**
* the wakable used for some object
* which is waiting on cond.
*/
class ISrsWakable
{
public:
ISrsWakable();
virtual ~ISrsWakable();
public:
/**
* when the consumer(for player) got msg from recv thread,
* it must be processed for maybe it's a close msg, so the cond
* wait must be wakeup.
*/
virtual void wakeup() = 0;
};
/**
* the consumer for SrsSource, that is a play client.
*/
class SrsConsumer
class SrsConsumer : public ISrsWakable
{
private:
SrsRtmpJitter* jitter;
@ -257,17 +275,19 @@ public:
* @param duration the messgae duration to wait.
*/
virtual void wait(int nb_msgs, int duration);
/**
* when the consumer(for player) got msg from recv thread,
* it must be processed for maybe it's a close msg, so the cond
* wait must be wakeup.
*/
virtual void wakeup();
#endif
/**
* when client send the pause message.
*/
virtual int on_play_client_pause(bool is_pause);
// ISrsWakable
public:
/**
* when the consumer(for player) got msg from recv thread,
* it must be processed for maybe it's a close msg, so the cond
* wait must be wakeup.
*/
virtual void wakeup();
};
/**

Loading…
Cancel
Save