Clean up ICU data tables on shutdown.
authorjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 26 Mar 2014 15:46:05 +0000 (15:46 +0000)
committerjochen@chromium.org <jochen@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 26 Mar 2014 15:46:05 +0000 (15:46 +0000)
This is only used by d8 if compiled with external data tables, or an
embedder that uses external data tables and v8's version of ICU.

BUG=none
R=svenpanne@chromium.org
LOG=n

Review URL: https://codereview.chromium.org/210973007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20283 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/icu_util.cc

index 6441dbd..5ca9dbd 100644 (file)
@@ -33,6 +33,7 @@
 
 #if defined(V8_I18N_SUPPORT)
 #include <stdio.h>
+#include <stdlib.h>
 
 #include "unicode/putil.h"
 #include "unicode/udata.h"
@@ -49,6 +50,17 @@ namespace v8 {
 
 namespace internal {
 
+#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
+namespace {
+char* g_icu_data_ptr = NULL;
+
+void free_icu_data_ptr() {
+  delete[] g_icu_data_ptr;
+}
+
+}  // namespace
+#endif
+
 bool InitializeICU(const char* icu_data_file) {
 #if !defined(V8_I18N_SUPPORT)
   return true;
@@ -70,6 +82,8 @@ bool InitializeICU(const char* icu_data_file) {
 #elif ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
   if (!icu_data_file) return false;
 
+  if (g_icu_data_ptr) return true;
+
   FILE* inf = fopen(icu_data_file, "rb");
   if (!inf) return false;
 
@@ -77,15 +91,19 @@ bool InitializeICU(const char* icu_data_file) {
   size_t size = ftell(inf);
   rewind(inf);
 
-  char* addr = new char[size];
-  if (fread(addr, 1, size, inf) != size) {
-    delete[] addr;
+  g_icu_data_ptr = new char[size];
+  if (fread(g_icu_data_ptr, 1, size, inf) != size) {
+    delete[] g_icu_data_ptr;
+    g_icu_data_ptr = NULL;
     fclose(inf);
     return false;
   }
   fclose(inf);
+
+  atexit(free_icu_data_ptr);
+
   UErrorCode err = U_ZERO_ERROR;
-  udata_setCommonData(reinterpret_cast<void*>(addr), &err);
+  udata_setCommonData(reinterpret_cast<void*>(g_icu_data_ptr), &err);
   return err == U_ZERO_ERROR;
 #endif
 #endif