From c3ce403df901ffa41bf826010e209e1260338b93 Mon Sep 17 00:00:00 2001
From: Martin Larralde <martin.larralde@embl.de>
Date: Wed, 3 Aug 2022 04:41:28 +0200
Subject: [PATCH] Add an `atomic_vector` wrapper for `vector` where `push_back`
 is thread-safe

---
 pyfastani/_atomic_vector.hpp | 21 +++++++++++++++++++++
 pyfastani/_atomic_vector.pxd |  5 +++++
 2 files changed, 26 insertions(+)
 create mode 100644 pyfastani/_atomic_vector.hpp
 create mode 100644 pyfastani/_atomic_vector.pxd

diff --git a/pyfastani/_atomic_vector.hpp b/pyfastani/_atomic_vector.hpp
new file mode 100644
index 0000000..a3ebcc0
--- /dev/null
+++ b/pyfastani/_atomic_vector.hpp
@@ -0,0 +1,21 @@
+#ifndef _SAFEVEC_HPP
+#define _SAFEVEC_HPP
+
+#include <mutex>
+#include <vector>
+
+
+template <class T>
+class atomic_vector: public std::vector<T> {
+protected:
+    std::mutex mutex;
+public:
+    atomic_vector(): std::vector<T>(), mutex() {}
+    void push_back(const T& val) {
+        mutex.lock();
+        std::vector<T>::push_back(val);
+        mutex.unlock();
+    }
+};
+
+#endif
diff --git a/pyfastani/_atomic_vector.pxd b/pyfastani/_atomic_vector.pxd
new file mode 100644
index 0000000..1c07986
--- /dev/null
+++ b/pyfastani/_atomic_vector.pxd
@@ -0,0 +1,5 @@
+from libcpp.vector cimport vector
+
+cdef extern from "_atomic_vector.hpp" nogil:
+    cdef cppclass atomic_vector[T](vector[T]):
+        pass
-- 
GitLab