PERFORCE change 229581 for review

Jonathan Anderson jonathan at FreeBSD.org
Tue Jun 11 14:28:38 UTC 2013


http://p4web.freebsd.org/@@229581?ac=10

Change 229581 by jonathan at jonathan-on-joe on 2013/06/11 14:28:18

	Update libtesla to most recent version.
	
	This version ignores events that are out of scope, i.e. occur before an <<init>> event
	or after a <<cleanup>> event.

Affected files ...

.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#4 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_dtrace.c#3 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_notification.c#3 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#2 edit

Differences ...

==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#4 (text+ko) ====

@@ -271,6 +271,10 @@
 typedef void	(*tesla_ev_accept)(struct tesla_class *,
 	    struct tesla_instance *);
 
+/** An event is being ignored. */
+typedef void	(*tesla_ev_ignored)(const struct tesla_class *,
+	    const struct tesla_key *, const struct tesla_transitions *);
+
 /** A vector of event handlers. */
 struct tesla_event_handlers {
 	tesla_ev_new_instance	teh_init;
@@ -279,6 +283,7 @@
 	tesla_ev_no_instance	teh_fail_no_instance;
 	tesla_ev_bad_transition	teh_bad_transition;
 	tesla_ev_accept		teh_accept;
+	tesla_ev_ignored	teh_ignored;
 };
 
 /** Register a set of event handlers. */

==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_dtrace.c#3 (text+ko) ====

@@ -54,6 +54,9 @@
     "struct tesla_transitions *");
 SDT_PROBE_DEFINE2(tesla, kernel, notify, accept, accept,
     "struct tesla_class *", "struct tesla_instance *");
+SDT_PROBE_DEFINE3(tesla, kernel, notify, ignored, ignored-event,
+    "struct tesla_class *", "struct tesla_key *",
+    "struct tesla_transitions *");
 
 static void
 new_instance(struct tesla_class *tcp, struct tesla_instance *tip)
@@ -101,13 +104,22 @@
 	SDT_PROBE(tesla, kernel, notify, accept, tcp, tip, 0, 0, 0);
 }
 
+static void
+ignored(struct tesla_class *tcp, const struct tesla_key *tkp,
+    const struct tesla_transitions *ttp)
+{
+
+	SDT_PROBE(tesla, kernel, notify, ignored, tcp, tkp, tip, 0, 0);
+}
+
 struct tesla_event_handlers dtrace_handlers = {
 	.teh_init			= new_instance,
 	.teh_transition			= transition,
 	.teh_clone			= clone,
 	.teh_fail_no_instance		= no_instance,
 	.teh_bad_transition		= bad_transition,
-	.teh_accept			= accept
+	.teh_accept			= accept,
+	.teh_ignored			= ignored,
 };
 
 #endif /* _KERNEL */

==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_notification.c#3 (text+ko) ====

@@ -41,7 +41,7 @@
 	if (!tehp || !tehp->teh_init || !tehp->teh_transition
 	    || !tehp->teh_clone || !tehp->teh_fail_no_instance
 	    || !tehp->teh_bad_transition
-	    || !tehp->teh_accept)
+	    || !tehp->teh_accept || !tehp->teh_ignored)
 		return (TESLA_ERROR_EINVAL);
 
 	ev_handlers = tehp;
@@ -69,13 +69,17 @@
 
 static void	print_accept(struct tesla_class *, struct tesla_instance *);
 
+static void	print_ignored(const struct tesla_class *,
+	    const struct tesla_key *, const struct tesla_transitions *);
+
 struct tesla_event_handlers printf_handlers = {
 	.teh_init		= print_new_instance,
 	.teh_transition		= print_transition_taken,
 	.teh_clone		= print_clone,
 	.teh_fail_no_instance	= print_no_instance,
 	.teh_bad_transition	= print_bad_transition,
-	.teh_accept		= print_accept
+	.teh_accept		= print_accept,
+	.teh_ignored		= print_ignored,
 };
 
 
@@ -94,7 +98,8 @@
 	.teh_clone		= print_clone,
 	.teh_fail_no_instance	= panic_no_instance,
 	.teh_bad_transition	= panic_bad_transition,
-	.teh_accept		= print_accept
+	.teh_accept		= print_accept,
+	.teh_ignored		= print_ignored,
 };
 
 
@@ -241,6 +246,21 @@
 		tip - tcp->tc_instances);
 }
 
+void
+print_ignored(const struct tesla_class *tcp, const struct tesla_key *tkp,
+    const struct tesla_transitions *transp)
+{
+	char buffer[ERROR_BUFFER_LENGTH];
+	char *next = buffer;
+	const char *end = buffer + sizeof(buffer);
+
+	next = key_string(next, end, tkp);
+	SAFE_SPRINTF(next, end, " : ");
+	sprint_transitions(next, end, transp);
+
+	DEBUG(libtesla.event, "ignore '%s':%s", tcp->tc_name, buffer);
+}
+
 
 static void
 print_failure_header(const struct tesla_class *tcp)

==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#2 (text+ko) ====

@@ -175,6 +175,16 @@
 		}
 	}
 
+	if (!matched_something) {
+		// If the class hasn't received any <<init>> events yet,
+		// simply ignore the event: it is out of scope.
+		if (class->tc_free == class->tc_limit)
+			ev_handlers->teh_ignored(class, pattern, trans);
+
+		// Otherwise, we ought to have matched something.
+		else ev_handlers->teh_fail_no_instance(class, pattern, trans);
+	}
+
 	// Does it cause class cleanup?
 	if (cleanup_required)
 		tesla_class_reset(class);
@@ -182,9 +192,6 @@
 	print_class(class);
 	PRINT("\n====\n\n");
 
-	if (!matched_something)
-		ev_handlers->teh_fail_no_instance(class, pattern, trans);
-
 	tesla_class_put(class);
 
 	return (TESLA_SUCCESS);


More information about the p4-projects mailing list