From owner-p4-projects@FreeBSD.ORG Tue Jun 11 14:28:38 2013 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0E6F7522; Tue, 11 Jun 2013 14:28:38 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id ACA85520 for ; Tue, 11 Jun 2013 14:28:37 +0000 (UTC) (envelope-from jonathan@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks6.freebsd.org [IPv6:2001:1900:2254:2068::682:0]) by mx1.freebsd.org (Postfix) with ESMTP id 8D26E1786 for ; Tue, 11 Jun 2013 14:28:37 +0000 (UTC) Received: from skunkworks.freebsd.org ([127.0.1.74]) by skunkworks.freebsd.org (8.14.7/8.14.7) with ESMTP id r5BESbFn045787 for ; Tue, 11 Jun 2013 14:28:37 GMT (envelope-from jonathan@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.7/8.14.6/Submit) id r5BESb5x045784 for perforce@freebsd.org; Tue, 11 Jun 2013 14:28:37 GMT (envelope-from jonathan@freebsd.org) Date: Tue, 11 Jun 2013 14:28:37 GMT Message-Id: <201306111428.r5BESb5x045784@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jonathan@freebsd.org using -f From: Jonathan Anderson Subject: PERFORCE change 229581 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: Tue, 11 Jun 2013 14:28:38 -0000 http://p4web.freebsd.org/@@229581?ac=10 Change 229581 by jonathan@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 <> event or after a <> 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 <> 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);