summaryrefslogtreecommitdiff
path: root/qa/src/hashwalk.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/hashwalk.c')
-rw-r--r--qa/src/hashwalk.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/qa/src/hashwalk.c b/qa/src/hashwalk.c
new file mode 100644
index 0000000..05f2551
--- /dev/null
+++ b/qa/src/hashwalk.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2013 Red Hat.
+ *
+ * Exercise libpcp hash walk interfaces
+ */
+
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+void
+dumpnode(unsigned int key, long data)
+{
+ printf("%u => %ld\n", key, data);
+}
+
+__pmHashWalkState
+walker(const __pmHashNode *n, void *v)
+{
+ __pmHashWalkState state = (__pmHashWalkState)(long)v;
+ dumpnode(n->key, (long)n->data);
+ return state;
+}
+
+void
+chained(__pmHashCtl *h)
+{
+ __pmHashNode *n;
+
+ for (n = __pmHashWalk(h, PM_HASH_WALK_START);
+ n != NULL;
+ n = __pmHashWalk(h, PM_HASH_WALK_NEXT)) {
+ dumpnode(n->key, (long)n->data);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ __pmHashCtl hc = { 0 };
+
+ printf("adding entries\n");
+ __pmHashAdd(0, (void *)0L, &hc);
+ __pmHashAdd(1, (void *)1L, &hc);
+ __pmHashAdd(2, (void *)2L, &hc);
+ __pmHashAdd(3, (void *)3L, &hc);
+
+ if (argc >= 2) {
+ if (strcmp(argv[1], "callback") == 0)
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_NEXT, &hc);
+ else if (strcmp(argv[1], "linked") == 0)
+ chained(&hc);
+ exit(0);
+ }
+
+ printf("iterating WALK_STOP\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_STOP, &hc);
+ printf("iterating WALK_NEXT\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_NEXT, &hc);
+ printf("iterating WALK_DELETE_STOP\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_DELETE_STOP, &hc);
+ printf("iterating WALK_NEXT\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_NEXT, &hc);
+ printf("iterating WALK_DELETE_NEXT\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_DELETE_NEXT, &hc);
+ printf("iterating WALK_NEXT\n");
+ __pmHashWalkCB(walker, (void *)PM_HASH_WALK_NEXT, &hc);
+
+ exit(0);
+}