libbluray | branch: master | hpi1 <[email protected]> | Wed Feb 16 14:11:13 2011 +0200| [df9e57c5d369566842e354586c9c77845945aa14] | committer: hpi1
Added locking to HDMV VM > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=df9e57c5d369566842e354586c9c77845945aa14 --- src/libbluray/hdmv/hdmv_vm.c | 71 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/libbluray/hdmv/hdmv_vm.c b/src/libbluray/hdmv/hdmv_vm.c index c8f590c..9b415e6 100644 --- a/src/libbluray/hdmv/hdmv_vm.c +++ b/src/libbluray/hdmv/hdmv_vm.c @@ -26,6 +26,7 @@ #include "util/macro.h" #include "util/strutl.h" #include "util/logging.h" +#include "util/mutex.h" #include <stdlib.h> #include <string.h> @@ -38,6 +39,9 @@ typedef struct { } NV_TIMER; struct hdmv_vm_s { + + BD_MUTEX mutex; + /* state */ uint32_t pc; /* program counter */ BD_REGISTERS *regs; /* player registers */ @@ -243,6 +247,8 @@ HDMV_VM *hdmv_vm_init(const char *disc_root, BD_REGISTERS *regs) p->regs = regs; + bd_mutex_init(&p->mutex); + return p; } @@ -258,6 +264,8 @@ void hdmv_vm_free(HDMV_VM **p) { if (p && *p) { + bd_mutex_destroy(&(*p)->mutex); + mobj_free(&(*p)->movie_objects); _free_ig_object(*p); @@ -886,12 +894,19 @@ static int _hdmv_step(HDMV_VM *p) int hdmv_vm_select_object(HDMV_VM *p, int object) { int result; + bd_mutex_lock(&p->mutex); + result = _jump_object(p, object); + + bd_mutex_unlock(&p->mutex); return result; } int hdmv_vm_set_object(HDMV_VM *p, int num_nav_cmds, void *nav_cmds) { + int result = -1; + bd_mutex_lock(&p->mutex); + p->object = NULL; _free_ig_object(p); @@ -902,48 +917,69 @@ int hdmv_vm_set_object(HDMV_VM *p, int num_nav_cmds, void *nav_cmds) ig_object->cmds = calloc(num_nav_cmds, sizeof(MOBJ_CMD)); memcpy(ig_object->cmds, nav_cmds, num_nav_cmds * sizeof(MOBJ_CMD)); -#if 0 - /* ??? */ - if (!p->ig_object && p->object) { - _suspend_object(p); - } -#endif p->pc = 0; p->ig_object = ig_object; p->object = ig_object; + + result = 0; } - return 0; + bd_mutex_unlock(&p->mutex); + + return result; } int hdmv_vm_get_event(HDMV_VM *p, HDMV_EVENT *ev) { - return _get_event(p, ev); + int result; + bd_mutex_lock(&p->mutex); + + result = _get_event(p, ev); + + bd_mutex_unlock(&p->mutex); + return result; } int hdmv_vm_running(HDMV_VM *p) { - return !!p->object; + int result; + bd_mutex_lock(&p->mutex); + + result = !!p->object; + + bd_mutex_unlock(&p->mutex); + return result; } int hdmv_vm_resume(HDMV_VM *p) { - return _resume_object(p); + int result; + bd_mutex_lock(&p->mutex); + + result = _resume_object(p); + + bd_mutex_unlock(&p->mutex); + return result; } int hdmv_vm_suspend(HDMV_VM *p) { + int result = -1; + bd_mutex_lock(&p->mutex); + if (p->object && !p->ig_object) { _suspend_object(p); - return 0; + result = 0; } - return -1; + + bd_mutex_unlock(&p->mutex); + return result; } /* terminate program after MAX_LOOP instructions */ #define MAX_LOOP 1000000 -int hdmv_vm_run(HDMV_VM *p, HDMV_EVENT *ev) +static int _vm_run(HDMV_VM *p, HDMV_EVENT *ev) { int max_loop = MAX_LOOP; @@ -991,4 +1027,13 @@ int hdmv_vm_run(HDMV_VM *p, HDMV_EVENT *ev) return -1; } +int hdmv_vm_run(HDMV_VM *p, HDMV_EVENT *ev) +{ + int result; + bd_mutex_lock(&p->mutex); + + result = _vm_run(p, ev); + bd_mutex_unlock(&p->mutex); + return result; +} _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
