1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems, Inc.
8
* Patrick Galbraith <pat@patg.net>
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License as published by
13
* the Free Software Foundation; version 2 of the License.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30
#include <drizzled/session.h>
31
#include <drizzled/item/func.h>
32
#include "drizzled/internal/my_pthread.h"
33
#include <drizzled/function/str/strfunc.h>
38
using namespace drizzled;
41
class Item_func_sleep : public Item_int_func
43
/* for thread-safe sleep() */
44
pthread_mutex_t LOCK_sleep;
48
Item_func_sleep() : Item_int_func()
53
const char *func_name() const
58
void fix_length_and_dec()
63
bool check_argument_count(int n)
70
int64_t Item_func_sleep::val_int()
72
/* int time in seconds, decimal allowed */
75
Session &session(getSession());
77
if ((arg_count != 1) || ! (dtime= args[0]->val_real()))
84
On 64-bit OSX pthread_cond_timedwait() waits forever
85
if passed abstime time has already been exceeded by
87
When given a very short timeout (< 10 mcs) just return
89
We assume that the lines between this test and the call
90
to pthread_cond_timedwait() will be executed in less than 0.00001 sec.
96
boost::this_thread::restore_interruption dl(session.getThreadInterupt());
100
xtime_get(&xt, boost::TIME_UTC);
101
xt.nsec += (uint64_t)(dtime * 1000000000ULL);
102
session.getThread()->sleep(xt);
104
catch(boost::thread_interrupted const& error)
106
my_error(drizzled::ER_QUERY_INTERRUPTED, MYF(0));
119
static int sleep_plugin_init(drizzled::module::Context &context)
121
context.add(new plugin::Create_function<Item_func_sleep>("sleep"));
126
DRIZZLE_PLUGIN(sleep_plugin_init, NULL, NULL);