[Beignet] [PATCH] Use __attribute__((destructor)), not atexit(3).

Koop Mast kwm at rainbow-runner.nl
Thu Aug 27 03:44:43 PDT 2015


On Linux, atexit(3) registered functions are called at program exit or
during module unload. The latter is a Glibc extension not supported by
FreeBSD. This means that, on FreeBSD, the registered function could be
called after the module was unloaded, causing the application to crash.
---
 backend/src/backend/gen_insn_selection.cpp | 2 +-
 backend/src/sys/alloc.cpp                  | 4 ++--
 src/performance.c                          | 7 +------
 utests/utest.cpp                           | 2 +-
 4 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index b84bb4b..e90fd8d 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -1776,11 +1776,11 @@ namespace gbe
 
   // Boiler plate to initialize the selection library at c++ pre-main
   static SelectionLibrary *selLib = NULL;
+  __attribute__((destructor))
   static void destroySelectionLibrary(void) { GBE_DELETE(selLib); }
   static struct SelectionLibraryInitializer {
     SelectionLibraryInitializer(void) {
       selLib = GBE_NEW_NO_ARG(SelectionLibrary);
-      atexit(destroySelectionLibrary);
     }
   } selectionLibraryInitializer;
 
diff --git a/backend/src/sys/alloc.cpp b/backend/src/sys/alloc.cpp
index 08dc7b1..30dc887 100644
--- a/backend/src/sys/alloc.cpp
+++ b/backend/src/sys/alloc.cpp
@@ -140,16 +140,17 @@ namespace gbe
   static bool isMutexInitializing = true;
   static size_t memDebuggerCurrSize(0u);
   static size_t memDebuggerMaxSize(0u);
+  __attribute__((destructor))
   static void SizeMutexDeallocate(void) { if (sizeMutex) delete sizeMutex; }
   static void SizeMutexAllocate(void) {
     if (sizeMutex == NULL && isMutexInitializing == false) {
       isMutexInitializing = true;
       sizeMutex = new MutexSys;
-      atexit(SizeMutexDeallocate);
     }
   }
 
   /*! Stop the memory debugger */
+  __attribute__((destructor))
   static void MemDebuggerEnd(void) {
     MemDebugger *_debug = memDebugger;
     memDebugger = NULL;
@@ -172,7 +173,6 @@ namespace gbe
   /*! Start the memory debugger */
   static void MemDebuggerStart(void) {
     if (memDebugger == NULL) {
-      atexit(MemDebuggerEnd);
       memDebugger = new MemDebugger;
     }
   }
diff --git a/src/performance.c b/src/performance.c
index 85cd481..15acded 100644
--- a/src/performance.c
+++ b/src/performance.c
@@ -37,7 +37,6 @@ typedef struct storage
 
 
 static storage record;
-static int atexit_registered = 0;
 
 
 static context_storage_node * prev_context_pointer = NULL;
@@ -170,6 +169,7 @@ static int cmp(const void *a, const void *b)
     return 0;
 }
 
+__attribute__((destructor))
 static void print_time_info()
 {
   context_storage_node *p_context = record.context_storage;
@@ -273,11 +273,6 @@ static void print_time_info()
 
 static void insert(cl_context context, const char *kernel_name, const char *build_opt, float time)
 {
-  if(!atexit_registered)
-  {
-    atexit_registered = 1;
-    atexit(print_time_info);
-  }
   context_storage_node *p_context = find_context(context);
   kernel_storage_node *p_kernel = find_kernel(p_context, kernel_name, build_opt);
   prev_context_pointer = p_context;
diff --git a/utests/utest.cpp b/utests/utest.cpp
index 0a03d8b..3d6e001 100644
--- a/utests/utest.cpp
+++ b/utests/utest.cpp
@@ -44,6 +44,7 @@ vector<UTest> *UTest::utestList = NULL;
 RStatistics UTest::retStatistics;
 
 void releaseUTestList(void) { delete UTest::utestList; }
+__attribute__((destructor))
 void runSummaryAtExit(void) {
   // If case crashes, count it as fail, and accumulate finishrun
   if(UTest::retStatistics.finishrun != UTest::utestList->size()) {
@@ -113,7 +114,6 @@ UTest::UTest(Function fn, const char *name, bool isBenchMark, bool haveIssue, bo
     utestList = new vector<UTest>;
 
     catch_signal();
-    atexit(runSummaryAtExit);
   }
   utestList->push_back(*this);
 }
-- 
2.4.6



More information about the Beignet mailing list