Commit ef2f6e1f authored by Thomas Vander Stichele's avatar Thomas Vander Stichele
Browse files

ok, my latest added error checking and stuff this reverts uraeus's patch but...

ok, my latest added error checking and stuff this reverts uraeus's patch but should tell us what goes wrong with munmap

Original commit message from CVS:
ok, my latest added error checking and stuff
this reverts uraeus's patch but should tell us what goes wrong with munmap
parent 7cc370b0
......@@ -55,7 +55,7 @@ struct _cothread_context
static pthread_key_t _cothread_key = -1;
/* Disablig this define allows you to shut off a few checks in
/* Disabling this define allows you to shut off a few checks in
* cothread_switch. This likely will speed things up fractionally */
#define COTHREAD_PARANOID
......@@ -265,9 +265,7 @@ cothread_destroy (cothread_state *thread)
g_free (thread);
}
else {
/* this doesn't seem to work very well */
/* munmap ((void *) thread, COTHREAD_STACKSIZE); */
int res = 0;
int res;
GST_DEBUG (GST_CAT_COTHREADS,
"unmap cothread slot stack from %p to %p (size %ld)",
......@@ -275,7 +273,7 @@ cothread_destroy (cothread_state *thread)
(long) COTHREAD_STACKSIZE);
GST_DEBUG (GST_CAT_COTHREADS, "doing an munmap at %p of size %d\n",
thread, COTHREAD_STACKSIZE);
/* res = munmap ((void *) thread, COTHREAD_STACKSIZE); */
res = munmap ((void *) thread, COTHREAD_STACKSIZE);
if (res != 0)
{
switch (res)
......@@ -502,6 +500,8 @@ cothread_stackquery (void **stack, glong* stacksize)
*stacksize = 0;
return FALSE;
}
GST_DEBUG (GST_CAT_THREAD, "have posix_memalign at %p of size %d\n",
(void *) *stack, STACK_SIZE);
GST_DEBUG (GST_CAT_COTHREADS,
"Got new cothread stack from %p to %p (size %ld)\n",
*stack, *stack + STACK_SIZE - 1, (long) STACK_SIZE);
......
......@@ -2,7 +2,7 @@
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstschedulerr.h: Header for default schedulerr code
* gstscheduler.h: Header for default scheduler code
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
......
......@@ -154,6 +154,8 @@ static void
gst_thread_dispose (GObject *object)
{
GstThread *thread = GST_THREAD (object);
void *stack;
long stacksize;
GST_DEBUG (GST_CAT_REFCOUNTING, "dispose");
......@@ -162,6 +164,12 @@ gst_thread_dispose (GObject *object)
G_OBJECT_CLASS (parent_class)->dispose (object);
GST_DEBUG (GST_CAT_THREAD, "Disposing of thread");
pthread_attr_getstack (&thread->attr, &stack, (size_t *) &stacksize);
GST_DEBUG (GST_CAT_THREAD, "undng posix_memalign at %p of size %ld\n",
stack, stacksize);
free (stack);
if (GST_ELEMENT_SCHED (thread)) {
gst_object_unref (GST_OBJECT (GST_ELEMENT_SCHED (thread)));
}
......@@ -274,16 +282,27 @@ gst_thread_change_state (GstElement * element)
g_mutex_lock (thread->lock);
pthread_attr_init (&thread->attr);
if (pthread_attr_init (&thread->attr) != 0)
g_warning ("pthread_attr_init returned an error !");
if (gst_scheduler_get_prefered_stack (GST_ELEMENT_SCHED (element), &stack, &stacksize)) {
pthread_attr_setstack (&thread->attr, stack, stacksize);
if (pthread_attr_setstack (&thread->attr, stack, stacksize) != 0)
g_warning ("pthread_attr_setstack failed !\n");
GST_DEBUG (GST_CAT_THREAD,
"pthread attr set stack at %p of size %ld",
stack, stacksize);
}
else
g_warning ("_get_prefered_stack failed !\n");
/* create the thread */
THR_DEBUG ("going to pthread_create...");
if (pthread_create (&thread->thread_id, &thread->attr, gst_thread_main_loop, thread) != 0) {
THR_DEBUG ("pthread create failed");
g_mutex_unlock (thread->lock);
THR_DEBUG ("could not create thread \"%s\"", GST_ELEMENT_NAME (element));
return GST_STATE_FAILURE;
}
THR_DEBUG ("pthread created");
/* wait for it to 'spin up' */
THR_DEBUG ("waiting for child thread spinup");
......@@ -402,10 +421,22 @@ gst_thread_change_state (GstElement * element)
THR_DEBUG ("waiting for ack");
g_cond_wait (thread->cond, thread->lock);
THR_DEBUG ("got ack");
pthread_join (thread->thread_id, NULL);
if (pthread_join (thread->thread_id, NULL) != 0)
g_warning ("pthread_join has failed !\n");
if (pthread_attr_destroy (&thread->attr) != 0)
g_warning ("pthread_attr_destroy has failed !\n");
thread->thread_id = -1;
g_mutex_unlock (thread->lock);
/*
* FIXME: we moved this code to the scheduler dispose function
pthread_attr_getstack (&thread->attr, &stack, (size_t *) &stacksize);
GST_DEBUG (GST_CAT_THREAD, "undng posix_memalign at %p of size %ld\n",
stack, stacksize);
stack, stacksize);
free (thread->stack);
thread->stack = 0;
*/
GST_FLAG_UNSET (thread, GST_THREAD_STATE_REAPING);
GST_FLAG_UNSET (thread, GST_THREAD_STATE_STARTED);
GST_FLAG_UNSET (thread, GST_THREAD_STATE_SPINNING);
......@@ -440,9 +471,11 @@ gst_thread_change_state (GstElement * element)
static void *
gst_thread_main_loop (void *arg)
{
GstThread *thread = GST_THREAD (arg);
GstThread *thread = NULL;
gint stateset;
THR_DEBUG ("gst_thread_main_loop started");
thread = GST_THREAD (arg);
g_mutex_lock (thread->lock);
gst_scheduler_setup (GST_ELEMENT_SCHED (thread));
......
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