PERFORCE change 231357 for review

Jonathan Anderson jonathan at FreeBSD.org
Tue Jul 23 00:28:49 UTC 2013


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

Change 231357 by jonathan at jonathan-on-zenith on 2013/07/23 00:28:45

	Pull in latest libtesla parts.

Affected files ...

.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla-macros.h#9 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla.h#7 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_class.c#7 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_debug.c#5 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_internal.h#10 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_notification.c#15 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_store.c#6 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#11 edit

Differences ...

==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla-macros.h#9 (text+ko) ====

@@ -90,17 +90,17 @@
 #define	tesla_done		return (__tesla_automaton_done())
 
 #define	optional(...)		__tesla_optional(TIGNORE, __VA_ARGS__)
-#define	ANY_REP	INT_MAX
+#define	ANY_REP			__TESLA_INFINITE_REPETITIONS
 #define	REPEAT(m, n, ...)	__tesla_repeat(m, n, __VA_ARGS__)
 #define	UPTO(n, ...)		__tesla_repeat(1, n, __VA_ARGS__)
 #define	ATLEAST(n, ...)		__tesla_repeat(n, ANY_REP, __VA_ARGS__)
 #define	ANY(int_type)		__tesla_any(int_type)
 
 /** A more programmer-friendly way to write assertions about the past. */
-#define previously(...)    TSEQUENCE(__VA_ARGS__, TESLA_ASSERTION_SITE)
+#define previously(...)		TSEQUENCE(__VA_ARGS__, TESLA_ASSERTION_SITE)
 
 /** A more programmer-friendly way to write assertions about the future. */
-#define eventually(...)    TSEQUENCE(TESLA_ASSERTION_SITE, __VA_ARGS__)
+#define eventually(...)		TSEQUENCE(TESLA_ASSERTION_SITE, __VA_ARGS__)
 
 /** @} */
 

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

@@ -66,17 +66,14 @@
 __tesla_inline_assertion(const char *filename, int line, int count,
 	__tesla_locality *loc, ...);
 
+#define	__TESLA_INFINITE_REPETITIONS	INT_MAX
+
 
 /* Only define the following things if doing TESLA analysis, not compiling. */
 #ifdef	__TESLA_ANALYSER__
 
 #include <sys/types.h>
-
-#ifdef _KERNEL
-#include <sys/limits.h>
-#else
 #include <limits.h>
-#endif
 
 /**
  * TESLA events can be serialised either with respect to the current thread
@@ -89,7 +86,7 @@
 struct __tesla_event* __tesla_sequence(__tesla_event*, ...);
 
 /** A sequence of events that repeats. */
-struct __tesla_event* __tesla_repeat(int min, int max, __tesla_event*, ...);
+struct __tesla_event* __tesla_repeat(int min, int max, ...);
 
 /* TESLA events: */
 /** Entering a function (with optionally-specified arguments). */
@@ -225,6 +222,7 @@
 
 #define	__tesla_strict(...)		0
 #define	__tesla_conditional(...)	0
+#define	__tesla_repeat(...)	0
 
 #endif	/* __TESLA_ANALYSER__ */
 

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

@@ -33,6 +33,7 @@
  */
 
 #include "tesla_internal.h"
+#include "tesla_key.h"
 
 #ifdef _KERNEL
 MALLOC_DEFINE(M_TESLA, "tesla", "TESLA internal state");
@@ -119,14 +120,6 @@
 }
 
 
