Drizzled Public API Documentation

barriers.cc
1 /* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2010 Brian Aker
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <config.h>
22 #include <plugin/user_locks/module.h>
23 
24 #include <boost/thread/locks.hpp>
25 
26 #include <string>
27 
28 namespace user_locks {
29 namespace barriers {
30 
31 bool Barriers::create(const user_locks::Key &arg, drizzled::session_id_t owner)
32 {
33  boost::unique_lock<boost::mutex> scope(mutex);
34  return barrier_map.insert(std::make_pair(arg, new Barrier(owner))).second;
35 }
36 
37 bool Barriers::create(const user_locks::Key &arg, drizzled::session_id_t owner, int64_t wait_count)
38 {
39  boost::unique_lock<boost::mutex> scope(mutex);
40  return barrier_map.insert(std::make_pair(arg, new Barrier(owner, wait_count))).second;
41 }
42 
43 /*
44  @note return
45 
46  true -> release happened.
47  false -> no release, we were not the owner
48  indeterminate -> barrier was not found.
49 
50 */
51 return_t Barriers::release(const user_locks::Key &arg, drizzled::session_id_t owner)
52 {
53  boost::unique_lock<boost::mutex> scope(mutex);
54  Map::iterator iter= barrier_map.find(arg);
55 
56  // Nothing is found
57  if ( iter == barrier_map.end())
58  return NOT_FOUND;
59 
60  if (not iter->second->getOwner() == owner)
61  return NOT_OWNED_BY;
62 
63  iter->second->signal(); // We tell anyone left to start running
64  (void)barrier_map.erase(arg);
65 
66  return SUCCESS;
67 }
68 
69 Barrier::shared_ptr Barriers::find(const user_locks::Key &arg)
70 {
71  boost::unique_lock<boost::mutex> scope(mutex);
72  Map::iterator iter= barrier_map.find(arg);
73 
74  if (iter != barrier_map.end())
75  return iter->second;
76 
77  return Barrier::shared_ptr();
78 }
79 
80 void Barriers::Copy(Map &arg)
81 {
82  boost::unique_lock<boost::mutex> scope(mutex);
83  arg= barrier_map;
84 }
85 
86 } /* namespace barriers */
87 } /* namespace user_locks */