22 #include <plugin/user_locks/module.h>
24 #include <boost/thread/locks.hpp>
28 namespace user_locks {
30 bool Locks::lock(drizzled::session_id_t id_arg,
const user_locks::Key &arg, int64_t wait_for)
32 boost::unique_lock<boost::mutex> scope(mutex);
33 boost::system_time timeout= boost::get_system_time() + boost::posix_time::seconds(wait_for);
35 LockMap::iterator iter;
36 while ((iter= lock_map.find(arg)) != lock_map.end())
38 if (id_arg == iter->second->id)
46 bool success= release_cond.timed_wait(scope, timeout);
53 release_cond.wait(scope);
56 catch(boost::thread_interrupted
const& error)
63 if (iter == lock_map.end())
65 create_cond.notify_all();
66 return lock_map.insert(std::make_pair(arg,
new Lock(id_arg))).second;
74 void Locks::waitCreate(int64_t wait_for)
76 boost::unique_lock<boost::mutex> scope(mutex);
77 boost::system_time timeout= boost::get_system_time() + boost::posix_time::seconds(wait_for);
80 create_cond.timed_wait(scope, timeout);
82 catch(boost::thread_interrupted
const& error)
89 bool Locks::lock(drizzled::session_id_t id_arg,
const user_locks::Keys &arg)
91 boost::unique_lock<boost::mutex> scope(mutex);
92 user_locks::Keys created;
95 for (user_locks::Keys::const_iterator iter= arg.begin(); iter != arg.end(); iter++)
97 LockMap::iterator record= lock_map.find(*iter);
99 if (record != lock_map.end())
101 if (id_arg != (*record).second->id)
110 lock_map.insert(std::make_pair(*iter,
new Lock(id_arg)));
111 created.insert(*iter);
117 for (user_locks::Keys::const_iterator iter= created.begin(); iter != created.end(); iter++)
119 lock_map.erase(*iter);
125 create_cond.notify_all();
130 bool Locks::isUsed(
const user_locks::Key &arg, drizzled::session_id_t &id_arg)
132 boost::unique_lock<boost::mutex> scope(mutex);
134 LockMap::iterator iter= lock_map.find(arg);
136 if ( iter == lock_map.end())
139 id_arg= iter->second->id;
146 boost::unique_lock<boost::mutex> scope(mutex);
148 LockMap::iterator iter= lock_map.find(arg);
150 return iter != lock_map.end();
153 void Locks::Copy(LockMap &lock_map_arg)
155 boost::unique_lock<boost::mutex> scope(mutex);
156 lock_map_arg= lock_map;
159 locks::return_t Locks::release(
const user_locks::Key &arg, drizzled::session_id_t &id_arg,
bool and_wait)
162 boost::unique_lock<boost::mutex> scope(mutex);
163 LockMap::iterator iter= lock_map.find(arg);
166 if ( iter == lock_map.end())
167 return locks::NOT_FOUND;
169 if (iter->second->id == id_arg)
171 elements= lock_map.erase(arg);
176 release_cond.notify_one();
183 assert(boost::this_thread::interruption_enabled());
185 create_cond.wait(scope);
187 catch(boost::thread_interrupted
const& error)
192 iter= lock_map.find(arg);
194 if (iter != lock_map.end())
199 return locks::SUCCESS;
203 return locks::NOT_OWNED_BY;