Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RID tracked handles better error messages for dangling RIDs #55719

Merged
merged 1 commit into from
Dec 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions core/rid_handle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,15 @@ String RID_Database::_rid_to_string(const RID &p_rid, const PoolElement &p_pe) {
s += "PE [ rev " + itos(p_pe.revision) + " ] ";
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
if (p_pe.filename) {
s += String(p_pe.filename) + " ";
s += String(p_pe.filename).get_file() + " ";
}
s += "line " + itos(p_pe.line_number);

if (p_pe.previous_filename) {
s += " ( prev ";
s += String(p_pe.previous_filename).get_file() + " ";
s += "line " + itos(p_pe.previous_line_number) + " )";
}
#endif
return s;
}
Expand Down Expand Up @@ -186,6 +192,11 @@ void RID_Database::handle_make_rid(RID &r_rid, RID_Data *p_data, RID_OwnerBase *
r_rid._revision = pe->revision;

#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
// make a note of the previous allocation - this isn't super necessary
// but can pinpoint source allocations when dangling RIDs occur.
pe->previous_filename = pe->filename;
pe->previous_line_number = pe->line_number;

pe->line_number = 0;
pe->filename = nullptr;
#endif
Expand Down Expand Up @@ -230,8 +241,7 @@ RID_Data *RID_Database::handle_get_or_null(const RID &p_rid) {

const PoolElement &pe = _pool[p_rid._id];
if (pe.revision != p_rid._revision) {
print_verbose("RID revision incorrect : " + _rid_to_string(p_rid, pe));
ERR_FAIL_COND_V_MSG(pe.revision != p_rid._revision, nullptr, "RID_Database get_or_null, revision is incorrect, object possibly freed before use.");
ERR_FAIL_COND_V_MSG(pe.revision != p_rid._revision, nullptr, "RID get_or_null, revision is incorrect, possible dangling RID. " + _rid_to_string(p_rid, pe));
}

return pe.data;
Expand Down
5 changes: 5 additions & 0 deletions core/rid_handle.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,14 @@ class RID_Database {
RID_Data *data;
uint32_t revision;
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
// current allocation
uint16_t line_number;
uint16_t owner_name_id;
const char *filename;

// previous allocation (allows identifying dangling RID source allocations)
const char *previous_filename;
uint32_t previous_line_number;
#endif
};

Expand Down