diff options
| author | 2025-11-17 20:57:42 -0600 | |
|---|---|---|
| committer | 2025-11-17 20:57:42 -0600 | |
| commit | 2b44f885e97b0d8902014a5a61f6687fa2931dec (patch) | |
| tree | 9e3ecfb3858f33a3922f47bde8a2163d9deed95e | |
| parent | build config + more plugin stuff (diff) | |
ignore this commit
| -rw-r--r-- | .clangd | 2 | ||||
| -rw-r--r-- | include/macros.h | 20 | ||||
| -rw-r--r-- | include/plugins.h | 24 | ||||
| -rw-r--r-- | meson.build | 14 | ||||
| -rw-r--r-- | plugins/epoll.c | 2 | ||||
| -rw-r--r-- | plugins/meson.build | 9 | ||||
| -rw-r--r-- | src/main.c | 2 | ||||
| -rw-r--r-- | src/meson.build | 3 | ||||
| -rw-r--r-- | src/plugins.c | 63 |
9 files changed, 129 insertions, 10 deletions
@@ -0,0 +1,2 @@ +CompileFlags: + Add: [-D_CLANGD=1] diff --git a/include/macros.h b/include/macros.h index 3702df7..b7a1bd2 100644 --- a/include/macros.h +++ b/include/macros.h @@ -3,10 +3,28 @@ #include "config.h" -#ifdef PTX_MODULE +#define UNUSED(...) ((void)((void) __VA_ARGS__)) +#define NO_OP_DECL _Static_assert(1, "") + +#ifdef __has_attribute +# if __has_attribute(unavailable) +# define PTX_UNAVAILABLE(_x) __attribute__((unavailable(_x))) +# define PTX_UNAVAILABLE_DEF(_x, _def) _def PTX_UNAVAILABLE(_x) +# else +# define PTX_UNAVAILABLE(_x) +# define PTX_UNAVAILABLE_DEF(_x, _def) /* definition hidden */ NO_OP_DECL +# endif +#else +# define PTX_UNAVAILABLE(_x) +# define PTX_UNAVAILABLE_DEF(_x, _def) /* definition hidden */ NO_OP_DECL +#endif + +#ifdef PTX_PLUGIN #define PTX_API PTX_IMPORT +#define PTX_INTERNAL(_def) PTX_UNAVAILABLE_DEF("internal API", _def) #else #define PTX_API PTX_EXPORT +#define PTX_INTERNAL(_def) _def #endif #endif /* include guard */ diff --git a/include/plugins.h b/include/plugins.h new file mode 100644 index 0000000..f6865e5 --- /dev/null +++ b/include/plugins.h @@ -0,0 +1,24 @@ +#ifndef PTX_PLUGINS_H_INCLUDED +#define PTX_PLUGINS_H_INCLUDED + +#include "macros.h" + +typedef struct ptx__plugin_manager_tag ptx_plugin_manager_t; +typedef struct ptx__plugin_handle_tag ptx_plugin_t; + +/* for testing */ +#ifdef _CLANGD +#undef PTX_PLUGIN +#define PTX_PLUGIN 1 +#endif + +PTX_INTERNAL(ptx_plugin_manager_t *ptx_plugin_manager_new(void) ATTR_MALLOC() ATTR_MALLOC((ptx_plugin_manager_free, 1)) ATTR_WUR); +PTX_INTERNAL(void ptx_plugin_manager_free(ptx_plugin_manager_t *mgr)); + +PTX_INTERNAL(int ptx_plugin_manager_load_dir(ptx_plugin_manager_t *mgr, const char *dir)); + +#ifdef PTX_PLUGIN + +#endif + +#endif diff --git a/meson.build b/meson.build index e144325..f6b16e7 100644 --- a/meson.build +++ b/meson.build @@ -22,8 +22,10 @@ conf_data.set('HAS_RESTRICT', c_comp.has_type('int *restrict')) configure_file(input : 'include/config.h.in', output : 'config.h', configuration : conf_data) -conf_include = include_directories('.') -src_include = include_directories('include') +add_project_dependencies( + declare_dependency(include_directories : include_directories('.', 'include')), + language : 'c' +) export_dynamic = [] @@ -36,8 +38,14 @@ endif subdir('src') executable('ptxmc', prog_sources, - include_directories : [ conf_include, src_include ], gnu_symbol_visibility : 'hidden', export_dynamic : true) +plugin_kwargs = { + 'gnu_symbol_visibility' : 'hidden', + 'c_args' : ['-DPTX_PLUGIN=1'], + 'name_prefix' : '', + 'name_suffix' : 'ptxplugin' +} + subdir('plugins') diff --git a/plugins/epoll.c b/plugins/epoll.c new file mode 100644 index 0000000..5c1975a --- /dev/null +++ b/plugins/epoll.c @@ -0,0 +1,2 @@ +#include <sys/epoll.h> + diff --git a/plugins/meson.build b/plugins/meson.build index 59b5da0..c14f536 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -1,3 +1,6 @@ -shared_module('m_skibidi', 'skibidi.c', - include_directories : [ conf_include, src_include ], - c_args : [ '-DMODULE=1' ]) +shared_module('m_skibidi', 'skibidi.c', kwargs : plugin_kwargs) + +if c_comp.check_header('sys/epoll.h') \ + and c_comp.has_header_symbol('sys/epoll.h', 'epoll_create1') + shared_module('m_epoll', 'epoll.c', kwargs : plugin_kwargs) +endif @@ -5,8 +5,6 @@ #include "pipeline.h" -#define UNUSED(_v) ((void)(_v)) - PIPELINE_STAGE static int identity_stage_handle(const ptx_pipeline_ctx_t *ctx, const void *data, size_t sz) { return ptx_pipeline_ctx_next(ctx, data, sz); diff --git a/src/meson.build b/src/meson.build index d1a3033..ba3d51b 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,5 +1,6 @@ prog_sources = files( 'pipeline.c', 'connection.c', - 'main.c' + 'main.c', + 'plugins.c' ) diff --git a/src/plugins.c b/src/plugins.c new file mode 100644 index 0000000..f2f8d14 --- /dev/null +++ b/src/plugins.c @@ -0,0 +1,63 @@ +#include "plugins.h" +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> + +#include <sys/types.h> +#include <dirent.h> + +struct ptx__plugin_manager_tag +{ + size_t sz_plugins; + ptx_plugin_t *plugins; +}; + +struct ptx__plugin_handle_tag +{ + char *path; +}; + +ptx_plugin_manager_t *ptx_plugin_manager_new(void) +{ + ptx_plugin_manager_t *mgr = malloc(sizeof(ptx_plugin_manager_t)); + if (!mgr) return NULL; + + /* do init */ + mgr->sz_plugins = 0; + mgr->plugins = NULL; + + return mgr; +} + +void ptx_plugin_manager_free(ptx_plugin_manager_t *mgr) +{ + if (!mgr) return; + + /* do cleanup */ + + free(mgr); + return; +} + +int ptx_plugin_manager_load_dir(ptx_plugin_manager_t *mgr, const char *dirnam) +{ + struct dirent *ent; + DIR *dir = opendir(dirnam); + + if (!dir) { + fprintf(stderr, "Failed to load plugins from %s (opendir): %s\n", dirnam, strerror(errno)); + return -1; + } + + while ((errno = 0, ent = readdir(dir))) { + + } + + if (errno != 0) { + fprintf(stderr, "Error reading entries from %s (readdir): %s\n", dirnam, strerror(errno)); + return -1; + } + + return 0; +} |
