1 /*****************************************************************************
2 * threads.c : threads implementation for the VideoLAN client
3 *****************************************************************************
4 * Copyright (C) 1999-2008 the VideoLAN team
7 * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
8 * Samuel Hocevar <sam@zoy.org>
9 * Gildas Bazin <gbazin@netcourrier.com>
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
26 *****************************************************************************/
32 #include <vlc_common.h>
41 #if defined( LIBVLC_USE_PTHREAD )
45 struct vlc_thread_boot
47 void * (*entry) (vlc_object_t *);
51 static void *thread_entry (void *data)
53 vlc_object_t *obj = ((struct vlc_thread_boot *)data)->object;
54 void *(*func) (vlc_object_t *) = ((struct vlc_thread_boot *)data)->entry;
57 msg_Dbg (obj, "thread started");
59 msg_Dbg (obj, "thread ended");
64 #undef vlc_thread_create
65 /*****************************************************************************
66 * vlc_thread_create: create a thread
67 *****************************************************************************
68 * Note that i_priority is only taken into account on platforms supporting
69 * userland real-time priority threads.
70 *****************************************************************************/
71 int vlc_thread_create( vlc_object_t *p_this, void *(*func) ( vlc_object_t * ),
75 vlc_object_internals_t *p_priv = vlc_internals( p_this );
77 struct vlc_thread_boot *boot = malloc (sizeof (*boot));
81 boot->object = p_this;
83 /* Make sure we don't re-create a thread if the object has already one */
84 assert( !p_priv->b_thread );
86 i_ret = vlc_clone( &p_priv->thread_id, thread_entry, boot, i_priority );
88 p_priv->b_thread = true;
92 msg_Err( p_this, "cannot create thread (%m)" );
99 #undef vlc_thread_join
100 /*****************************************************************************
101 * vlc_thread_join: wait until a thread exits, inner version
102 *****************************************************************************/
103 void vlc_thread_join( vlc_object_t *p_this )
105 vlc_object_internals_t *p_priv = vlc_internals( p_this );
107 vlc_join( p_priv->thread_id, NULL );
108 p_priv->b_thread = false;
111 void vlc_thread_cancel (vlc_object_t *obj)
113 vlc_object_internals_t *priv = vlc_internals (obj);
116 vlc_cancel (priv->thread_id);
119 /*** Global locks ***/
121 void vlc_global_mutex (unsigned n, bool acquire)
123 static vlc_mutex_t locks[] = {
128 assert (n < (sizeof (locks) / sizeof (locks[0])));
129 vlc_mutex_t *lock = locks + n;
132 vlc_mutex_lock (lock);
134 vlc_mutex_unlock (lock);
136 /* Compile-time assertion ;-) */
137 char enough_locks[(sizeof (locks) / sizeof (locks[0])) - VLC_MAX_MUTEX];