[Insight-developers] Static initialization in itkImageSource causes early registration of ITKIOFactory

Jean-Christophe Fillion-Robin jchris.fillionr at kitware.com
Wed Apr 3 16:27:16 EDT 2013


Hi Brad,

Thanks again for working on this issue :)

I just updated ITKv4 Slicer external project so that ITK master including
your topic is now used.
See http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=21859

Thanks
Jc


On Wed, Apr 3, 2013 at 2:13 PM, Jean-Christophe Fillion-Robin <
jchris.fillionr at kitware.com> wrote:

> 1) A possible way of checking this would be to check if an env variable
> named ITK_OBJECT_FACTORY_BASE_INITIALIZE_VERBOSE is defined to 1, if it is
> the case, the number of registered factory would be displayed in the
> "ObjectFactoryBase::Initialize()" methods.
>
> Then writing a hello world program linking against ITK, would allow to
> check if the "hello world" string is displayed before or after static
> initialization.
>
> 2) I think the addition of a ITKFactoryRegistration shared library would
> be backward compatible. Application would be either using their inside hack
> or calling the method provided by ITK allowing to register the factories.
> Let's also note that all of this would be needed only if the variable
> ITK_NO_IO_FACTORY_REGISTER_MANAGER is set to True.
>
> I really think this would benefit every application loading plugin.
>
> 3) A different approach would be to check if a given factory is already
> loaded and ensure that no duplicate factory are registered.
>
> Let me know what you think.
>
> Thanks
> Jc
>
>
> On Wed, Apr 3, 2013 at 1:25 PM, Bradley Lowekamp <blowekamp at mail.nih.gov>wrote:
>
>> Bill,
>>
>> There is currently no an obvious way I see to check this. If you call a
>> method of the ObjectFactory to ask how many object are registered, it will
>> do the initialization if it wasn't before.
>>
>> Now a new method could be added, to check if the ObjectFactory has been
>> initialized. But I recall there was quite a lot of issues with the class on
>> when the initialization should occur and how to check if it needs to be
>> done.
>>
>> Brad
>>
>> On Apr 3, 2013, at 12:35 PM, Bill Lorensen <bill.lorensen at gmail.com>
>> wrote:
>>
>> Brad,
>>
>> Is there a way we can test for this in ITK? Better we find it before our
>> customers.
>>
>> Bill
>>
>>
>> On Wed, Apr 3, 2013 at 12:11 PM, Jean-Christophe Fillion-Robin <
>> jchris.fillionr at kitware.com> wrote:
>>
>>> Thanks Brad for looking at the issue so quickly :)
>>>
>>> I reviewed your patch in gerrit and posted comment.
>>>
>>> Thanks
>>> Jc
>>>
>>>
>>> On Wed, Apr 3, 2013 at 11:33 AM, Bradley Lowekamp <
>>> blowekamp at mail.nih.gov> wrote:
>>>
>>>> Hello JC,
>>>>
>>>> This is quite an interesting side-effect of the changes I introduced.
>>>>
>>>> I am glad that you were able to figure this out. For a variety of
>>>> reasons, it's likely a very bad thing for all that to occur during static
>>>> initialization in ITK. So it certainly needs to be fixed.
>>>>
>>>> I agree that lazy initialization is the way to go. Unfortunately it
>>>> needs to be thread safe so its a little more completed.
>>>>
>>>> ITKv4 performs the factory initialization when the user creates the
>>>> first ITK object.  And that changed with this patch, and need to be fixed.
>>>>
>>>> CONCLUSION:
>>>>
>>>> Inside ITK, we can not use statically initialized ITK object.
>>>>
>>>> Brad
>>>>
>>>> On Apr 3, 2013, at 10:54 AM, Jean-Christophe Fillion-Robin <
>>>> jchris.fillionr at kitware.com> wrote:
>>>>
>>>> Hi Brad,
>>>>
>>>> Following commit 4c47e7d [1] of February 19th and commit defb9c1 [2] of
>>>> March 1st, due to static initialization, the initialization of
>>>> ObjectFactory  now happens when ITK shared library are loaded [3][4].
>>>>
>>>> This caused a regression in Slicer where the ObjectFactory were
>>>> expected to be loaded while attempting to load an image for the first time.
>>>>
>>>> In Slicer case, the environment variable ITK_AUTOLOAD_PATH was set
>>>> during the initialization of the qSlicerCoreApplication, which is now too
>>>> late.
>>>>
>>>> By commenting line where a new ImageRegionSplitterSlowDimension is
>>>> instantiated [5][6] and updating the method "GetImageRegionSplitter /
>>>> GetGlobalDefaultSplitter" to return 0 [7][8], the initialization can happen
>>>> on demand instead of when ITK libraries are loaded.
>>>>
>>>> An easy solution for us would be to ensure the "ITK_AUTOLOAD_PATH"
>>>> environment variable is set in the application launcher for Windows and
>>>> Linux application and set in Info.plist file associated with the
>>>> application bundle on MacOSX [9]
>>>>
>>>> To provide more details, within Slicer we set the CMake
>>>> variable ITK_NO_IO_FACTORY_REGISTER_MANAGER before doing an
>>>> "include(${ITK_USE_FILE}) so that IOFactory are loaded only by calling the
>>>> method "itkFactoryRegistration" associated with a shared library we named
>>>> ITKFactoryRegistration. This approach allowed us to disable the automatic
>>>> registration of factory in selected part of the code. More details here [10]
>>>>
>>>> It seems the new ITK commits 4c47e7d and defb9c1 prevent from
>>>> completely leveraging the use of ITK_NO_IO_FACTORY_REGISTER_MANAGER
>>>> variable, the code should probably be updated to consider this.
>>>>
>>>>
>>>> Let me know what you think.
>>>>
>>>> Thanks
>>>> Jc
>>>>
>>>>
>>>> [1] https://github.com/Kitware/ITK/commit/4c47e7d
>>>> [2] https://github.com/Kitware/ITK/commit/defb9c1
>>>> [3]
>>>> https://github.com/Kitware/ITK/blob/4c47e7d672bad5d83b92c2df5f293cca618e2740/Modules/Core/Common/src/itkImageSource.cxx#L27
>>>> [4]
>>>> https://github.com/Kitware/ITK/blob/4c47e7d672bad5d83b92c2df5f293cca618e2740/Modules/Core/Common/src/itkObjectFactoryBase.cxx#L142-144
>>>> [5]
>>>> https://github.com/Kitware/ITK/blob/defb9c1d084c8d55df61947587427839f9968ecf/Modules/IO/ImageBase/src/itkImageIOBase.cxx#L760
>>>> [6]
>>>> https://github.com/Kitware/ITK/blob/4c47e7d672bad5d83b92c2df5f293cca618e2740/Modules/Core/Common/src/itkImageSource.cxx#L27
>>>> [7]
>>>> https://github.com/Kitware/ITK/blob/defb9c1d084c8d55df61947587427839f9968ecf/Modules/IO/ImageBase/src/itkImageIOBase.cxx#L765
>>>> [8]
>>>> https://github.com/Kitware/ITK/blob/4c47e7d672bad5d83b92c2df5f293cca618e2740/Modules/Core/Common/src/itkImageSource.cxx#L32
>>>> [9]
>>>> http://www.herzbube.ch/blog/2009/01/how-set-environment-variables-mac-os-x-applications
>>>> [10] https://github.com/Slicer/Slicer/commit/03b8961
>>>>
>>>>
>>>> <https://github.com/Kitware/ITK/blob/4c47e7d672bad5d83b92c2df5f293cca618e2740/Modules/Core/Common/src/itkImageSource.cxx#L27>
>>>> --
>>>> +1 919 869 8849
>>>>  _______________________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Kitware offers ITK Training Courses, for more information visit:
>>>> http://kitware.com/products/protraining.php
>>>>
>>>> Please keep messages on-topic and check the ITK FAQ at:
>>>> http://www.itk.org/Wiki/ITK_FAQ
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.itk.org/mailman/listinfo/insight-developers
>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>> +1 919 869 8849
>>>
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://kitware.com/products/protraining.php
>>>
>>> Please keep messages on-topic and check the ITK FAQ at:
>>> http://www.itk.org/Wiki/ITK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.itk.org/mailman/listinfo/insight-developers
>>>
>>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com
>>
>>
>>
>
>
> --
> +1 919 869 8849
>



-- 
+1 919 869 8849
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-developers/attachments/20130403/91df3e8d/attachment.htm>


More information about the Insight-developers mailing list