PERFORCE change 229888 for review
Jonathan Anderson
jonathan at FreeBSD.org
Tue Jun 18 13:46:34 UTC 2013
http://p4web.freebsd.org/@@229888?ac=10
Change 229888 by jonathan at jonathan-on-zenith on 2013/06/18 13:45:52
Report errors with ev_err() rather than a return code.
Instrumentation should be very simplle: it's better to call a void tesla_update_state() than try to handle errors from generated instrumentation.
Instead, we use the new ev_errr() event handler from within tesla_update_state() to handle errors like ENOMEM.
This change will require (not-yet-committed) TESLA instrumenter changes.
Affected files ...
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#8 edit
.. //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#6 edit
Differences ...
==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/include/libtesla.h#8 (text+ko) ====
@@ -194,7 +194,7 @@
/**
* Update all automata instances that match a given key to a new state.
*/
-int32_t tesla_update_state(enum tesla_context context, uint32_t class_id,
+void tesla_update_state(enum tesla_context context, uint32_t class_id,
const struct tesla_key *key, const char *name, const char *description,
const struct tesla_transitions*);
==== //depot/projects/ctsrd/tesla/src/sys/contrib/tesla/libtesla/tesla_update.c#6 (text+ko) ====
@@ -37,23 +37,16 @@
#include <inttypes.h>
#endif
-#define CHECK(fn, ...) do { \
- int err = fn(__VA_ARGS__); \
- if (err != TESLA_SUCCESS) { \
- PRINT("error in " #fn ": %s\n", tesla_strerror(err)); \
- return (err); \
- } \
-} while(0)
-
#define DEBUG_NAME "libtesla.state.update"
#define PRINT(...) DEBUG(libtesla.state.update, __VA_ARGS__)
-int32_t
+void
tesla_update_state(enum tesla_context tesla_context, uint32_t class_id,
const struct tesla_key *pattern,
const char *name, const char *description,
const struct tesla_transitions *trans)
{
+ int err;
if (tesla_debugging(DEBUG_NAME)) {
/* We should never see with multiple <<init>> transitions. */
@@ -80,17 +73,20 @@
PRINT("\n----\n");
struct tesla_store *store;
- CHECK(tesla_store_get, tesla_context, TESLA_MAX_CLASSES,
- TESLA_MAX_INSTANCES, &store);
+ err = tesla_store_get(tesla_context, TESLA_MAX_CLASSES,
+ TESLA_MAX_INSTANCES, &store);
+ if (err != TESLA_SUCCESS)
+ return;
+
PRINT("store: 0x%tx\n", (intptr_t) store);
struct tesla_class *class;
- CHECK(tesla_class_get, store, class_id, &class, name, description);
+ err = tesla_class_get(store, class_id, &class, name, description);
+ if (err != TESLA_SUCCESS)
+ return;
print_class(class);
- int error = TESLA_SUCCESS;
-
// Did we match any instances?
bool matched_something = false;
@@ -134,7 +130,8 @@
case FORK: {
if (cloned >= max_clones) {
- error = TESLA_ERROR_ENOMEM;
+ err = TESLA_ERROR_ENOMEM;
+ ev_err(class, err, "too many clones");
goto cleanup;
}
@@ -154,11 +151,19 @@
for (size_t i = 0; i < cloned; i++) {
struct clone_info *c = clones + i;
struct tesla_instance *clone;
- CHECK(tesla_instance_clone, class, c->old, &clone);
+ err = tesla_instance_clone(class, c->old, &clone);
+ if (err != TESLA_SUCCESS) {
+ ev_err(class, err, "failed to clone instance");
+ goto cleanup;
+ }
tesla_key new_name = *pattern;
new_name.tk_mask &= c->transition->to_mask;
- CHECK(tesla_key_union, &clone->ti_key, &new_name);
+ err = tesla_key_union(&clone->ti_key, &new_name);
+ if (err != TESLA_SUCCESS) {
+ ev_err(class, err, "failed to union keys");
+ goto cleanup;
+ }
clone->ti_state = c->transition->to;
@@ -174,7 +179,12 @@
const tesla_transition *t = trans->transitions + i;
if (t->flags & TESLA_TRANS_INIT) {
struct tesla_instance *inst;
- CHECK(tesla_instance_new, class, pattern, t->to, &inst);
+ err = tesla_instance_new(class, pattern, t->to, &inst);
+ if (err != TESLA_SUCCESS) {
+ ev_err(class, err, "failed to create instance");
+ goto cleanup;
+ }
+
assert(tesla_instance_active(inst));
matched_something = true;
@@ -201,7 +211,6 @@
cleanup:
tesla_class_put(class);
- return error;
}
enum tesla_action_t
More information about the p4-projects
mailing list