Author: massie
Date: Fri Jan 22 19:02:59 2010
New Revision: 902221

URL: http://svn.apache.org/viewvc?rev=902221&view=rev
Log:
AVRO-367.  Complete memory management for the C implementation

Added:
    hadoop/avro/trunk/lang/c/tests/test_valgrind   (with props)
Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/src/avro.h
    hadoop/avro/trunk/lang/c/src/datum.c
    hadoop/avro/trunk/lang/c/src/datum.h
    hadoop/avro/trunk/lang/c/src/datum_equal.c
    hadoop/avro/trunk/lang/c/src/datum_read.c
    hadoop/avro/trunk/lang/c/src/schema.c
    hadoop/avro/trunk/lang/c/src/schema.h
    hadoop/avro/trunk/lang/c/tests/Makefile.am
    hadoop/avro/trunk/lang/c/tests/test_avro_data.c
    hadoop/avro/trunk/lang/c/tests/test_avro_schema.c
    hadoop/avro/trunk/lang/c/version.sh

Modified: hadoop/avro/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Fri Jan 22 19:02:59 2010
@@ -242,6 +242,8 @@
 
     AVRO-364. Add support for encoding/decoding records (massie)
 
+    AVRO-367. Complete memory management for the C implementation (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Modified: hadoop/avro/trunk/lang/c/src/avro.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/avro.h?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/avro.h (original)
+++ hadoop/avro/trunk/lang/c/src/avro.h Fri Jan 22 19:02:59 2010
@@ -136,6 +136,9 @@
 avro_schema_t avro_schema_copy(avro_schema_t schema);
 int avro_schema_equal(avro_schema_t a, avro_schema_t b);
 
+avro_schema_t avro_schema_incref(avro_schema_t schema);
+void avro_schema_decref(avro_schema_t schema);
+
 void avro_schema_printf(avro_schema_t schema, FILE * fp);
 
 /*
@@ -165,7 +168,11 @@
  */
 typedef struct avro_obj_t *avro_datum_t;
 avro_datum_t avro_string(const char *str);
+avro_datum_t avro_wrapstring(const char *str);
+avro_datum_t avro_givestring(const char *str);
 avro_datum_t avro_bytes(const char *buf, int64_t len);
+avro_datum_t avro_wrapbytes(const char *buf, int64_t len);
+avro_datum_t avro_givebytes(const char *buf, int64_t len);
 avro_datum_t avro_int(int32_t i);
 avro_datum_t avro_long(int64_t l);
 avro_datum_t avro_float(float f);

Modified: hadoop/avro/trunk/lang/c/src/datum.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum.c Fri Jan 22 19:02:59 2010
@@ -17,10 +17,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
-#include <limits.h>
-#include <assert.h>
 #include "avro.h"
-#include "schema.h"
 #include "datum.h"
 #include "encoding.h"
 
@@ -31,38 +28,76 @@
        datum->refcount = 1;
 }
 
-avro_datum_t avro_string(const char *str)
+static avro_datum_t avro_string_private(char *str,
+                                       void (*string_free) (void *ptr))
 {
        struct avro_string_datum_t *datum =
            malloc(sizeof(struct avro_string_datum_t));
        if (!datum) {
                return NULL;
        }
-       datum->s = strdup(str);
+       datum->s = str;
+       datum->free = string_free;
 
        avro_datum_init(&datum->obj, AVRO_STRING);
        return &datum->obj;
 }
 
