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  Barrier::shared_ptr iter= find_ptr2(barrier_map, arg);
55 
56  // Nothing is found
57  if (not iter)
58  return NOT_FOUND;
59 
60  if (iter->getOwner() != owner)
61  return NOT_OWNED_BY;
62 
63  iter->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  return find_ptr2(barrier_map, arg);
73 }
74 
75 void Barriers::Copy(Map &arg)
76 {
77  boost::unique_lock<boost::mutex> scope(mutex);
78  arg= barrier_map;
79 }
80 
81 } /* namespace barriers */
82 } /* namespace user_locks */