+2006-12-09 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst/gst.c: (ensure_current_registry_forking):
+ Ignore EINTR when reading from the child registry pipe.
+ Explicitly ignore the return value from close, since it makes no
+ difference.
+
+ * gst/gstminiobject.c: (gst_mini_object_ref),
+ (gst_mini_object_unref):
+ When debugging refcounts, check GST_IS_MINI_OBJECT and warn.
+
+ * gst/gstregistry.c: (_priv_gst_registry_remove_cache_plugins):
+ When removing cached plugins, remove their features too, so they're
+ not visible after they've disappeared.
+
+ * gst/gstutils.c: (prepare_link_maybe_ghosting):
+ In the unlikely case that we are linking pads with no parents, don't
+ crash trying to get the non-existent parent bin.
+
+ * gst/parse/grammar.y:
+ Output debug in the PIPELINE category
+
2005-03-08 Wim Taymans <wim@fluendo.com>
Patch by: René Stadler <mail at renestadler dot de>
#ifdef HAVE_FORK
pid_t pid;
int pfd[2];
+ int ret;
/* We fork here, and let the child read and possibly rebuild the registry.
* After that, the parent will re-read the freshly generated registry. */
gchar res_byte;
/* this is the child. Close the read pipe */
- close (pfd[0]);
+ (void) close (pfd[0]);
GST_DEBUG ("child reading registry cache");
res =
/* write a result byte to the pipe */
res_byte = res ? '1' : '0';
- if (write (pfd[1], &res_byte, 1) != 1 || close (pfd[1]) != 0) {
- /* could not write to pipe, probably means parent has exited before us */
- }
+ do {
+ ret = write (pfd[1], &res_byte, 1);
+ } while (ret == -1 && errno == EINTR);
+ /* if ret == -1 now, we could not write to pipe, probably
+ * means parent has exited before us */
+ (void) close (pfd[1]);
+
_exit (0);
} else {
- int ret;
gchar res_byte;
/* parent. Close write pipe */
- close (pfd[1]);
+ (void) close (pfd[1]);
/* Wait for result from the pipe */
GST_DEBUG ("Waiting for data from child");
- ret = read (pfd[0], &res_byte, 1);
+ do {
+ ret = read (pfd[0], &res_byte, 1);
+ } while (ret == -1 && errno == EINTR);
+
if (ret == -1) {
g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
_("Error re-scanning registry %s: %s"),
close (pfd[0]);
return FALSE;
}
- close (pfd[0]);
+ (void) close (pfd[0]);
/* Wait to ensure the child is reaped, but ignore the result */
GST_DEBUG ("parent waiting on child");
* function might resurect an object
g_return_val_if_fail (mini_object->refcount > 0, NULL);
*/
-
#ifdef DEBUG_REFCOUNT
+ g_return_val_if_fail (GST_IS_MINI_OBJECT (mini_object), NULL);
+
GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p ref %d->%d",
mini_object,
GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object),
g_return_if_fail (mini_object->refcount > 0);
#ifdef DEBUG_REFCOUNT
+ g_return_if_fail (GST_IS_MINI_OBJECT (mini_object));
+
GST_CAT_LOG (GST_CAT_REFCOUNTING, "%p unref %d->%d",
mini_object,
GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object),
GST_DEBUG_OBJECT (registry, "removing cached plugin \"%s\"",
GST_STR_NULL (plugin->filename));
registry->plugins = g_list_delete_link (registry->plugins, g);
+ gst_registry_remove_features_for_plugin_unlocked (registry, plugin);
gst_object_unref (plugin);
changed = TRUE;
}
e1 = GST_OBJECT_PARENT (*src);
e2 = GST_OBJECT_PARENT (*sink);
+ if (G_UNLIKELY (e1 == NULL)) {
+ GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
+ GST_PTR_FORMAT, *src);
+ return FALSE;
+ }
+ if (G_UNLIKELY (e2 == NULL)) {
+ GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
+ GST_PTR_FORMAT, *sink);
+ return FALSE;
+ }
+
if (GST_OBJECT_PARENT (e1) == GST_OBJECT_PARENT (e2)) {
GST_CAT_INFO (GST_CAT_PADS, "%s and %s in same bin, no need for ghost pads",
GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
/* we need to setup some ghost pads */
root = find_common_root (e1, e2);
if (!root) {
- g_warning
- ("Trying to connect elements that don't share a common ancestor: %s and %s\n",
- GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2));
+ g_warning ("Trying to connect elements that don't share a common "
+ "ancestor: %s and %s", GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2));
return FALSE;
}
if (gst_child_proxy_lookup (GST_OBJECT (element), value, &target, &pspec)) {
value_type = G_PARAM_SPEC_VALUE_TYPE (pspec);
- GST_LOG ("parsing property %s as a %s", pspec->name,
+ GST_CAT_LOG (GST_CAT_PIPELINE, "parsing property %s as a %s", pspec->name,
g_type_name (value_type));
g_value_init (&v, value_type);
if (!gst_value_deserialize (&v, pos))