-avro_datum_t avro_bytes(const char *bytes, int64_t size)
+avro_datum_t avro_string(const char *str)
 {
-       struct avro_bytes_datum_t *datum =
-           malloc(sizeof(struct avro_bytes_datum_t));
-       if (!datum) {
+       char *p = strdup(str);
+       if (!p) {
                return NULL;
        }
-       datum->bytes = malloc(size);
-       if (!datum->bytes) {
-               free(datum);
+       return avro_string_private(p, free);
+}
+
+avro_datum_t avro_givestring(const char *str)
+{
+       return avro_string_private((char *)str, free);
+}
+
+avro_datum_t avro_wrapstring(const char *str)
+{
+       return avro_string_private((char *)str, NULL);
+}
+
+static avro_datum_t avro_bytes_private(char *bytes, int64_t size,
+                                      void (*bytes_free) (void *ptr))
+{
+       struct avro_bytes_datum_t *datum;
+       datum = malloc(sizeof(struct avro_bytes_datum_t));
+       if (!datum) {
                return NULL;
        }
-       memcpy(datum->bytes, bytes, size);
+       datum->bytes = bytes;
        datum->size = size;
+       datum->free = bytes_free;
 
        avro_datum_init(&datum->obj, AVRO_BYTES);
        return &datum->obj;
 }
 
+avro_datum_t avro_bytes(const char *bytes, int64_t size)
+{
+       char *bytes_copy = malloc(size);
+       if (!bytes_copy) {
+               return NULL;
+       }
+       memcpy(bytes_copy, bytes, size);
+       return avro_bytes_private(bytes_copy, size, free);
+}
+
+avro_datum_t avro_givebytes(const char *bytes, int64_t size)
+{
+       return avro_bytes_private((char *)bytes, size, free);
+}
+
+avro_datum_t avro_wrapbytes(const char *bytes, int64_t size)
+{
+       return avro_bytes_private((char *)bytes, size, NULL);
+}
+
 avro_datum_t avro_int(int32_t i)
 {
        struct avro_int_datum_t *datum =
@@ -173,10 +208,27 @@
 avro_record_field_set(const avro_datum_t datum,
                      const char *field_name, const avro_datum_t field_value)
 {
+       char *key = (char *)field_name;
+       union {
+               avro_datum_t old_value;
+               st_data_t data;
+       } val;
+
        if (is_avro_datum(datum) && is_avro_record(datum)) {
                struct avro_record_datum_t *record =
                    avro_datum_to_record(datum);
-               st_insert(record->fields, (st_data_t) field_name,
+               if (st_lookup
+                   (record->fields, (st_data_t) field_name, &val.data)) {
+                       /* Overriding old value */
+                       avro_datum_decref(val.old_value);
+               } else {
+                       /* Inserting new value */
+                       key = strdup(field_name);
+                       if (!key) {
+                               return ENOMEM;
+                       }
+               }
+               st_insert(record->fields, (st_data_t) key,
                          (st_data_t) field_value);
                return 0;
        }
@@ -232,13 +284,29 @@
 avro_map_set(const avro_datum_t datum, const char *key,
             const avro_datum_t value)
 {
+       char *save_key = (char *)key;
        struct avro_map_datum_t *map;
+       union {
+               st_data_t data;
+               avro_datum_t old_datum;
+       } val;
+
        if (!is_avro_datum(datum) || !is_avro_map(datum) || !key
            || !is_avro_datum(value)) {
                return EINVAL;
        }
        map = avro_datum_to_map(datum);
-       st_insert(map->map, (st_data_t) key, (st_data_t) value);
+       if (st_lookup(map->map, (st_data_t) key, &(val.data))) {
+               /* Overwriting an old value */
+               avro_datum_decref(val.old_datum);
+       } else {
+               /* Inserting a new value */
+               save_key = strdup(key);
+               if (!save_key) {
+                       return ENOMEM;
+               }
+       }
+       st_insert(map->map, (st_data_t) save_key, (st_data_t) value);
        return 0;
 }
 
@@ -277,17 +345,143 @@
        return 0;
 }
 
-avro_datum_t avro_datum_incref(avro_datum_t value)
+static int char_datum_free_foreach(char *key, avro_datum_t datum, void *arg)
 {
-       /*
-        * TODO 
-        */
-       return value;
+       avro_datum_decref(datum);
+       free(key);
+       return ST_DELETE;
+}
+
+static void avro_datum_free(avro_datum_t datum)
+{
+       if (is_avro_datum(datum)) {
+               switch (avro_typeof(datum)) {
+               case AVRO_STRING:{
+                               struct avro_string_datum_t *string;
+                               string = avro_datum_to_string(datum);
+                               if (string->free) {
+                                       string->free(string->s);
+                               }
+                               free(string);
+                       }
+                       break;
+               case AVRO_BYTES:{
+                               struct avro_bytes_datum_t *bytes;
+                               bytes = avro_datum_to_bytes(datum);
+                               if (bytes->free) {
+                                       bytes->free(bytes->bytes);
+                               }
+                               free(bytes);
+                       }
+                       break;
+               case AVRO_INT:{
+                               struct avro_int_datum_t *i;
+                               i = avro_datum_to_int(datum);
+                               free(i);
+                       }
+                       break;
+               case AVRO_LONG:{
+                               struct avro_long_datum_t *l;
+                               l = avro_datum_to_long(datum);
+                               free(l);
+                       }
+                       break;
+               case AVRO_FLOAT:{
+                               struct avro_float_datum_t *f;
+                               f = avro_datum_to_float(datum);
+                               free(f);
+                       }
+                       break;
+               case AVRO_DOUBLE:{
+                               struct avro_double_datum_t *d;
+                               d = avro_datum_to_double(datum);
+                               free(d);
+                       }
+                       break;
+               case AVRO_BOOLEAN:{
+                               struct avro_boolean_datum_t *b;
+                               b = avro_datum_to_boolean(datum);
+                               free(b);
+                       }
+                       break;
+               case AVRO_NULL:
+                       /* Nothing allocated */
+                       break;
+
+               case AVRO_RECORD:{
+                               struct avro_record_datum_t *record;
+                               record = avro_datum_to_record(datum);
+                               free((void *)record->name);
+                               st_foreach(record->fields,
+                                          char_datum_free_foreach, 0);
+                               st_free_table(record->fields);
+                               free(record);
+                       }
+                       break;
+               case AVRO_ENUM:{
+                               struct avro_enum_datum_t *enump;
+                               enump = avro_datum_to_enum(datum);
+                               free((void *)enump->name);
+                               free((void *)enump->symbol);
+                               free(enump);
+                       }
+                       break;
+               case AVRO_FIXED:{
+                               struct avro_fixed_datum_t *fixed;
+                               fixed = avro_datum_to_fixed(datum);
+                               free((void *)fixed->name);
+                               free((void *)fixed->bytes);
+                               free(fixed);
+                       }
+                       break;
+               case AVRO_MAP:{
+                               struct avro_map_datum_t *map;
+                               map = avro_datum_to_map(datum);
+                               st_foreach(map->map, char_datum_free_foreach,
+                                          0);
+                               st_free_table(map->map);
+                               free(map);
+                       }
+                       break;
+               case AVRO_ARRAY:{
+                               struct avro_array_datum_t *array;
+                               array = avro_datum_to_array(datum);
+                               while (!STAILQ_EMPTY(&array->els)) {
+                                       struct avro_array_element_t *el;
+                                       el = STAILQ_FIRST(&array->els);
+                                       STAILQ_REMOVE_HEAD(&array->els, els);
+                                       avro_datum_decref(el->datum);
+                                       free(el);
+                               }
+                               free(array);
+                       }
+                       break;
+               case AVRO_UNION:{
+                               /* TODO */
+                       }
+                       break;
+               case AVRO_LINK:{
+                               /* TODO */
+                       }
+                       break;
+               }
+       }
 }
 
-void avro_datum_decref(avro_datum_t value)
+avro_datum_t avro_datum_incref(avro_datum_t datum)
 {
+       if (datum && datum->refcount != (unsigned int)-1) {
+               ++datum->refcount;
+       }
+       return datum;
+}
 
+void avro_datum_decref(avro_datum_t datum)
+{
+       if (datum && datum->refcount != (unsigned int)-1
+           && --datum->refcount == 0) {
+               avro_datum_free(datum);
+       }
 }
 
 void avro_datum_print(avro_datum_t value, FILE * fp)

Modified: hadoop/avro/trunk/lang/c/src/datum.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.h?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.h (original)
+++ hadoop/avro/trunk/lang/c/src/datum.h Fri Jan 22 19:02:59 2010
@@ -25,12 +25,14 @@
 struct avro_string_datum_t {
        struct avro_obj_t obj;
        char *s;
+       void (*free) (void *ptr);
 };
 
 struct avro_bytes_datum_t {
        struct avro_obj_t obj;
        char *bytes;
        int64_t size;
+       void (*free) (void *ptr);
 };
 
 struct avro_int_datum_t {

Modified: hadoop/avro/trunk/lang/c/src/datum_equal.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_equal.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Fri Jan 22 19:02:59 2010
@@ -77,11 +77,8 @@
 {
        struct st_equal_args args = { 1, b->fields };
        if (a->fields->num_entries != b->fields->num_entries) {
-               fprintf(stderr, "num entries mismatch %d != %d\n",
-                       a->fields->num_entries, b->fields->num_entries);
                return 0;
        }
-       fprintf(stderr, "Each record has %d values\n", a->fields->num_entries);
        st_foreach(a->fields, st_equal_foreach, (st_data_t) & args);
        return args.rval;
 }

Modified: hadoop/avro/trunk/lang/c/src/datum_read.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_read.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Fri Jan 22 19:02:59 2010
@@ -194,12 +194,15 @@
                                           avro_schema_to_map(readers_schema)->
                                           values, &value);
                        if (rval) {
+                               free(key);
                                return rval;
                        }
                        rval = avro_map_set(map, key, value);
                        if (rval) {
+                               free(key);
                                return rval;
                        }
+                       free(key);
                }
                rval = enc->read_long(reader, &block_count);
                if (rval) {
@@ -314,7 +317,7 @@
                {
                        char *s;
                        rval = enc->read_string(reader, &s);
-                       *datum = avro_string(s);
+                       *datum = avro_givestring(s);
                }
                break;
 
@@ -355,7 +358,7 @@
                        char *bytes;
                        int64_t len;
                        rval = enc->read_bytes(reader, &bytes, &len);
-                       *datum = avro_bytes(bytes, len);
+                       *datum = avro_givebytes(bytes, len);
                }
                break;
 

Modified: hadoop/avro/trunk/lang/c/src/schema.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema.c Fri Jan 22 19:02:59 2010
@@ -58,12 +58,118 @@
        return 0;
 }
 
-/*
- * TODO 
- */
-void avro_schema_free(avro_schema_t schema)
+static void avro_schema_free(avro_schema_t schema)
 {
-       return;
+       if (is_avro_schema(schema)) {
+               switch (avro_typeof(schema)) {
+               case AVRO_STRING:
+               case AVRO_BYTES:
+               case AVRO_INT:
+               case AVRO_LONG:
+               case AVRO_FLOAT:
+               case AVRO_DOUBLE:
+               case AVRO_BOOLEAN:
+               case AVRO_NULL:
+                       /* no memory allocated for primitives */
+                       return;
+
+               case AVRO_RECORD:{
+                               struct avro_record_schema_t *record;
+                               record = avro_schema_to_record(schema);
+                               free(record->name);
+                               while (!STAILQ_EMPTY(&record->fields)) {
+                                       struct avro_record_field_t *field;
+                                       field = STAILQ_FIRST(&record->fields);
+                                       STAILQ_REMOVE_HEAD(&record->fields,
+                                                          fields);
+                                       avro_schema_decref(field->type);
+                                       free(field->name);
+                                       free(field);
+                               }
+                               free(record);
+                       }
+                       break;
+
+               case AVRO_ENUM:{
+                               struct avro_enum_schema_t *enump;
+                               enump = avro_schema_to_enum(schema);
+                               free(enump->name);
+                               while (!STAILQ_EMPTY(&enump->symbols)) {
+                                       struct avro_enum_symbol_t *symbol;
+                                       symbol = STAILQ_FIRST(&enump->symbols);
+                                       STAILQ_REMOVE_HEAD(&enump->symbols,
+                                                          symbols);
+                                       free(symbol->symbol);
+                                       free(symbol);
+                               }
+                               free(enump);
+                       }
+                       break;
+
+               case AVRO_FIXED:{
+                               struct avro_fixed_schema_t *fixed;
+                               fixed = avro_schema_to_fixed(schema);
+                               free((char *)fixed->name);
+                               free(fixed);
+                       }
+                       break;
+
+               case AVRO_MAP:{
+                               struct avro_map_schema_t *map;
+                               map = avro_schema_to_map(schema);
+                               avro_schema_decref(map->values);
+                               free(map);
+                       }
+                       break;
+
+               case AVRO_ARRAY:{
+                               struct avro_array_schema_t *array;
+                               array = avro_schema_to_array(schema);
+                               avro_schema_decref(array->items);
+                               free(array);
+                       }
+                       break;
+               case AVRO_UNION:{
+                               struct avro_union_schema_t *unionp;
+                               unionp = avro_schema_to_union(schema);
+                               while (!STAILQ_EMPTY(&unionp->branches)) {
+                                       struct avro_union_branch_t *branch;
+                                       branch =
+                                           STAILQ_FIRST(&unionp->branches);
+                                       STAILQ_REMOVE_HEAD(&unionp->branches,
+                                                          branches);
+                                       avro_schema_decref(branch->schema);
+                                       free(branch);
+                               }
+                               free(unionp);
+                       }
+                       break;
+
+               case AVRO_LINK:{
+                               struct avro_link_schema_t *link;
+                               link = avro_schema_to_link(schema);
+                               avro_schema_decref(link->to);
+                               free(link);
+                       }
+                       break;
+               }
+       }
+}
+
+avro_schema_t avro_schema_incref(avro_schema_t schema)
+{
+       if (schema && schema->refcount != (unsigned int)-1) {
+               ++schema->refcount;
+       }
+       return schema;
+}
+
+void avro_schema_decref(avro_schema_t schema)
+{
+       if (schema && schema->refcount != (unsigned int)-1
+           && --schema->refcount == 0) {
+               avro_schema_free(schema);
+       }
 }
 
 avro_schema_t avro_schema_string(void)
@@ -189,7 +295,7 @@
        if (!s) {
                return ENOMEM;
        }
-       s->schema = schema;
+       s->schema = avro_schema_incref(schema);
        STAILQ_INSERT_TAIL(&unionp->branches, s, branches);
        return 0;
 }

Modified: hadoop/avro/trunk/lang/c/src/schema.h
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.h?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.h (original)
+++ hadoop/avro/trunk/lang/c/src/schema.h Fri Jan 22 19:02:59 2010
@@ -87,22 +87,4 @@
 #define avro_schema_to_fixed(schema_)   (container_of(schema_, struct 
avro_fixed_schema_t, obj))
 #define avro_schema_to_link(schema_)    (container_of(schema_, struct 
