Skip to content

Commit

Permalink
for bug #251, remove the queue fast cache for it's too complex, use q…
Browse files Browse the repository at this point in the history
…ueue fast vector instead. 2.0.69
  • Loading branch information
winlinvip committed Dec 10, 2014
1 parent 7150a99 commit 6bdd0af
Show file tree
Hide file tree
Showing 4 changed files with 3 additions and 123 deletions.
96 changes: 2 additions & 94 deletions trunk/src/app/srs_app_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -406,23 +406,10 @@ SrsConsumer::SrsConsumer(SrsSource* _source)
mw_duration = 0;
mw_waiting = false;
#endif

#ifdef SRS_PERF_QUEUE_FAST_CACHE
mw_cache = new SrsMessageArray(SRS_PERF_MW_MSGS);
mw_count = 0;
mw_first_pkt = mw_last_pkt = 0;
#endif
}

SrsConsumer::~SrsConsumer()
{
#ifdef SRS_PERF_QUEUE_FAST_CACHE
if (mw_cache) {
mw_cache->free(mw_count);
mw_count = 0;
}
srs_freep(mw_cache);
#endif
source->on_consumer_destroy(this);
srs_freep(jitter);
srs_freep(queue);
Expand Down Expand Up @@ -460,35 +447,9 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* __msg, bool atc, int tba, int tbv,
}
}

#ifdef SRS_PERF_QUEUE_FAST_CACHE
// use fast cache if available
if (mw_count < mw_cache->max) {
// update fast cache timestamps
if (mw_count == 0) {
mw_first_pkt = msg->timestamp;
}
mw_last_pkt = msg->timestamp;

mw_cache->msgs[mw_count++] = msg;
} else{
// fast cache is full, use queue.
bool is_overflow = false;
if ((ret = queue->enqueue(msg, &is_overflow)) != ERROR_SUCCESS) {
return ret;
}
// when overflow, clear cache and refresh the fast cache.
if (is_overflow) {
mw_cache->free(mw_count);
if ((ret = dumps_queue_to_fast_cache()) != ERROR_SUCCESS) {
return ret;
}
}
}
#else
if ((ret = queue->enqueue(msg, NULL)) != ERROR_SUCCESS) {
return ret;
}
#endif

#ifdef SRS_PERF_QUEUE_COND_WAIT
// fire the mw when msgs is enough.
Expand Down Expand Up @@ -522,59 +483,28 @@ int SrsConsumer::dump_packets(SrsMessageArray* msgs, int& count)
if (paused) {
return ret;
}

#ifdef SRS_PERF_QUEUE_FAST_CACHE
// only dumps an whole array to msgs.
for (int i = 0; i < mw_count; i++) {
msgs->msgs[i] = mw_cache->msgs[i];
}
count = mw_count;

// when fast cache is not filled,
// we donot check the queue, direclty zero fast cache.
if (mw_count < mw_cache->max) {
mw_count = 0;
mw_first_pkt = mw_last_pkt = 0;
return ret;
}

return dumps_queue_to_fast_cache();
#else

// pump msgs from queue.
if ((ret = queue->dump_packets(msgs->max, msgs->msgs, count)) != ERROR_SUCCESS) {
return ret;
}

return ret;
#endif
}

#ifdef SRS_PERF_QUEUE_COND_WAIT
void SrsConsumer::wait(int nb_msgs, int duration)
{
mw_min_msgs = nb_msgs;
mw_duration = duration;

#ifdef SRS_PERF_QUEUE_FAST_CACHE
// when fast cache not overflow, always flush.
// so we donot care about the queue.
bool fast_cache_overflow = mw_count >= mw_cache->max;
int duration_ms = (int)(mw_last_pkt - mw_first_pkt);
bool match_min_msgs = mw_count > mw_min_msgs;

// when fast cache overflow, or duration ok, signal to flush.
if (fast_cache_overflow || (match_min_msgs && duration_ms > mw_duration)) {
return;
}
#else

int duration_ms = queue->duration();
bool match_min_msgs = queue->size() > mw_min_msgs;

// when duration ok, signal to flush.
if (match_min_msgs && duration_ms > mw_duration) {
return;
}
#endif

// the enqueue will notify this cond.
mw_waiting = true;
Expand All @@ -593,28 +523,6 @@ int SrsConsumer::on_play_client_pause(bool is_pause)
return ret;
}

#ifdef SRS_PERF_QUEUE_FAST_CACHE
int SrsConsumer::dumps_queue_to_fast_cache()
{
int ret =ERROR_SUCCESS;

// fill fast cache with queue.
if ((ret = queue->dump_packets(mw_cache->max, mw_cache->msgs, mw_count)) != ERROR_SUCCESS) {
return ret;
}
// set the timestamp when got message.
if (mw_count > 0) {
SrsSharedPtrMessage* first_msg = mw_cache->msgs[0];
mw_first_pkt = first_msg->timestamp;

SrsSharedPtrMessage* last_msg = mw_cache->msgs[mw_count - 1];
mw_last_pkt = last_msg->timestamp;
}

return ret;
}
#endif

SrsGopCache::SrsGopCache()
{
cached_video_count = 0;
Expand Down
18 changes: 0 additions & 18 deletions trunk/src/app/srs_app_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,16 +205,6 @@ class SrsConsumer
int mw_min_msgs;
int mw_duration;
#endif
#ifdef SRS_PERF_QUEUE_FAST_CACHE
// use fast cache for msgs
// @see https://github.com/winlinvip/simple-rtmp-server/issues/251
SrsMessageArray* mw_cache;
// the count of msg in fast cache.
int mw_count;
// the packet time in fast cache.
int64_t mw_first_pkt;
int64_t mw_last_pkt;
#endif
public:
SrsConsumer(SrsSource* _source);
virtual ~SrsConsumer();
Expand Down Expand Up @@ -262,14 +252,6 @@ class SrsConsumer
* when client send the pause message.
*/
virtual int on_play_client_pause(bool is_pause);
private:
#ifdef SRS_PERF_QUEUE_FAST_CACHE
/**
* dumps the queue to fast cache,
* when fast cache is clear or queue is overflow.
*/
virtual int dumps_queue_to_fast_cache();
#endif
};

/**
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version
#define VERSION_MAJOR 2
#define VERSION_MINOR 0
#define VERSION_REVISION 68
#define VERSION_REVISION 69
// server info.
#define RTMP_SIG_SRS_KEY "SRS"
#define RTMP_SIG_SRS_ROLE "origin/edge server"
Expand Down
10 changes: 0 additions & 10 deletions trunk/src/core/srs_core_performance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#undef SRS_PERF_MW_SO_RCVBUF
/**
* whether enable the fast cache.
* @remark this improve performance for large connectios.
* @remark this also introduce complex, default to disable it.
* @see https://github.com/winlinvip/simple-rtmp-server/issues/251
*/
#undef SRS_PERF_QUEUE_FAST_CACHE
/**
* whether enable the fast vector for qeueue.
* @see https://github.com/winlinvip/simple-rtmp-server/issues/251
*/
#define SRS_PERF_QUEUE_FAST_VECTOR
#if defined(SRS_PERF_QUEUE_FAST_CACHE) && defined(SRS_PERF_QUEUE_FAST_VECTOR)
#error "fast cache conflict with fast vector"
#endif
/**
* whether use cond wait to send messages.
* @remark this improve performance for large connectios.
Expand Down

0 comments on commit 6bdd0af

Please sign in to comment.