You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ma...@apache.org on 2010/02/04 00:59:41 UTC

svn commit: r906293 - in /hadoop/avro/trunk: ./ lang/c/examples/ lang/c/jansson/ lang/c/src/

Author: massie
Date: Wed Feb  3 23:59:40 2010
New Revision: 906293

URL: http://svn.apache.org/viewvc?rev=906293&view=rev
Log:
AVRO-394. Simplify and consolidate all data structures into hash tables

Removed:
    hadoop/avro/trunk/lang/c/src/queue.h
Modified:
    hadoop/avro/trunk/CHANGES.txt
    hadoop/avro/trunk/lang/c/examples/   (props changed)
    hadoop/avro/trunk/lang/c/jansson/   (props changed)
    hadoop/avro/trunk/lang/c/src/Makefile.am
    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/datum_skip.c
    hadoop/avro/trunk/lang/c/src/datum_validate.c
    hadoop/avro/trunk/lang/c/src/datum_write.c
    hadoop/avro/trunk/lang/c/src/schema.c
    hadoop/avro/trunk/lang/c/src/schema.h
    hadoop/avro/trunk/lang/c/src/schema_equal.c
    hadoop/avro/trunk/lang/c/src/schema_printf.c

Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Wed Feb  3 23:59:40 2010
@@ -281,6 +281,8 @@
 
     AVRO-386. Python implementaiton of compression (philz)
 
+    AVRO-394. Simplify and consolidate all data structures into hash tables (massie)
+
   OPTIMIZATIONS
 
     AVRO-172. More efficient schema processing (massie)

Propchange: hadoop/avro/trunk/lang/c/examples/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Feb  3 23:59:40 2010
@@ -0,0 +1 @@
+Makefile.in

Propchange: hadoop/avro/trunk/lang/c/jansson/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed Feb  3 23:59:40 2010
@@ -3,3 +3,9 @@
 autom4te.cache
 aclocal.m4
 configure
+depcomp
+config.guess
+ltmain.sh
+config.sub
+missing
+install-sh

Modified: hadoop/avro/trunk/lang/c/src/Makefile.am
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/Makefile.am?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/Makefile.am (original)
+++ hadoop/avro/trunk/lang/c/src/Makefile.am Wed Feb  3 23:59:40 2010
@@ -9,7 +9,7 @@
 libavro_la_SOURCES = st.c st.h schema.c schema.h schema_printf.c schema_equal.c \
 datum.c datum_equal.c datum_validate.c datum_read.c datum_skip.c datum_write.c datum.h \
 io.c dump.c dump.h encoding_binary.c \
-container_of.h queue.h encoding.h
+container_of.h encoding.h
 libavro_la_LIBADD = $(top_builddir)/jansson/src/.libs/libjansson.a
 libavro_la_LDFLAGS = \
         -version-info $(LIBAVRO_VERSION) \

Modified: hadoop/avro/trunk/lang/c/src/datum.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum.c Wed Feb  3 23:59:40 2010
@@ -21,6 +21,8 @@
 #include "datum.h"
 #include "encoding.h"
 
+#define DEFAULT_TABLE_SIZE 32
+
 static void avro_datum_init(avro_datum_t datum, avro_type_t type)
 {
 	datum->type = type;
@@ -386,7 +388,16 @@
 		return NULL;
 	}
 	datum->name = strdup(name);
-	datum->fields = st_init_strtable();
+	if (!datum->name) {
+		free(datum);
+		return NULL;
+	}
+	datum->fields = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!datum->fields) {
+		free(datum->name);
+		free(datum);
+		return NULL;
+	}
 
 	avro_datum_init(&datum->obj, AVRO_RECORD);
 	return &datum->obj;
@@ -555,7 +566,12 @@
 	if (!datum) {
 		return NULL;
 	}
-	datum->map = st_init_strtable();
+	datum->map = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!datum->map) {
+		free(datum);
+		return NULL;
+	}
+
 	avro_datum_init(&datum->obj, AVRO_MAP);
 	return &datum->obj;
 }
@@ -616,8 +632,11 @@
 	if (!datum) {
 		return NULL;
 	}
-	STAILQ_INIT(&datum->els);
-	datum->num_elements = 0;
+	datum->els = st_init_numtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!datum->els) {
+		free(datum);
+		return NULL;
+	}
 
 	avro_datum_init(&datum->obj, AVRO_ARRAY);
 	return &datum->obj;
@@ -628,19 +647,13 @@
 			const avro_datum_t datum)
 {
 	struct avro_array_datum_t *array;
-	struct avro_array_element_t *el;
 	if (!is_avro_datum(array_datum) || !is_avro_array(array_datum)
 	    || !is_avro_datum(datum)) {
 		return EINVAL;
 	}
 	array = avro_datum_to_array(array_datum);
-	el = malloc(sizeof(struct avro_array_element_t));
-	if (!el) {
-		return ENOMEM;
-	}
-	el->datum = avro_datum_incref(datum);
-	STAILQ_INSERT_TAIL(&array->els, el, els);
-	array->num_elements++;
+	st_insert(array->els, array->els->num_entries,
+		  (st_data_t) avro_datum_incref(datum));
 	return 0;
 }
 
