mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
UniquePtr: Support SrsUniquePtr to replace SrsAutoFree. v6.0.136 (#4109)
To manage an object: ```cpp // Before MyClass* ptr = new MyClass(); SrsAutoFree(MyClass, ptr); ptr->do_something(); // Now SrsUniquePtr<MyClass> ptr(new MyClass()); ptr->do_something(); ``` To manage an array of objects: ```cpp // Before char* ptr = new char[10]; SrsAutoFreeA(char, ptr); ptr[0] = 0xf; // Now SrsUniquePtr<char[]> ptr(new char[10]); ptr[0] = 0xf; ``` In fact, SrsUniquePtr is a limited subset of SrsAutoFree, mainly managing pointers and arrays. SrsUniquePtr is better than SrsAutoFree because it has the same API to standard unique ptr. ```cpp SrsUniquePtr<MyClass> ptr(new MyClass()); ptr->do_something(); MyClass* p = ptr.get(); ``` SrsAutoFree actually uses a pointer to a pointer, so it can be set to NULL, allowing the pointer's value to be changed later (this usage is different from SrsUniquePtr). ```cpp // OK to free ptr correctly. MyClass* ptr; SrsAutoFree(MyClass, ptr); ptr = new MyClass(); // Crash because ptr is an invalid pointer. MyClass* ptr; SrsUniquePtr<MyClass> ptr(ptr); ptr = new MyClass(); ``` Additionally, SrsAutoFreeH can use specific release functions, which SrsUniquePtr does not support. --------- Co-authored-by: Jacob Su <suzp1984@gmail.com>
This commit is contained in:
parent
baf22d01c1
commit
23d2602c34
72 changed files with 1720 additions and 1669 deletions
|
@ -112,8 +112,8 @@ srs_error_t SrsEdgeRtmpUpstream::connect(SrsRequest* r, SrsLbRoundRobin* lb)
|
|||
|
||||
#ifdef SRS_APM
|
||||
// Create a client span and store it to an AMF0 propagator.
|
||||
ISrsApmSpan* span_client = _srs_apm->inject(_srs_apm->span("edge-pull")->set_kind(SrsApmKindClient)->as_child(_srs_apm->load()), sdk->extra_args());
|
||||
SrsAutoFree(ISrsApmSpan, span_client);
|
||||
SrsUniquePtr<ISrsApmSpan> span_client(_srs_apm->inject(_srs_apm->span("edge-pull")->set_kind(SrsApmKindClient)
|
||||
->as_child(_srs_apm->load()), sdk->extra_args()));
|
||||
#endif
|
||||
|
||||
if ((err = sdk->connect()) != srs_success) {
|
||||
|
@ -594,9 +594,8 @@ srs_error_t SrsEdgeIngester::do_cycle()
|
|||
srs_error_t SrsEdgeIngester::ingest(string& redirect)
|
||||
{
|
||||
srs_error_t err = srs_success;
|
||||
|
||||
SrsPithyPrint* pprint = SrsPithyPrint::create_edge();
|
||||
SrsAutoFree(SrsPithyPrint, pprint);
|
||||
|
||||
SrsUniquePtr<SrsPithyPrint> pprint(SrsPithyPrint::create_edge());
|
||||
|
||||
// we only use the redict once.
|
||||
// reset the redirect to empty, for maybe the origin changed.
|
||||
|
@ -615,15 +614,15 @@ srs_error_t SrsEdgeIngester::ingest(string& redirect)
|
|||
}
|
||||
|
||||
// read from client.
|
||||
SrsCommonMessage* msg = NULL;
|
||||
if ((err = upstream->recv_message(&msg)) != srs_success) {
|
||||
SrsCommonMessage* msg_raw = NULL;
|
||||
if ((err = upstream->recv_message(&msg_raw)) != srs_success) {
|
||||
return srs_error_wrap(err, "recv message");
|
||||
}
|
||||
|
||||
srs_assert(msg);
|
||||
SrsAutoFree(SrsCommonMessage, msg);
|
||||
|
||||
if ((err = process_publish_message(msg, redirect)) != srs_success) {
|
||||
srs_assert(msg_raw);
|
||||
SrsUniquePtr<SrsCommonMessage> msg(msg_raw);
|
||||
|
||||
if ((err = process_publish_message(msg.get(), redirect)) != srs_success) {
|
||||
return srs_error_wrap(err, "process message");
|
||||
}
|
||||
}
|
||||
|
@ -659,14 +658,14 @@ srs_error_t SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg, stri
|
|||
|
||||
// process onMetaData
|
||||
if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
|
||||
SrsPacket* pkt = NULL;
|
||||
if ((err = upstream->decode_message(msg, &pkt)) != srs_success) {
|
||||
SrsPacket* pkt_raw = NULL;
|
||||
if ((err = upstream->decode_message(msg, &pkt_raw)) != srs_success) {
|
||||
return srs_error_wrap(err, "decode message");
|
||||
}
|
||||
SrsAutoFree(SrsPacket, pkt);
|
||||
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
|
||||
|
||||
if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) {
|
||||
SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt);
|
||||
if (dynamic_cast<SrsOnMetaDataPacket*>(pkt.get())) {
|
||||
SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt.get());
|
||||
if ((err = source_->on_meta_data(msg, metadata)) != srs_success) {
|
||||
return srs_error_wrap(err, "source consume metadata");
|
||||
}
|
||||
|
@ -678,15 +677,15 @@ srs_error_t SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg, stri
|
|||
|
||||
// call messages, for example, reject, redirect.
|
||||
if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
|
||||
SrsPacket* pkt = NULL;
|
||||
if ((err = upstream->decode_message(msg, &pkt)) != srs_success) {
|
||||
SrsPacket* pkt_raw = NULL;
|
||||
if ((err = upstream->decode_message(msg, &pkt_raw)) != srs_success) {
|
||||
return srs_error_wrap(err, "decode message");
|
||||
}
|
||||
SrsAutoFree(SrsPacket, pkt);
|
||||
SrsUniquePtr<SrsPacket> pkt(pkt_raw);
|
||||
|
||||
// RTMP 302 redirect
|
||||
if (dynamic_cast<SrsCallPacket*>(pkt)) {
|
||||
SrsCallPacket* call = dynamic_cast<SrsCallPacket*>(pkt);
|
||||
if (dynamic_cast<SrsCallPacket*>(pkt.get())) {
|
||||
SrsCallPacket* call = dynamic_cast<SrsCallPacket*>(pkt.get());
|
||||
if (!call->arguments->is_object()) {
|
||||
return err;
|
||||
}
|
||||
|
@ -793,8 +792,8 @@ srs_error_t SrsEdgeForwarder::start()
|
|||
#ifdef SRS_APM
|
||||
// Create a client span and store it to an AMF0 propagator.
|
||||
// Note that we are able to load the span from coroutine context because in the same coroutine.
|
||||
ISrsApmSpan* span_client = _srs_apm->inject(_srs_apm->span("edge-push")->set_kind(SrsApmKindClient)->as_child(_srs_apm->load()), sdk->extra_args());
|
||||
SrsAutoFree(ISrsApmSpan, span_client);
|
||||
SrsUniquePtr<ISrsApmSpan> span_client(_srs_apm->inject(_srs_apm->span("edge-push")->set_kind(SrsApmKindClient)
|
||||
->as_child(_srs_apm->load()), sdk->extra_args()));
|
||||
#endif
|
||||
|
||||
if ((err = sdk->connect()) != srs_success) {
|
||||
|
@ -858,10 +857,8 @@ srs_error_t SrsEdgeForwarder::do_cycle()
|
|||
srs_error_t err = srs_success;
|
||||
|
||||
sdk->set_recv_timeout(SRS_CONSTS_RTMP_PULSE);
|
||||
|
||||
SrsPithyPrint* pprint = SrsPithyPrint::create_edge();
|
||||
SrsAutoFree(SrsPithyPrint, pprint);
|
||||
|
||||
|
||||
SrsUniquePtr<SrsPithyPrint> pprint(SrsPithyPrint::create_edge());
|
||||
SrsMessageArray msgs(SYS_MAX_EDGE_SEND_MSGS);
|
||||
|
||||
while (true) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue