1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright 2009 Sun Microsystems
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()
74
/* int time in seconds, decimal allowed */
77
struct timespec abstime;
81
Session *session= current_session;
83
if ((arg_count != 1) || ! (dtime= args[0]->val_real()))
90
On 64-bit OSX pthread_cond_timedwait() waits forever
91
if passed abstime time has already been exceeded by
93
When given a very short timeout (< 10 mcs) just return
95
We assume that the lines between this test and the call
96
to pthread_cond_timedwait() will be executed in less than 0.00001 sec.
101
/* need to obtain time value for passing to cond_timedwait */
102
set_timespec_nsec(abstime, (uint64_t)(dtime * 1000000000ULL));
104
pthread_mutex_init(&LOCK_sleep, MY_MUTEX_INIT_FAST);
105
pthread_cond_init(&cond, NULL);
107
/* don't run if not killed */
108
pthread_mutex_lock(&LOCK_sleep);
109
while (! session->killed)
111
error= pthread_cond_timedwait(&cond, &LOCK_sleep, &abstime);
112
if (error == ETIMEDOUT || error == ETIME)
118
pthread_mutex_unlock(&LOCK_sleep);
120
/* relenquish pthread cond */
121
pthread_cond_destroy(&cond);
122
pthread_mutex_destroy(&LOCK_sleep);
129
plugin::Create_function<Item_func_sleep> *sleep_udf= NULL;
131
static int sleep_plugin_init(drizzled::plugin::Context &context)
133
sleep_udf= new plugin::Create_function<Item_func_sleep>("sleep");
134
context.add(sleep_udf);
139
DRIZZLE_PLUGIN(sleep_plugin_init, NULL);