void BcmUnit::attach() { if (attached_.load(std::memory_order_acquire)) { throw FbossError("unit ", unit_, " already initialized"); } auto rv = opennsl_switch_event_register(unit_, switchEventCallback, this); bcmCheckError(rv, "unable to register switch event callback for unit ", unit_); attached_.store(true, std::memory_order_release); }
/* * Register hw trigger callback * * @notes callback will be executed in driver thread so post the data * to respective task. * */ void bst_switch_event_register(bool enable) { int hw_unit = 0; static bool event_registered = false; for (hw_unit = 0; hw_unit <= MAX_SWITCH_UNIT_ID; hw_unit++) { if (enable) { opennsl_switch_event_register(hw_unit, (opennsl_switch_event_cb_t)bst_switch_event_callback, (void *)&trigger_user_data[hw_unit]); event_registered = true; } else if (!enable && event_registered) { opennsl_switch_event_unregister(hw_unit, (opennsl_switch_event_cb_t)bst_switch_event_callback, (void *)&trigger_user_data[hw_unit]); event_registered = false; } } }