|
Packit |
6d2c1b |
/*
|
|
Packit |
6d2c1b |
* Copyright (c) 2001-2020 Mellanox Technologies, Ltd. All rights reserved.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* This software is available to you under a choice of one of two
|
|
Packit |
6d2c1b |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
6d2c1b |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
6d2c1b |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
6d2c1b |
* BSD license below:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
6d2c1b |
* without modification, are permitted provided that the following
|
|
Packit |
6d2c1b |
* conditions are met:
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions of source code must retain the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
6d2c1b |
* copyright notice, this list of conditions and the following
|
|
Packit |
6d2c1b |
* disclaimer in the documentation and/or other materials
|
|
Packit |
6d2c1b |
* provided with the distribution.
|
|
Packit |
6d2c1b |
*
|
|
Packit |
6d2c1b |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
6d2c1b |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
6d2c1b |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
6d2c1b |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
6d2c1b |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
6d2c1b |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
6d2c1b |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
6d2c1b |
* SOFTWARE.
|
|
Packit |
6d2c1b |
*/
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#include "vlogger/vlogger.h"
|
|
Packit |
6d2c1b |
#include "vma/infra/subject_observer.h"
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#define MODULE_NAME "subject_observer"
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
#define sub_obs_logerr __log_info_err
|
|
Packit |
6d2c1b |
#define sub_obs_logwarn __log_info_warn
|
|
Packit |
6d2c1b |
#define sub_obs_loginfo __log_info_info
|
|
Packit |
6d2c1b |
#define sub_obs_logdbg __log_info_dbg
|
|
Packit |
6d2c1b |
#define sub_obs_logfunc __log_info_func
|
|
Packit |
6d2c1b |
#define sub_obs_logfuncall __log_info_funcall
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
bool subject::register_observer(IN const observer* const new_observer)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (new_observer == NULL) {
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s] observer (NULL)", to_str());
|
|
Packit |
6d2c1b |
return false;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
auto_unlocker lock(m_lock);
|
|
Packit |
6d2c1b |
if (m_observers.count((observer *)new_observer) > 0) {
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s] Observer is already registered (%p)", to_str(), new_observer);
|
|
Packit |
6d2c1b |
return false;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
m_observers.insert((observer *)new_observer);
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s] Successfully registered new_observer %s", to_str(), new_observer->to_str());
|
|
Packit |
6d2c1b |
return true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
bool subject::unregister_observer(IN const observer * const old_observer)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
if (old_observer == NULL) {
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s] observer (NULL)", to_str());
|
|
Packit |
6d2c1b |
return false;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
auto_unlocker lock(m_lock);
|
|
Packit |
6d2c1b |
m_observers.erase((observer *)old_observer);
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s] Successfully unregistered old_observer %s",to_str(), old_observer->to_str());
|
|
Packit |
6d2c1b |
return true;
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
void subject::notify_observers(event* ev /*=NULL*/)
|
|
Packit |
6d2c1b |
{
|
|
Packit |
6d2c1b |
// sub_obs_logdbg("[%s]", to_str());
|
|
Packit |
6d2c1b |
|
|
Packit |
6d2c1b |
auto_unlocker lock(m_lock);
|
|
Packit |
6d2c1b |
for (observers_t::iterator iter = m_observers.begin(); iter != m_observers.end(); iter++) {
|
|
Packit |
6d2c1b |
if (ev)
|
|
Packit |
6d2c1b |
(*iter)->notify_cb(ev);
|
|
Packit |
6d2c1b |
else
|
|
Packit |
6d2c1b |
(*iter)->notify_cb();
|
|
Packit |
6d2c1b |
}
|
|
Packit |
6d2c1b |
}
|