Ensure ResourceMgr::LookupOrCreate calls create fn just once
authorNick Felt <nickfelt@google.com>
Thu, 24 May 2018 20:07:50 +0000 (13:07 -0700)
committerTensorFlower Gardener <gardener@tensorflow.org>
Thu, 24 May 2018 20:13:41 +0000 (13:13 -0700)
commit44311bc337f88547722f2c8bc8158cc1b8ae2923
tree34485c70601a72bb24f00aa13738ab72ec825bf0
parent748ea4b831fd91660fc83288fe798ef3abca7d2b
Ensure ResourceMgr::LookupOrCreate calls create fn just once

This addresses a race condition where LookupOrCreate is called at the same time from two threads, and both Lookup()s fail, so the creator() function is run twice, even though only a single Create() will then succeed.

The motivation is that some creator() functions have side-effects, e.g. tf.contrib.summary.create_file_writer()'s init op opens an events file.  This change ensures that if two init ops for file writers with the same resource name are run in the same session.run() call, only one events file will be created.  (Current behavior will often open two files; typically the second one overwrites the first but this won't happen if the filename_suffix values are different or the timestamps happen to straddle a second boundary.)

PiperOrigin-RevId: 197940607
tensorflow/core/framework/resource_mgr.cc
tensorflow/core/framework/resource_mgr.h
tensorflow/core/framework/resource_mgr_test.cc