blob: 7109729650cedece39202474a62e871ed288c1fe [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __ETCHMONITOR_H__
#define __ETCHMONITOR_H__
#include "capu/os/Mutex.h"
#include "capu/os/CondVar.h"
#include "capu/os/Time.h"
#include "common/EtchString.h"
/**
* A class which we can use to monitor conditions.
*/
class EtchMonitor {
public:
/**
* Constructs the Monitor.
*
* @param description a description of this monitor.
* @param initialValue the initial value of this monitor.
*/
EtchMonitor(EtchString description, EtchString initialValue);
/**
* Destructor
*/
virtual ~EtchMonitor();
/**
* @return the description of this monitor.
*/
EtchString getDescription();
/**
* @return the current value of the monitor.
*/
EtchString get();
/**
* Sets the current value.
*
* @param newValue the value to be set.
* @param the old value.
*/
status_t set(EtchString value, EtchString& oldValue);
/**
* Waits until value equals the desired value and
* then sets the value. Will wait forever.
*
* @param desiredValue the value we want.
* @param newValue the value to be set.
* @param the old value
* @return ETCH_OK if it was successfully
*/
status_t waitUntilEqAndSet(const EtchString& desiredValue, EtchString& newValue, EtchString &old);
/**
* Waits until value equals the desired value and
* then sets the value.
*
* @param desiredValue the value we want.
* @param maxDelay the max amount of time in ms to wait.
* If 0 is specified, we will wait forever.
* @param newValue the value to be set.
* @param the old value
* @return ETCH_OK if it was successfully
*/
status_t waitUntilEqAndSet(const EtchString& desiredValue, capu::int32_t maxDelay, EtchString& newValue, EtchString &old);
/**
* Waits until value equals the desired value. Will wait forever.
*
* @param desiredValue the value we want.
* @return ETCH_OK if it was successfully
*/
status_t waitUntilEq(const EtchString& desiredValue);
/**
* Waits until value equals the desired value.
*
* @param desiredValue the value we want.
*
* @param maxDelay the max amount of time in ms to wait.
* If 0 is specified, we will wait forever.
* @return ETCH_OK if it was successfully
*/
status_t waitUntilEq(const EtchString& desiredValue, capu::int32_t maxDelay);
/**
* Waits until value does not equal the undesired value and then
* sets the value. Will wait forever.
*
* @param undesiredValue the value we do not want.
* @param newValue the value to be set.
* @param the old value
* @return ETCH_OK if it was successfully
*/
status_t waitUntilNotEqAndSet(const EtchString& undesiredValue, EtchString& newValue, EtchString& old);
/**
* Waits until value does not equal the undesired value and then
* sets the value.
*
* @param undesiredValue the value we do not want.
* @param maxDelay the max amount of time in ms to wait.
* If 0 is specified, we will wait forever.
* @param newValue the value to be set.
* @param the old value
* @return ETCH_OK if it was successfully, ETCH_TIMEOUT if a timeout occurs
*/
status_t waitUntilNotEqAndSet(const EtchString& undesiredValue, capu::int32_t maxDelay, EtchString& newValue, EtchString& old);
/**
* Waits until value does not equal the undesired value. Will
* wait forever.
*
* @param undesiredValue the value we do not want.
* @param the current value.
* @return ETCH_OK if it was successfully
*/
status_t waitUntilNotEq(const EtchString& undesiredValue, EtchString& current);
/**
* Waits until value does not equal the undesired value.
*
* @param undesiredValue the value we do not want.
* @param maxDelay the max amount of time in ms to wait.
* If 0 is specified, we will wait forever.
* @param the current value.
* @return ETCH_OK if it was successfully, ETCH_TIMEOUT if a timeout occurs
*/
status_t waitUntilNotEq(const EtchString& undesiredValue, capu::uint32_t maxDelay, EtchString& current);
private:
/////////////////////
// PRIVATE METHODS //
/////////////////////
/**
* waitUntilEq internal
*/
status_t waitUntilEqIntern(const EtchString& desiredValue, capu::int32_t maxDelay);
/**
* waitUntilNotEq internal
*/
status_t waitUntilNotEqIntern(const EtchString& undesiredValue, capu::uint32_t maxDelay, EtchString& current);
/**
* Compares the specified values.
*
* @param v1 a value to compare, which may be null.
* @param v2 another value to compare, which may be null.
* @return true if the values are equal, false otherwise.
*/
capu::bool_t eq(const EtchString& v1, const EtchString& v2);
EtchString mDescription;
EtchString mValue;
capu::Mutex mMutex;
capu::CondVar mCv;
};
#endif