Created
October 7, 2016 14:08
-
-
Save wagenet/229d8e60017859c2cbc71d6c6cf44267 to your computer and use it in GitHub Desktop.
Skylight gem dynamic loading code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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