+ vlc_object_internals_t *p_priv = vlc_internals( p_this );
+ libvlc_priv_t *libpriv = libvlc_priv (p_this->p_libvlc);
+
+ struct vlc_thread_boot *boot = malloc (sizeof (*boot));
+ if (boot == NULL)
+ return errno;
+ boot->entry = func;
+ boot->object = p_this;
+
+ vlc_mutex_lock (&libpriv->threads_lock);
+ libpriv->threads_count++;
+ vlc_mutex_unlock (&libpriv->threads_lock);
+
+ vlc_object_lock( p_this );
+
+ /* Make sure we don't re-create a thread if the object has already one */
+ assert( !p_priv->b_thread );
+
+#if defined( LIBVLC_USE_PTHREAD )
+ pthread_attr_t attr;
+ pthread_attr_init (&attr);
+
+ /* Block the signals that signals interface plugin handles.
+ * If the LibVLC caller wants to handle some signals by itself, it should
+ * block these before whenever invoking LibVLC. And it must obviously not
+ * start the VLC signals interface plugin.
+ *
+ * LibVLC will normally ignore any interruption caused by an asynchronous
+ * signal during a system call. But there may well be some buggy cases
+ * where it fails to handle EINTR (bug reports welcome). Some underlying
+ * libraries might also not handle EINTR properly.
+ */
+ sigset_t set, oldset;
+ sigemptyset (&set);
+ sigdelset (&set, SIGHUP);
+ sigaddset (&set, SIGINT);
+ sigaddset (&set, SIGQUIT);
+ sigaddset (&set, SIGTERM);
+
+ sigaddset (&set, SIGPIPE); /* We don't want this one, really! */
+ pthread_sigmask (SIG_BLOCK, &set, &oldset);