inline ObjPtr<mirror::Object> LrtEntry::GetReference() {
DCHECK(!IsFree());
DCHECK(!IsSerialNumber());
DCHECK(!IsNull()); // Local references do not need read barriers. They are marked during the thread root flip. return root_.Read<kWithoutReadBarrier>();
}
inlinebool LocalReferenceTable::IsValidReference(IndirectRef iref, /*out*/std::string* error_msg) const {
uint32_t entry_index = GetReferenceEntryIndex(iref); if (UNLIKELY(entry_index == std::numeric_limits<uint32_t>::max())) {
*error_msg = android::base::StringPrintf("reference outside the table: %p", iref); returnfalse;
} if (UNLIKELY(entry_index >= segment_state_.top_index)) {
*error_msg = android::base::StringPrintf("popped reference at index %u in a table of size %u",
entry_index,
segment_state_.top_index); returnfalse;
}
LrtEntry* entry = ToLrtEntry(iref);
LrtEntry* serial_number_entry = GetCheckJniSerialNumberEntry(entry); if (serial_number_entry->IsSerialNumber()) { // This reference was created with CheckJNI enabled.
uint32_t expected_serial_number = serial_number_entry->GetSerialNumber();
uint32_t serial_number = entry - serial_number_entry;
DCHECK_LT(serial_number, kCheckJniEntriesPerReference); if (serial_number != expected_serial_number || serial_number == 0u) {
*error_msg = android::base::StringPrintf( "reference at index %u with bad serial number %u v. %u (valid 1 - %u)",
entry_index,
serial_number,
expected_serial_number,
dchecked_integral_cast<uint32_t>(kCheckJniEntriesPerReference - 1u)); returnfalse;
}
} if (UNLIKELY(entry->IsFree())) {
*error_msg = android::base::StringPrintf("deleted reference at index %u", entry_index); returnfalse;
} if (UNLIKELY(entry->IsNull())) { // This should never really happen and may indicate memory coruption.
*error_msg = android::base::StringPrintf("null reference at index %u", entry_index); returnfalse;
} returntrue;
}
inlinevoid LocalReferenceTable::DCheckValidReference(IndirectRef iref) const { // If CheckJNI is performing the checks, we should not reach this point with an invalid // reference with the exception of gtests that intercept the CheckJNI abort and proceed // to decode the reference anyway and we do not want to abort again in this case. if (kIsDebugBuild && !IsCheckJniEnabled()) {
std::string error_msg;
CHECK(IsValidReference(iref, &error_msg)) << error_msg;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.