~drizzle-trunk/drizzle/development

1933.1.3 by Brian Aker
First pass though barriers.
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
#include "plugin/user_locks/barrier_storage.h"
24
25
#include <string>
26
27
namespace user_locks {
28
namespace barriers {
29
30
int64_t Wait::val_int()
31
{
32
  drizzled::String *res= args[0]->val_str(&value);
33
1933.1.6 by Brian Aker
Add additional test for barriers.
34
  if (res and res->length())
35
  {
2008.1.1 by Brian Aker
Adding user identifier that makes use of a shared ptr to handle concurrency
36
    Barrier::shared_ptr barrier= Barriers::getInstance().find(Key(*getSession().user(), res->c_str()));
1933.1.6 by Brian Aker
Add additional test for barriers.
37
38
    if (barrier and barrier->getOwner() == getSession().getSessionId())
1933.1.4 by Brian Aker
Fix errror messages and namespace.
39
    {
40
      my_error(drizzled::ER_USER_LOCKS_CANT_WAIT_ON_OWN_BARRIER, MYF(0));
41
42
      return 0;
43
    }
1933.1.6 by Brian Aker
Add additional test for barriers.
44
    else if (barrier)
45
    {
46
      if (arg_count == 2)
47
      {
48
        int64_t generation;
49
        generation= args[1]->val_int();
50
        barrier->wait(generation);
51
      }
52
      else
53
      {
1933.2.4 by Brian Aker
Update user locks to allow for interruption based on boost.
54
        boost::this_thread::restore_interruption dl(getSession().getThreadInterupt());
1933.2.5 by Brian Aker
Merge in the ability to kill off locks as well as barriers.
55
1933.2.4 by Brian Aker
Update user locks to allow for interruption based on boost.
56
        try {
57
          barrier->wait();
58
        }
59
        catch(boost::thread_interrupted const&)
60
        {
61
          // We need to issue a different sort of error here
62
          my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
63
          return 0;
64
        }
1933.1.6 by Brian Aker
Add additional test for barriers.
65
      }
66
      null_value= false;
67
68
      return 1;
69
    }
1933.1.3 by Brian Aker
First pass though barriers.
70
  }
1955.1.2 by Brian Aker
Update such that we can now do a lock test with a wait.
71
  else if (not res || not res->length())
72
  {
73
    my_error(drizzled::ER_USER_LOCKS_INVALID_NAME_BARRIER, MYF(0));
74
    return 0;
75
  }
1933.1.3 by Brian Aker
First pass though barriers.
76
1933.1.4 by Brian Aker
Fix errror messages and namespace.
77
  my_error(drizzled::ER_USER_LOCKS_UNKNOWN_BARRIER, MYF(0));
1933.1.3 by Brian Aker
First pass though barriers.
78
79
  return 0;
80
}
81
82
} /* namespace barriers */
83
} /* namespace user_locks */