avro_link_schema_t, obj))
 
-static inline avro_schema_t avro_schema_incref(avro_schema_t schema)
-{
-       if (schema && schema->refcount != (unsigned int)-1) {
-               ++schema->refcount;
-       }
-       return schema;
-}
-
-void avro_schema_free(avro_schema_t schema);
-
-static inline void avro_schema_decref(avro_schema_t schema)
-{
-       if (schema && schema->refcount != (unsigned int)-1
-           && --schema->refcount == 0) {
-               avro_schema_free(schema);
-       }
-}
-
 #endif

Modified: hadoop/avro/trunk/lang/c/tests/Makefile.am
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/Makefile.am?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/Makefile.am (original)
+++ hadoop/avro/trunk/lang/c/tests/Makefile.am Fri Jan 22 19:02:59 2010
@@ -3,7 +3,7 @@
 AM_CFLAGS=-Wall 
 ACLOCAL_AMFLAGS=-I m4
 
-EXTRA_DIST=schema_tests
+EXTRA_DIST=schema_tests test_valgrind
 
 check_PROGRAMS=test_avro_schema test_avro_data
 
@@ -18,4 +18,4 @@
 test_avro_interop_SOURCES=test_avro_interop.c
 test_avro_interop_LDADD=$(test_LDADD)
 
