+ 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) */
+uint8_t **
+stat_segment_string_vector (uint8_t ** string_vector, const char *string)
+{
+ uint8_t *name = 0;
+ size_t len = strlen (string);
+
+ vec_validate_init_c_string (name, string, len);
+ vec_add1 (string_vector, 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_r (uint32_t index, stat_client_main_t * sm)
+{
+ stat_segment_directory_entry_t *ep;
+ stat_segment_access_t sa;
+ stat_segment_directory_entry_t *vec;
+
+ /* Has directory been update? */
+ if (sm->shared_header->epoch != sm->current_epoch)
+ return 0;
+ stat_segment_access_start (&sa, sm);
+ vec = get_stat_vector_r (sm);
+ ep = vec_elt_at_index (vec, index);
+ if (!stat_segment_access_end (&sa, sm))
+ return 0;
+ return strdup (ep->name);
+}
+
+char *
+stat_segment_index_to_name (uint32_t index)
+{
+ stat_client_main_t *sm = &stat_client_main;
+ return stat_segment_index_to_name_r (index, sm);
+}
+
+uint64_t
+stat_segment_version_r (stat_client_main_t * sm)
+{
+ ASSERT (sm->shared_header);
+ return sm->shared_header->version;
+}
+
+uint64_t
+stat_segment_version (void)
+{
+ stat_client_main_t *sm = &stat_client_main;
+ return stat_segment_version_r (sm);