-int
-tesla_instance_active(const struct tesla_instance *i)
-{
-	assert(i != NULL);
-
-	return ((i->ti_state != 0) || (i->ti_key.tk_mask != 0));
-}
-
 
 int32_t
 tesla_instance_new(struct tesla_class *tclass, const struct tesla_key *name,

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

@@ -156,12 +156,23 @@
 	/*
 	 * Debugging paths could be more vulnerable to format string problems
 	 * than other code; don't allow when running setuid or setgid.
-	 */
-	if (issetugid())
+		*/
+	static int isnotme = -1;
+
+	if (isnotme == -1)
+		isnotme = issetugid();
+
+	if (isnotme)
 		return 0;
 #endif
 
-	const char *env = getenv("TESLA_DEBUG");
+	static const char *env = (char*)-1;
+	if (env == (char*)-1)
+	{
+		env = getenv("TESLA_DEBUG");
+		if (env != 0 && *env == '\0')
+			env = 0;
+	}
 
 	/* If TESLA_DEBUG is not set, we're definitely not debugging. */
 	if (env == NULL)
@@ -246,5 +257,11 @@
 	print("%s", buffer);
 }
 
+#else
+
+#undef tesla_debugging
+int32_t
+tesla_debugging(const char *name) { return 0; }
+
 #endif /* !NDEBUG */
 

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

@@ -113,7 +113,14 @@
  *
  * @returns     1 if active, 0 if inactive
  */
-int32_t	tesla_instance_active(const struct tesla_instance *i);
+static inline int32_t
+tesla_instance_active(const struct tesla_instance *i)
+{
+	assert(i != NULL);
+
+	return ((i->ti_state != 0) || (i->ti_key.tk_mask != 0));
+}
+
 
 
 /** Clone an existing instance into a new instance. */
@@ -139,13 +146,6 @@
 int32_t	tesla_match(struct tesla_class *tclass, const struct tesla_key *key,
 	    struct tesla_instance **array, uint32_t *size);
 
-/**
- * Check to see if a key matches a pattern.
- *
- * @returns  1 if @a k matches @a pattern, 0 otherwise
- */
-int32_t	tesla_key_matches(
-	    const struct tesla_key *pattern, const struct tesla_key *k);
 
 
 /** Actions that can be taken by @ref tesla_update_state. */
@@ -176,9 +176,6 @@
 	    const struct tesla_key*, const struct tesla_transitions*,
 	    const struct tesla_transition** trigger);
 
-/** Copy new entries from @a source into @a dest. */
-int32_t	tesla_key_union(struct tesla_key *dest, const struct tesla_key *source);
-
 
 #ifndef __unused
 #if __has_attribute(unused)
@@ -346,16 +343,17 @@
 #define error(...)	fprintf(stderr, __VA_ARGS__)
 #endif
 
-#ifndef NDEBUG
-
-#define __debug
-
 #ifdef _KERNEL
 #include <sys/systm.h>
 #else
 #include <stdio.h>
 #endif
 
+#ifndef NDEBUG
+
+#define __debug
+
+
 /** Are we in (verbose) debug mode? */
 int32_t	tesla_debugging(const char*);
 
@@ -369,7 +367,9 @@
 #define __debug __unused
 
 #define DEBUG(...)
-int32_t	tesla_debugging(const char*) { return 0; }
+#define tesla_debugging(...) 0
+#define print_key(...)
+#define print_class(...)
 
 #endif
 
@@ -407,6 +407,10 @@
 char*	sprint_transitions(char *buffer, const char *end,
     const struct tesla_transitions *);
 
+/** Flag indicating whether ev_transition should be called. */
+extern int have_transitions;
+
 /** @} */
 
+
 #endif /* TESLA_INTERNAL_H */

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

@@ -34,6 +34,12 @@
 
 #define	ERROR_BUFFER_LENGTH	1024
 
+#ifndef NDEBUG
+int have_transitions = 1;
+#else
+int have_transitions = 0;
+#endif
+
 /**
  * The currently-active event handlers.
  */
@@ -68,6 +74,7 @@
 		.tem_mask = 1,
 		.tem_handlers = singleton,
 	};
+	have_transitions = (tehp->teh_transition != 0);
 
 	singleton[0] = tehp;
 	event_handlers = &singleton_handler;
@@ -79,6 +86,7 @@
 tesla_set_event_handlers(struct tesla_event_metahandler *temp)
 {
 	int error = TESLA_SUCCESS;
+	int will_have_transitions = 0;
 
 	if (!temp)
 		return (TESLA_ERROR_EINVAL);
@@ -91,8 +99,11 @@
 		error = check_event_handler(temp->tem_handlers[i]);
 		if (error != TESLA_SUCCESS)
 			return (error);
+		if (temp->tem_handlers[i]->teh_transition)
+			will_have_transitions = 1;
 	}
 
+	have_transitions = will_have_transitions;
 	event_handlers = temp;
 	return (TESLA_SUCCESS);
 }
@@ -101,21 +112,18 @@
 /*
  * generic event handlers:
  */
-#define	FOREACH_ERROR_HANDLER() \
+#define	FOREACH_ERROR_HANDLER(x, ...) \
 	for (uint32_t i = 0; i < event_handlers->tem_length; i++) \
 		if (event_handlers->tem_mask & (1 << i)) \
-			event_handlers->tem_handlers[i]
+			if (event_handlers->tem_handlers[i]->x) \
+				event_handlers->tem_handlers[i]->x(__VA_ARGS__)
 
-static void
-ev_noop()
-{
-}
 
 void
 ev_new_instance(struct tesla_class *tcp, struct tesla_instance *tip)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_init(tcp, tip);
+	FOREACH_ERROR_HANDLER(teh_init, tcp, tip);
 }
 
 void
@@ -123,7 +131,7 @@
 	const struct tesla_transition *ttp)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_transition(tcp, tip, ttp);
+	FOREACH_ERROR_HANDLER(teh_transition, tcp, tip, ttp);
 }
 
 void
@@ -131,7 +139,7 @@
 	struct tesla_instance *copy, const struct tesla_transition *ttp)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_clone(tcp, orig, copy, ttp);
+	FOREACH_ERROR_HANDLER(teh_clone, tcp, orig, copy, ttp);
 }
 
 void
@@ -139,7 +147,7 @@
 	const struct tesla_transitions *ttp)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_fail_no_instance(tcp, tkp, ttp);
+	FOREACH_ERROR_HANDLER(teh_fail_no_instance, tcp, tkp, ttp);
 }
 
 void
@@ -147,21 +155,21 @@
 	const struct tesla_transitions *ttp)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_bad_transition(tcp, tip, ttp);
+	FOREACH_ERROR_HANDLER(teh_bad_transition, tcp, tip, ttp);
 }
 
 void
 ev_err(struct tesla_class *tcp, int errno, const char *message)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_err(tcp, errno, message);
+	FOREACH_ERROR_HANDLER(teh_err, tcp, errno, message);
 }
 
 void
 ev_accept(struct tesla_class *tcp, struct tesla_instance *tip)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_accept(tcp, tip);
+	FOREACH_ERROR_HANDLER(teh_accept, tcp, tip);
 }
 
 void
@@ -169,7 +177,7 @@
 	const struct tesla_transitions *ttp)
 {
 
-	FOREACH_ERROR_HANDLER()->teh_ignored(tcp, tkp, ttp);
+	FOREACH_ERROR_HANDLER(teh_ignored, tcp, tkp, ttp);
 }
 
 
