- error_base =
- stat_segment_pointer (sm->shared_header,
- sm->shared_header->error_offset);
- result.error_value = error_base[ep->index];
+ /* Gather errors from all threads into a vector */
+ error_vector =
+ stat_segment_adjust (sm, (void *) sm->shared_header->error_vector);
+ vec_validate (result.error_vector, vec_len (error_vector) - 1);
+ for (i = 0; i < vec_len (error_vector); i++)
+ {
+ counter_t *cb = stat_segment_adjust (sm, (void *) error_vector[i]);
+ result.error_vector[i] = cb[ep->index];
+ }
+ break;
+
+ case STAT_DIR_TYPE_NAME_VECTOR:
+ {
+ uint8_t **name_vector = stat_segment_adjust (sm, ep->data);
+ result.name_vector = stat_vec_dup (sm, name_vector);
+ for (i = 0; i < vec_len (name_vector); i++)
+ {
+ u8 *name = stat_segment_adjust (sm, name_vector[i]);
+ result.name_vector[i] = stat_vec_dup (sm, name);
+ }
+ }
+ break;
+
+ case STAT_DIR_TYPE_SYMLINK:
+ /* Gather info from all threads into a vector */
+ {
+ stat_segment_directory_entry_t *ep2;
+ ep2 = vec_elt_at_index (sm->directory_vector, ep->index1);
+ return copy_data (ep2, ep->index2, ep->name, sm);
+ }
+
+ case STAT_DIR_TYPE_EMPTY: