aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar bigfoot547 <[email protected]>2025-11-17 20:57:42 -0600
committerLibravatar bigfoot547 <[email protected]>2025-11-17 20:57:42 -0600
commit2b44f885e97b0d8902014a5a61f6687fa2931dec (patch)
tree9e3ecfb3858f33a3922f47bde8a2163d9deed95e
parentbuild config + more plugin stuff (diff)
ignore this commit
-rw-r--r--.clangd2
-rw-r--r--include/macros.h20
-rw-r--r--include/plugins.h24
-rw-r--r--meson.build14
-rw-r--r--plugins/epoll.c2
-rw-r--r--plugins/meson.build9
-rw-r--r--src/main.c2
-rw-r--r--src/meson.build3
-rw-r--r--src/plugins.c63
9 files changed, 129 insertions, 10 deletions
diff --git a/.clangd b/.clangd
new file mode 100644
index 0000000..03a6443
--- /dev/null
+++ b/.clangd
@@ -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
diff --git a/src/main.c b/src/main.c
index 83ed688..50baf66 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;
+}