From 29563523b210274f7fffa47b0c7b4e80292d5e41 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 14 May 2009 15:55:31 -0700 Subject: [PATCH] class: basic api for class, call class_init when class loads --- src/Makefile.am | 3 ++- src/mon/ClassMonitor.cc | 10 ++-------- src/objclass/class_debug.cc | 25 +++++++++++++++++++++++++ src/objclass/objclass.h | 32 ++++++++++++++++++++++++++++++++ src/osd/ClassHandler.cc | 3 +++ 5 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 src/objclass/class_debug.cc create mode 100644 src/objclass/objclass.h diff --git a/src/Makefile.am b/src/Makefile.am index a27a30011c16d..aa58d0e544c7a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -221,7 +221,8 @@ libcommon_files = \ common/buffer.cc \ common/debug.cc \ config.cc \ - common/lockdep.cc + common/lockdep.cc \ + objclass/class_debug.cc libcrush_a_SOURCES = \ crush/builder.c \ diff --git a/src/mon/ClassMonitor.cc b/src/mon/ClassMonitor.cc index 706b48aeed474..90ad59a0188cb 100644 --- a/src/mon/ClassMonitor.cc +++ b/src/mon/ClassMonitor.cc @@ -82,11 +82,8 @@ void ClassMonitor::create_initial(bufferlist& bl) bool ClassMonitor::store_impl(ClassInfo& info, ClassImpl& impl) { - char *store_name; int len = info.name.length() + 16; - store_name = (char *)malloc(len); - if (!store_name) - return false; + char store_name[len]; snprintf(store_name, len, "%s.%d", info.name.c_str(), (int)info.version); dout(0) << "storing inc.impl length=" << impl.binary.length() << dendl; @@ -95,7 +92,6 @@ bool ClassMonitor::store_impl(ClassInfo& info, ClassImpl& impl) ::encode(info, bl); mon->store->append_bl_ss(bl, "class_impl", store_name); dout(0) << "adding name=" << info.name << " version=" << info.version << " store_name=" << store_name << dendl; - free(store_name); return true; } @@ -347,15 +343,13 @@ void ClassMonitor::handle_request(MClass *m) switch (m->action) { case CLASS_GET: if (list.get_ver((*p).name, &ver)) { - char *store_name; int len = (*p).name.length() + 16; int bin_len; - store_name = (char *)malloc(len); + char store_name[len]; snprintf(store_name, len, "%s.%d", (*p).name.c_str(), ver); bin_len = mon->store->get_bl_ss(impl.binary, "class_impl", store_name); assert(bin_len > 0); dout(0) << "replying with name=" << (*p).name << " version=" << ver << " store_name=" << store_name << dendl; - free(store_name); list.add((*p).name, ver); reply->add.push_back(true); reply->impl.push_back(impl); diff --git a/src/objclass/class_debug.cc b/src/objclass/class_debug.cc new file mode 100644 index 0000000000000..35e470e8b8a86 --- /dev/null +++ b/src/objclass/class_debug.cc @@ -0,0 +1,25 @@ +#include "config.h" + +#include "objclass/objclass.h" + +#include +#include +#include + +extern "C" int cls_log(const char *format, ...) +{ + int size = 256, n; + va_list ap; + while (1) { + char buf[size]; + va_start(ap, format); + n = vsnprintf(buf, size, format, ap); + va_end(ap); +#define MAX_SIZE 8196 + if ((n > -1 && n < size) || size > MAX_SIZE) { + dout(0) << buf << dendl; + return n; + } + size *= 2; + } +} diff --git a/src/objclass/objclass.h b/src/objclass/objclass.h new file mode 100644 index 0000000000000..191ae88f129b6 --- /dev/null +++ b/src/objclass/objclass.h @@ -0,0 +1,32 @@ +#ifndef __OBJCLASS_H +#define __OBJCLASS_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void * ClsMethodHandle; + + +#define OBJ_READ 0x1 +#define OBJ_WRITE 0x2 + +typedef int ClsTrigger; + +/* class log */ +extern int cls_log(const char *format, ...); + +/* class registration api */ +extern int cls_register(const char *name, const char *method, + int (*class_call)(struct ceph_osd_op *op, char **indata, int datalen, char **outdata, int *outdatalen), + ClsMethodHandle *handle); +extern int cls_unregister(ClsMethodHandle handle); + +extern int cls_link(ClsMethodHandle handle, int priority, ClsTrigger trigger); +extern int cls_unlink(ClsMethodHandle handle); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/osd/ClassHandler.cc b/src/osd/ClassHandler.cc index 79355add98427..6ba5d92db0cce 100644 --- a/src/osd/ClassHandler.cc +++ b/src/osd/ClassHandler.cc @@ -31,6 +31,9 @@ void ClassHandler::load_class(const nstring& cname) close(fd); data.handle = dlopen(fname, RTLD_LAZY); + void (*cls_init)() = (void (*)())dlsym(data.handle, "class_init"); + if (cls_init) + cls_init(); unlink(fname); free(fname); -- 2.39.5