You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2007/11/22 00:45:41 UTC

svn commit: r597266 - /incubator/stdcxx/trunk/src/messages.cpp

Author: sebor
Date: Wed Nov 21 15:45:28 2007
New Revision: 597266

URL: http://svn.apache.org/viewvc?rev=597266&view=rev
Log:
2007-11-20 Travis Vitek <vi...@roguewave.com>

	Merged rev 597265 with a fix for STDCXX-607 from branches/4.2.x.
	* src/messages.cpp (__rw_cat_close): Put lock guard into local scope
	to avoid recursive acquire on error.

Modified:
    incubator/stdcxx/trunk/src/messages.cpp

Modified: incubator/stdcxx/trunk/src/messages.cpp
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/src/messages.cpp?rev=597266&r1=597265&r2=597266&view=diff
==============================================================================
--- incubator/stdcxx/trunk/src/messages.cpp (original)
+++ incubator/stdcxx/trunk/src/messages.cpp Wed Nov 21 15:45:28 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)")));
 }