: m_image_ctx(image_ctx),
m_watch_lock(unique_lock_name("librbd::ImageWatcher::m_watch_lock", this)),
m_watch_ctx(*this), m_watch_handle(0),
- m_watch_state(WATCH_STATE_UNREGISTERED), m_lock_supported(false),
- m_lock_owner_state(LOCK_OWNER_STATE_NOT_LOCKED),
+ m_watch_state(WATCH_STATE_UNREGISTERED),
+ m_refresh_lock(unique_lock_name("librbd::ImageWatcher::m_refresh_lock",
+ this)),
+ m_lock_supported(false), m_lock_owner_state(LOCK_OWNER_STATE_NOT_LOCKED),
m_listeners_lock(unique_lock_name("librbd::ImageWatcher::m_listeners_lock", this)),
m_listeners_in_use(false),
m_task_finisher(new TaskFinisher<Task>(*m_image_ctx.cct)),
bool lock_support_changed = false;
{
- RWLock::WLocker watch_locker(m_watch_lock);
+ Mutex::Locker refresh_locker(m_refresh_lock);
if (m_lock_supported != is_lock_supported()) {
m_lock_supported = is_lock_supported();
lock_support_changed = true;
Listener listener;
ictx->image_watcher->register_listener(&listener);
{
- Mutex::Locker listener_locker(listener.lock);
RWLock::RLocker owner_locker(ictx->owner_lock);
while (!ictx->image_watcher->is_lock_owner()) {
ictx->owner_lock.put_read();
+ listener.lock.Lock();
listener.cond.Wait(listener.lock);
+ listener.lock.Unlock();
ictx->owner_lock.get_read();
}
}