@@ -651,6 +664,12 @@
 	return ST_DELETE;
 }
 
+static int array_free_foreach(int i, avro_datum_t datum, void *arg)
+{
+	avro_datum_decref(datum);
+	return ST_DELETE;
+}
+
 static void avro_datum_free(avro_datum_t datum)
 {
 	if (is_avro_datum(datum)) {
@@ -747,13 +766,8 @@
 		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);
-				}
+				st_foreach(array->els, array_free_foreach, 0);
+				st_free_table(array->els);
 				free(array);
 			}
 			break;

Modified: hadoop/avro/trunk/lang/c/src/datum.h
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum.h?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum.h (original)
+++ hadoop/avro/trunk/lang/c/src/datum.h Wed Feb  3 23:59:40 2010
@@ -20,7 +20,6 @@
 #include "avro.h"		/* for avro_schema_t */
 #include "container_of.h"
 #include "st.h"
-#include "queue.h"
 
 struct avro_string_datum_t {
 	struct avro_obj_t obj;
@@ -85,15 +84,9 @@
 	const char *symbol;
 };
 
-struct avro_array_element_t {
-	avro_datum_t datum;
-	 STAILQ_ENTRY(avro_array_element_t) els;
-};
-
 struct avro_array_datum_t {
 	struct avro_obj_t obj;
-	int64_t num_elements;
-	 STAILQ_HEAD(els, avro_array_element_t) els;
+	st_table *els;
 };
 
 #define avro_datum_to_string(datum_)    (container_of(datum_, struct avro_string_datum_t, obj))

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=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_equal.c Wed Feb  3 23:59:40 2010
@@ -21,18 +21,19 @@
 static int
 array_equal(struct avro_array_datum_t *a, struct avro_array_datum_t *b)
 {
-	struct avro_array_element_t *a_el, *b_el;
-	if (a->num_elements != b->num_elements) {
+	long i;
+
+	if (a->els->num_entries != b->els->num_entries) {
 		return 0;
 	}
-	for (a_el = STAILQ_FIRST(&a->els),
-	     b_el = STAILQ_FIRST(&b->els);
-	     !(a_el == NULL && a_el == NULL);
-	     a_el = STAILQ_NEXT(a_el, els), b_el = STAILQ_NEXT(b_el, els)) {
-		if (a_el == NULL || b_el == NULL) {
-			return 0;	/* different number of elements */
-		}
-		if (!avro_datum_equal(a_el->datum, b_el->datum)) {
+	for (i = 0; i < a->els->num_entries; i++) {
+		union {
+			st_data_t data;
+			avro_datum_t datum;
+		} ael, bel;
+		st_lookup(a->els, i, &ael.data);
+		st_lookup(b->els, i, &bel.data);
+		if (!avro_datum_equal(ael.datum, bel.datum)) {
 			return 0;
 		}
 	}

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=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_read.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_read.c Wed Feb  3 23:59:40 2010
@@ -98,22 +98,21 @@
 	  struct avro_enum_schema_t *readers_schema, avro_datum_t * datum)
 {
 	int rval;
-	int64_t i, index;
-	struct avro_enum_symbol_t *sym;
+	int64_t index;
+	union {
+		st_data_t data;
+		char *sym;
+	} val;
 
 	rval = enc->read_long(reader, &index);
 	if (rval) {
 		return rval;
 	}
 
-	sym = STAILQ_FIRST(&writers_schema->symbols);
-	for (i = 0; i != index && sym != NULL;
-	     sym = STAILQ_NEXT(sym, symbols), i++) {
-	}
-	if (!sym) {
+	if (!st_lookup(writers_schema->symbols, index, &val.data)) {
 		return EINVAL;
 	}
-	*datum = avro_enum(writers_schema->name, sym->symbol);
+	*datum = avro_enum(writers_schema->name, val.sym);
 	return 0;
 }
 
@@ -231,22 +230,21 @@
 	   struct avro_union_schema_t *readers_schema, avro_datum_t * datum)
 {
 	int rval;
-	int64_t i, index;
-	struct avro_union_branch_t *branch;
+	int64_t index;
+	union {
+		st_data_t data;
+		avro_schema_t schema;
+	} val;
 
 	rval = enc->read_long(reader, &index);
 	if (rval) {
 		return rval;
 	}
 
-	branch = STAILQ_FIRST(&writers_schema->branches);
-	for (i = 0; i != index && branch != NULL;
-	     branch = STAILQ_NEXT(branch, branches)) {
-	}
-	if (!branch) {
+	if (!st_lookup(writers_schema->branches, index, &val.data)) {
 		return EILSEQ;
 	}
-	return avro_read_data(reader, branch->schema, NULL, datum);
+	return avro_read_data(reader, val.schema, NULL, datum);
 }
 
 /* TODO: handle default values in fields */
@@ -256,36 +254,35 @@
 	    struct avro_record_schema_t *readers_schema, avro_datum_t * datum)
 {
 	int rval;
-	struct avro_record_field_t *reader_field;
-	struct avro_record_field_t *field;
+	long i;
 	avro_datum_t record;
 	avro_datum_t field_datum;
 
 	record = *datum = avro_record(writers_schema->name);
-	for (field = STAILQ_FIRST(&writers_schema->fields);
-	     field != NULL; field = STAILQ_NEXT(field, fields)) {
-		for (reader_field = STAILQ_FIRST(&readers_schema->fields);
-		     reader_field != NULL;
-		     reader_field = STAILQ_NEXT(reader_field, fields)) {
-			if (strcmp(field->name, reader_field->name) == 0) {
-				break;
-			}
-		}
-		if (reader_field) {
+	for (i = 0; i < writers_schema->fields->num_entries; i++) {
+		union {
+			st_data_t data;
+			struct avro_record_field_t *field;
+		} rfield, wfield;
+		st_lookup(writers_schema->fields, i, &wfield.data);
+		if (st_lookup
+		    (readers_schema->fields_byname,
+		     (st_data_t) wfield.field->name, &rfield.data)) {
 			rval =
-			    avro_read_data(reader, field->type,
-					   reader_field->type, &field_datum);
+			    avro_read_data(reader, wfield.field->type,
+					   rfield.field->type, &field_datum);
 			if (rval) {
 				return rval;
 			}
 			rval =
-			    avro_record_set(record, field->name, field_datum);
+			    avro_record_set(record, wfield.field->name,
+					    field_datum);
 			if (rval) {
 				return rval;
 			}
 			avro_datum_decref(field_datum);
 		} else {
-			rval = avro_skip_data(reader, field->type);
+			rval = avro_skip_data(reader, wfield.field->type);
 			if (rval) {
 				return rval;
 			}
@@ -299,6 +296,7 @@
 	       avro_schema_t readers_schema, avro_datum_t * datum)
 {
 	int rval = EINVAL;
+	long i;
 	const avro_encoding_t *enc = &avro_binary_encoding;
 
 	if (!reader || !is_avro_schema(writers_schema) || !datum) {
@@ -315,15 +313,18 @@
 	 * schema resolution 
 	 */
 	if (!is_avro_union(writers_schema) && is_avro_union(readers_schema)) {
-		struct avro_union_branch_t *branch;
 		struct avro_union_schema_t *union_schema =
 		    avro_schema_to_union(readers_schema);
 
-		for (branch = STAILQ_FIRST(&union_schema->branches);
-		     branch != NULL; branch = STAILQ_NEXT(branch, branches)) {
-			if (avro_schema_match(writers_schema, branch->schema)) {
+		for (i = 0; i < union_schema->branches->num_entries; i++) {
+			union {
+				st_data_t data;
+				avro_schema_t schema;
+			} val;
+			st_lookup(union_schema->branches, i, &val.data);
+			if (avro_schema_match(writers_schema, val.schema)) {
 				return avro_read_data(reader, writers_schema,
-						      branch->schema, datum);
+						      val.schema, datum);
 			}
 		}
 		return EINVAL;

Modified: hadoop/avro/trunk/lang/c/src/datum_skip.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_skip.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_skip.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_skip.c Wed Feb  3 23:59:40 2010
@@ -101,33 +101,35 @@
 		      struct avro_union_schema_t *writers_schema)
 {
 	int rval;
-	int64_t i, index;
-	struct avro_union_branch_t *branch;
+	int64_t index;
+	union {
+		st_data_t data;
+		avro_schema_t schema;
+	} val;
 
 	rval = enc->read_long(reader, &index);
 	if (rval) {
 		return rval;
 	}
-
-	branch = STAILQ_FIRST(&writers_schema->branches);
-	for (i = 0; i != index && branch != NULL;
-	     branch = STAILQ_NEXT(branch, branches)) {
-	}
-	if (!branch) {
+	if (!st_lookup(writers_schema->branches, index, &val.data)) {
 		return EILSEQ;
 	}
-	return avro_skip_data(reader, branch->schema);
+	return avro_skip_data(reader, val.schema);
 }
 
 static int skip_record(avro_reader_t reader, const avro_encoding_t * enc,
 		       struct avro_record_schema_t *writers_schema)
 {
 	int rval;
-	struct avro_record_field_t *field;
+	long i;
 
-	for (field = STAILQ_FIRST(&writers_schema->fields);
-	     field != NULL; field = STAILQ_NEXT(field, fields)) {
-		rval = avro_skip_data(reader, field->type);
+	for (i = 0; i < writers_schema->fields->num_entries; i++) {
+		union {
+			st_data_t data;
+			struct avro_record_field_t *field;
+		} val;
+		st_lookup(writers_schema->fields, i, &val.data);
+		rval = avro_skip_data(reader, val.field->type);
 		if (rval) {
 			return rval;
 		}

Modified: hadoop/avro/trunk/lang/c/src/datum_validate.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_validate.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_validate.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_validate.c Wed Feb  3 23:59:40 2010
@@ -40,6 +40,9 @@
 int
 avro_schema_datum_validate(avro_schema_t expected_schema, avro_datum_t datum)
 {
+	int rval;
+	long i;
+
 	if (!is_avro_schema(expected_schema) || !is_avro_datum(datum)) {
 		return EINVAL;
 	}
@@ -80,49 +83,45 @@
 			    avro_datum_to_fixed(datum)->size));
 
 	case AVRO_ENUM:
-		{
+		if (is_avro_enum(datum)) {
 			struct avro_enum_schema_t *enump =
 			    avro_schema_to_enum(expected_schema);
-			struct avro_enum_symbol_t *symbol =
-			    STAILQ_FIRST(&enump->symbols);
-			while (symbol) {
-				if (!strcmp
-				    (symbol->symbol,
-				     avro_datum_to_enum(datum)->symbol)) {
-					return 1;
-				}
-				symbol = STAILQ_NEXT(symbol, symbols);
-			}
-			return 0;
+			struct avro_enum_datum_t *d = avro_datum_to_enum(datum);
+			union {
+				st_data_t data;
+				long idx;
+			} val;
+			return st_lookup(enump->symbols_byname,
+					 (st_data_t) d->symbol, &val.data);
 		}
-		break;
+		return 0;
 
 	case AVRO_ARRAY:
-		{
-			if (is_avro_array(datum)) {
-				struct avro_array_datum_t *array =
-				    avro_datum_to_array(datum);
-				struct avro_array_element_t *el =
-				    STAILQ_FIRST(&array->els);
-				while (el) {
-					if (!avro_schema_datum_validate
-					    ((avro_schema_to_array
-					      (expected_schema))->items,
-					     el->datum)) {
-						return 0;
-					}
-					el = STAILQ_NEXT(el, els);
+		if (is_avro_array(datum)) {
+			struct avro_array_datum_t *array =
+			    avro_datum_to_array(datum);
+
+			for (i = 0; i < array->els->num_entries; i++) {
+				union {
+					st_data_t data;
+					avro_datum_t datum;
+				} val;
+				st_lookup(array->els, i, &val.data);
+				if (!avro_schema_datum_validate
+				    ((avro_schema_to_array
+				      (expected_schema))->items, val.datum)) {
+					return 0;
 				}
-				return 1;
 			}
-			return 0;
+			return 1;
 		}
-		break;
+		return 0;
 
 	case AVRO_MAP:
 		if (is_avro_map(datum)) {
 			struct validate_st vst =
-			    { avro_schema_to_map(expected_schema)->values, 1 };
+			    { avro_schema_to_map(expected_schema)->values, 1
+			};
 			st_foreach(avro_datum_to_map(datum)->map,
 				   schema_map_validate_foreach,
 				   (st_data_t) & vst);
@@ -134,41 +133,45 @@
 		{
 			struct avro_union_schema_t *union_schema =
 			    avro_schema_to_union(expected_schema);
-			struct avro_union_branch_t *branch;
 
-			for (branch = STAILQ_FIRST(&union_schema->branches);
-			     branch != NULL;
-			     branch = STAILQ_NEXT(branch, branches)) {
+			for (i = 0; i < union_schema->branches->num_entries;
+			     i++) {
+				union {
+					st_data_t data;
+					avro_schema_t schema;
+				} val;
+				st_lookup(union_schema->branches, i, &val.data);
 				if (avro_schema_datum_validate
-				    (branch->schema, datum)) {
+				    (val.schema, datum)) {
 					return 1;
 				}
 			}
-			return 0;
 		}
-		break;
+		return 0;
 
 	case AVRO_RECORD:
 		if (is_avro_record(datum)) {
 			struct avro_record_schema_t *record_schema =
 			    avro_schema_to_record(expected_schema);
-			struct avro_record_field_t *field;
-			for (field = STAILQ_FIRST(&record_schema->fields);
-			     field != NULL;
-			     field = STAILQ_NEXT(field, fields)) {
-				int field_rval;
+			for (i = 0; i < record_schema->fields->num_entries; i++) {
 				avro_datum_t field_datum;
-				field_rval =
-				    avro_record_get(datum, field->name,
+				union {
+					st_data_t data;
+					struct avro_record_field_t *field;
+				} val;
+				st_lookup(record_schema->fields, i, &val.data);
+
+				rval =
+				    avro_record_get(datum, val.field->name,
 						    &field_datum);
-				if (field_rval) {
+				if (rval) {
 					/*
 					 * TODO: check for default values 
 					 */
-					return field_rval;
+					return rval;
 				}
 				if (!avro_schema_datum_validate
-				    (field->type, field_datum)) {
+				    (val.field->type, field_datum)) {
 					return 0;
 				}
 			}

Modified: hadoop/avro/trunk/lang/c/src/datum_write.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/datum_write.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/datum_write.c (original)
+++ hadoop/avro/trunk/lang/c/src/datum_write.c Wed Feb  3 23:59:40 2010
@@ -26,15 +26,20 @@
 	     struct avro_record_schema_t *record, avro_datum_t datum)
 {
 	int rval;
-	struct avro_record_field_t *field = STAILQ_FIRST(&record->fields);
-	for (; field != NULL; field = STAILQ_NEXT(field, fields)) {
-		int field_rval;
+	long i;
+
+	for (i = 0; i < record->fields->num_entries; i++) {
 		avro_datum_t field_datum;
-		field_rval = avro_record_get(datum, field->name, &field_datum);
-		if (field_rval) {
-			return field_rval;
+		union {
+			st_data_t data;
+			struct avro_record_field_t *field;
+		} val;
+		st_lookup(record->fields, i, &val.data);
+		rval = avro_record_get(datum, val.field->name, &field_datum);
+		if (rval) {
+			return rval;
 		}
-		rval = avro_write_data(writer, field->type, field_datum);
+		rval = avro_write_data(writer, val.field->type, field_datum);
 		if (rval) {
 			return rval;
 		}
@@ -46,17 +51,15 @@
 write_enum(avro_writer_t writer, const avro_encoding_t * enc,
 	   struct avro_enum_schema_t *enump, struct avro_enum_datum_t *datum)
 {
-	int64_t index;
-	struct avro_enum_symbol_t *sym = STAILQ_FIRST(&enump->symbols);
-	for (index = 0; sym != NULL; sym = STAILQ_NEXT(sym, symbols), index++) {
-		if (strcmp(sym->symbol, datum->symbol) == 0) {
-			break;
-		}
-	}
-	if (!sym) {
+	union {
+		st_data_t data;
+		long idx;
+	} val;
+	if (!st_lookup
+	    (enump->symbols_byname, (st_data_t) datum->symbol, &val.data)) {
 		return EINVAL;
 	}
-	return enc->write_long(writer, index);
+	return enc->write_long(writer, val.idx);
 }
 
 struct write_map_args {
@@ -113,17 +116,21 @@
 	    struct avro_array_datum_t *array)
 {
 	int rval;
-	struct avro_array_element_t *el;
+	long i;
 
-	if (array->num_elements) {
-		rval = enc->write_long(writer, array->num_elements);
+	if (array->els->num_entries) {
+		rval = enc->write_long(writer, array->els->num_entries);
 		if (rval) {
 			return rval;
 		}
-		for (el = STAILQ_FIRST(&array->els);
-		     el != NULL; el = STAILQ_NEXT(el, els)) {
+		for (i = 0; i < array->els->num_entries; i++) {
+			union {
+				st_data_t data;
+				avro_datum_t datum;
+			} val;
+			st_lookup(array->els, i, &val.data);
 			rval =
-			    avro_write_data(writer, schema->items, el->datum);
+			    avro_write_data(writer, schema->items, val.datum);
 			if (rval) {
 				return rval;
 			}
@@ -137,22 +144,23 @@
 	    struct avro_union_schema_t *schema, avro_datum_t datum)
 {
 	int rval;
-	int64_t index;
-	struct avro_union_branch_t *branch = STAILQ_FIRST(&schema->branches);
-	for (index = 0; branch != NULL;
-	     branch = STAILQ_NEXT(branch, branches), index++) {
-		if (avro_schema_datum_validate(branch->schema, datum)) {
-			break;
+	long i;
+
+	for (i = 0; i < schema->branches->num_entries; i++) {
+		union {
+			st_data_t data;
+			avro_schema_t schema;
+		} val;
+		st_lookup(schema->branches, i, &val.data);
+		if (avro_schema_datum_validate(val.schema, datum)) {
+			rval = enc->write_long(writer, i);
+			if (rval) {
+				return rval;
+			}
+			return avro_write_data(writer, val.schema, datum);
 		}
 	}
-	if (!branch) {
-		return EINVAL;
-	}
-	rval = enc->write_long(writer, index);
-	if (rval) {
-		return rval;
-	}
-	return avro_write_data(writer, branch->schema, datum);
+	return EINVAL;
 }
 
 int

Modified: hadoop/avro/trunk/lang/c/src/schema.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema.c Wed Feb  3 23:59:40 2010
@@ -24,6 +24,8 @@
 #include "st.h"
 #include "schema.h"
 
+#define DEFAULT_TABLE_SIZE 32
+
 struct avro_schema_error_t {
 	st_table *named_schemas;
 	json_error_t json_error;
@@ -58,6 +60,27 @@
 	return 0;
 }
 
+static int record_free_foreach(int i, struct avro_record_field_t *field,
+			       void *arg)
+{
+	free(field->name);
+	avro_schema_decref(field->type);
+	free(field);
+	return ST_DELETE;
+}
+
+static int enum_free_foreach(int i, char *sym, void *arg)
+{
+	free(sym);
+	return ST_DELETE;
+}
+
+static int union_free_foreach(int i, avro_schema_t schema, void *arg)
+{
+	avro_schema_decref(schema);
+	return ST_DELETE;
+}
+
 static void avro_schema_free(avro_schema_t schema)
 {
 	if (is_avro_schema(schema)) {
@@ -77,15 +100,10 @@
 				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);
-				}
+				st_foreach(record->fields, record_free_foreach,
+					   0);
+				st_free_table(record->fields_byname);
+				st_free_table(record->fields);
 				free(record);
 			}
 			break;
@@ -94,14 +112,10 @@
 				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);
-				}
+				st_foreach(enump->symbols, enum_free_foreach,
+					   0);
+				st_free_table(enump->symbols);
+				st_free_table(enump->symbols_byname);
 				free(enump);
 			}
 			break;
@@ -132,15 +146,9 @@
 		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);
-				}
+				st_foreach(unionp->branches, union_free_foreach,
+					   0);
+				st_free_table(unionp->branches);
 				free(unionp);
 			}
 			break;
@@ -275,7 +283,12 @@
 	if (!schema) {
 		return NULL;
 	}
-	STAILQ_INIT(&schema->branches);
+	schema->branches = st_init_numtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!schema->branches) {
+		free(schema);
+		return NULL;
+	}
+
 	avro_schema_init(&schema->obj, AVRO_UNION);
 	return &schema->obj;
 }
@@ -285,18 +298,13 @@
 			 const avro_schema_t schema)
 {
 	struct avro_union_schema_t *unionp;
-	struct avro_union_branch_t *s;
-
 	if (!union_schema || !schema || !is_avro_union(union_schema)) {
 		return EINVAL;
 	}
 	unionp = avro_schema_to_union(union_schema);
-	s = malloc(sizeof(struct avro_union_branch_t));
-	if (!s) {
-		return ENOMEM;
-	}
-	s->schema = avro_schema_incref(schema);
-	STAILQ_INSERT_TAIL(&unionp->branches, s, branches);
+	st_insert(unionp->branches, unionp->branches->num_entries,
+		  (st_data_t) schema);
+	avro_schema_incref(schema);
 	return 0;
 }
 
@@ -326,19 +334,33 @@
 
 avro_schema_t avro_schema_enum(const char *name)
 {
-	struct avro_enum_schema_t *enump =
-	    malloc(sizeof(struct avro_enum_schema_t));
-	if (!enump) {
+	struct avro_enum_schema_t *enump;
+
+	if (!is_avro_id(name)) {
 		return NULL;
 	}
-	if (!is_avro_id(name)) {
+	enump = malloc(sizeof(struct avro_enum_schema_t));
+	if (!enump) {
 		return NULL;
 	}
 	enump->name = strdup(name);
 	if (!enump->name) {
+		free(enump);
+		return NULL;
+	}
+	enump->symbols = st_init_numtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!enump->symbols) {
+		free(enump->name);
+		free(enump);
+		return NULL;
+	}
+	enump->symbols_byname = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!enump->symbols_byname) {
+		st_free_table(enump->symbols);
+		free(enump->name);
+		free(enump);
 		return NULL;
 	}
-	STAILQ_INIT(&enump->symbols);
 	avro_schema_init(&enump->obj, AVRO_ENUM);
 	return &enump->obj;
 }
@@ -348,17 +370,19 @@
 			       const char *symbol)
 {
 	struct avro_enum_schema_t *enump;
-	struct avro_enum_symbol_t *enum_symbol;
+	char *sym;
+	long idx;
 	if (!enum_schema || !symbol || !is_avro_enum(enum_schema)) {
 		return EINVAL;
 	}
 	enump = avro_schema_to_enum(enum_schema);
-	enum_symbol = malloc(sizeof(struct avro_enum_symbol_t));
-	if (!enum_symbol) {
+	sym = strdup(symbol);
+	if (!sym) {
 		return ENOMEM;
 	}
-	enum_symbol->symbol = strdup(symbol);
-	STAILQ_INSERT_TAIL(&enump->symbols, enum_symbol, symbols);
+	idx = enump->symbols->num_entries;
+	st_insert(enump->symbols, (st_data_t) idx, (st_data_t) sym);
+	st_insert(enump->symbols_byname, (st_data_t) sym, (st_data_t) idx);
 	return 0;
 }
 
@@ -381,22 +405,42 @@
 	}
 	new_field->name = strdup(field_name);
 	new_field->type = avro_schema_incref(field_schema);
-	STAILQ_INSERT_TAIL(&record->fields, new_field, fields);
+	st_insert(record->fields, record->fields->num_entries,
+		  (st_data_t) new_field);
+	st_insert(record->fields_byname, (st_data_t) new_field->name,
+		  (st_data_t) new_field);
 	return 0;
 }
 
 avro_schema_t avro_schema_record(const char *name)
 {
-	struct avro_record_schema_t *record =
-	    malloc(sizeof(struct avro_record_schema_t));
-	if (!record) {
+	struct avro_record_schema_t *record;
+	if (!is_avro_id(name)) {
 		return NULL;
 	}
-	if (!is_avro_id(name)) {
+	record = malloc(sizeof(struct avro_record_schema_t));
+	if (!record) {
 		return NULL;
 	}
 	record->name = strdup(name);
-	STAILQ_INIT(&record->fields);
+	if (!record->name) {
+		free(record);
+		return NULL;
+	}
+	record->fields = st_init_numtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!record->fields) {
+		free(record->name);
+		free(record);
+		return NULL;
+	}
+	record->fields_byname = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
+	if (!record->fields_byname) {
+		st_free_table(record->fields);
+		free(record->name);
+		free(record);
+		return NULL;
+	}
+
 	avro_schema_init(&record->obj, AVRO_RECORD);
 	return &record->obj;
 }
@@ -776,7 +820,7 @@
 	}
 	*e = error;
 
-	error->named_schemas = st_init_strtable();
+	error->named_schemas = st_init_strtable_with_size(DEFAULT_TABLE_SIZE);
 	if (!error->named_schemas) {
 		free(error);
 		return ENOMEM;
@@ -804,6 +848,7 @@
 
 avro_schema_t avro_schema_copy(avro_schema_t schema)
 {
+	long i;
 	avro_schema_t new_schema = NULL;
 	if (!schema) {
 		return NULL;
@@ -827,22 +872,18 @@
 		{
 			struct avro_record_schema_t *record_schema =
 			    avro_schema_to_record(schema);
-			struct avro_record_field_t *field;
 			new_schema = avro_schema_record(record_schema->name);
-			for (field = STAILQ_FIRST(&record_schema->fields);
-			     field != NULL;
-			     field = STAILQ_NEXT(field, fields)) {
-				avro_schema_t field_copy =
-				    avro_schema_copy(field->type);
-				if (!field_copy) {
-					avro_schema_decref(new_schema);
-					return NULL;
-				}
-				if (avro_schema_record_field_append
-				    (new_schema, field->name, field_copy)) {
-					avro_schema_decref(new_schema);
-					return NULL;
-				}
+			for (i = 0; i < record_schema->fields->num_entries; i++) {
+				union {
+					st_data_t data;
+					struct avro_record_field_t *field;
+				} val;
+				st_lookup(record_schema->fields, i, &val.data);
+				avro_schema_t type_copy =
+				    avro_schema_copy(val.field->type);
+				avro_schema_record_field_append(new_schema,
+								val.field->name,
+								type_copy);
 			}
 		}
 		break;
@@ -852,15 +893,14 @@
 			struct avro_enum_schema_t *enum_schema =
 			    avro_schema_to_enum(schema);
 			new_schema = avro_schema_enum(enum_schema->name);
-			struct avro_enum_symbol_t *enum_symbol;
-			for (enum_symbol = STAILQ_FIRST(&enum_schema->symbols);
-			     enum_symbol != NULL;
-			     enum_symbol = STAILQ_NEXT(enum_symbol, symbols)) {
-				if (avro_schema_enum_symbol_append
-				    (new_schema, enum_symbol->symbol)) {
-					avro_schema_decref(new_schema);
-					return NULL;
-				}
+			for (i = 0; i < enum_schema->symbols->num_entries; i++) {
+				union {
+					st_data_t data;
+					char *sym;
+				} val;
+				st_lookup(enum_schema->symbols, i, &val.data);
+				avro_schema_enum_symbol_append(new_schema,
+							       val.sym);
 			}
 		}
 		break;
@@ -905,14 +945,17 @@
 		{
 			struct avro_union_schema_t *union_schema =
 			    avro_schema_to_union(schema);
-			struct avro_union_branch_t *s;
 
 			new_schema = avro_schema_union();
-
-			for (s = STAILQ_FIRST(&union_schema->branches);
-			     s != NULL; s = STAILQ_NEXT(s, branches)) {
-				avro_schema_t schema_copy =
-				    avro_schema_copy(s->schema);
+			for (i = 0; i < union_schema->branches->num_entries;
+			     i++) {
+				avro_schema_t schema_copy;
+				union {
+					st_data_t data;
+					avro_schema_t schema;
+				} val;
+				st_lookup(union_schema->branches, i, &val.data);
+				schema_copy = avro_schema_copy(val.schema);
 				if (avro_schema_union_append
 				    (new_schema, schema_copy)) {
 					avro_schema_decref(new_schema);

Modified: hadoop/avro/trunk/lang/c/src/schema.h
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema.h?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema.h (original)
+++ hadoop/avro/trunk/lang/c/src/schema.h Wed Feb  3 23:59:40 2010
@@ -19,7 +19,7 @@
 
 #include "avro.h"
 #include "container_of.h"
-#include "queue.h"
+#include "st.h"
 
 struct avro_record_field_t {
 	char *name;
@@ -27,25 +27,20 @@
 	/*
 	 * TODO: default values 
 	 */
-	 STAILQ_ENTRY(avro_record_field_t) fields;
 };
 
 struct avro_record_schema_t {
 	struct avro_obj_t obj;
 	char *name;
-	/* TODO: st_table of names for faster lookup on record_read() */
-	 STAILQ_HEAD(fields, avro_record_field_t) fields;
-};
-
-struct avro_enum_symbol_t {
-	char *symbol;
-	 STAILQ_ENTRY(avro_enum_symbol_t) symbols;
+	st_table *fields;
+	st_table *fields_byname;
 };
 
 struct avro_enum_schema_t {
 	struct avro_obj_t obj;
 	char *name;
-	 STAILQ_HEAD(symbols, avro_enum_symbol_t) symbols;
+	st_table *symbols;
+	st_table *symbols_byname;
 };
 
 struct avro_array_schema_t {
@@ -58,14 +53,9 @@
 	avro_schema_t values;
 };
 
-struct avro_union_branch_t {
-	avro_schema_t schema;
-	 STAILQ_ENTRY(avro_union_branch_t) branches;
-};
-
 struct avro_union_schema_t {
 	struct avro_obj_t obj;
-	 STAILQ_HEAD(branch, avro_union_branch_t) branches;
+	st_table *branches;
 };
 
 struct avro_fixed_schema_t {

Modified: hadoop/avro/trunk/lang/c/src/schema_equal.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema_equal.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema_equal.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema_equal.c Wed Feb  3 23:59:40 2010
@@ -22,29 +22,29 @@
 schema_record_equal(struct avro_record_schema_t *a,
 		    struct avro_record_schema_t *b)
 {
-	struct avro_record_field_t *field_a, *field_b;
+	long i;
 	if (strcmp(a->name, b->name)) {
 		/*
 		 * They have different names 
 		 */
 		return 0;
 	}
-
-	for (field_a = STAILQ_FIRST(&a->fields),
-	     field_b = STAILQ_FIRST(&b->fields);
-	     !(field_a == NULL && field_b == NULL);
-	     field_a = STAILQ_NEXT(field_a, fields),
-	     field_b = STAILQ_NEXT(field_b, fields)) {
-		if (field_a == NULL || field_b == NULL) {
-			return 0;	/* different num fields */
+	for (i = 0; i < a->fields->num_entries; i++) {
+		union {
+			st_data_t data;
+			struct avro_record_field_t *f;
+		} fa, fb;
+		st_lookup(a->fields, i, &fa.data);
+		if (!st_lookup(b->fields, i, &fb.data)) {
+			return 0;
 		}
-		if (strcmp(field_a->name, field_b->name)) {
+		if (strcmp(fa.f->name, fb.f->name)) {
 			/*
 			 * They have fields with different names 
 			 */
 			return 0;
 		}
-		if (!avro_schema_equal(field_a->type, field_b->type)) {
+		if (!avro_schema_equal(fa.f->type, fb.f->type)) {
 			/*
 			 * They have fields with different schemas 
 			 */
@@ -57,23 +57,23 @@
 static int
 schema_enum_equal(struct avro_enum_schema_t *a, struct avro_enum_schema_t *b)
 {
-	struct avro_enum_symbol_t *sym_a, *sym_b;
-
+	long i;
 	if (strcmp(a->name, b->name)) {
 		/*
 		 * They have different names 
 		 */
 		return 0;
 	}
-	for (sym_a = STAILQ_FIRST(&a->symbols),
-	     sym_b = STAILQ_FIRST(&b->symbols);
-	     !(sym_a == NULL && sym_b == NULL);
-	     sym_a = STAILQ_NEXT(sym_a, symbols),
-	     sym_b = STAILQ_NEXT(sym_b, symbols)) {
-		if (sym_a == NULL || sym_b == NULL) {
-			return 0;	/* different num symbols */
+	for (i = 0; i < a->symbols->num_entries; i++) {
+		union {
+			st_data_t data;
+			char *sym;
+		} sa, sb;
+		st_lookup(a->symbols, i, &sa.data);
+		if (!st_lookup(b->symbols, i, &sb.data)) {
+			return 0;
 		}
-		if (strcmp(sym_a->symbol, sym_b->symbol)) {
+		if (strcmp(sa.sym, sb.sym) != 0) {
 			/*
 			 * They have different symbol names 
 			 */
@@ -110,17 +110,17 @@
 static int
 schema_union_equal(struct avro_union_schema_t *a, struct avro_union_schema_t *b)
 {
-	struct avro_union_branch_t *branch_a, *branch_b;
-
-	for (branch_a = STAILQ_FIRST(&a->branches),
-	     branch_b = STAILQ_FIRST(&b->branches);
-	     !(branch_a == NULL && branch_b == NULL);
-	     branch_a = STAILQ_NEXT(branch_a, branches),
-	     branch_b = STAILQ_NEXT(branch_b, branches)) {
-		if (branch_a == NULL || branch_b == NULL) {
-			return 0;	/* different num symbols */
+	long i;
+	for (i = 0; i < a->branches->num_entries; i++) {
+		union {
+			st_data_t data;
+			avro_schema_t schema;
+		} ab, bb;
+		st_lookup(a->branches, i, &ab.data);
+		if (!st_lookup(b->branches, i, &bb.data)) {
+			return 0;
 		}
-		if (!avro_schema_equal(branch_a->schema, branch_b->schema)) {
+		if (!avro_schema_equal(ab.schema, bb.schema)) {
 			/*
 			 * They don't have the same schema types 
 			 */

Modified: hadoop/avro/trunk/lang/c/src/schema_printf.c
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/lang/c/src/schema_printf.c?rev=906293&r1=906292&r2=906293&view=diff
==============================================================================
--- hadoop/avro/trunk/lang/c/src/schema_printf.c (original)
+++ hadoop/avro/trunk/lang/c/src/schema_printf.c Wed Feb  3 23:59:40 2010
@@ -92,13 +92,17 @@
 avro_schema_record_print(struct avro_record_schema_t *record,
 			 struct avro_schema_args_t *args)
 {
-	struct avro_record_field_t *field;
+	long i;
 	avro_schema_printf_indent(args);
 	fprintf(args->fp, "record \"%s\"\n", record->name);
 	args->depth++;
-	for (field = STAILQ_FIRST(&record->fields);
-	     field != NULL; field = STAILQ_NEXT(field, fields)) {
-		avro_schema_record_field_print(field, args);
+	for (i = 0; i < record->fields->num_entries; i++) {
+		union {
+			st_data_t data;
+			struct avro_record_field_t *field;
+		} val;
+		st_lookup(record->fields, i, &val.data);
+		avro_schema_record_field_print(val.field, args);
 	}
 	args->depth--;
 }