Forgot to attach the patch. -Nathan
diff --git a/opal/runtime/opal_finalize.c b/opal/runtime/opal_finalize.c
index 318eba7..22b2e58 100644
--- a/opal/runtime/opal_finalize.c
+++ b/opal/runtime/opal_finalize.c
@@ -1,3 +1,4 @@
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
* University Research and Technology
@@ -10,7 +11,7 @@
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2008-2012 Cisco Systems, Inc. All rights reserved.
- * Copyright (c) 2010-2013 Los Alamos National Security, LLC.
+ * Copyright (c) 2010-2014 Los Alamos National Security, LLC.
* All rights reserved.
* Copyright (c) 2013-2014 Intel, Inc. All rights reserved
* $COPYRIGHT$
@@ -57,6 +58,7 @@
extern int opal_initialized;
extern int opal_util_initialized;
+extern bool opal_init_util_called;
int
opal_finalize_util(void)
@@ -65,9 +67,21 @@ opal_finalize_util(void)
if( opal_util_initialized < 0 ) {
return OPAL_ERROR;
}
- return OPAL_SUCCESS;
}
+ /* do not do anything more if the destuctor attribute is available */
+#if OPAL_HAVE_ATTRIBUTE_DESTRUCTOR
+ return OPAL_SUCCESS;
+}
+
+static void __attribute__((destructor)) opal_cleanup_resources (void) {
+ if (!opal_init_util_called) {
+ /* nothing to clean up */
+ return;
+ }
+#endif
+ opal_init_util_called = false;
+
/* close interfaces code. */
if (opal_if_base_framework.framework_refcnt > 1) {
/* opal if may have been opened many times -- FIXME */
@@ -89,6 +103,11 @@ opal_finalize_util(void)
(void) mca_base_framework_close(&opal_installdirs_base_framework);
+#if OPAL_HAVE_ATTRIBUTE_DESTRUCTOR
+ /* there are issues with tearing down everything in opal_finalize_util.
doing
+ * so will cause opal_init_util to segmentation fault if called after
finalize.
+ * this cleanup is safe in a destructor function. */
+
/* finalize the memory allocator */
opal_malloc_finalize();
@@ -108,8 +127,9 @@ opal_finalize_util(void)
/* finalize the class/object system */
opal_class_finalize();
-
+#else
return OPAL_SUCCESS;
+#endif
}
diff --git a/opal/runtime/opal_init.c b/opal/runtime/opal_init.c
index 6567a9f..a48517b 100644
--- a/opal/runtime/opal_init.c
+++ b/opal/runtime/opal_init.c
@@ -71,6 +71,8 @@ const char opal_version_string[] = OPAL_IDENT_STRING;
int opal_initialized = 0;
int opal_util_initialized = 0;
+bool opal_init_util_called = false;
+
/* We have to put a guess in here in case hwloc is not available. If
hwloc is available, this value will be overwritten when the
hwloc data is loaded. */
@@ -247,13 +249,17 @@ opal_init_util(int* pargc, char*** pargv)
int ret;
char *error = NULL;
- if( ++opal_util_initialized != 1 ) {
+ ++opal_util_initialized;
+
+ if (opal_init_util_called) {
if( opal_util_initialized < 1 ) {
return OPAL_ERROR;
}
return OPAL_SUCCESS;
}
+ opal_init_util_called = true;
+
/* initialize the memory allocator */
opal_malloc_init();
pgpQAhUei3oae.pgp
Description: PGP signature
