Repository : http://git.fedorahosted.org/cgit/firewalld-recode.git
On branch : master
commit fe19b51e257e951380db70f164be7da3e1dfbe9e Author: Daniel Kopecek dkopecek@redhat.com Date: Tue Oct 14 16:57:41 2014 +0200
Remove the transaction if the commit operation was successful
src/Daemon/Firewall/Backend.cpp | 19 +++++++++++++++++++ src/Daemon/Firewall/Backend.hpp | 3 ++- src/Daemon/Firewall/Transaction.cpp | 10 ++++++++++ src/Daemon/Firewall/Transaction.hpp | 4 ++++ 4 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/src/Daemon/Firewall/Backend.cpp b/src/Daemon/Firewall/Backend.cpp index 1dfb2ad..43dc1ae 100644 --- a/src/Daemon/Firewall/Backend.cpp +++ b/src/Daemon/Firewall/Backend.cpp @@ -40,6 +40,7 @@ namespace firewalld for (size_t i = 0; i < transaction->countOperations(); ++i) { processOperation(transaction->operation(i)); } + removeTransactionUnlocked(transaction->identifier()); } catch(const TransactionError& ex) { // Undo completed operations if (ex.rollbackNeeded()) { @@ -54,6 +55,24 @@ namespace firewalld return; }
+ void Backend::removeTransaction(const String& identifier) + { + std::lock_guardstd::mutex backend_lock(_backend_mutex); + removeTransactionUnlocked(identifier); + } + + void Backend::removeTransactionUnlocked(const String& identifier) + { + size_t i = 0; + for (Pointer<const Transaction> member : _transactions) { + if (member->identifier() == identifier) { + _transactions.erase(_transactions.begin() + i); + return; + } + ++i; + } + } + size_t Backend::countTransactions() const { std::lock_guardstd::mutex backend_lock(_backend_mutex); diff --git a/src/Daemon/Firewall/Backend.hpp b/src/Daemon/Firewall/Backend.hpp index 58298e8..97eb0ca 100644 --- a/src/Daemon/Firewall/Backend.hpp +++ b/src/Daemon/Firewall/Backend.hpp @@ -33,11 +33,12 @@ namespace firewalld virtual const UString& identifier() const = 0; Pointer<Transaction> createTransaction(); void commitTransaction(Pointer<Transaction> transaction); - void removeTransaction(const UString& identifier); + void removeTransaction(const String& identifier); size_t countTransactions() const;
protected: virtual void processOperation(const UStringList& op, bool undo = false) = 0; + void removeTransactionUnlocked(const String& identifier);
private: PointerVector<Transaction> _transactions; diff --git a/src/Daemon/Firewall/Transaction.cpp b/src/Daemon/Firewall/Transaction.cpp index 1505e69..b9f59f4 100644 --- a/src/Daemon/Firewall/Transaction.cpp +++ b/src/Daemon/Firewall/Transaction.cpp @@ -27,6 +27,11 @@ namespace firewalld _identifier = identifier; }
+ const String& Transaction::identifier() const + { + return _identifier; + } + const UStringList& Transaction::operation(size_t index) const { return _operations.at(index); @@ -51,6 +56,11 @@ namespace firewalld _operations.erase(_operations.begin() + index); }
+ bool Transaction::operator==(const Transaction& rhs) const + { + return (_identifier == rhs._identifier); + } + TransactionError::TransactionError(Pointer<Transaction> transaction, size_t failed_op_index, const UString& message) : std::runtime_error("Transaction error") { diff --git a/src/Daemon/Firewall/Transaction.hpp b/src/Daemon/Firewall/Transaction.hpp index 2978039..5b23a48 100644 --- a/src/Daemon/Firewall/Transaction.hpp +++ b/src/Daemon/Firewall/Transaction.hpp @@ -31,12 +31,16 @@ namespace firewalld public: Transaction(const String& identifier);
+ const String& identifier() const; + const UStringList& operation(size_t index) const; size_t countOperations() const;
size_t appendOperation(const UStringList& op); void removeOperation(size_t index);
+ bool operator==(const Transaction& rhs) const; + private: String _identifier; std::vector<UStringList> _operations;