-TESTS=$(check_PROGRAMS)
+TESTS=$(check_PROGRAMS) test_valgrind

Modified: hadoop/avro/trunk/lang/c/tests/test_avro_data.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_avro_data.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_avro_data.c (original)
+++ hadoop/avro/trunk/lang/c/tests/test_avro_data.c Fri Jan 22 19:02:59 2010
@@ -60,12 +60,13 @@
                "a new nation", "conceived in Liberty",
                "and dedicated to the proposition that all men are created 
equal."
        };
+       avro_schema_t writer_schema = avro_schema_string();
        for (i = 0; i < sizeof(strings) / sizeof(strings[0]); i++) {
-               avro_schema_t writer_schema = avro_schema_string();
-               avro_datum_t datum = avro_string(strings[i]);
+               avro_datum_t datum = avro_wrapstring(strings[i]);
                write_read_check(writer_schema, NULL, datum, "string");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(writer_schema);
        return 0;
 }
 
@@ -73,70 +74,76 @@
 {
        char bytes[] = { 0xDE, 0xAD, 0xBE, 0xEF };
        avro_schema_t writer_schema = avro_schema_bytes();
-       avro_datum_t datum = avro_bytes(bytes, sizeof(bytes));
+       avro_datum_t datum = avro_wrapbytes(bytes, sizeof(bytes));
 
        write_read_check(writer_schema, NULL, datum, "bytes");
        avro_datum_decref(datum);
+       avro_schema_decref(writer_schema);
        return 0;
 }
 
 static int test_int(void)
 {
        int i;
+       avro_schema_t writer_schema = avro_schema_int();
        for (i = 0; i < 100; i++) {
-               avro_schema_t writer_schema = avro_schema_int();
                avro_datum_t datum = avro_int(rand());
                write_read_check(writer_schema, NULL, datum, "int");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(writer_schema);
        return 0;
 }
 
 static int test_long(void)
 {
        int i;
+       avro_schema_t writer_schema = avro_schema_long();
        for (i = 0; i < 100; i++) {
-               avro_schema_t writer_schema = avro_schema_long();
                avro_datum_t datum = avro_long(rand());
                write_read_check(writer_schema, NULL, datum, "long");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(writer_schema);
        return 0;
 }
 
 static int test_double(void)
 {
        int i;
+       avro_schema_t schema = avro_schema_double();
        for (i = 0; i < 100; i++) {
-               avro_schema_t schema = avro_schema_double();
                avro_datum_t datum = avro_double((double)(rand()));
                write_read_check(schema, NULL, datum, "double");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(schema);
        return 0;
 }
 
 static int test_float(void)
 {
        int i;
+       avro_schema_t schema = avro_schema_double();
        for (i = 0; i < 100; i++) {
-               avro_schema_t schema = avro_schema_double();
                avro_datum_t datum = avro_double((double)(rand()));
                write_read_check(schema, NULL, datum, "float");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(schema);
        return 0;
 }
 
 static int test_boolean(void)
 {
        int i;
+       avro_schema_t schema = avro_schema_boolean();
        for (i = 0; i <= 1; i++) {
-               avro_schema_t schema = avro_schema_boolean();
                avro_datum_t datum = avro_boolean(i);
                write_read_check(schema, NULL, datum, "boolean");
                avro_datum_decref(datum);
        }
+       avro_schema_decref(schema);
        return 0;
 }
 
@@ -157,10 +164,14 @@
        avro_schema_record_field_append(schema, "name", avro_schema_string());
        avro_schema_record_field_append(schema, "age", avro_schema_int());
 
-       avro_record_field_set(datum, "name", avro_string("Joseph Campbell"));
+       avro_record_field_set(datum, "name",
+                             avro_wrapstring("Joseph Campbell"));
        avro_record_field_set(datum, "age", avro_int(83));
 
        write_read_check(schema, NULL, datum, "record");
+
+       avro_datum_decref(datum);
+       avro_schema_decref(schema);
        return 0;
 }
 
@@ -186,6 +197,7 @@
        }
        write_read_check(schema, NULL, datum, "array");
        avro_datum_decref(datum);
+       avro_schema_decref(schema);
        return 0;
 }
 
@@ -202,6 +214,7 @@
        }
        write_read_check(schema, NULL, datum, "map");
        avro_datum_decref(datum);
