/** * mongoc_counters_register: * @counters: A mongoc_counter_t. * @num: The counter number. * @category: The counter category. * @name: THe counter name. * @description The counter description. * * Registers a new counter in the memory segment for counters. If the counters * are exported over shared memory, it will be made available. * * Returns: The offset to the data for the counters values. */ static size_t mongoc_counters_register (mongoc_counters_t *counters, uint32_t num, const char *category, const char *name, const char *description) { mongoc_counter_info_t *infos; char *segment; int n_cpu; BSON_ASSERT(counters); BSON_ASSERT(category); BSON_ASSERT(name); BSON_ASSERT(description); /* * Implementation Note: * * The memory barrier is required so that all of the above has been * completed. Then increment the n_counters so that a reading application * only knows about the counter after we have initialized it. */ n_cpu = _mongoc_get_cpu_count(); segment = (char *)counters; infos = (mongoc_counter_info_t *)(segment + counters->infos_offset); infos = &infos[counters->n_counters]; infos->slot = num % SLOTS_PER_CACHELINE; infos->offset = (counters->values_offset + ((num / SLOTS_PER_CACHELINE) * n_cpu * sizeof(mongoc_counter_slots_t))); bson_strcpy_w_null(infos->category, category, sizeof infos->category); bson_strcpy_w_null(infos->name, name, sizeof infos->name); bson_strcpy_w_null(infos->description, description, sizeof infos->description); bson_memory_barrier (); counters->n_counters++; return infos->offset; }
/** * mongoc_counters_init: * * Initializes the mongoc counters system. This should be run on library * initialization using the GCC constructor attribute. */ void _mongoc_counters_init (void) { mongoc_counter_info_t *info; mongoc_counters_t *counters; size_t infos_size; size_t off; size_t size; char *segment; size = mongoc_counters_calc_size(); segment = mongoc_counters_alloc(size); infos_size = LAST_COUNTER * sizeof *info; counters = (mongoc_counters_t *)segment; counters->n_cpu = _mongoc_get_cpu_count(); counters->n_counters = 0; counters->infos_offset = sizeof *counters; counters->values_offset = (uint32_t)(counters->infos_offset + infos_size); BSON_ASSERT ((counters->values_offset % 64) == 0); #define COUNTER(ident, Category, Name, Desc) \ off = mongoc_counters_register(counters, COUNTER_##ident, Category, Name, Desc); \ __mongoc_counter_##ident.cpus = (void *)(segment + off); #include "mongoc-counters.defs" #undef COUNTER /* * NOTE: * * Only update the size of the shared memory area for the client after * we have initialized the rest of the counters. Don't forget our memory * barrier to prevent compiler reordering. */ bson_memory_barrier (); counters->size = (uint32_t)size; }
static void test3 (void) { bson_memory_barrier (); }