Author: sebor Date: Wed Nov 21 15:40:43 2007 New Revision: 597265 URL: http://svn.apache.org/viewvc?rev=597265&view=rev Log: 2007-11-20 Travis Vitek <[EMAIL PROTECTED]>
STDCXX-607 * messages.cpp (__rw_cat_close): Put lock guard into local scope to avoid recursive acquire on error. Modified: incubator/stdcxx/branches/4.2.x/src/messages.cpp Modified: incubator/stdcxx/branches/4.2.x/src/messages.cpp URL: http://svn.apache.org/viewvc/incubator/stdcxx/branches/4.2.x/src/messages.cpp?rev=597265&r1=597264&r2=597265&view=diff ============================================================================== --- incubator/stdcxx/branches/4.2.x/src/messages.cpp (original) +++ incubator/stdcxx/branches/4.2.x/src/messages.cpp Wed Nov 21 15:40:43 2007 @@ -275,27 +275,37 @@ // Close a catalog and release its handle. void __rw_cat_close (int cat) { - _RWSTD_MT_CLASS_GUARD (__rw_open_cat_data); + bool cat_closed = false; + + { + // guard is local to this scope to avoid reacquiring the mutex + // if have to generate an exception message string below. + _RWSTD_MT_CLASS_GUARD (__rw_open_cat_data); - __rw_open_cat_data* const pcat_data = - cat < 0 ? 0 : __rw_manage_cat_data (cat, 0); + __rw_open_cat_data* const pcat_data = + cat < 0 ? 0 : __rw_manage_cat_data (cat, 0); - // 22.2.7.1.2, p5: `catalog' must be valid - if (pcat_data && pcat_data->catd != _RWSTD_BAD_CATD) { + // 22.2.7.1.2, p5: `catalog' must be valid + if (pcat_data && pcat_data->catd != _RWSTD_BAD_CATD) { - catclose (pcat_data->catd); + catclose (pcat_data->catd); - _STD::locale* const ploc = - _RWSTD_REINTERPRET_CAST (_STD::locale*, &pcat_data->loc); + _STD::locale* const ploc = + _RWSTD_REINTERPRET_CAST (_STD::locale*, &pcat_data->loc); - ploc->~locale (); + ploc->~locale (); - __rw_manage_cat_data (cat, pcat_data); - } - else { - _RWSTD_REQUIRES (0, (_RWSTD_ERROR_INVALID_ARGUMENT, - _RWSTD_FUNC ("__rw_cat_close (int cat)"))); + __rw_manage_cat_data (cat, pcat_data); + + cat_closed = true; + } + else { + cat_closed = false; + } } + + _RWSTD_REQUIRES (cat_closed, (_RWSTD_ERROR_INVALID_ARGUMENT, + _RWSTD_FUNC ("__rw_cat_close (int cat)"))); }