osx: synchronize access to the input_ctx

While all functions of input_ctx are inherently thread-safe, access to
the _inputContext field itself is not. It could be unset any time by
cocoa_set_input_context(). So even trivial input_ctx calls must be under
a lock, so that the input_ctx can not be destroyed while the function
call is "starting". (Even a function call in progress wouldn't be fine,
because mp_input_uninit() requires the caller to "own" the object, i.e.
no other threads can access it at this point.)
This commit is contained in:
wm4 2015-05-26 22:47:11 +02:00
parent 2dd904289d
commit bf4dd877e9
1 changed files with 30 additions and 18 deletions

View File

@ -40,7 +40,7 @@
@interface EventsResponder ()
{
struct input_ctx *_inputContext;
NSCondition *_input_ready;
NSCondition *_input_lock;
CFMachPortRef _mk_tap_port;
#if HAVE_APPLE_REMOTE
HIDRemote *_remote;
@ -223,54 +223,63 @@ void cocoa_set_input_context(struct input_ctx *input_context)
{
self = [super init];
if (self) {
_input_ready = [NSCondition new];
_input_lock = [NSCondition new];
}
return self;
}
- (void)waitForInputContext
{
[_input_ready lock];
[_input_lock lock];
while (!_inputContext)
[_input_ready wait];
[_input_ready unlock];
[_input_lock wait];
[_input_lock unlock];
}
- (void)setInputContext:(struct input_ctx *)ctx;
{
[_input_ready lock];
[_input_lock lock];
_inputContext = ctx;
[_input_ready signal];
[_input_ready unlock];
[_input_lock signal];
[_input_lock unlock];
}
- (void)wakeup
{
[_input_lock lock];
mp_input_wakeup(_inputContext);
[_input_lock unlock];
}
- (bool)queueCommand:(char *)cmd
{
if (!_inputContext)
return false;
mp_cmd_t *cmdt = mp_input_parse_cmd(_inputContext, bstr0(cmd), "");
mp_input_queue_cmd(_inputContext, cmdt);
return true;
bool r = false;
[_input_lock lock];
if (_inputContext) {
mp_cmd_t *cmdt = mp_input_parse_cmd(_inputContext, bstr0(cmd), "");
mp_input_queue_cmd(_inputContext, cmdt);
r = true;
}
[_input_lock unlock];
return r;
}
- (void)putKey:(int)keycode
{
[_input_lock lock];
if (_inputContext)
mp_input_put_key(_inputContext, keycode);
[_input_lock unlock];
}
- (BOOL)useAltGr
{
BOOL r = YES;
[_input_lock lock];
if (_inputContext)
return mp_input_use_alt_gr(_inputContext);
else
return YES;
r = mp_input_use_alt_gr(_inputContext);
[_input_lock unlock];
return r;
}
- (void)startEventMonitor
@ -460,7 +469,10 @@ void cocoa_set_input_context(struct input_ctx *input_context)
size_t bytes = [p lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
files_utf8[i] = talloc_memdup(files_utf8, filename, bytes + 1);
}];
mp_event_drop_files(_inputContext, num_files, files_utf8);
[_input_lock lock];
if (_inputContext)
mp_event_drop_files(_inputContext, num_files, files_utf8);
[_input_lock unlock];
talloc_free(files_utf8);
}