Fix: always close fd when destructing buffers

Also always rethrow exceptions not swallow them

Change-Id: I7a4b1e408858aa0d0128ca7bd6d6a7715662f9fb
diff --git a/driver_library/include/ethosu.hpp b/driver_library/include/ethosu.hpp
index 547e346..a12d668 100644
--- a/driver_library/include/ethosu.hpp
+++ b/driver_library/include/ethosu.hpp
@@ -129,7 +129,7 @@
 class Device {
 public:
     Device(const char *device = "/dev/ethosu0");
-    virtual ~Device();
+    virtual ~Device() noexcept(false);
 
     int ioctl(unsigned long cmd, void *data = nullptr) const;
     Capabilities capabilities() const;
@@ -141,7 +141,7 @@
 class Buffer {
 public:
     Buffer(const Device &device, const size_t capacity);
-    virtual ~Buffer();
+    virtual ~Buffer() noexcept(false);
 
     size_t capacity() const;
     void clear() const;
@@ -162,7 +162,7 @@
 public:
     Network(const Device &device, std::shared_ptr<Buffer> &buffer);
     Network(const Device &device, const unsigned index);
-    virtual ~Network();
+    virtual ~Network() noexcept(false);
 
     int ioctl(unsigned long cmd, void *data = nullptr);
     std::shared_ptr<Buffer> getBuffer();
@@ -215,7 +215,7 @@
         create(counterConfigs, enableCycleCounter);
     }
 
-    virtual ~Inference();
+    virtual ~Inference() noexcept(false);
 
     int wait(int64_t timeoutNanos = -1) const;
     const std::vector<uint32_t> getPmuCounters() const;
diff --git a/driver_library/src/ethosu.cpp b/driver_library/src/ethosu.cpp
index 01631b3..2b1da45 100644
--- a/driver_library/src/ethosu.cpp
+++ b/driver_library/src/ethosu.cpp
@@ -148,7 +148,7 @@
     fd = eopen(device, O_RDWR | O_NONBLOCK);
 }
 
-Device::~Device() {
+Device::~Device() noexcept(false) {
     eclose(fd);
 }
 
@@ -185,18 +185,21 @@
         try {
             eclose(fd);
         } catch (...) { std::throw_with_nested(e); }
+        throw;
     }
     dataPtr = reinterpret_cast<char *>(d);
 }
 
-Buffer::~Buffer() {
+Buffer::~Buffer() noexcept(false) {
     try {
         emunmap(dataPtr, dataCapacity);
     } catch (std::exception &e) {
         try {
             eclose(fd);
         } catch (...) { std::throw_with_nested(e); }
+        throw;
     }
+    eclose(fd);
 }
 
 size_t Buffer::capacity() const {
@@ -250,6 +253,7 @@
         try {
             eclose(fd);
         } catch (...) { std::throw_with_nested(e); }
+        throw;
     }
 }
 
@@ -265,6 +269,7 @@
         try {
             eclose(fd);
         } catch (...) { std::throw_with_nested(e); }
+        throw;
     }
 }
 
@@ -281,7 +286,7 @@
     }
 }
 
-Network::~Network() {
+Network::~Network() noexcept(false) {
     eclose(fd);
 }
 
@@ -325,7 +330,7 @@
  * Inference
  ****************************************************************************/
 
-Inference::~Inference() {
+Inference::~Inference() noexcept(false) {
     eclose(fd);
 }