changeset 97:69424e77621f

Clean up a bit better when a server audioDB constructor throws an exception (or even a char*, as currently). New cleanup() function, called from the destructor and from catch blocks in the server constructors.
author mas01cr
date Wed, 03 Oct 2007 15:16:47 +0000
parents 8f7d0ae0ede4
children e1dc62a646bf
files audioDB.cpp audioDB.h
diffstat 2 files changed, 24 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB.cpp	Wed Oct 03 15:15:03 2007 +0000
+++ b/audioDB.cpp	Wed Oct 03 15:16:47 2007 +0000
@@ -109,22 +109,31 @@
 
 audioDB::audioDB(const unsigned argc, char* const argv[], adb__queryResult *adbQueryResult): O2_AUDIODB_INITIALIZERS
 {
-  processArgs(argc, argv);
-  isServer = 1; // FIXME: Hack
-  assert(O2_ACTION(COM_QUERY));
-  query(dbName, inFile, adbQueryResult);
+  try {
+    processArgs(argc, argv);
+    isServer = 1; // FIXME: Hack
+    assert(O2_ACTION(COM_QUERY));
+    query(dbName, inFile, adbQueryResult);
+  } catch(char *err) {
+    cleanup();
+    throw(err);
+  }
 }
 
 audioDB::audioDB(const unsigned argc, char* const argv[], adb__statusResult *adbStatusResult): O2_AUDIODB_INITIALIZERS
 {
-  processArgs(argc, argv);
-  isServer = 1; // FIXME: Hack
-  assert(O2_ACTION(COM_STATUS));
-  status(dbName, adbStatusResult);
+  try {
+    processArgs(argc, argv);
+    isServer = 1; // FIXME: Hack
+    assert(O2_ACTION(COM_STATUS));
+    status(dbName, adbStatusResult);
+  } catch(char *err) {
+    cleanup();
+    throw(err);
+  }
 }
 
-audioDB::~audioDB(){
-  // Clean up
+void audioDB::cleanup() {
   if(indata)
     munmap(indata,statbuf.st_size);
   if(db)
@@ -137,6 +146,10 @@
     delete dbH;
 }
 
+audioDB::~audioDB(){
+  cleanup();
+}
+
 int audioDB::processArgs(const unsigned argc, char* const argv[]){
 
   if(argc<2){
--- a/audioDB.h	Wed Oct 03 15:15:03 2007 +0000
+++ b/audioDB.h	Wed Oct 03 15:16:47 2007 +0000
@@ -160,6 +160,7 @@
   audioDB(const unsigned argc, char* const argv[]);
   audioDB(const unsigned argc, char* const argv[], adb__queryResult *adbQueryResult);
   audioDB(const unsigned argc, char* const argv[], adb__statusResult *adbStatusResult);
+  void cleanup();
   ~audioDB();
   int processArgs(const unsigned argc, char* const argv[]);
   void get_lock(int fd, bool exclusive);