MEDIUM: pattern: add a revision to all pattern expressions

This will be used to detect any change on the pattern list between
two operations, ultimately making it possible to implement a cache
which immediately invalidates obsolete keys after an update. The
revision is simply taken from the timestamp counter to ensure that
even upon a pointer reuse we cannot accidently come back to the
same (expr,revision) tuple.
diff --git a/include/types/pattern.h b/include/types/pattern.h
index 492cdd3..54af8fb 100644
--- a/include/types/pattern.h
+++ b/include/types/pattern.h
@@ -186,6 +186,7 @@
  */
 struct pattern_expr {
 	struct list list; /* Used for chaining pattern_expr in pat_ref. */
+	unsigned long long revision; /* updated for each update */
 	struct pat_ref *ref; /* The pattern reference if exists. */
 	struct pattern_head *pat_head; /* Point to the pattern_head that contain manipulation functions.
 	                                * Note that this link point on compatible head but not on the real
diff --git a/src/pattern.c b/src/pattern.c
index b19ffe2..ebae85d 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -978,6 +978,7 @@
 
 	/* chain pattern in the expression */
 	LIST_ADDQ(&expr->patterns, &patl->list);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1006,6 +1007,7 @@
 
 	/* chain pattern in the expression */
 	LIST_ADDQ(&expr->patterns, &patl->list);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1035,6 +1037,7 @@
 
 	/* chain pattern in the expression */
 	LIST_ADDQ(&expr->patterns, &patl->list);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1071,6 +1074,7 @@
 
 	/* chain pattern in the expression */
 	LIST_ADDQ(&expr->patterns, &patl->list);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1109,6 +1113,7 @@
 
 			/* Insert the entry. */
 			ebmb_insert_prefix(&expr->pattern_tree, &node->node, 4);
+			expr->revision = rdtsc();
 
 			/* that's ok */
 			return 1;
@@ -1136,6 +1141,7 @@
 
 		/* Insert the entry. */
 		ebmb_insert_prefix(&expr->pattern_tree_2, &node->node, 16);
+		expr->revision = rdtsc();
 
 		/* that's ok */
 		return 1;
@@ -1179,6 +1185,7 @@
 
 	/* index the new node */
 	ebst_insert(&expr->pattern_tree, &node->node);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1220,6 +1227,7 @@
 
 	/* index the new node */
 	ebmb_insert_prefix(&expr->pattern_tree, &node->node, len);
+	expr->revision = rdtsc();
 
 	/* that's ok */
 	return 1;
@@ -1240,6 +1248,7 @@
 		free(pat->pat.smp);
 		free(pat);
 	}
+	expr->revision = rdtsc();
 }
 
 void pat_del_tree_ip(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1283,6 +1292,7 @@
 		free(elt->smp);
 		free(elt);
 	}
+	expr->revision = rdtsc();
 }
 
 void pat_del_list_ptr(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1301,6 +1311,7 @@
 		free(pat->pat.smp);
 		free(pat);
 	}
+	expr->revision = rdtsc();
 }
 
 void pat_del_tree_str(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1328,6 +1339,7 @@
 		free(elt->smp);
 		free(elt);
 	}
+	expr->revision = rdtsc();
 }
 
 void pat_del_list_reg(struct pattern_expr *expr, struct pat_ref_elt *ref)
@@ -1346,11 +1358,13 @@
 		free(pat->pat.smp);
 		free(pat);
 	}
+	expr->revision = rdtsc();
 }
 
 void pattern_init_expr(struct pattern_expr *expr)
 {
 	LIST_INIT(&expr->patterns);
+	expr->revision = 0;
 	expr->pattern_tree = EB_ROOT;
 	expr->pattern_tree_2 = EB_ROOT;
 }