draw closure in cfv optimisation
[lttv.git] / ltt / branches / poly / lttv / lttv / attribute.c
index a862cdf78ec094a9fe015b539d41c0221fdae09c..081265c7cede526a9ab3984e792fe8b46c234f98 100644 (file)
@@ -16,6 +16,7 @@
  * MA 02111-1307, USA.
  */
 
+#include <string.h>
 #include <lttv/attribute.h>
 #include <ltt/ltt.h>
 
@@ -40,7 +41,8 @@ typedef struct _Attribute {
 } Attribute;
 
 
-LttvAttributeValue address_of_value(LttvAttributeType t, AttributeValue *v)
+static __inline__ LttvAttributeValue address_of_value(LttvAttributeType t,
+                                                      AttributeValue *v)
 {
   LttvAttributeValue va;
 
@@ -55,6 +57,7 @@ LttvAttributeValue address_of_value(LttvAttributeType t, AttributeValue *v)
   case LTTV_POINTER: va.v_pointer = &v->dv_pointer; break;
   case LTTV_STRING: va.v_string = &v->dv_string; break;
   case LTTV_GOBJECT: va.v_gobject = &v->dv_gobject; break;
+  case LTTV_NONE: break;
   }
   return va;
 }
@@ -75,6 +78,7 @@ AttributeValue init_value(LttvAttributeType t)
   case LTTV_POINTER: v.dv_pointer = NULL; break;
   case LTTV_STRING: v.dv_string = NULL; break;
   case LTTV_GOBJECT: v.dv_gobject = NULL; break;
+  case LTTV_NONE: break;
   }
   return v;
 }
@@ -161,6 +165,10 @@ lttv_attribute_remove(LttvAttribute *self, unsigned i)
 
   a = &g_array_index(self->attributes, Attribute, i);
 
+  /* If the element is a gobject, unreference it. */
+  if(a->type == LTTV_GOBJECT && a->value.dv_gobject != NULL)
+    g_object_unref(a->value.dv_gobject);
+  
   /* Remove the array element and its entry in the name index */
 
   g_hash_table_remove(self->names, GUINT_TO_POINTER(a->name));
@@ -234,7 +242,7 @@ lttv_attribute_find(LttvAttribute *self, LttvAttributeName name,
 }
 
 
-void lttv_attribute_recursive_free(LttvAttribute *self)
+/*void lttv_attribute_recursive_free(LttvAttribute *self)
 {
   int i, nb;
 
@@ -249,7 +257,7 @@ void lttv_attribute_recursive_free(LttvAttribute *self)
     }
   }
   g_object_unref(self);
-}
+}*/
 
 
 void lttv_attribute_recursive_add(LttvAttribute *dest, LttvAttribute *src)
@@ -272,7 +280,7 @@ void lttv_attribute_recursive_add(LttvAttribute *dest, LttvAttribute *src)
     else {
       g_assert(lttv_attribute_find(dest, a->name, a->type, &value));
       switch(a->type) {
-       case LTTV_INT:
+             case LTTV_INT:
           *value.v_int += a->value.dv_int;
           break;
         case LTTV_UINT:
@@ -356,7 +364,7 @@ lttv_attribute_write_xml(LttvAttribute *self, FILE *fp, int pos, int indent)
           fprintf(fp, "TYPE=DOUBLE VALUE=%f/>\n", a->value.dv_double);
           break;
         case LTTV_TIME:
-          fprintf(fp, "TYPE=TIME SEC=%u NSEC=%u/>\n", a->value.dv_time.tv_sec,
+          fprintf(fp, "TYPE=TIME SEC=%lu NSEC=%lu/>\n", a->value.dv_time.tv_sec,
               a->value.dv_time.tv_nsec);
           break;
         case LTTV_POINTER:
@@ -382,9 +390,7 @@ lttv_attribute_write_xml(LttvAttribute *self, FILE *fp, int pos, int indent)
 void 
 lttv_attribute_read_xml(LttvAttribute *self, FILE *fp)
 {
-  int i, nb, res;
-
-  Attribute *a;
+  int res;
 
   char buffer[256], type[10];
 
@@ -433,12 +439,12 @@ lttv_attribute_read_xml(LttvAttribute *self, FILE *fp)
     }
     else if(strcmp(type, "DOUBLE") == 0) {
       value = lttv_attribute_add(self, name, LTTV_DOUBLE);
-      res = fscanf(fp, " VALUE=%f/>", value.v_double);
+      res = fscanf(fp, " VALUE=%lf/>", value.v_double);
       g_assert(res == 1);
     }
     else if(strcmp(type, "TIME") == 0) {
       value = lttv_attribute_add(self, name, LTTV_TIME);
-      res = fscanf(fp, " SEC=%u NSEC=%u/>", &(value.v_time->tv_sec), 
+      res = fscanf(fp, " SEC=%lu NSEC=%lu/>", &(value.v_time->tv_sec), 
           &(value.v_time->tv_nsec));
       g_assert(res == 2);
     }
@@ -509,12 +515,12 @@ attribute_interface_init (gpointer g_iface, gpointer iface_data)
 
 }
 
-
 static void
 attribute_instance_init (GTypeInstance *instance, gpointer g_class)
 {
   LttvAttribute *self = (LttvAttribute *)instance;
-  self->names = g_hash_table_new(g_direct_hash, g_direct_equal);
+  self->names = g_hash_table_new(g_direct_hash,
+                                 g_direct_equal);
   self->attributes = g_array_new(FALSE, FALSE, sizeof(Attribute));
 }
 
@@ -522,11 +528,15 @@ attribute_instance_init (GTypeInstance *instance, gpointer g_class)
 static void
 attribute_finalize (LttvAttribute *self)
 {
-  g_hash_table_destroy(self->names);
+  guint i;
   g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "attribute_finalize()");
+
+  for(i=0;i<self->attributes->len;i++) {
+    lttv_attribute_remove(self, i);
+  }
+  
+  g_hash_table_destroy(self->names);
   g_array_free(self->attributes, TRUE);
-  G_OBJECT_CLASS(g_type_class_peek_parent(
-      g_type_class_peek(LTTV_ATTRIBUTE_TYPE)))->finalize(G_OBJECT(self));
 }
 
 
@@ -552,7 +562,8 @@ lttv_attribute_get_type (void)
       NULL,   /* class_data */
       sizeof (LttvAttribute),
       0,      /* n_preallocs */
-      (GInstanceInitFunc) attribute_instance_init    /* instance_init */
+      (GInstanceInitFunc) attribute_instance_init,    /* instance_init */
+      NULL    /* value handling */
     };
 
     static const GInterfaceInfo iattribute_info = {
This page took 0.026821 seconds and 4 git commands to generate.