+ if (stat_segment_access_end (&sa, sm))
+ return res;
+
+ fprintf (stderr, "Epoch changed while reading, invalid results\n");
+ // TODO increase counter
+ return 0;
+}
+
+stat_segment_data_t *
+stat_segment_dump (uint32_t * stats)
+{
+ stat_client_main_t *sm = &stat_client_main;
+ return stat_segment_dump_r (stats, sm);
+}
+
+/* Wrapper for accessing vectors from other languages */
+int
+stat_segment_vec_len (void *vec)
+{
+ return vec_len (vec);
+}
+
+void
+stat_segment_vec_free (void *vec)
+{
+ vec_free (vec);
+}
+
+/* Create a vector from a string (or add to existing) */
+u8 **
+stat_segment_string_vector (u8 ** string_vector, char *string)
+{
+ u8 *name = 0;
+ name = vec_dup ((u8 *) string);
+ vec_add1 (string_vector, (u8 *) name);
+ return string_vector;
+}
+
+stat_segment_data_t *
+stat_segment_dump_entry_r (uint32_t index, stat_client_main_t * sm)
+{
+ stat_segment_directory_entry_t *ep;
+ stat_segment_data_t *res = 0;
+ stat_segment_access_t sa;
+
+ stat_segment_access_start (&sa, sm);
+
+ /* Collect counter */
+ ep = vec_elt_at_index (sm->directory_vector, index);
+ vec_add1 (res, copy_data (ep, sm));
+
+ if (stat_segment_access_end (&sa, sm))
+ return res;
+ return 0;
+}
+
+stat_segment_data_t *
+stat_segment_dump_entry (uint32_t index)
+{
+ stat_client_main_t *sm = &stat_client_main;
+ return stat_segment_dump_entry_r (index, sm);
+}
+
+char *
+stat_segment_index_to_name (uint32_t index)
+{
+ char *name;
+ stat_segment_directory_entry_t *counter_vec = get_stat_vector ();
+ stat_segment_directory_entry_t *ep;
+ ep = vec_elt_at_index (counter_vec, index);
+ name = strdup (ep->name);
+ return name;