From owner-p4-projects@FreeBSD.ORG Sun Mar 17 23:45:35 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 22FDEAC2; Sun, 17 Mar 2013 23:45:35 +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 D6EFEAC0 for ; Sun, 17 Mar 2013 23:45:34 +0000 (UTC) (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id B9F2D93C for ; Sun, 17 Mar 2013 23:45:34 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.6/8.14.6) with ESMTP id r2HNjY8h014642 for ; Sun, 17 Mar 2013 23:45:34 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.6/8.14.6/Submit) id r2HNjYRo014639 for perforce@freebsd.org; Sun, 17 Mar 2013 23:45:34 GMT (envelope-from bb+lists.freebsd.perforce@cyrus.watson.org) Date: Sun, 17 Mar 2013 23:45:34 GMT Message-Id: <201303172345.r2HNjYRo014639@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to bb+lists.freebsd.perforce@cyrus.watson.org using -f From: Robert Watson Subject: PERFORCE change 222991 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, 17 Mar 2013 23:45:35 -0000 http://p4web.freebsd.org/@@222991?ac=10 Change 222991 by rwatson@rwatson_cinnamon on 2013/03/17 23:44:57 Merge updated libtesla from contrib to sys; loop back my build changes and TESLA functional updates. Affected files ... .. //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#3 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#4 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#5 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#6 integrate .. //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#5 integrate Differences ... ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/debug.c#4 (text+ko) ==== @@ -45,9 +45,9 @@ char* transition_matrix(const struct tesla_transitions *trans) { - static const char EACH[] = "(%d:0x%tx -> %d%s) "; + static const char EACH[] = "(%d:0x%tx -> %d%s%s%s) "; - size_t needed = trans->length * (sizeof(EACH) + 4) + 4; + size_t needed = trans->length * (sizeof(EACH) + 12) + 4; char *buffer = tesla_malloc(needed); char *c = buffer; @@ -56,7 +56,10 @@ for (size_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; c += sprintf(c, EACH, t->from, t->mask, t->to, - t->fork ? " " : ""); + (t->flags & TESLA_TRANS_FORK ? " " : ""), + (t->flags & TESLA_TRANS_INIT ? " " : ""), + (t->flags & TESLA_TRANS_CLEANUP ? " " : "") + ); } c += sprintf(c, "]"); ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/key.c#3 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/libtesla.h#4 (text+ko) ==== @@ -65,15 +65,15 @@ /** The state we are moving to. */ uint32_t to; - /** - * Explicit declaration that libtesla should fork on this transition. - * - * This is useful for e.g. TELSA "or" expressions, when we need to - * allow either or both paths to be followed. - */ - int fork; + /** Things we may need to do on this transition. */ + int flags; }; +#define TESLA_TRANS_FORK 0x01 /* Always fork on this transition. */ +#define TESLA_TRANS_INIT 0x02 /* May need to initialise the class. */ +#define TESLA_TRANS_CLEANUP 0x04 /* Clean up the class now. */ + + /** * A set of permissible state transitions for an automata instance. * ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state-perthread.c#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/state.c#5 (text+ko) ==== @@ -194,6 +194,8 @@ tesla_class_reset(struct tesla_class *c) { + DEBUG_PRINT("tesla_class_reset(%" PRId64 ")\n", (uint64_t) c); + struct tesla_table *t = c->ts_table; bzero(&t->tt_instances, sizeof(struct tesla_instance) * t->tt_length); t->tt_free = t->tt_length; ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/store.c#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/tesla_internal.h#6 (text+ko) ==== ==== //depot/projects/ctsrd/tesla/src/sys/libtesla/update.c#5 (text+ko) ==== @@ -119,6 +119,9 @@ if (!tesla_key_matches(&masked, k)) continue; + if (k->tk_mask != t->mask) + continue; + if (inst->ti_state != t->from) { // If the instance matches everything but the // state, so there had better be a transition @@ -136,7 +139,8 @@ // If the keys just match (and we haven't been explictly // instructed to fork), just update the state. - if (!t->fork && key->tk_mask == k->tk_mask) { + if (!(t->flags & TESLA_TRANS_FORK) + && key->tk_mask == k->tk_mask) { VERBOSE_PRINT("update %td: %tx->%tx\n", inst - start, t->from, t->to); @@ -171,19 +175,22 @@ } - // If there is a (0 -> anything) transition, create a new instance. + // Is the transition "special" (e.g. init/cleanup)? for (uint32_t i = 0; i < trans->length; i++) { const tesla_transition *t = trans->transitions + i; - if (t->from != 0) - continue; + if (t->from == 0) { + struct tesla_instance *inst; + CHECK(tesla_instance_new, class, key, t->to, &inst); + assert(tesla_instance_active(inst)); - struct tesla_instance *inst; - CHECK(tesla_instance_new, class, key, t->to, &inst); - assert(tesla_instance_active(inst)); + matched_something = true; + VERBOSE_PRINT("new %td: %tx\n", + inst - start, inst->ti_state); + } - matched_something = true; - VERBOSE_PRINT("new %td: %tx\n", - inst - start, inst->ti_state); + if (t->flags & TESLA_TRANS_CLEANUP) { + tesla_class_reset(class); + } } if (verbose_debug()) {