+       avro_schema_decref(schema);
        return 0;
 }
 

Modified: hadoop/avro/trunk/lang/c/tests/test_avro_schema.c
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_avro_schema.c?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_avro_schema.c (original)
+++ hadoop/avro/trunk/lang/c/tests/test_avro_schema.c Fri Jan 22 19:02:59 2010
@@ -70,6 +70,8 @@
                                                        "failed to 
avro_schema_equal(schema,avro_schema_copy())\n");
                                                exit(EXIT_FAILURE);
                                        }
+                                       avro_schema_decref(schema_copy);
+                                       avro_schema_decref(schema);
                                } else {
                                        /*
                                         * Unexpected success 

Added: hadoop/avro/trunk/lang/c/tests/test_valgrind
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/tests/test_valgrind?rev=902221&view=auto
==============================================================================
--- hadoop/avro/trunk/lang/c/tests/test_valgrind (added)
+++ hadoop/avro/trunk/lang/c/tests/test_valgrind Fri Jan 22 19:02:59 2010
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0 
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.  See the License for the specific language governing
+# permissions and limitations under the License. 
+set +e
+set -x
+
+if ! which valgrind; then
+       echo "Unable to find valgrind installed. Test will not run."
+       # This special exit value will show that we skipped this test
+       exit 77
+fi
+
+LD_LIBRARY_PATH="../src/.libs/:${LD_LIBRARY_PATH}"
+valgrind --leak-check=full --show-reachable=yes -q .libs/test_avro_data 2>&1 |\
+grep -E '^==[0-9]+== '
+if [ $? -eq 0 ]; then
+       # Expression found. Test failed.
+       exit 1
+else
+       # We're all clean
+       exit 0
+fi

Propchange: hadoop/avro/trunk/lang/c/tests/test_valgrind
------------------------------------------------------------------------------
    svn:executable = *

Modified: hadoop/avro/trunk/lang/c/version.sh
URL: 
http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/version.sh?rev=902221&r1=902220&r2=902221&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/version.sh (original)
+++ hadoop/avro/trunk/lang/c/version.sh Fri Jan 22 19:02:59 2010
@@ -18,9 +18,9 @@
 #         libavro_binary_age = 0
 #         libavro_interface_age = 0
 #
-libavro_micro_version=7
+libavro_micro_version=8
 libavro_interface_age=0
-libavro_binary_age=2
+libavro_binary_age=3
 
 # IGNORE EVERYTHING ELSE FROM HERE DOWN.........
 if test $# != 1; then


Reply via email to