rogue
Loading...
Searching...
No Matches
TransactionLock.cpp
Go to the documentation of this file.
1
17#include "rogue/Directives.h"
18
20
21#include <memory>
22
23#include "rogue/GilRelease.h"
25
27
28#ifndef NO_PYTHON
29 #include <boost/python.hpp>
30namespace bp = boost::python;
31#endif
32
34rim::TransactionLockPtr rim::TransactionLock::create(rim::TransactionPtr tran) {
35 rim::TransactionLockPtr tranLock = std::make_shared<rim::TransactionLock>(tran);
36 return (tranLock);
37}
38
40rim::TransactionLock::TransactionLock(rim::TransactionPtr tran) {
42
43 tran_ = tran;
44
45 while (tran_->isSubTransaction_) {
46 rim::TransactionPtr parentTran = tran_->parentTransaction_.lock();
47 if (parentTran)
48 tran_ = parentTran;
49 else
50 break;
51 }
52 tran_->lock_.lock();
53 locked_ = true;
54}
55
57void rim::TransactionLock::setup_python() {
58#ifndef NO_PYTHON
59
60 bp::class_<rim::TransactionLock, rim::TransactionLockPtr, boost::noncopyable>("TransactionLock", bp::no_init)
61 .def("lock", &rim::TransactionLock::lock)
62 .def("unlock", &rim::TransactionLock::unlock)
63 .def("__enter__", &rim::TransactionLock::enter)
64 .def("__exit__", &rim::TransactionLock::exit);
65#endif
66}
67
69rim::TransactionLock::~TransactionLock() {
70 if (locked_) tran_->lock_.unlock();
71}
72
74void rim::TransactionLock::lock() {
75 if (!locked_) {
77 tran_->lock_.lock();
78 locked_ = true;
79 }
80}
81
83void rim::TransactionLock::unlock() {
84 if (locked_) {
85 tran_->lock_.unlock();
86 locked_ = false;
87 }
88}
89
91void rim::TransactionLock::enter() {}
92
94void rim::TransactionLock::exit(void*, void*, void*) {}
RAII helper that releases the Python GIL for a scope.
Definition GilRelease.h:36
std::shared_ptr< rogue::interfaces::memory::TransactionLock > TransactionLockPtr
Shared pointer alias for TransactionLock.
std::shared_ptr< rogue::interfaces::memory::Transaction > TransactionPtr
Shared pointer alias for Transaction.