* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <assert.h>
#include <vlc/libvlc.h>
static const long MaxQueuedItem = 300000;
long count = 0;
#endif
-
+
struct queue_elmt * elmt = malloc(sizeof(struct queue_elmt));
elmt->listener = *listener;
elmt->event = *event;
elmt->next = NULL;
-
+
/* Append to the end of the queue */
struct queue_elmt * iter = queue(p_em)->elements;
if(!iter)
*listener = queue(p_em)->elements->listener;
*event = queue(p_em)->elements->event;
-
+
struct queue_elmt * elmt = queue(p_em)->elements;
queue(p_em)->elements = elmt->next;
free(elmt);
while (iter) {
if(listeners_are_equal(&iter->listener, listener))
{
+ struct queue_elmt * to_delete = iter;
if(!prev)
- queue(p_em)->elements = iter->next;
+ queue(p_em)->elements = to_delete->next;
else
- prev->next = iter->next;
- free(iter);
+ prev->next = to_delete->next;
+ iter = to_delete->next;
+ free(to_delete);
+ }
+ else {
+ prev = iter;
+ iter = iter->next;
}
- prev = iter;
- iter = iter->next;
}
}
**************************************************************************/
void
libvlc_event_async_fini(libvlc_event_manager_t * p_em)
-{
+{
if(!is_queue_initialized(p_em)) return;
-
+
+ if(current_thread_is_asynch_thread(p_em))
+ {
+ fprintf(stderr, "*** Error: releasing the last reference of the observed object from its callback thread is not (yet!) supported\n");
+ abort();
+ }
+
vlc_thread_t thread = queue(p_em)->thread;
if(thread)
{
iter = iter->next;
free(elemt_to_delete);
}
-
+
free(queue(p_em));
}
{
p_em->async_event_queue = calloc(1, sizeof(struct libvlc_event_async_queue));
- int error = vlc_clone (&queue(p_em)->thread, event_async_loop, p_em, VLC_THREAD_PRIORITY_LOW);
+ int error = vlc_threadvar_create(&queue(p_em)->is_asynch_dispatch_thread_var, NULL);
+ assert(!error);
+
+ vlc_mutex_init(&queue(p_em)->lock);
+ vlc_cond_init(&queue(p_em)->signal);
+ vlc_cond_init(&queue(p_em)->signal_idle);
+
+ error = vlc_clone (&queue(p_em)->thread, event_async_loop, p_em, VLC_THREAD_PRIORITY_LOW);
if(error)
{
free(p_em->async_event_queue);
return;
}
- vlc_mutex_init(&queue(p_em)->lock);
- vlc_cond_init(&queue(p_em)->signal);
- vlc_cond_init(&queue(p_em)->signal_idle);
- error = vlc_threadvar_create(&queue(p_em)->is_asynch_dispatch_thread_var, NULL);
- assert(!error);
}
/**************************************************************************
queue_lock(p_em);
pop_listener(p_em, listener);
-
+
// Wait for the asynch_loop to have processed all events.
if(!current_thread_is_asynch_thread(p_em))
{
libvlc_event_listener_t listener;
libvlc_event_t event;
- vlc_threadvar_set(queue(p_em)->is_asynch_dispatch_thread_var, (void*)true);
+ vlc_threadvar_set(queue(p_em)->is_asynch_dispatch_thread_var, p_em);
queue_lock(p_em);
while (true) {
vlc_cond_broadcast(&queue(p_em)->signal_idle); // We'll be idle
vlc_cond_wait(&queue(p_em)->signal, &queue(p_em)->lock);
vlc_cleanup_pop();
-
+
queue(p_em)->is_idle = false;
}
}