namespace mirror { class Object;
} // namespace mirror
class Thread;
// Counting locks by storing object pointers into a vector. Duplicate entries mark recursive locks. // The vector will be visited with the ShadowFrame during GC (so all the locked-on objects are // thread roots). // Note: implementation is split so that the call sites may be optimized to no-ops in case no // lock counting is necessary. The actual implementation is in the cc file to avoid // dependencies. class LockCountData { public: // Add the given object to the list of monitors, that is, objects that have been locked. This // will not throw (but be skipped if there is an exception pending on entry).
EXPORT void AddMonitor(Thread* self, mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_);
// Try to remove the given object from the monitor list, indicating an unlock operation. // This will throw an IllegalMonitorStateException (clearing any already pending exception), in // case that there wasn't a lock recorded for the object.
EXPORT void RemoveMonitorOrThrow(Thread* self, const mirror::Object* obj) REQUIRES_SHARED(Locks::mutator_lock_);
// Check whether all acquired monitors have been released. This will potentially throw an // IllegalMonitorStateException, clearing any already pending exception. Returns true if the // check shows that everything is OK wrt/ lock counting, false otherwise.
EXPORT bool CheckAllMonitorsReleasedOrThrow(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
template <typename T, typename... Args> void VisitMonitors(T visitor, Args&&... args) REQUIRES_SHARED(Locks::mutator_lock_) { if (monitors_ != nullptr) { // Visitors may change the Object*. Be careful with the foreach loop. for (mirror::Object*& obj : *monitors_) {
visitor(/* inout */ &obj, std::forward<Args>(args)...);
}
}
}
private: // Stores references to the locked-on objects. As noted, this should be visited during thread // marking.
std::unique_ptr<std::vector<mirror::Object*>> monitors_;
};
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.