Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@wagenet
Created October 7, 2016 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wagenet/229d8e60017859c2cbc71d6c6cf44267 to your computer and use it in GitHub Desktop.
Save wagenet/229d8e60017859c2cbc71d6c6cf44267 to your computer and use it in GitHub Desktop.
Skylight gem dynamic loading code
#include "skylight_dlopen.h"
#include "dlfcn.h"
sky_main_fn sky_main = 0;
sky_init_fn sky_init = 0;
sky_hrtime_fn sky_hrtime = 0;
sky_instrumenter_new_fn sky_instrumenter_new = 0;
sky_instrumenter_start_fn sky_instrumenter_start = 0;
sky_instrumenter_stop_fn sky_instrumenter_stop = 0;
sky_instrumenter_submit_trace_fn sky_instrumenter_submit_trace = 0;
sky_instrumenter_track_desc_fn sky_instrumenter_track_desc = 0;
sky_instrumenter_free_fn sky_instrumenter_free = 0;
sky_trace_new_fn sky_trace_new = 0;
sky_trace_free_fn sky_trace_free = 0;
sky_trace_start_fn sky_trace_start = 0;
sky_trace_endpoint_fn sky_trace_endpoint = 0;
sky_trace_set_endpoint_fn sky_trace_set_endpoint = 0;
sky_trace_uuid_fn sky_trace_uuid = 0;
sky_trace_set_uuid_fn sky_trace_set_uuid = 0;
sky_trace_instrument_fn sky_trace_instrument = 0;
sky_trace_span_set_title_fn sky_trace_span_set_title = 0;
sky_trace_span_set_desc_fn sky_trace_span_set_desc = 0;
sky_lex_sql_fn sky_lex_sql = 0;
sky_trace_span_set_sql_fn sky_trace_span_set_sql = 0;
sky_trace_span_add_uint_annotation_fn sky_trace_span_add_uint_annotation = 0;
sky_trace_span_done_fn sky_trace_span_done = 0;
#define BIND_FN(SRC, DST) \
do { \
fnptr = dlsym(SRC, #DST); \
if (!fnptr) { \
return -1; \
} \
*(void**) (&DST) = fnptr; \
} while(0)
// Loads libskylight at the specified file location and binds the function
// pointers.
int sky_load_libskylight(const char* filename) {
void* fnptr;
void* libskylight;
if (sky_init != 0) {
return 0;
}
libskylight = dlopen(filename, RTLD_NOW | RTLD_LOCAL);
if (!libskylight) {
return -1;
}
BIND_FN(libskylight, sky_main);
BIND_FN(libskylight, sky_init);
BIND_FN(libskylight, sky_hrtime);
BIND_FN(libskylight, sky_instrumenter_new);
BIND_FN(libskylight, sky_instrumenter_start);
BIND_FN(libskylight, sky_instrumenter_stop);
BIND_FN(libskylight, sky_instrumenter_submit_trace);
BIND_FN(libskylight, sky_instrumenter_track_desc);
BIND_FN(libskylight, sky_instrumenter_free);
BIND_FN(libskylight, sky_trace_new);
BIND_FN(libskylight, sky_trace_free);
BIND_FN(libskylight, sky_trace_start);
BIND_FN(libskylight, sky_trace_endpoint);
BIND_FN(libskylight, sky_trace_set_endpoint);
BIND_FN(libskylight, sky_trace_uuid);
BIND_FN(libskylight, sky_trace_set_uuid);
BIND_FN(libskylight, sky_trace_instrument);
BIND_FN(libskylight, sky_trace_span_set_title);
BIND_FN(libskylight, sky_trace_span_set_desc);
BIND_FN(libskylight, sky_lex_sql);
BIND_FN(libskylight, sky_trace_span_set_sql);
BIND_FN(libskylight, sky_trace_span_add_uint_annotation);
BIND_FN(libskylight, sky_trace_span_done);
sky_init();
return 0;
}
#ifndef __SKYLIGHT_H__
#define __SKYLIGHT_H__
#include "stddef.h"
#include "stdint.h"
/*
*
* ===== Skylight types =====
*
*/
typedef struct {
void* data;
size_t len;
} sky_buf_t;
typedef void sky_instrumenter_t;
typedef void sky_trace_t;
/*
*
* ====== Skylight functions =====
*
*/
int sky_load_libskylight(const char* filename);
typedef int (*sky_main_fn)(int argc, char** argv);
typedef int (*sky_init_fn)();
typedef uint64_t (*sky_hrtime_fn)();
typedef int (*sky_instrumenter_new_fn)(sky_buf_t* env, int envc, sky_instrumenter_t** out);
typedef int (*sky_instrumenter_start_fn)(const sky_instrumenter_t* inst);
typedef int (*sky_instrumenter_stop_fn)(sky_instrumenter_t* inst);
typedef int (*sky_instrumenter_submit_trace_fn)(const sky_instrumenter_t* inst, sky_trace_t* trace);
typedef int (*sky_instrumenter_track_desc_fn)(sky_instrumenter_t* inst, sky_buf_t endpoint, sky_buf_t desc, int* out);
typedef void (*sky_instrumenter_free_fn)(sky_instrumenter_t* val);
typedef int (*sky_trace_new_fn)(uint64_t start, sky_buf_t uuid, sky_buf_t endpoint, sky_trace_t** out);
typedef void (*sky_trace_free_fn)(sky_trace_t* val);
typedef int (*sky_trace_start_fn)(sky_trace_t* trace, uint64_t* out);
typedef int (*sky_trace_endpoint_fn)(sky_trace_t* trace, sky_buf_t* out);
typedef int (*sky_trace_set_endpoint_fn)(const sky_trace_t* trace, sky_buf_t endpoint);
typedef int (*sky_trace_uuid_fn)(sky_trace_t* trace, sky_buf_t* out);
typedef int (*sky_trace_set_uuid_fn)(const sky_trace_t* trace, sky_buf_t uuid);
typedef int (*sky_trace_instrument_fn)(const sky_trace_t* trace, uint64_t time, sky_buf_t category, uint32_t* out);
typedef int (*sky_trace_span_set_title_fn)(const sky_trace_t* trace, uint32_t handle, sky_buf_t title);
typedef int (*sky_trace_span_set_desc_fn)(const sky_trace_t* trace, uint32_t handle, sky_buf_t desc);
typedef int (*sky_lex_sql_fn)(sky_buf_t sql, sky_buf_t* title_buf, sky_buf_t* desc_buf);
typedef int (*sky_trace_span_set_sql_fn)(const sky_trace_t* trace, uint32_t handle, sky_buf_t sql, int flavor);
typedef int (*sky_trace_span_add_uint_annotation_fn)(const sky_trace_t* trace, uint32_t handle, uint32_t key, uint64_t value);
typedef int (*sky_trace_span_done_fn)(const sky_trace_t* trace, uint32_t handle, uint64_t time);
extern sky_main_fn sky_main;
extern sky_init_fn sky_init;
extern sky_hrtime_fn sky_hrtime;
extern sky_instrumenter_new_fn sky_instrumenter_new;
extern sky_instrumenter_start_fn sky_instrumenter_start;
extern sky_instrumenter_stop_fn sky_instrumenter_stop;
extern sky_instrumenter_submit_trace_fn sky_instrumenter_submit_trace;
extern sky_instrumenter_track_desc_fn sky_instrumenter_track_desc;
extern sky_instrumenter_free_fn sky_instrumenter_free;
extern sky_trace_new_fn sky_trace_new;
extern sky_trace_free_fn sky_trace_free;
extern sky_trace_start_fn sky_trace_start;
extern sky_trace_endpoint_fn sky_trace_endpoint;
extern sky_trace_set_endpoint_fn sky_trace_set_endpoint;
extern sky_trace_uuid_fn sky_trace_uuid;
extern sky_trace_set_uuid_fn sky_trace_set_uuid;
extern sky_trace_instrument_fn sky_trace_instrument;
extern sky_trace_span_set_title_fn sky_trace_span_set_title;
extern sky_trace_span_set_desc_fn sky_trace_span_set_desc;
extern sky_lex_sql_fn sky_lex_sql;
extern sky_trace_span_set_sql_fn sky_trace_span_set_sql;
extern sky_trace_span_add_uint_annotation_fn sky_trace_span_add_uint_annotation;
extern sky_trace_span_done_fn sky_trace_span_done;
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment