Commit 8664552c authored by unknown's avatar unknown
Browse files

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)


plugin/daemon_example/Makefile.am:
  Added additional include
plugin/daemon_example/daemon_example.cc:
  Created heart beat code.
parent 0df2004c
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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
+196 −0
Original line number Diff line number Diff line
@@ -13,10 +13,13 @@
   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)
@@ -24,7 +27,44 @@
#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.
@@ -33,7 +73,7 @@
    daemon_example_plugin_init()

  DESCRIPTION
    Does nothing.
    Starts up heartbeatbeat thread

  RETURN VALUE
    0                    success
@@ -42,7 +82,51 @@

static int daemon_example_plugin_init(void *p)
{
  return(0);
  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);
}


@@ -58,10 +142,33 @@ static int daemon_example_plugin_init(void *p)
    1                    failure (cannot happen)

*/

static int daemon_example_plugin_deinit(void *p)
{
  return(0);
  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=
@@ -77,7 +184,7 @@ mysql_declare_plugin(daemon_example)
  &daemon_example_plugin,
  "daemon_example",
  "Brian Aker",
  "Daemon example that tests init and deinit of a plugin",
  "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 */