[libbluray-devel] Split event queue to separate file
hpi1
git at videolan.org
Mon Mar 21 11:24:15 CET 2016
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Thu Mar 10 13:22:31 2016 +0200| [2e823519b5f79f30813c9ef73608b8cf78c0f635] | committer: hpi1
Split event queue to separate file
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=2e823519b5f79f30813c9ef73608b8cf78c0f635
---
Makefile.am | 2 +
src/libbluray/bluray.c | 89 +++++++----------------------------------
src/util/event_queue.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++
src/util/event_queue.h | 35 ++++++++++++++++
4 files changed, 156 insertions(+), 74 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 5c77a05..3a54bfc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -112,6 +112,8 @@ libbluray_la_SOURCES = \
src/util/attributes.h \
src/util/bits.h \
src/util/bits.c \
+ src/util/event_queue.h \
+ src/util/event_queue.c \
src/util/logging.h \
src/util/logging.c \
src/util/log_control.h \
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index 9aba36d..f19d850 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -28,6 +28,7 @@
#include "bluray_internal.h"
#include "register.h"
#include "util/array.h"
+#include "util/event_queue.h"
#include "util/macro.h"
#include "util/logging.h"
#include "util/strutl.h"
@@ -59,14 +60,6 @@
#include <string.h>
-#define MAX_EVENTS 31 /* 2^n - 1 */
-typedef struct bd_event_queue_s {
- BD_MUTEX mutex;
- unsigned in; /* next free slot */
- unsigned out; /* next event */
- BD_EVENT ev[MAX_EVENTS+1];
-} BD_EVENT_QUEUE;
-
typedef enum {
title_undef = 0,
title_hdmv,
@@ -200,78 +193,26 @@ void bd_get_version(int *major, int *minor, int *micro)
* Navigation mode event queue
*/
-static void _init_event_queue(BLURAY *bd)
-{
- if (!bd->event_queue) {
- bd->event_queue = calloc(1, sizeof(struct bd_event_queue_s));
- if (bd->event_queue) {
- bd_mutex_init(&bd->event_queue->mutex);
- }
- } else {
- bd_mutex_lock(&bd->event_queue->mutex);
- bd->event_queue->in = 0;
- bd->event_queue->out = 0;
- memset(bd->event_queue->ev, 0, sizeof(bd->event_queue->ev));
- bd_mutex_unlock(&bd->event_queue->mutex);
- }
-}
-
-static void _free_event_queue(BLURAY *bd)
-{
- if (bd->event_queue) {
- bd_mutex_destroy(&bd->event_queue->mutex);
- X_FREE(bd->event_queue);
- }
-}
-
static int _get_event(BLURAY *bd, BD_EVENT *ev)
{
- struct bd_event_queue_s *eq = bd->event_queue;
-
- if (eq) {
- bd_mutex_lock(&eq->mutex);
-
- if (eq->in != eq->out) {
-
- *ev = eq->ev[eq->out];
- eq->out = (eq->out + 1) & MAX_EVENTS;
-
- bd_mutex_unlock(&eq->mutex);
- return 1;
- }
-
- bd_mutex_unlock(&eq->mutex);
+ int result = event_queue_get(bd->event_queue, ev);
+ if (!result) {
+ ev->event = BD_EVENT_NONE;
}
-
- ev->event = BD_EVENT_NONE;
-
- return 0;
+ return result;
}
static int _queue_event(BLURAY *bd, uint32_t event, uint32_t param)
{
- struct bd_event_queue_s *eq = bd->event_queue;
-
- if (eq) {
- bd_mutex_lock(&eq->mutex);
-
- unsigned new_in = (eq->in + 1) & MAX_EVENTS;
-
- if (new_in != eq->out) {
- eq->ev[eq->in].event = event;
- eq->ev[eq->in].param = param;
- eq->in = new_in;
-
- bd_mutex_unlock(&eq->mutex);
- return 1;
+ int result = 0;
+ if (bd->event_queue) {
+ BD_EVENT ev = { event, param };
+ result = event_queue_put(bd->event_queue, &ev);
+ if (!result) {
+ BD_DEBUG(DBG_BLURAY|DBG_CRIT, "_queue_event(%d, %d): queue overflow !\n", event, param);
}
-
- bd_mutex_unlock(&eq->mutex);
-
- BD_DEBUG(DBG_BLURAY|DBG_CRIT, "_queue_event(%d, %d): queue overflow !\n", event, param);
}
-
- return 0;
+ return result;
}
/*
@@ -1526,7 +1467,7 @@ void bd_close(BLURAY *bd)
sound_free(&bd->sound_effects);
bd_registers_free(bd->regs);
- _free_event_queue(bd);
+ event_queue_destroy(&bd->event_queue);
array_free((void**)&bd->titles);
_storage_free(bd);
@@ -3239,7 +3180,7 @@ int bd_play(BLURAY *bd)
}
if (!bd->event_queue) {
- _init_event_queue(bd);
+ bd->event_queue = event_queue_new(sizeof(BD_EVENT));
bd_psr_lock(bd->regs);
bd_psr_register_cb(bd->regs, _process_psr_event, bd);
@@ -3505,7 +3446,7 @@ int bd_read_ext(BLURAY *bd, unsigned char *buf, int len, BD_EVENT *event)
int bd_get_event(BLURAY *bd, BD_EVENT *event)
{
if (!bd->event_queue) {
- _init_event_queue(bd);
+ bd->event_queue = event_queue_new(sizeof(BD_EVENT));
bd_psr_register_cb(bd->regs, _process_psr_event, bd);
_queue_initial_psr_events(bd);
diff --git a/src/util/event_queue.c b/src/util/event_queue.c
new file mode 100644
index 0000000..976201d
--- /dev/null
+++ b/src/util/event_queue.c
@@ -0,0 +1,104 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2010-2016 Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "event_queue.h"
+
+#include "util/macro.h"
+#include "util/mutex.h"
+
+#include <string.h>
+
+
+#define MAX_EVENTS 31 /* 2^n - 1 */
+
+struct bd_event_queue {
+ BD_MUTEX mutex;
+ size_t event_size;
+ unsigned in; /* next free slot */
+ unsigned out; /* next event */
+
+ unsigned char ev[1];
+};
+
+
+void event_queue_destroy(BD_EVENT_QUEUE **pp)
+{
+ if (pp && *pp) {
+ BD_EVENT_QUEUE *eq = *pp;
+ bd_mutex_destroy(&eq->mutex);
+ X_FREE(*pp);
+ }
+}
+
+BD_EVENT_QUEUE *event_queue_new(size_t event_size)
+{
+ BD_EVENT_QUEUE *eq = calloc(1, sizeof(BD_EVENT_QUEUE) + event_size * (MAX_EVENTS + 1));
+ if (eq) {
+ bd_mutex_init(&eq->mutex);
+ eq->event_size = event_size;
+ }
+ return eq;
+}
+
+int event_queue_get(BD_EVENT_QUEUE *eq, void *ev)
+{
+ int result = 0;
+
+ if (eq) {
+ bd_mutex_lock(&eq->mutex);
+
+ if (eq->in != eq->out) {
+
+ memcpy(ev, &eq->ev[eq->out * eq->event_size], eq->event_size);
+ eq->out = (eq->out + 1) & MAX_EVENTS;
+
+ result = 1;
+ }
+
+ bd_mutex_unlock(&eq->mutex);
+ }
+
+ return result;
+}
+
+int event_queue_put(BD_EVENT_QUEUE *eq, const void *ev)
+{
+ int result = 0;
+
+ if (eq) {
+ bd_mutex_lock(&eq->mutex);
+
+ unsigned new_in = (eq->in + 1) & MAX_EVENTS;
+
+ if (new_in != eq->out) {
+ memcpy(&eq->ev[eq->in * eq->event_size], ev, eq->event_size);
+ eq->in = new_in;
+
+ result = 1;
+ }
+
+ bd_mutex_unlock(&eq->mutex);
+ }
+
+ return result;
+}
diff --git a/src/util/event_queue.h b/src/util/event_queue.h
new file mode 100644
index 0000000..6331b7d
--- /dev/null
+++ b/src/util/event_queue.h
@@ -0,0 +1,35 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2010-2016 Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#if !defined(BD_EVENT_QUEUE_H_)
+#define BD_EVENT_QUEUE_H_
+
+#include "util/attributes.h"
+
+#include <stddef.h>
+
+typedef struct bd_event_queue BD_EVENT_QUEUE;
+
+BD_PRIVATE BD_EVENT_QUEUE *event_queue_new(size_t event_size);
+BD_PRIVATE void event_queue_destroy(BD_EVENT_QUEUE **);
+
+BD_PRIVATE int event_queue_get(BD_EVENT_QUEUE *eq, void *ev);
+BD_PRIVATE int event_queue_put(BD_EVENT_QUEUE *eq, const void *ev);
+
+#endif /* BD_EVENT_QUEUE_H_ */
More information about the libbluray-devel
mailing list