| 638 | |
| 639 | template <typename T, bool use_dynamic_cast> |
| 640 | Status ResourceMgr::LookupOrCreate(const string& container, const string& name, |
| 641 | T** resource, |
| 642 | std::function<Status(T**)> creator) { |
| 643 | CheckDeriveFromResourceBase<T>(); |
| 644 | *resource = nullptr; |
| 645 | Status s; |
| 646 | { |
| 647 | tf_shared_lock l(mu_); |
| 648 | s = LookupInternal<T, use_dynamic_cast>(container, name, resource); |
| 649 | if (s.ok()) return s; |
| 650 | } |
| 651 | mutex_lock l(mu_); |
| 652 | s = LookupInternal<T, use_dynamic_cast>(container, name, resource); |
| 653 | if (s.ok()) return s; |
| 654 | TF_RETURN_IF_ERROR(creator(resource)); |
| 655 | s = DoCreate(container, MakeTypeIndex<T>(), name, *resource); |
| 656 | if (!s.ok()) { |
| 657 | return errors::Internal("LookupOrCreate failed unexpectedly"); |
| 658 | } |
| 659 | (*resource)->Ref(); |
| 660 | return s; |
| 661 | } |
| 662 | |
| 663 | template <typename T> |
| 664 | Status ResourceMgr::Delete(const string& container, const string& name) { |
no test coverage detected