summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorbrian@zim.(none) <>2007-01-25 18:43:40 -0800
committerbrian@zim.(none) <>2007-01-25 18:43:40 -0800
commit9d06ba72ea1195132990496cc6e6befd7b8ca520 (patch)
tree24d147fd36ac09656782504a67dc371264af1694 /plugin
parent2ccd38169feb8b391c08569d0eda3fb44b924bf2 (diff)
downloadmariadb-git-9d06ba72ea1195132990496cc6e6befd7b8ca520.tar.gz
Made the example actually do something :)
It now demonstrates creating its own thread and shows off how to clean up after itself (creates a really simple heartbeat file)
Diffstat (limited to 'plugin')
-rw-r--r--plugin/daemon_example/Makefile.am8
-rw-r--r--plugin/daemon_example/daemon_example.c89
-rw-r--r--plugin/daemon_example/daemon_example.cc196
3 files changed, 201 insertions, 92 deletions
diff --git a/plugin/daemon_example/Makefile.am b/plugin/daemon_example/Makefile.am
index cb466986913..21a86f8973e 100644
--- a/plugin/daemon_example/Makefile.am
+++ b/plugin/daemon_example/Makefile.am
@@ -19,18 +19,20 @@ MYSQLSHAREdir = $(pkgdatadir)
MYSQLBASEdir= $(prefix)
MYSQLLIBdir= $(pkglibdir)
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include \
- -I$(srcdir)
+ -I$(top_srcdir)/regex \
+ -I$(top_srcdir)/sql \
+ -I$(srcdir) @ZLIB_INCLUDES@
EXTRA_LTLIBRARIES = libdaemon_example.la
pkglib_LTLIBRARIES = @plugin_daemon_example_shared_target@
libdaemon_example_la_LDFLAGS = -module -rpath $(MYSQLLIBdir)
libdaemon_example_la_CXXFLAGS= $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
libdaemon_example_la_CFLAGS = $(AM_CFLAGS) -DMYSQL_DYNAMIC_PLUGIN
-libdaemon_example_la_SOURCES = daemon_example.c
+libdaemon_example_la_SOURCES = daemon_example.cc
EXTRA_LIBRARIES = libdaemon_example.a
noinst_LIBRARIES = @plugin_daemon_example_static_target@
libdaemon_example_a_CXXFLAGS = $(AM_CFLAGS)
libdaemon_example_a_CFLAGS = $(AM_CFLAGS)
-libdaemon_example_a_SOURCES= daemon_example.c
+libdaemon_example_a_SOURCES= daemon_example.cc
diff --git a/plugin/daemon_example/daemon_example.c b/plugin/daemon_example/daemon_example.c
deleted file mode 100644
index 26d54157cbd..00000000000
--- a/plugin/daemon_example/daemon_example.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (C) 2006 MySQL AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <mysql_version.h>
-#include <mysql/plugin.h>
-
-/*
-#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
-#define __attribute__(A)
-#endif
-*/
-
-
-
-/*
- Initialize the daemon example at server start or plugin installation.
-
- SYNOPSIS
- daemon_example_plugin_init()
-
- DESCRIPTION
- Does nothing.
-
- RETURN VALUE
- 0 success
- 1 failure (cannot happen)
-*/
-
-static int daemon_example_plugin_init(void *p)
-{
- return(0);
-}
-
-
-/*
- Terminate the daemon example at server shutdown or plugin deinstallation.
-
- SYNOPSIS
- daemon_example_plugin_deinit()
- Does nothing.
-
- RETURN VALUE
- 0 success
- 1 failure (cannot happen)
-
-*/
-
-static int daemon_example_plugin_deinit(void *p)
-{
- return(0);
-}
-
-struct st_mysql_daemon daemon_example_plugin=
-{ MYSQL_DAEMON_INTERFACE_VERSION };
-
-/*
- Plugin library descriptor
-*/
-
-mysql_declare_plugin(daemon_example)
-{
- MYSQL_DAEMON_PLUGIN,
- &daemon_example_plugin,
- "daemon_example",
- "Brian Aker",
- "Daemon example that tests init and deinit of a plugin",
- PLUGIN_LICENSE_GPL,
- daemon_example_plugin_init, /* Plugin Init */
- daemon_example_plugin_deinit, /* Plugin Deinit */
- 0x0100 /* 1.0 */,
- NULL, /* status variables */
- NULL, /* system variables */
- NULL /* config options */
-}
-mysql_declare_plugin_end;
diff --git a/plugin/daemon_example/daemon_example.cc b/plugin/daemon_example/daemon_example.cc
new file mode 100644
index 00000000000..d4a8d843a0a
--- /dev/null
+++ b/plugin/daemon_example/daemon_example.cc
@@ -0,0 +1,196 @@
+/* Copyright (C) 2006 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include <mysql_priv.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <mysql_version.h>
+#include <mysql/plugin.h>
+#include <my_global.h>
+#include <my_dir.h>
+
+/*
+#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#define __attribute__(A)
+#endif
+*/
+
+#define HEART_STRING_BUFFER 100
+
+struct mysql_heartbeat_context
+{
+ pthread_t heartbeat_thread;
+ File heartbeat_file;
+};
+
+pthread_handler_t mysql_heartbeat(void *p)
+{
+ DBUG_ENTER("mysql_heartbeat");
+ struct mysql_heartbeat_context *con= (struct mysql_heartbeat_context *)p;
+ char buffer[HEART_STRING_BUFFER];
+ unsigned int x= 0;
+ time_t result;
+ struct tm tm_tmp;
+
+ while(1)
+ {
+ sleep(5);
+
+ result= time(NULL);
+ localtime_r(&result, &tm_tmp);
+ my_snprintf(buffer, sizeof(buffer),
+ "Heartbeat at %02d%02d%02d %2d:%02d:%02d\n",
+ tm_tmp.tm_year % 100,
+ tm_tmp.tm_mon+1,
+ tm_tmp.tm_mday,
+ tm_tmp.tm_hour,
+ tm_tmp.tm_min,
+ tm_tmp.tm_sec);
+ my_write(con->heartbeat_file, buffer, strlen(buffer), MYF(0));
+ x++;
+ }
+
+
+ DBUG_RETURN(0);
+}
+
+/*
+ Initialize the daemon example at server start or plugin installation.
+
+ SYNOPSIS
+ daemon_example_plugin_init()
+
+ DESCRIPTION
+ Starts up heartbeatbeat thread
+
+ RETURN VALUE
+ 0 success
+ 1 failure (cannot happen)
+*/
+
+static int daemon_example_plugin_init(void *p)
+{
+ DBUG_ENTER("daemon_example_plugin_init");
+ struct mysql_heartbeat_context *con;
+ pthread_attr_t attr; /* Thread attributes */
+ char heartbeat_filename[FN_REFLEN];
+ char buffer[HEART_STRING_BUFFER];
+ time_t result= time(NULL);
+ struct tm tm_tmp;
+
+ struct st_plugin_int *plugin= (struct st_plugin_int *)p;
+
+ con= (struct mysql_heartbeat_context *)my_malloc(sizeof(struct mysql_heartbeat_context), MYF(0));
+
+ fn_format(heartbeat_filename, "mysql-heartbeat", "", ".log", MY_REPLACE_EXT | MY_UNPACK_FILENAME);
+ unlink(heartbeat_filename);
+ con->heartbeat_file= my_open(heartbeat_filename, O_CREAT|O_RDWR, MYF(0));
+
+ /*
+ No threads exist at this point in time, so this is thread safe.
+ */
+ localtime_r(&result, &tm_tmp);
+ my_snprintf(buffer, sizeof(buffer),
+ "Starting up at %02d%02d%02d %2d:%02d:%02d\n",
+ tm_tmp.tm_year % 100,
+ tm_tmp.tm_mon+1,
+ tm_tmp.tm_mday,
+ tm_tmp.tm_hour,
+ tm_tmp.tm_min,
+ tm_tmp.tm_sec);
+ my_write(con->heartbeat_file, buffer, strlen(buffer), MYF(0));
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr,
+ PTHREAD_CREATE_JOINABLE);
+
+
+ /* now create the thread */
+ if (pthread_create(&con->heartbeat_thread, &attr, mysql_heartbeat, (void *)con) != 0)
+ {
+ fprintf(stderr,"Could not create heartbeat thread!\n");
+ exit(0);
+ }
+
+ plugin->data= (void *)con;
+
+ DBUG_RETURN(0);
+}
+
+
+/*
+ Terminate the daemon example at server shutdown or plugin deinstallation.
+
+ SYNOPSIS
+ daemon_example_plugin_deinit()
+ Does nothing.
+
+ RETURN VALUE
+ 0 success
+ 1 failure (cannot happen)
+
+*/
+static int daemon_example_plugin_deinit(void *p)
+{
+ DBUG_ENTER("daemon_example_plugin_deinit");
+ char buffer[HEART_STRING_BUFFER];
+ struct st_plugin_int *plugin= (struct st_plugin_int *)p;
+ struct mysql_heartbeat_context *con= (struct mysql_heartbeat_context *)plugin->data;
+ time_t result= time(NULL);
+ struct tm tm_tmp;
+
+ pthread_cancel(con->heartbeat_thread);
+
+ localtime_r(&result, &tm_tmp);
+ my_snprintf(buffer, sizeof(buffer),
+ "Shutting down at %02d%02d%02d %2d:%02d:%02d\n",
+ tm_tmp.tm_year % 100,
+ tm_tmp.tm_mon+1,
+ tm_tmp.tm_mday,
+ tm_tmp.tm_hour,
+ tm_tmp.tm_min,
+ tm_tmp.tm_sec);
+ my_write(con->heartbeat_file, buffer, strlen(buffer), MYF(0));
+ my_close(con->heartbeat_file, MYF(0));
+
+
+ my_free((char *)con, MYF(0));
+
+ DBUG_RETURN(0);
+}
+
+struct st_mysql_daemon daemon_example_plugin=
+{ MYSQL_DAEMON_INTERFACE_VERSION };
+
+/*
+ Plugin library descriptor
+*/
+
+mysql_declare_plugin(daemon_example)
+{
+ MYSQL_DAEMON_PLUGIN,
+ &daemon_example_plugin,
+ "daemon_example",
+ "Brian Aker",
+ "Daemon example, creates a heartbeat beat file in mysql-heartbeat.log",
+ PLUGIN_LICENSE_GPL,
+ daemon_example_plugin_init, /* Plugin Init */
+ daemon_example_plugin_deinit, /* Plugin Deinit */
+ 0x0100 /* 1.0 */,
+ NULL, /* status variables */
+ NULL, /* system variables */
+ NULL /* config options */
+}
+mysql_declare_plugin_end;