@@ -49,7 +49,7 @@ Kernel* registered_kernels = reinterpret_cast<Kernel*>(registered_kernels_data);
4949size_t num_registered_kernels = 0 ;
5050
5151// Registers the kernels, but may return an error.
52- Error register_kernels_internal (const Span<const Kernel> kernels) {
52+ Error register_kernels_internal (const Span<const Kernel> kernels, ErrorHandler errorHandler ) {
5353 // Operator registration happens in static initialization time before or after
5454 // PAL init, so call it here. It is safe to call multiple times.
5555 ::et_pal_init ();
@@ -74,12 +74,19 @@ Error register_kernels_internal(const Span<const Kernel> kernels) {
7474 ET_LOG (Error, " %s" , kernels[i].name_ );
7575 ET_LOG_KERNEL_KEY (kernels[i].kernel_key_ );
7676 }
77+
78+ if (errorHandler != nullptr ) {
79+ return errorHandler (Error::RegistrationExceedingMaxKernels);
80+ }
81+
7782 return Error::RegistrationExceedingMaxKernels;
7883 }
7984 // for debugging purpose
8085 ET_UNUSED const char * lib_name =
8186 et_pal_get_shared_library_name (kernels.data ());
8287
88+ Error err = Error::Ok;
89+
8390 for (const auto & kernel : kernels) {
8491 // Linear search. This is fine if the number of kernels is small.
8592 for (size_t i = 0 ; i < num_registered_kernels; i++) {
@@ -88,24 +95,33 @@ Error register_kernels_internal(const Span<const Kernel> kernels) {
8895 kernel.kernel_key_ == k.kernel_key_ ) {
8996 ET_LOG (Error, " Re-registering %s, from %s" , k.name_ , lib_name);
9097 ET_LOG_KERNEL_KEY (k.kernel_key_ );
91- return Error::RegistrationAlreadyRegistered;
98+ err = Error::RegistrationAlreadyRegistered;
99+ continue ;
92100 }
93101 }
102+
94103 registered_kernels[num_registered_kernels++] = kernel;
95104 }
96- ET_LOG (
97- Debug,
98- " Successfully registered all kernels from shared library: %s" ,
99- lib_name);
100105
101- return Error::Ok;
106+ if (errorHandler != nullptr ) {
107+ err = errorHandler (err);
108+ }
109+
110+ if (err == Error::Ok) {
111+ ET_LOG (
112+ Debug,
113+ " Successfully registered all kernels from shared library: %s" ,
114+ lib_name);
115+ }
116+
117+ return err;
102118}
103119
104120} // namespace
105121
106122// Registers the kernels, but panics if an error occurs. Always returns Ok.
107- Error register_kernels (const Span<const Kernel> kernels) {
108- Error success = register_kernels_internal (kernels);
123+ Error register_kernels (const Span<const Kernel> kernels, ErrorHandler errorHandler ) {
124+ Error success = register_kernels_internal (kernels, errorHandler );
109125 if (success == Error::RegistrationAlreadyRegistered ||
110126 success == Error::RegistrationExceedingMaxKernels) {
111127 ET_CHECK_MSG (
0 commit comments