@@ -309,14 +317,14 @@
 };
 
 static const struct tesla_event_handlers printf_on_failure = {
-	.teh_init		= ev_noop,
-	.teh_transition		= ev_noop,
-	.teh_clone		= ev_noop,
+	.teh_init		= 0,
+	.teh_transition		= 0,
+	.teh_clone		= 0,
 	.teh_fail_no_instance	= print_no_instance,
 	.teh_bad_transition	= print_bad_transition,
 	.teh_err		= print_error,
-	.teh_accept		= ev_noop,
-	.teh_ignored		= ev_noop,
+	.teh_accept		= 0,
+	.teh_ignored		= 0,
 };
 
 /*
@@ -349,14 +357,14 @@
 }
 
 static const struct tesla_event_handlers failstop_handlers = {
-	.teh_init		= ev_noop,
-	.teh_transition		= ev_noop,
-	.teh_clone		= ev_noop,
+	.teh_init		= 0,
+	.teh_transition		= 0,
+	.teh_clone		= 0,
 	.teh_fail_no_instance	= panic_no_instance,
 	.teh_bad_transition	= panic_bad_transition,
 	.teh_err		= panic_errno,
-	.teh_accept		= ev_noop,
-	.teh_ignored		= ev_noop,
+	.teh_accept		= 0,
+	.teh_ignored		= 0,
 };
 
 
@@ -365,7 +373,9 @@
  * either use DTrace or fail-stop if DTrace is not available.
  */
 const static struct tesla_event_handlers* const default_handlers[] = {
+#ifndef NDEBUG
 	&printf_handlers,
+#endif
 	&printf_on_failure,
 #if defined(_KERNEL) && defined(KDTRACE_HOOKS)
 	&dtrace_handlers,

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

@@ -61,6 +61,10 @@
     tesla_global_store_sysinit, NULL);
 #endif
 
+#ifndef _KERNEL
+__thread tesla_store *cache = NULL;
+#endif
+
 int32_t
 tesla_store_get(enum tesla_context context, uint32_t classes,
 	uint32_t instances, tesla_store* *storep)
@@ -78,8 +82,12 @@
 #ifdef _KERNEL
 		store = curthread->td_tesla;
 #else
-		pthread_key_t key = pthread_key();
-		store = pthread_getspecific(key);
+		pthread_key_t key;
+		if (!cache) {
+			key = pthread_key();
+			cache = pthread_getspecific(key);
+		}
+		store = cache;
 #endif
 
 		// Create a new store if we don't already have one.

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

@@ -31,6 +31,7 @@
  */
 
 #include "tesla_internal.h"
+#include "tesla_key.h"
 
 #ifndef _KERNEL
 #include <stdbool.h>
@@ -72,14 +73,15 @@
 	PRINT("\n----\n");
 
 	struct tesla_store *store;
-	assert(tesla_store_get(tesla_context, TESLA_MAX_CLASSES,
-			TESLA_MAX_INSTANCES, &store) == TESLA_SUCCESS);
+	int ret = tesla_store_get(tesla_context, TESLA_MAX_CLASSES,
+			TESLA_MAX_INSTANCES, &store);
+	assert(ret == TESLA_SUCCESS);
 
 	PRINT("store: 0x%tx\n", (intptr_t) store);
 
 	struct tesla_class *class;
-	assert(tesla_class_get(store, class_id, &class, name, description)
-		== TESLA_SUCCESS);
+	ret = tesla_class_get(store, class_id, &class, name, description);
+	assert(ret == TESLA_SUCCESS);
 
 	print_class(class);
 
@@ -99,13 +101,15 @@
 
 	// Iterate over existing instances, figure out what to do with each.
 	int err = TESLA_SUCCESS;
-	for (uint32_t i = 0; i < class->tc_limit; i++) {
+	int expected = class->tc_limit - class->tc_free;
+	for (uint32_t i = 0; expected > 0 && (i < class->tc_limit); i++) {
 		assert(class->tc_instances != NULL);
 		tesla_instance *inst = class->tc_instances + i;
 
 		const tesla_transition *trigger = NULL;
 		enum tesla_action_t action =
 			tesla_action(inst, pattern, trans, &trigger);
+		expected -= action == IGNORE ? 0 : 1;
 
 		switch (action) {
 		case FAIL:
@@ -116,7 +120,8 @@
 			break;
 
 		case UPDATE:
-			ev_transition(class, inst, trigger);
+			if (have_transitions)
+				ev_transition(class, inst, trigger);
 			inst->ti_state = trigger->to;
 			matched_something = true;
 


More information about the p4-projects mailing list