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
|
|
@ -706,11 +706,10 @@ srs_error_t SrsClsClient::report()
|
|||
return err;
|
||||
}
|
||||
|
||||
SrsClsSugars* sugars = sugars_;
|
||||
SrsAutoFree(SrsClsSugars, sugars);
|
||||
SrsUniquePtr<SrsClsSugars> sugars(sugars_);
|
||||
sugars_ = new SrsClsSugars();
|
||||
|
||||
if ((err = send_logs(sugars)) != srs_success) {
|
||||
if ((err = send_logs(sugars.get())) != srs_success) {
|
||||
return srs_error_wrap(err, "cls");
|
||||
}
|
||||
|
||||
|
|
@ -727,16 +726,15 @@ srs_error_t SrsClsClient::do_send_logs(ISrsEncoder* sugar, int count, int total)
|
|||
return srs_error_new(ERROR_CLS_EXCEED_SIZE, "exceed 5MB actual %d", size);
|
||||
}
|
||||
|
||||
char* buf = new char[size];
|
||||
SrsAutoFreeA(char, buf);
|
||||
SrsUniquePtr<char[]> buf(new char[size]);
|
||||
|
||||
memset(buf, 0, size);
|
||||
SrsBuffer b(buf, size);
|
||||
memset(buf.get(), 0, size);
|
||||
SrsBuffer b(buf.get(), size);
|
||||
if ((err = sugar->encode(&b)) != srs_success) {
|
||||
return srs_error_wrap(err, "encode log");
|
||||
}
|
||||
|
||||
string body(buf, size);
|
||||
string body(buf.get(), size);
|
||||
|
||||
// Write a CLS log to service specified by url.
|
||||
string url = "http://" + endpoint_ + ":80/structuredlog?topic_id=" + topic_;
|
||||
|
|
@ -776,11 +774,11 @@ srs_error_t SrsClsClient::do_send_logs(ISrsEncoder* sugar, int count, int total)
|
|||
}
|
||||
|
||||
// Start request and parse response.
|
||||
ISrsHttpMessage* msg = NULL;
|
||||
if ((err = http.post(path, body, &msg)) != srs_success) {
|
||||
ISrsHttpMessage* msg_raw = NULL;
|
||||
if ((err = http.post(path, body, &msg_raw)) != srs_success) {
|
||||
return srs_error_wrap(err, "http: client post");
|
||||
}
|
||||
SrsAutoFree(ISrsHttpMessage, msg);
|
||||
SrsUniquePtr<ISrsHttpMessage> msg(msg_raw);
|
||||
|
||||
string res;
|
||||
uint16_t code = msg->status_code();
|
||||
|
|
@ -819,10 +817,9 @@ srs_error_t SrsClsClient::send_logs(SrsClsSugars* sugars)
|
|||
|
||||
// Never do infinite loop, limit to a max loop and drop logs if exceed.
|
||||
for (int i = 0; i < 128 && !sugars->empty(); ++i) {
|
||||
SrsClsSugars* v = sugars->slice(SRS_CLS_BATCH_MAX_LOG_SIZE);
|
||||
SrsAutoFree(SrsClsSugars, v);
|
||||
SrsUniquePtr<SrsClsSugars> v(sugars->slice(SRS_CLS_BATCH_MAX_LOG_SIZE));
|
||||
|
||||
if ((err = do_send_logs((ISrsEncoder*)v, v->size(), total)) != srs_success) {
|
||||
if ((err = do_send_logs((ISrsEncoder*)v.get(), v->size(), total)) != srs_success) {
|
||||
return srs_error_wrap(err, "send %d/%d/%d logs", v->size(), i, total);
|
||||
}
|
||||
}
|
||||
|
|
@ -2148,8 +2145,7 @@ srs_error_t SrsApmClient::do_report()
|
|||
// Update statistaic for APM.
|
||||
nn_spans_ += spans_.size();
|
||||
|
||||
SrsOtelExportTraceServiceRequest* sugar = new SrsOtelExportTraceServiceRequest();
|
||||
SrsAutoFree(SrsOtelExportTraceServiceRequest, sugar);
|
||||
SrsUniquePtr<SrsOtelExportTraceServiceRequest> sugar(new SrsOtelExportTraceServiceRequest());
|
||||
|
||||
SrsOtelResourceSpans* rs = sugar->append();
|
||||
// See https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions
|
||||
|
|
@ -2169,16 +2165,15 @@ srs_error_t SrsApmClient::do_report()
|
|||
return srs_error_new(ERROR_APM_EXCEED_SIZE, "exceed 5MB actual %d", size);
|
||||
}
|
||||
|
||||
char* buf = new char[size];
|
||||
SrsAutoFreeA(char, buf);
|
||||
SrsUniquePtr<char[]> buf(new char[size]);
|
||||
|
||||
memset(buf, 0, size);
|
||||
SrsBuffer b(buf, size);
|
||||
memset(buf.get(), 0, size);
|
||||
SrsBuffer b(buf.get(), size);
|
||||
if ((err = sugar->encode(&b)) != srs_success) {
|
||||
return srs_error_wrap(err, "encode log");
|
||||
}
|
||||
|
||||
string body(buf, size);
|
||||
string body(buf.get(), size);
|
||||
|
||||
// Write a CLS log to service specified by url.
|
||||
string url = "http://" + endpoint_ + "/v1/traces";
|
||||
|
|
@ -2204,11 +2199,11 @@ srs_error_t SrsApmClient::do_report()
|
|||
}
|
||||
|
||||
// Start request and parse response.
|
||||
ISrsHttpMessage* msg = NULL;
|
||||
if ((err = http.post(path, body, &msg)) != srs_success) {
|
||||
ISrsHttpMessage* msg_raw = NULL;
|
||||
if ((err = http.post(path, body, &msg_raw)) != srs_success) {
|
||||
return srs_error_wrap(err, "http: client post");
|
||||
}
|
||||
SrsAutoFree(ISrsHttpMessage, msg);
|
||||
SrsUniquePtr<ISrsHttpMessage> msg(msg_raw);
|
||||
|
||||
string res;
|
||||
uint16_t code = msg->status_code();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue