X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif.c;h=28b936b139fdb9480e75491ae765435a6b25f710;hb=ea413ef8eecbcd3034446b9dfd49714cbb6815d2;hp=01e905d936cafa61db25d1608b17ae2bba67d70a;hpb=d59051362fa8ac4369f1be69ac942a52c9a424b9;p=sliver-openvswitch.git diff --git a/lib/dpif.c b/lib/dpif.c index 01e905d93..28b936b13 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -37,6 +37,7 @@ #include "svec.h" #include "util.h" #include "valgrind.h" +#include "fatal-signal.h" #include "vlog.h" VLOG_DEFINE_THIS_MODULE(dpif) @@ -54,6 +55,7 @@ struct registered_dpif_class { }; static struct shash dpif_classes = SHASH_INITIALIZER(&dpif_classes); + /* Rate limit for individual messages going to or from the datapath, output at * DBG level. This is very high because, if these are enabled, it is because * we really need to see them. */ @@ -78,14 +80,30 @@ dp_initialize(void) if (status < 0) { int i; +#ifdef THREADED + struct shash_node *node; +#endif status = 0; for (i = 0; i < ARRAY_SIZE(base_dpif_classes); i++) { dp_register_provider(base_dpif_classes[i]); } + +#ifdef THREADED + /* register an exit handler for the registered classes */ + SHASH_FOR_EACH(node, &dpif_classes) { + const struct registered_dpif_class *registered_class = node->data; + if (registered_class->dpif_class.exit_hook) { + fatal_signal_add_hook(registered_class->dpif_class.exit_hook, + NULL, NULL, true); + } + } +#endif } } + + /* Performs periodic work needed by all the various kinds of dpifs. * * If your program opens any dpifs, it must call both this function and @@ -118,13 +136,34 @@ dp_wait(void) } } +#ifdef THREADED +/* Start the datapath management. + * + * This function has been thought for a scenario in which the management of the + * datapath module and the ofproto module are performed in separate + * threads/processes module. */ +void +dp_start(void) +{ + struct shash_node *node; + + SHASH_FOR_EACH(node, &dpif_classes) { + const struct registered_dpif_class *registered_class = node->data; + if (registered_class->dpif_class.start) { + registered_class->dpif_class.start(); + } + } +} +#endif + + /* Registers a new datapath provider. After successful registration, new * datapaths of that type can be opened using dpif_open(). */ int dp_register_provider(const struct dpif_class *new_class) { struct registered_dpif_class *registered_class; - + if (shash_find(&dpif_classes, new_class->type)) { VLOG_WARN("attempted to register duplicate datapath provider: %s", new_class->type);