static int dialog_wait(vlc_dialog_provider *p_provider, vlc_dialog_id *p_id, enum dialog_type i_type, struct dialog_answer *p_answer) { struct dialog_i11e_context context = { .p_provider = p_provider, .p_id = p_id, }; vlc_interrupt_register(dialog_wait_interrupted, &context); vlc_mutex_lock(&p_id->lock); /* Wait for the dialog to be dismissed, interrupted or answered */ while (!p_id->b_cancelled && !p_id->b_answered) vlc_cond_wait(&p_id->wait, &p_id->lock); int i_ret; if (p_id->b_cancelled) i_ret = 0; else if (p_id->answer.i_type != i_type) i_ret = VLC_EGENERIC; else { i_ret = 1; memcpy(p_answer, &p_id->answer, sizeof(p_id->answer)); memset(&p_id->answer, 0, sizeof(p_id->answer)); } vlc_mutex_unlock(&p_id->lock); vlc_interrupt_unregister(); vlc_mutex_lock(&p_provider->lock); dialog_remove_locked(p_provider, p_id); vlc_mutex_unlock(&p_provider->lock); return i_ret; }
static int vlc_h2_stream_unlock(struct vlc_h2_stream *s) { vlc_mutex_unlock(&s->conn->lock); return vlc_interrupt_unregister(); }