Commit 3ccd91d3 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

interrupt: voidify vlc_interrupt_prepare and simplify

parent cc0d8ec8
...@@ -196,17 +196,12 @@ VLC_API bool vlc_killed(void) VLC_USED; ...@@ -196,17 +196,12 @@ VLC_API bool vlc_killed(void) VLC_USED;
* it will be forwarded to the specified other context. This is used to cross * it will be forwarded to the specified other context. This is used to cross
* thread boundaries. * thread boundaries.
* *
* If the calling thread already has an interruption pending, this function * If the calling thread has no interrupt context, this function does nothing.
* dequeues the interrupt, return an error code and does not enable forwarding.
*
* If the calling thread has no interrupt context, this function does nothing
* and returns zero.
* *
* @param to context to forward to * @param to context to forward to
* @return 0 on success, or EINTR on error
*/ */
VLC_API int vlc_interrupt_forward_start(vlc_interrupt_t *to, VLC_API void vlc_interrupt_forward_start(vlc_interrupt_t *to,
void *data[2]) VLC_USED; void *data[2]);
/** /**
* Undoes vlc_interrupt_forward_start(). * Undoes vlc_interrupt_forward_start().
......
...@@ -323,12 +323,13 @@ static ssize_t Read(stream_t *stream, void *buf, size_t buflen) ...@@ -323,12 +323,13 @@ static ssize_t Read(stream_t *stream, void *buf, size_t buflen)
{ {
void *data[2]; void *data[2];
if (sys->error || vlc_interrupt_forward_start(sys->interrupt, data)) if (sys->error)
{ {
vlc_mutex_unlock(&sys->lock); vlc_mutex_unlock(&sys->lock);
return -1; return -1;
} }
vlc_interrupt_forward_start(sys->interrupt, data);
vlc_cond_wait(&sys->wait_data, &sys->lock); vlc_cond_wait(&sys->wait_data, &sys->lock);
vlc_interrupt_forward_stop(data); vlc_interrupt_forward_stop(data);
} }
......
...@@ -154,33 +154,23 @@ vlc_interrupt_t *vlc_interrupt_set(vlc_interrupt_t *newctx) ...@@ -154,33 +154,23 @@ vlc_interrupt_t *vlc_interrupt_set(vlc_interrupt_t *newctx)
* Prepares to enter interruptible wait. * Prepares to enter interruptible wait.
* @param cb callback to interrupt the wait (i.e. wake up the thread) * @param cb callback to interrupt the wait (i.e. wake up the thread)
* @param data opaque data pointer for the callback * @param data opaque data pointer for the callback
* @return 0 on success or EINTR if an interruption is already pending
* @note Any <b>succesful</b> call <b>must</b> be paired with a call to * @note Any <b>succesful</b> call <b>must</b> be paired with a call to
* vlc_interrupt_finish(). * vlc_interrupt_finish().
*/ */
static int vlc_interrupt_prepare(vlc_interrupt_t *ctx, static void vlc_interrupt_prepare(vlc_interrupt_t *ctx,
void (*cb)(void *), void *data) void (*cb)(void *), void *data)
{ {
int ret = 0;
assert(ctx != NULL); assert(ctx != NULL);
assert(ctx == vlc_threadvar_get(vlc_interrupt_var)); assert(ctx == vlc_threadvar_get(vlc_interrupt_var));
vlc_mutex_lock(&ctx->lock); vlc_mutex_lock(&ctx->lock);
assert(ctx->callback == NULL); assert(ctx->callback == NULL);
if (ctx->interrupted)
{
ret = EINTR;
ctx->interrupted = false;
}
else
{
ret = 0;
ctx->callback = cb; ctx->callback = cb;
ctx->data = data; ctx->data = data;
}
if (unlikely(ctx->interrupted))
cb(data);
vlc_mutex_unlock(&ctx->lock); vlc_mutex_unlock(&ctx->lock);
return ret;
} }
/** /**
...@@ -244,12 +234,7 @@ int vlc_sem_wait_i11e(vlc_sem_t *sem) ...@@ -244,12 +234,7 @@ int vlc_sem_wait_i11e(vlc_sem_t *sem)
if (ctx == NULL) if (ctx == NULL)
return vlc_sem_wait(sem), 0; return vlc_sem_wait(sem), 0;
int ret = vlc_interrupt_prepare(ctx, vlc_interrupt_sem, sem); vlc_interrupt_prepare(ctx, vlc_interrupt_sem, sem);
if (ret)
{
vlc_testcancel();
return ret;
}
vlc_cleanup_push(vlc_interrupt_cleanup, ctx); vlc_cleanup_push(vlc_interrupt_cleanup, ctx);
vlc_sem_wait(sem); vlc_sem_wait(sem);
...@@ -282,13 +267,7 @@ int vlc_mwait_i11e(mtime_t deadline) ...@@ -282,13 +267,7 @@ int vlc_mwait_i11e(mtime_t deadline)
vlc_cond_t wait; vlc_cond_t wait;
vlc_cond_init(&wait); vlc_cond_init(&wait);
int ret = vlc_interrupt_prepare(ctx, vlc_mwait_i11e_wake, &wait); vlc_interrupt_prepare(ctx, vlc_mwait_i11e_wake, &wait);
if (ret)
{
vlc_cond_destroy(&wait);
vlc_testcancel();
return ret;
}
vlc_mutex_lock(&ctx->lock); vlc_mutex_lock(&ctx->lock);
vlc_cleanup_push(vlc_mwait_i11e_cleanup, ctx); vlc_cleanup_push(vlc_mwait_i11e_cleanup, ctx);
...@@ -297,7 +276,7 @@ int vlc_mwait_i11e(mtime_t deadline) ...@@ -297,7 +276,7 @@ int vlc_mwait_i11e(mtime_t deadline)
vlc_cleanup_pop(); vlc_cleanup_pop();
vlc_mutex_unlock(&ctx->lock); vlc_mutex_unlock(&ctx->lock);
ret = vlc_interrupt_finish(ctx); int ret = vlc_interrupt_finish(ctx);
vlc_cond_destroy(&wait); vlc_cond_destroy(&wait);
return ret; return ret;
} }
...@@ -312,18 +291,18 @@ static void vlc_interrupt_forward_wake(void *opaque) ...@@ -312,18 +291,18 @@ static void vlc_interrupt_forward_wake(void *opaque)
: vlc_interrupt_raise)(to); : vlc_interrupt_raise)(to);
} }
int vlc_interrupt_forward_start(vlc_interrupt_t *to, void *data[2]) void vlc_interrupt_forward_start(vlc_interrupt_t *to, void *data[2])
{ {
data[0] = data[1] = NULL; data[0] = data[1] = NULL;
vlc_interrupt_t *from = vlc_threadvar_get(vlc_interrupt_var); vlc_interrupt_t *from = vlc_threadvar_get(vlc_interrupt_var);
if (from == NULL) if (from == NULL)
return 0; return;
assert(from != to); assert(from != to);
data[0] = to; data[0] = to;
data[1] = from; data[1] = from;
return vlc_interrupt_prepare(from, vlc_interrupt_forward_wake, data); vlc_interrupt_prepare(from, vlc_interrupt_forward_wake, data);
} }
int vlc_interrupt_forward_stop(void *const data[2]) int vlc_interrupt_forward_stop(void *const data[2])
...@@ -392,12 +371,7 @@ static int vlc_poll_i11e_inner(struct pollfd *restrict fds, unsigned nfds, ...@@ -392,12 +371,7 @@ static int vlc_poll_i11e_inner(struct pollfd *restrict fds, unsigned nfds,
ufd[nfds].fd = fd[0]; ufd[nfds].fd = fd[0];
ufd[nfds].events = POLLIN; ufd[nfds].events = POLLIN;
if (vlc_interrupt_prepare(ctx, vlc_poll_i11e_wake, fd)) vlc_interrupt_prepare(ctx, vlc_poll_i11e_wake, fd);
{
vlc_testcancel();
errno = EINTR;
goto out;
}
vlc_cleanup_push(vlc_poll_i11e_cleanup, ctx); vlc_cleanup_push(vlc_poll_i11e_cleanup, ctx);
ret = poll(ufd, nfds + 1, timeout); ret = poll(ufd, nfds + 1, timeout);
...@@ -419,7 +393,7 @@ static int vlc_poll_i11e_inner(struct pollfd *restrict fds, unsigned nfds, ...@@ -419,7 +393,7 @@ static int vlc_poll_i11e_inner(struct pollfd *restrict fds, unsigned nfds,
errno = EINTR; errno = EINTR;
ret = -1; ret = -1;
} }
out:
canc = vlc_savecancel(); canc = vlc_savecancel();
if (fd[1] != fd[0]) if (fd[1] != fd[0])
close(fd[1]); close(fd[1]);
...@@ -642,11 +616,7 @@ int vlc_poll_i11e(struct pollfd *fds, unsigned nfds, int timeout) ...@@ -642,11 +616,7 @@ int vlc_poll_i11e(struct pollfd *fds, unsigned nfds, int timeout)
return -1; return -1;
} }
if (vlc_interrupt_prepare(ctx, vlc_poll_i11e_wake, th)) vlc_interrupt_prepare(ctx, vlc_poll_i11e_wake, th);
{
errno = EINTR;
goto out;
}
vlc_cleanup_push(vlc_poll_i11e_cleanup, th); vlc_cleanup_push(vlc_poll_i11e_cleanup, th);
ret = vlc_poll(fds, nfds, timeout); ret = vlc_poll(fds, nfds, timeout);
...@@ -657,7 +627,7 @@ int vlc_poll_i11e(struct pollfd *fds, unsigned nfds, int timeout) ...@@ -657,7 +627,7 @@ int vlc_poll_i11e(struct pollfd *fds, unsigned nfds, int timeout)
errno = EINTR; errno = EINTR;
ret = -1; ret = -1;
} }
out:
CloseHandle(th); CloseHandle(th);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment