| 1185 | namespace kernel_factory { |
| 1186 | |
| 1187 | void OpKernelRegistrar::InitInternal(const KernelDef* kernel_def, |
| 1188 | StringPiece kernel_class_name, |
| 1189 | std::unique_ptr<OpKernelFactory> factory) { |
| 1190 | // See comments in register_kernel::Name in header for info on _no_register. |
| 1191 | if (kernel_def->op() != "_no_register") { |
| 1192 | const string key = |
| 1193 | Key(kernel_def->op(), DeviceType(kernel_def->device_type()), |
| 1194 | kernel_def->label()); |
| 1195 | |
| 1196 | // To avoid calling LoadDynamicKernels DO NOT CALL GlobalKernelRegistryTyped |
| 1197 | // here. |
| 1198 | // InitInternal gets called by static initializers, so it ends up executing |
| 1199 | // before main. This causes LoadKernelLibraries function to get called |
| 1200 | // before some file libraries can initialize, which in turn crashes the |
| 1201 | // program flakily. Until we get rid of static initializers in kernel |
| 1202 | // registration mechanism, we have this workaround here. |
| 1203 | auto global_registry = |
| 1204 | reinterpret_cast<KernelRegistry*>(GlobalKernelRegistry()); |
| 1205 | mutex_lock l(global_registry->mu); |
| 1206 | global_registry->registry.emplace( |
| 1207 | key, |
| 1208 | KernelRegistration(*kernel_def, kernel_class_name, std::move(factory))); |
| 1209 | } |
| 1210 | delete kernel_def; |
| 1211 | } |
| 1212 | |
| 1213 | OpKernel* OpKernelRegistrar::PtrOpKernelFactory::Create( |
| 1214 | OpKernelConstruction* context) { |
nothing calls this directly
no test coverage detected