/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* ** RCCondition - C++ wrapper around NSPR's PRCondVar */ #include "rccv.h" #include #include #include RCCondition::RCCondition(class RCLock *lock): RCBase() { cv = PR_NewCondVar(lock->lock); PR_ASSERT(NULL != cv); timeout = PR_INTERVAL_NO_TIMEOUT; } /* RCCondition::RCCondition */ RCCondition::~RCCondition() { if (NULL != cv) { PR_DestroyCondVar(cv); } } /* RCCondition::~RCCondition */ PRStatus RCCondition::Wait() { PRStatus rv; PR_ASSERT(NULL != cv); if (NULL == cv) { SetError(PR_INVALID_ARGUMENT_ERROR, 0); rv = PR_FAILURE; } else { rv = PR_WaitCondVar(cv, timeout.interval); } return rv; } /* RCCondition::Wait */ PRStatus RCCondition::Notify() { return PR_NotifyCondVar(cv); } /* RCCondition::Notify */ PRStatus RCCondition::Broadcast() { return PR_NotifyAllCondVar(cv); } /* RCCondition::Broadcast */ PRStatus RCCondition::SetTimeout(const RCInterval& tmo) { if (NULL == cv) { SetError(PR_INVALID_ARGUMENT_ERROR, 0); return PR_FAILURE; } timeout = tmo; return PR_SUCCESS; } /* RCCondition::SetTimeout */ RCInterval RCCondition::GetTimeout() const { return timeout; } /* rccv.cpp */