diff --git a/inc/lektor/lktmodule.h b/inc/lektor/lktmodule.h new file mode 100644 index 0000000000000000000000000000000000000000..7ddba4bd4dfa0363d60cfdb4fa4bb30030f6e9ed --- /dev/null +++ b/inc/lektor/lktmodule.h @@ -0,0 +1,24 @@ +#if ! defined(__LKT_LKTMODULE_H__) +#define __LKT_LKTMODULE_H__ + +/* The single header modules can use from lektor */ + +/* Include header */ + +#include <lektor/lktconfig.h> +#include <lektor/common.h> +#include <lektor/queue.h> +#include <lektor/database.h> +#include <lektor/net.h> +#include <lektor/reg.h> + +#include <lektor/thread.h> /* To be moved in module_repo... */ + +/* Include source files, only do it once per module ! */ +#if defined(__LKT_MODULE_MAIN_SOURCE__) && ! defined(LKT_STATIC_MODULE) +#include "../../../src/base/thread.c" +#include "../../../src/base/common.c" +#include "../../../src/database/queue.c" +#endif /* __LKT_MODULE_MAIN_SOURCE__ && ! LKT_STATIC_MODULE*/ + +#endif /* __LKT_LKTMODULE_H__ */ diff --git a/inc/lektor/queue.h b/inc/lektor/queue.h index f62bad11b520f91ee329bf484e84a631c4a6faa7..1332a2e6bdf5d65fd1a155703a383a11ef0d888c 100644 --- a/inc/lektor/queue.h +++ b/inc/lektor/queue.h @@ -1,7 +1,16 @@ #if ! defined(__LKT_QUEUE_H__) #define __LKT_QUEUE_H__ +#define _POSIX_C_SOURCE 200809L + +/* Everything in this file is implemented in the header, so that modules don't + have to compile the lib with another .c file. */ #include <pthread.h> +#include <errno.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <stdio.h> #include <lektor/common.h> enum { @@ -59,12 +68,93 @@ struct queue { volatile int available; }; -int lkt_queue_new(struct queue *); -void lkt_queue_free(struct queue *); +static inline int +lkt_queue_new(struct queue *ret) +{ + if (!ret) + return 1; + + pthread_mutex_t mxt = PTHREAD_MUTEX_INITIALIZER; + struct queue _ret = { + .contents = malloc(LKT_DEFAULT_LIST_SIZE * sizeof(lkt_event)), + .size = LKT_DEFAULT_LIST_SIZE, + .last = 0, + .available = 0, + .lock = mxt, + }; + + if (_ret.contents == NULL) + return 1; + + *ret = _ret; + return 0; +} + +static inline void +lkt_queue_free(struct queue *queue) +{ + pthread_mutex_lock(&queue->lock); + if (queue && queue->contents) + free((void *) queue->contents); + pthread_mutex_unlock(&queue->lock); +} + +static inline void +lkt_queue_send(struct queue *queue, enum lkt_event_type _type, void *_attr) +{ + pthread_mutex_lock(&queue->lock); + GOTO_UNLESS(queue, "Invalid argument", end) + + volatile lkt_event *new; + if (queue->size == queue->last) { + new = realloc((void *) queue->contents, queue->size * 2 * sizeof(lkt_event)); + + if (NULL == new) + goto end; + + queue->contents = new; + queue->size *= 2; + } + + lkt_event evt = { + .type = _type, + .attr = _attr, + }; + queue->contents[(queue->last)++] = evt; + + if (! (_type & queue->available)) + LOG_WARN("QUEUE", "The event %d is not available, push it anyway", _type); +end: + pthread_mutex_unlock(&queue->lock); +} + +static inline lkt_event +lkt_queue_handle(struct queue *queue) +{ + pthread_mutex_lock(&queue->lock); + lkt_event ret = {0}; + if (!queue || !queue->last) + goto end; + if (! (queue->contents[0].type & queue->available) && + queue->contents[0].type) { + LOG_WARN("QUEUE", "Event %d is not available", queue->contents[0].type); + goto end; + } -void lkt_queue_send(struct queue *, enum lkt_event_type, void *attr); -lkt_event lkt_queue_handle(struct queue *); + ret = queue->contents[0]; + memmove((void *) queue->contents, (void *) (queue->contents + 1), + --(queue->last)); +end: + pthread_mutex_unlock(&queue->lock); + return ret; +} -void lkt_queue_make_available(struct queue *, enum lkt_event_type); +static inline void +lkt_queue_make_available(struct queue *queue, enum lkt_event_type type) +{ + pthread_mutex_lock(&queue->lock); + queue->available |= type; + pthread_mutex_unlock(&queue->lock); +} #endif /* __LKT_QUEUE_H__ */ diff --git a/src/Makefile.am b/src/Makefile.am index 11f477f72c84f4f46682a41a059b51a851aca77f..cd8897b41aba37fc870198d6201f72e4d0c0b71f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,7 +14,7 @@ endif ## REPO module liblktmodrepo_la_SOURCES = module/module_repo.c module/worker.c liblktmodrepo_la_CFLAGS = -fPIC -liblktmodrepo_la_LDFLAGS = -avoid-version -pthread +liblktmodrepo_la_LDFLAGS = -avoid-version -pthread -ljson-c -lcurl if LKT_STATIC_MODULE liblktmodrepo_la_LDFLAGS += -static else @@ -35,8 +35,8 @@ endif ## Lib lektor # Base sources liblektor_la_SOURCES = base/bufferfd.c base/cmd.c base/common.c base/config.c -liblektor_la_SOURCES += base/queue.c base/reg.c base/stack.c base/uri.c -liblektor_la_SOURCES += base/thread.c base/commands.c +liblektor_la_SOURCES += base/reg.c base/stack.c base/uri.c base/thread.c +liblektor_la_SOURCES += base/commands.c # Database sources liblektor_la_SOURCES += database/disk.c database/memory.c @@ -52,7 +52,7 @@ liblektor_la_SOURCES += net/command.c net/listen.c net/message.c # Liblektor configuration liblektor_la_CFLAGS = -fPIC -liblektor_la_LDFLAGS = -avoid-version -shared -pthread -ljson-c -lsqlite3 -lcurl +liblektor_la_LDFLAGS = -avoid-version -shared -pthread -lsqlite3 if LKT_STATIC_MODULE liblektor_la_LDFLAGS += -lSDL2 -lmpv liblektor_la_LIBADD = liblktmodsdl.la liblktmodrepo.la diff --git a/src/Makefile.in b/src/Makefile.in index 94c2556c46e9ca77494e2019fa517ec21ff7d15a..0589129671438abb8ab8e729903b801862b6f56d 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -145,11 +145,11 @@ LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__dirstamp = $(am__leading_dot)dirstamp am_liblektor_la_OBJECTS = base/liblektor_la-bufferfd.lo \ base/liblektor_la-cmd.lo base/liblektor_la-common.lo \ - base/liblektor_la-config.lo base/liblektor_la-queue.lo \ - base/liblektor_la-reg.lo base/liblektor_la-stack.lo \ - base/liblektor_la-uri.lo base/liblektor_la-thread.lo \ - base/liblektor_la-commands.lo database/liblektor_la-disk.lo \ - database/liblektor_la-memory.lo database/liblektor_la-open.lo \ + base/liblektor_la-config.lo base/liblektor_la-reg.lo \ + base/liblektor_la-stack.lo base/liblektor_la-uri.lo \ + base/liblektor_la-thread.lo base/liblektor_la-commands.lo \ + database/liblektor_la-disk.lo database/liblektor_la-memory.lo \ + database/liblektor_la-open.lo \ database/liblektor_la-playlist.lo \ database/liblektor_la-queue.lo \ database/liblektor_la-stickers.lo \ @@ -216,7 +216,6 @@ am__depfiles_remade = base/$(DEPDIR)/cmd.Po base/$(DEPDIR)/common.Po \ base/$(DEPDIR)/liblektor_la-commands.Plo \ base/$(DEPDIR)/liblektor_la-common.Plo \ base/$(DEPDIR)/liblektor_la-config.Plo \ - base/$(DEPDIR)/liblektor_la-queue.Plo \ base/$(DEPDIR)/liblektor_la-reg.Plo \ base/$(DEPDIR)/liblektor_la-stack.Plo \ base/$(DEPDIR)/liblektor_la-thread.Plo \ @@ -427,8 +426,8 @@ AM_CPPFLAGS = -I$(abs_top_srcdir)/inc/ -I$(abs_top_builddir)/inc/ @LKT_STATIC_MODULE_TRUE@lib_LTLIBRARIES = liblektor.la liblktmodrepo_la_SOURCES = module/module_repo.c module/worker.c liblktmodrepo_la_CFLAGS = -fPIC -liblktmodrepo_la_LDFLAGS = -avoid-version -pthread $(am__append_1) \ - $(am__append_2) +liblktmodrepo_la_LDFLAGS = -avoid-version -pthread -ljson-c -lcurl \ + $(am__append_1) $(am__append_2) liblktmodsdl_la_SOURCES = module/module_sdl2.c module/mpv.c liblktmodsdl_la_CFLAGS = -fPIC `sdl2-config --cflags` liblktmodsdl_la_LDFLAGS = -avoid-version -pthread -lmpv \ @@ -443,18 +442,17 @@ liblktmodsdl_la_LIBADD = -lSDL2 -lmpv # Net sources liblektor_la_SOURCES = base/bufferfd.c base/cmd.c base/common.c \ - base/config.c base/queue.c base/reg.c base/stack.c base/uri.c \ - base/thread.c base/commands.c database/disk.c \ - database/memory.c database/open.c database/playlist.c \ - database/queue.c database/stickers.c database/update.c \ - database/user.c database/config.c database/find.c mkv/mkv.c \ - mkv/utils.c mkv/write.c net/command.c net/listen.c \ - net/message.c + base/config.c base/reg.c base/stack.c base/uri.c base/thread.c \ + base/commands.c database/disk.c database/memory.c \ + database/open.c database/playlist.c database/queue.c \ + database/stickers.c database/update.c database/user.c \ + database/config.c database/find.c mkv/mkv.c mkv/utils.c \ + mkv/write.c net/command.c net/listen.c net/message.c # Liblektor configuration liblektor_la_CFLAGS = -fPIC -liblektor_la_LDFLAGS = -avoid-version -shared -pthread -ljson-c \ - -lsqlite3 -lcurl $(am__append_5) +liblektor_la_LDFLAGS = -avoid-version -shared -pthread -lsqlite3 \ + $(am__append_5) @LKT_STATIC_MODULE_TRUE@liblektor_la_LIBADD = liblktmodsdl.la liblktmodrepo.la CLEANFILES = database/disk.c database/memory.c EXTRA_DIST = database/disk.sql database/memory.sql @@ -619,8 +617,6 @@ base/liblektor_la-common.lo: base/$(am__dirstamp) \ base/$(DEPDIR)/$(am__dirstamp) base/liblektor_la-config.lo: base/$(am__dirstamp) \ base/$(DEPDIR)/$(am__dirstamp) -base/liblektor_la-queue.lo: base/$(am__dirstamp) \ - base/$(DEPDIR)/$(am__dirstamp) base/liblektor_la-reg.lo: base/$(am__dirstamp) \ base/$(DEPDIR)/$(am__dirstamp) base/liblektor_la-stack.lo: base/$(am__dirstamp) \ @@ -751,7 +747,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-commands.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-config.Plo@am__quote@ # am--include-marker -@AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-queue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-reg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-stack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-thread.Plo@am__quote@ # am--include-marker @@ -837,13 +832,6 @@ base/liblektor_la-config.lo: base/config.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -c -o base/liblektor_la-config.lo `test -f 'base/config.c' || echo '$(srcdir)/'`base/config.c -base/liblektor_la-queue.lo: base/queue.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -MT base/liblektor_la-queue.lo -MD -MP -MF base/$(DEPDIR)/liblektor_la-queue.Tpo -c -o base/liblektor_la-queue.lo `test -f 'base/queue.c' || echo '$(srcdir)/'`base/queue.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) base/$(DEPDIR)/liblektor_la-queue.Tpo base/$(DEPDIR)/liblektor_la-queue.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='base/queue.c' object='base/liblektor_la-queue.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -c -o base/liblektor_la-queue.lo `test -f 'base/queue.c' || echo '$(srcdir)/'`base/queue.c - base/liblektor_la-reg.lo: base/reg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(liblektor_la_CFLAGS) $(CFLAGS) -MT base/liblektor_la-reg.lo -MD -MP -MF base/$(DEPDIR)/liblektor_la-reg.Tpo -c -o base/liblektor_la-reg.lo `test -f 'base/reg.c' || echo '$(srcdir)/'`base/reg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) base/$(DEPDIR)/liblektor_la-reg.Tpo base/$(DEPDIR)/liblektor_la-reg.Plo @@ -1180,7 +1168,6 @@ distclean: distclean-am -rm -f base/$(DEPDIR)/liblektor_la-commands.Plo -rm -f base/$(DEPDIR)/liblektor_la-common.Plo -rm -f base/$(DEPDIR)/liblektor_la-config.Plo - -rm -f base/$(DEPDIR)/liblektor_la-queue.Plo -rm -f base/$(DEPDIR)/liblektor_la-reg.Plo -rm -f base/$(DEPDIR)/liblektor_la-stack.Plo -rm -f base/$(DEPDIR)/liblektor_la-thread.Plo @@ -1259,7 +1246,6 @@ maintainer-clean: maintainer-clean-am -rm -f base/$(DEPDIR)/liblektor_la-commands.Plo -rm -f base/$(DEPDIR)/liblektor_la-common.Plo -rm -f base/$(DEPDIR)/liblektor_la-config.Plo - -rm -f base/$(DEPDIR)/liblektor_la-queue.Plo -rm -f base/$(DEPDIR)/liblektor_la-reg.Plo -rm -f base/$(DEPDIR)/liblektor_la-stack.Plo -rm -f base/$(DEPDIR)/liblektor_la-thread.Plo diff --git a/src/base/queue.c b/src/base/queue.c deleted file mode 100644 index ae9be02a664b89d4c48a7de579fc804ba453c60d..0000000000000000000000000000000000000000 --- a/src/base/queue.c +++ /dev/null @@ -1,99 +0,0 @@ -#define _POSIX_C_SOURCE 200809L - -#include <errno.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> -#include <stdio.h> -#include <lektor/common.h> -#include <lektor/queue.h> -#include <pthread.h> - -int -lkt_queue_new(struct queue *ret) -{ - if (!ret) - return 1; - - pthread_mutex_t mxt = PTHREAD_MUTEX_INITIALIZER; - struct queue _ret = { - .contents = malloc(LKT_DEFAULT_LIST_SIZE * sizeof(lkt_event)), - .size = LKT_DEFAULT_LIST_SIZE, - .last = 0, - .available = 0, - .lock = mxt, - }; - - if (_ret.contents == NULL) - return 1; - - *ret = _ret; - return 0; -} - -void -lkt_queue_free(struct queue *queue) -{ - pthread_mutex_lock(&queue->lock); - if (queue && queue->contents) - free((void *) queue->contents); - pthread_mutex_unlock(&queue->lock); -} - -void -lkt_queue_send(struct queue *queue, enum lkt_event_type _type, void *_attr) -{ - pthread_mutex_lock(&queue->lock); - GOTO_UNLESS(queue, "Invalid argument", end) - - volatile lkt_event *new; - if (queue->size == queue->last) { - new = realloc((void *) queue->contents, queue->size * 2 * sizeof(lkt_event)); - - if (NULL == new) - goto end; - - queue->contents = new; - queue->size *= 2; - } - - lkt_event evt = { - .type = _type, - .attr = _attr, - }; - queue->contents[(queue->last)++] = evt; - - if (! (_type & queue->available)) - LOG_WARN("QUEUE", "The event %d is not available, push it anyway", _type); -end: - pthread_mutex_unlock(&queue->lock); -} - -lkt_event -lkt_queue_handle(struct queue *queue) -{ - pthread_mutex_lock(&queue->lock); - lkt_event ret = {0}; - if (!queue || !queue->last) - goto end; - if (! (queue->contents[0].type & queue->available) && - queue->contents[0].type) { - LOG_WARN("QUEUE", "Event %d is not available", queue->contents[0].type); - goto end; - } - - ret = queue->contents[0]; - memmove((void *) queue->contents, (void *) (queue->contents + 1), - --(queue->last)); -end: - pthread_mutex_unlock(&queue->lock); - return ret; -} - -void -lkt_queue_make_available(struct queue *queue, enum lkt_event_type type) -{ - pthread_mutex_lock(&queue->lock); - queue->available |= type; - pthread_mutex_unlock(&queue->lock); -} diff --git a/src/module/module_repo.c b/src/module/module_repo.c index e11cc7101f547009fa5244e8ebb4a2bf982e7b5c..53ca2975bea1f11fbaef1bd7dd84d0ff36d48455 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -1,11 +1,7 @@ #define _POSIX_C_SOURCE 200809L -#include <lektor/lktconfig.h> -#include <lektor/common.h> -#include <lektor/queue.h> -#include <lektor/database.h> -#include <lektor/net.h> -#include <lektor/reg.h> +#define __LKT_MODULE_MAIN_SOURCE__ +#include <lektor/lktmodule.h> #include "worker.h" diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c index 490a0feda7841041ec8152dbdef648e1bac4e08b..5dfcd79046e0e48d98888bc1a061043954b3bca8 100644 --- a/src/module/module_sdl2.c +++ b/src/module/module_sdl2.c @@ -1,11 +1,7 @@ #define _POSIX_C_SOURCE 200809L -#include <lektor/lktconfig.h> -#include <lektor/common.h> -#include <lektor/queue.h> -#include <lektor/thread.h> -#include <lektor/reg.h> -#include <lektor/net.h> +#define __LKT_MODULE_MAIN_SOURCE__ +#include <lektor/lktmodule.h> #include "mpv.h" diff --git a/src/module/mpv.c b/src/module/mpv.c index 4d92ecc08dab27b3c8d56010765f829f5c399006..7186bd20ce1f932f41921d748ce97d5c3646cb3e 100644 --- a/src/module/mpv.c +++ b/src/module/mpv.c @@ -3,7 +3,6 @@ #include "mpv.h" #include <lektor/common.h> -#include <lektor/commands.h> #include <lektor/database.h> #include <strings.h> #include <stdio.h>