Add location info in registry (debug mode only)
PiperOrigin-RevId: 508786558
This commit is contained in:
		
							parent
							
								
									23012f2151
								
							
						
					
					
						commit
						2c82f67097
					
				|  | @ -88,7 +88,8 @@ struct NodeRegistrationStatic { | |||
|   static mediapipe::RegistrationToken Make() { | ||||
|     return mediapipe::CalculatorBaseRegistry::Register( | ||||
|         T::kCalculatorName, | ||||
|         absl::make_unique<mediapipe::internal::CalculatorBaseFactoryFor<T>>); | ||||
|         absl::make_unique<mediapipe::internal::CalculatorBaseFactoryFor<T>>, | ||||
|         __FILE__, __LINE__); | ||||
|   } | ||||
| 
 | ||||
|   using RequireStatics = ForceStaticInstantiation<®istration>; | ||||
|  | @ -104,8 +105,8 @@ struct SubgraphRegistrationImpl { | |||
|   static NoDestructor<mediapipe::RegistrationToken> registration; | ||||
| 
 | ||||
|   static mediapipe::RegistrationToken Make() { | ||||
|     return mediapipe::SubgraphRegistry::Register(T::kCalculatorName, | ||||
|                                                  absl::make_unique<T>); | ||||
|     return mediapipe::SubgraphRegistry::Register( | ||||
|         T::kCalculatorName, absl::make_unique<T>, __FILE__, __LINE__); | ||||
|   } | ||||
| 
 | ||||
|   using RequireStatics = ForceStaticInstantiation<®istration>; | ||||
|  | @ -223,12 +224,13 @@ class SubgraphImpl : public Subgraph, public Intf { | |||
| 
 | ||||
| // This macro is used to register a calculator that does not use automatic
 | ||||
| // registration. Deprecated.
 | ||||
| #define MEDIAPIPE_NODE_IMPLEMENTATION(Impl)                                  \ | ||||
|   static mediapipe::NoDestructor<mediapipe::RegistrationToken>               \ | ||||
|   REGISTRY_STATIC_VAR(calculator_registration,                               \ | ||||
|                       __LINE__)(mediapipe::CalculatorBaseRegistry::Register( \ | ||||
|       Impl::kCalculatorName,                                                 \ | ||||
|       absl::make_unique<mediapipe::internal::CalculatorBaseFactoryFor<Impl>>)) | ||||
| #define MEDIAPIPE_NODE_IMPLEMENTATION(Impl)                                   \ | ||||
|   static mediapipe::NoDestructor<mediapipe::RegistrationToken>                \ | ||||
|   REGISTRY_STATIC_VAR(calculator_registration,                                \ | ||||
|                       __LINE__)(mediapipe::CalculatorBaseRegistry::Register(  \ | ||||
|       Impl::kCalculatorName,                                                  \ | ||||
|       absl::make_unique<mediapipe::internal::CalculatorBaseFactoryFor<Impl>>, \ | ||||
|       __FILE__, __LINE__)) | ||||
| 
 | ||||
| // This macro is used to register a non-split-contract calculator. Deprecated.
 | ||||
| #define MEDIAPIPE_REGISTER_NODE(name) REGISTER_CALCULATOR(name) | ||||
|  | @ -239,7 +241,7 @@ class SubgraphImpl : public Subgraph, public Intf { | |||
|   static mediapipe::NoDestructor<mediapipe::RegistrationToken>         \ | ||||
|   REGISTRY_STATIC_VAR(subgraph_registration,                           \ | ||||
|                       __LINE__)(mediapipe::SubgraphRegistry::Register( \ | ||||
|       Impl::kCalculatorName, absl::make_unique<Impl>)) | ||||
|       Impl::kCalculatorName, absl::make_unique<Impl>, __FILE__, __LINE__)) | ||||
| 
 | ||||
| }  // namespace api2
 | ||||
| }  // namespace mediapipe
 | ||||
|  |  | |||
|  | @ -183,7 +183,8 @@ TEST(CalculatorTest, CreateByNameWhitelisted) { | |||
|   CalculatorBaseRegistry::Register( | ||||
|       "::mediapipe::test_ns::whitelisted_ns::DeadCalculator", | ||||
|       absl::make_unique<internal::CalculatorBaseFactoryFor< | ||||
|           mediapipe::test_ns::whitelisted_ns::DeadCalculator>>); | ||||
|           mediapipe::test_ns::whitelisted_ns::DeadCalculator>>, | ||||
|       __FILE__, __LINE__); | ||||
| 
 | ||||
|   // A whitelisted calculator can be found in its own namespace.
 | ||||
