~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/multi_thread/multi_thread.cc

  • Committer: Brian Aker
  • Date: 2009-02-10 00:14:40 UTC
  • Revision ID: brian@tangent.org-20090210001440-qjg8eofh3h93064b
Adding Multi-threaded Scheduler into the system.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2006 MySQL AB
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
 
15
 
 
16
#include <drizzled/server_includes.h>
 
17
#include <drizzled/gettext.h>
 
18
#include <drizzled/error.h>
 
19
#include <drizzled/plugin_scheduling.h>
 
20
#include <drizzled/connect.h>
 
21
#include <drizzled/sql_parse.h>
 
22
#include <drizzled/session.h>
 
23
#include <drizzled/connect.h>
 
24
#include <string>
 
25
using namespace std;
 
26
 
 
27
pthread_attr_t multi_thread_attrib;
 
28
static uint32_t max_threads;
 
29
 
 
30
static bool add_connection(Session *session)
 
31
{
 
32
  int error;
 
33
 
 
34
  safe_mutex_assert_owner(&LOCK_thread_count);
 
35
  (void) pthread_mutex_unlock(&LOCK_thread_count);
 
36
 
 
37
  if ((error= pthread_create(&session->real_id, &multi_thread_attrib, handle_one_connection, (void*) session)))
 
38
    return true;
 
39
 
 
40
  return false;
 
41
}
 
42
 
 
43
 
 
44
/*
 
45
  End connection, in case when we are using 'no-threads'
 
46
*/
 
47
 
 
48
static bool end_thread(Session *session, bool)
 
49
{
 
50
  unlink_session(session);   /* locks LOCK_thread_count and deletes session */
 
51
  pthread_mutex_unlock(&LOCK_thread_count);
 
52
 
 
53
  pthread_exit(0);
 
54
  return true; // We should never reach this point
 
55
}
 
56
 
 
57
static int init(void *p)
 
58
{
 
59
  scheduling_st* func= (scheduling_st *)p;
 
60
 
 
61
  func->max_threads= max_threads; /* This will create an upper limit on max connections */
 
62
  func->add_connection= add_connection;
 
63
  func->end_thread= end_thread;
 
64
 
 
65
  /* Parameter for threads created for connections */
 
66
  (void) pthread_attr_init(&multi_thread_attrib);
 
67
  (void) pthread_attr_setdetachstate(&multi_thread_attrib,
 
68
                                     PTHREAD_CREATE_DETACHED);
 
69
  pthread_attr_setscope(&multi_thread_attrib, PTHREAD_SCOPE_SYSTEM);
 
70
 
 
71
  return 0;
 
72
}
 
73
 
 
74
static int deinit(void *)
 
75
{
 
76
  pthread_attr_destroy(&multi_thread_attrib);
 
77
 
 
78
  return 0;
 
79
}
 
80
 
 
81
static DRIZZLE_SYSVAR_UINT(max_threads, max_threads,
 
82
                           PLUGIN_VAR_RQCMDARG,
 
83
                           N_("Maximum number of user threads available."),
 
84
                           NULL, NULL, 2048, 1, 4048, 0);
 
85
 
 
86
static struct st_mysql_sys_var* system_variables[]= {
 
87
  DRIZZLE_SYSVAR(max_threads),
 
88
  NULL
 
89
};
 
90
 
 
91
drizzle_declare_plugin(multi_thread)
 
92
{
 
93
  DRIZZLE_SCHEDULING_PLUGIN,
 
94
  "multi_thread",
 
95
  "0.1",
 
96
  "Brian Aker",
 
97
  "One Thread Perl Session Scheduler",
 
98
  PLUGIN_LICENSE_GPL,
 
99
  init, /* Plugin Init */
 
100
  deinit, /* Plugin Deinit */
 
101
  NULL,   /* status variables */
 
102
  system_variables,   /* system variables */
 
103
  NULL    /* config options */
 
104
}
 
105
drizzle_declare_plugin_end;