summaryrefslogtreecommitdiffstats
path: root/runtime/map-values.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/map-values.c')
-rw-r--r--runtime/map-values.c156
1 files changed, 34 insertions, 122 deletions
diff --git a/runtime/map-values.c b/runtime/map-values.c
index 6f8adf11..9adc9789 100644
--- a/runtime/map-values.c
+++ b/runtime/map-values.c
@@ -1,138 +1,50 @@
-/* -*- linux-c -*- */
+#ifndef _MAP_VALUES_C_ /* -*- linux-c -*- */
+#define _MAP_VALUES_C_
+
+/** @file map-values.c
+ * @brief Includes the proper value functions for maps.
+ */
#include "map.h"
-#if VALUE_TYPE == STRING
-#define VALUETYPE char*
-#define VALUENAME str
-#define NEED_STRING_VALS
-#elif VALUE_TYPE == INT64
-#define VALUETYPE int64_t
-#define VALUENAME int64
-#define NEED_INT64_VALS
-#elif VALUE_TYPE == STAT
-#define VALUETYPE stat*
-#define VALUENAME stat
-#define NEED_STAT_VALS
-#else
-#error VALUE_TYPE has unimplemented value.
+#if !defined(NEED_STRING_VALS) && !defined(NEED_INT64_VALS) && !defined(NEED_STAT_VALS)
+#error Need to define at least one of NEED_STRING_VALS, NEED_INT64_VALS and NEED_STAT_VALS
#endif
-#define VALSYM(x) JOIN(x,VALUENAME)
-#define VALUE_TYPE_COPY JOIN(VALUENAME,copy)
-#define VALUE_TYPE_ADD JOIN(VALUENAME,add)
-#define VALUE_GET JOIN(VALUENAME,get)
-
-void VALSYM(__stp_map_set) (MAP map, VALUETYPE val, int add)
-{
- struct map_node *m;
-
- if (map == NULL)
- return;
-
- if (map->create) {
- if (val == 0 && !map->no_wrap)
- return;
+#ifdef NEED_STRING_VALS
+#include "map-str.c"
+#endif
- m = __stp_map_create (map);
- if (!m)
- return;
-
- /* set the value */
- dbug ("m=%lx offset=%lx\n", (long)m, (long)map->data_offset);
- VALUE_TYPE_COPY((void *)((long)m + map->data_offset), val);
- //m->val = val;
- } else {
- if (map->key == NULL)
- return;
-
- if (val) {
- if (add)
- VALUE_TYPE_ADD((void *)((long)map->key + map->data_offset), val);
- else
- VALUE_TYPE_COPY((void *)((long)map->key + map->data_offset), val);
- } else if (!add) {
- /* setting value to 0 is the same as deleting */
- _stp_map_key_del(map);
- }
- }
-}
+#ifdef NEED_STAT_VALS
+#include "map-stat.c"
+#endif
-void VALSYM(_stp_map_set) (MAP map, VALUETYPE val)
-{
- VALSYM(__stp_map_set)(map, val, 0);
-}
+#ifdef NEED_INT64_VALS
+#include "map-int.c"
+#endif
-#if VALUE_TYPE == STAT
-/** Adds an int64 to a stats map */
-void VALSYM(_stp_map_add_int64) (MAP map, int64_t val)
+#if defined(NEED_INT64_VALS) || defined (NEED_STAT_VALS)
+/** Add an int64 to a map.
+ * @ingroup map_set
+ * @param map
+ * @param val int64 value to add
+ */
+void _stp_map_add_int64 (MAP map, int64_t val)
{
- stat *d;
- int n;
-
if (map == NULL)
return;
-
- if (map->create) {
- struct map_node *m = __stp_map_create (map);
- if (!m)
- return;
-
- /* set the value */
- d = (stat *)((long)m + map->data_offset);
- d->count = 1;
- d->sum = d->min = d->max = val;
- } else {
- if (map->key == NULL)
- return;
- d = (stat *)((long)map->key + map->data_offset);
- d->count++;
- d->sum += val;
- if (val > d->max)
- d->max = val;
- if (val < d->min)
- d->min = val;
- }
- /* histogram */
- switch (map->hist_type) {
- case HIST_LOG:
- n = msb64 (val);
- if (n >= map->hist_buckets)
- n = map->hist_buckets - 1;
- d->histogram[n]++;
- break;
- case HIST_LINEAR:
- /* n = (val - map->hist_start) / map->hist_int; */
- val -= map->hist_start;
- do_div (val, map->hist_int);
- n = val;
- if (n < 0)
- n = 0;
- if (n >= map->hist_buckets)
- n = map->hist_buckets - 1;
- d->histogram[n]++;
- default:
- break;
- }
-}
-#endif /* VALUE_TYPE == STAT */
-void VALSYM(_stp_map_add) (MAP map, VALUETYPE val)
-{
- VALSYM(__stp_map_set)(map, val, 1);
+#ifdef NEED_INT64_VALS
+ if (map->type == INT64)
+ __stp_map_set_int64 (map, val, 1);
+#endif
+#ifdef NEED_STAT_VALS
+ if (map->type == STAT)
+ _stp_map_add_stat (map, val);
+#endif
}
+#endif
-VALUETYPE VALSYM(_stp_map_get) (MAP map)
-{
- struct map_node *m;
- if (map == NULL || map->create || map->key == NULL)
- return 0;
- dbug ("key %lx\n", (long)map->key);
- m = (struct map_node *)map->key;
- return VALUE_GET ((void *)((long)m + map->data_offset));
-}
+#endif /* _MAP_VALUES_C_ */
-#undef VALUE_TYPE
-#undef VALUETYPE
-#undef VALUENAME