|   MP_EXPECT_OK(CalculatorBaseRegistry::CreateByNameInNamespace(  //
 | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| #define MEDIAPIPE_DEPS_REGISTRATION_H_ | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <cstdint> | ||||
| #include <functional> | ||||
| #include <string> | ||||
| #include <tuple> | ||||
|  | @ -161,7 +162,8 @@ class FunctionRegistry { | |||
|   FunctionRegistry(const FunctionRegistry&) = delete; | ||||
|   FunctionRegistry& operator=(const FunctionRegistry&) = delete; | ||||
| 
 | ||||
|   RegistrationToken Register(absl::string_view name, Function func) | ||||
|   RegistrationToken Register(absl::string_view name, Function func, | ||||
|                              std::string filename, uint64_t line) | ||||
|       ABSL_LOCKS_EXCLUDED(lock_) { | ||||
|     std::string normalized_name = GetNormalizedName(name); | ||||
|     absl::WriterMutexLock lock(&lock_); | ||||
|  | @ -171,10 +173,21 @@ class FunctionRegistry { | |||
|     } | ||||
|     if (functions_.insert(std::make_pair(normalized_name, std::move(func))) | ||||
|             .second) { | ||||
| #ifndef NDEBUG | ||||
|       locations_.emplace(normalized_name, | ||||
|                          std::make_pair(std::move(filename), line)); | ||||
| #endif | ||||
|       return RegistrationToken( | ||||
|           [this, normalized_name]() { Unregister(normalized_name); }); | ||||
|     } | ||||
| #ifndef NDEBUG | ||||
|     LOG(FATAL) << "Function with name " << name << " already registered." | ||||
|                << " First registration at " | ||||
|                << locations_.at(normalized_name).first << ":" | ||||
|                << locations_.at(normalized_name).second; | ||||
| #else | ||||
|     LOG(FATAL) << "Function with name " << name << " already registered."; | ||||
| #endif | ||||
|     return RegistrationToken([]() {}); | ||||
|   } | ||||
| 
 | ||||
|  | @ -291,6 +304,11 @@ class FunctionRegistry { | |||
|  private: | ||||
|   mutable absl::Mutex lock_; | ||||
|   absl::flat_hash_map<std::string, Function> functions_ ABSL_GUARDED_BY(lock_); | ||||
| #ifndef NDEBUG | ||||
|   // Stores filename and line number for useful debug log.
 | ||||
|   absl::flat_hash_map<std::string, std::pair<std::string, uint32_t>> locations_ | ||||
|       ABSL_GUARDED_BY(lock_); | ||||
| #endif | ||||
| 
 | ||||
|   // For names included in NamespaceAllowlist, strips the namespace.
 | ||||
|   std::string GetAdjustedName(absl::string_view name) { | ||||
|  | @ -321,8 +339,10 @@ class GlobalFactoryRegistry { | |||
| 
 | ||||
|  public: | ||||
|   static RegistrationToken Register(absl::string_view name, | ||||
|                                     typename Functions::Function func) { | ||||
|     return functions()->Register(name, std::move(func)); | ||||
|                                     typename Functions::Function func, | ||||
|                                     std::string filename, uint64_t line) { | ||||
|     return functions()->Register(name, std::move(func), std::move(filename), | ||||
|                                  line); | ||||
|   } | ||||
| 
 | ||||
|   // Invokes the specified factory function and returns the result.
 | ||||
|  | @ -382,12 +402,12 @@ class GlobalFactoryRegistry { | |||
| #define MEDIAPIPE_REGISTER_FACTORY_FUNCTION(RegistryType, name, ...) \ | ||||
|   static auto* REGISTRY_STATIC_VAR(registration_##name, __LINE__) =  \ | ||||
|       new mediapipe::RegistrationToken(                              \ | ||||
|           RegistryType::Register(#name, __VA_ARGS__)) | ||||
|           RegistryType::Register(#name, __VA_ARGS__, __FILE__, __LINE__)) | ||||
| 
 | ||||
| #define REGISTER_FACTORY_FUNCTION_QUALIFIED(RegistryType, var_name, name, ...) \ | ||||
|   static auto* REGISTRY_STATIC_VAR(var_name, __LINE__) =                       \ | ||||
|       new mediapipe::RegistrationToken(                                        \ | ||||
|           RegistryType::Register(#name, __VA_ARGS__)) | ||||
|           RegistryType::Register(#name, __VA_ARGS__, __FILE__, __LINE__)) | ||||
| 
 | ||||
| }  // namespace mediapipe
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -466,7 +466,8 @@ struct MessageRegistrationImpl { | |||
| template <typename T> | ||||
| NoDestructor<mediapipe::RegistrationToken> | ||||
|     MessageRegistrationImpl<T>::registration(MessageHolderRegistry::Register( | ||||
|         T{}.GetTypeName(), MessageRegistrationImpl<T>::CreateMessageHolder)); | ||||
|         T{}.GetTypeName(), MessageRegistrationImpl<T>::CreateMessageHolder, | ||||
|         __FILE__, __LINE__)); | ||||
| 
 | ||||
| // For non-Message payloads, this does nothing.
 | ||||
| template <typename T, typename Enable = void> | ||||
|  |  | |||
|  | @ -64,13 +64,13 @@ GraphRegistry::GraphRegistry( | |||
| void GraphRegistry::Register( | ||||
|     const std::string& type_name, | ||||
|     std::function<std::unique_ptr<Subgraph>()> factory) { | ||||
|   local_factories_.Register(type_name, factory); | ||||
|   local_factories_.Register(type_name, factory, __FILE__, __LINE__); | ||||
| } | ||||
| 
 | ||||
| // TODO: Remove this convenience function.
 | ||||
| void GraphRegistry::Register(const std::string& type_name, | ||||
|                              const CalculatorGraphConfig& config) { | ||||
|   local_factories_.Register(type_name, [config] { | ||||
|   Register(type_name, [config] { | ||||
|     auto result = absl::make_unique<ProtoSubgraph>(config); | ||||
|     return std::unique_ptr<Subgraph>(result.release()); | ||||
|   }); | ||||
|  | @ -79,7 +79,7 @@ void GraphRegistry::Register(const std::string& type_name, | |||
| // TODO: Remove this convenience function.
 | ||||
| void GraphRegistry::Register(const std::string& type_name, | ||||
|                              const CalculatorGraphTemplate& templ) { | ||||
|   local_factories_.Register(type_name, [templ] { | ||||
|   Register(type_name, [templ] { | ||||
|     auto result = absl::make_unique<TemplateSubgraph>(templ); | ||||
|     return std::unique_ptr<Subgraph>(result.release()); | ||||
|   }); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user