From owner-p4-projects@FreeBSD.ORG Sun Jul 7 01:41:01 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 584CFD9A; Sun, 7 Jul 2013 01:41:01 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 1C134D98 for ; Sun, 7 Jul 2013 01:41:01 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [8.8.178.74]) by mx1.freebsd.org (Postfix) with ESMTP id 0C1EA1C45 for ; Sun, 7 Jul 2013 01:41:01 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.7/8.14.7) with ESMTP id r671f0Fv012250 for ; Sun, 7 Jul 2013 01:41:00 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.7/8.14.6/Submit) id r671f0Z2012247 for perforce@freebsd.org; Sun, 7 Jul 2013 01:41:00 GMT (envelope-from jonathan@freebsd.org) Date: Sun, 7 Jul 2013 01:41:00 GMT Message-Id: <201307070141.r671f0Z2012247@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 230769 for review To: Perforce Change Reviews Precedence: bulk X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.14 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 07 Jul 2013 01:41:01 -0000 http://p4web.freebsd.org/@@230769?ac=10 Change 230769 by jonathan@jonathan-on-joe on 2013/07/07 01:40:34 Update libtesla to latest GitHub version. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#10 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla-macros.h#6 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla.h#3 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_class.c#6 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_internal.h#8 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_notification.c#13 edit .. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#9 edit Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#10 (text+ko) ==== @@ -278,8 +278,9 @@ #ifdef _KERNEL #define TESLA_KERN_PRINTF_EV 0x1 -#define TESLA_KERN_DTRACE_EV 0x2 -#define TESLA_KERN_PANIC_EV 0x4 +#define TESLA_KERN_PRINTERR_EV 0x2 +#define TESLA_KERN_DTRACE_EV 0x4 +#define TESLA_KERN_PANIC_EV 0x8 #endif /** @} */ ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla-macros.h#6 (text+ko) ==== @@ -78,6 +78,9 @@ #define strict(...) __tesla_strict(TIGNORE, __VA_ARGS__) #define conditional(...) __tesla_conditional(TIGNORE, __VA_ARGS__) +#define flags(...) __tesla_flags(__VA_ARGS__) +#define bitmask(...) __tesla_mask(__VA_ARGS__) + #define TESLA_NOW __tesla_now ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/tesla.h#3 (text+ko) ==== @@ -99,6 +99,12 @@ /** Function events inside this predicate refer to the caller context. */ struct __tesla_event* __tesla_caller(__tesla_event*, ...); +/** A mask of flags we expect to see. */ +int __tesla_flags(int); + +/** A bitmask that an argument must not exceed. */ +int __tesla_mask(int); + /** * Events named in this predicate should only occur exactly as described. * ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_class.c#6 (text+ko) ==== @@ -170,6 +170,14 @@ } void +tesla_instance_clear(struct tesla_instance *tip) +{ + + bzero(tip, sizeof(*tip)); + assert(!tesla_instance_active(tip)); +} + +void tesla_class_put(struct tesla_class *tsp) { switch (tsp->tc_context) { ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_internal.h#8 (text+ko) ==== @@ -120,13 +120,8 @@ int32_t tesla_instance_clone(struct tesla_class *tclass, const struct tesla_instance *orig, struct tesla_instance **copy); -/** - * This interface releases an instance for reuse; some types of automata will - * prefer tesla_class_reset(), which clears all instances associated with a - * particular tesla_class. - */ -void tesla_instance_destroy(struct tesla_class *tsp, - struct tesla_instance *tip); +/** Zero an instance for re-use. */ +void tesla_instance_clear(struct tesla_instance *tip); /** @@ -161,6 +156,9 @@ /** The instance should be copied to a new instance. */ FORK, + /** The instance should be merged into another instance. */ + JOIN, + /** The instance is irrelevant to the given transitions. */ IGNORE, ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_notification.c#13 (text+ko) ==== @@ -192,7 +192,7 @@ print_new_instance(struct tesla_class *tcp, struct tesla_instance *tip) { - DEBUG(libtesla.instance.new, "new %td: %tx\n", + DEBUG(libtesla.instance.new, "new %td: %d\n", tip - tcp->tc_instances, tip->ti_state); } @@ -201,7 +201,7 @@ struct tesla_instance *tip, const struct tesla_transition *transp) { - DEBUG(libtesla.state.transition, "update %td: %tx->%tx\n", + DEBUG(libtesla.state.transition, "update %td: %d->%d\n", tip - tcp->tc_instances, transp->from, transp->to); } @@ -211,7 +211,7 @@ const struct tesla_transition *transp) { - DEBUG(libtesla.instance.clone, "clone %td:%tx -> %td:%tx\n", + DEBUG(libtesla.instance.clone, "clone %td:%d -> %td:%d\n", old_instance - tcp->tc_instances, transp->from, new_instance - tcp->tc_instances, transp->to); } @@ -308,6 +308,16 @@ .teh_ignored = print_ignored, }; +static const struct tesla_event_handlers printf_on_failure = { + .teh_init = ev_noop, + .teh_transition = ev_noop, + .teh_clone = ev_noop, + .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, +}; /* * Wrappers that panic on failure: @@ -330,21 +340,12 @@ tesla_panic("TESLA: failure in '%s': bad transition", tcp->tc_name); } -static void -panic_err(struct tesla_class *tcp, int errno, const char *message) -{ - - tesla_panic("TESLA: error in '%s': %s (%d)", tcp->tc_name, message, - errno); -} - static const struct tesla_event_handlers failstop_handlers = { .teh_init = ev_noop, .teh_transition = ev_noop, .teh_clone = ev_noop, .teh_fail_no_instance = panic_no_instance, .teh_bad_transition = panic_bad_transition, - .teh_err = panic_err, .teh_accept = ev_noop, .teh_ignored = ev_noop, }; @@ -356,6 +357,7 @@ */ const static struct tesla_event_handlers* const default_handlers[] = { &printf_handlers, + &printf_on_failure, #if defined(_KERNEL) && defined(KDTRACE_HOOKS) &dtrace_handlers, #endif @@ -365,9 +367,9 @@ static struct tesla_event_metahandler default_event_handlers = { .tem_length = sizeof(default_handlers) / sizeof(*default_handlers), #if defined(_KERNEL) && defined(KDTRACE_HOOKS) - .tem_mask = 0x2, + .tem_mask = TESLA_KERN_DTRACE_EV, #else - .tem_mask = 0x3, + .tem_mask = 0x5, #endif .tem_handlers = default_handlers, }; ==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#9 (text+ko) ==== @@ -138,6 +138,23 @@ matched_something = true; break; } + + case JOIN: +#ifndef NDEBUG + { + int target = -1; + for (int j = 0; j < class->tc_limit; j++) { + tesla_instance *t = class->tc_instances + j; + if (t->ti_state == trigger->to) { + target = j; + break; + } + } + assert(target >= 0); + } +#endif + tesla_instance_clear(inst); + break; } if (trigger && (trigger->flags & TESLA_TRANS_CLEANUP)) @@ -230,7 +247,6 @@ if (t->from == inst->ti_state) { assert(inst->ti_key.tk_mask == t->from_mask); - assert(SUBSET(t->from_mask, t->to_mask)); /* * We need to match events against a pattern based on @@ -246,10 +262,20 @@ pattern.tk_mask &= t->from_mask; /* + * Losing information implies a join + * (except during automaton instance cleanup). + */ + if (!SUBSET(t->from_mask, t->to_mask) + && ((t->flags & TESLA_TRANS_CLEANUP) == 0)) { + *trigger = t; + return JOIN; + } + + /* * Does the transition cause key data to be added * to the instance's name? */ - if (t->from_mask == t->to_mask) { + if (SUBSET(t->to_mask, t->from_mask)) { /* * No: just just update the instance * if its (masked) name matches.