blob: c7bdf257f4936c1d6d68bf43097ea8a0bfa77803 [file] [log] [blame]
// (C) Copyright Christian Bienia 2007
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0.
//
// file : TicketDispenser.h
// author : Christian Bienia - cbienia@cs.princeton.edu
// description : A synchronized counter used to issue tickets
#ifndef TICKETDISPENSER_H
#define TICKETDISPENSER_H
#if defined(HAVE_CONFIG_H)
# include "config.h"
#endif
#include "LockTypes.h"
#include "Mutex.h"
namespace threads {
template <typename T>
class TicketDispenser {
public:
//dispenser with Mutex, starting with (T)0, incrementing in steps of (T)1
TicketDispenser();
//dispenser with Mutex, starting with (T)0, custom increment steps
TicketDispenser(T);
//dispenser with Mutex, custom start value, custom increment steps
TicketDispenser(T, T);
//dispenser with custom lock, custom start value, custom increment steps
TicketDispenser(T, T, LockType &);
//destructor
~TicketDispenser();
//get a ticket and increment counter (in that order)
T getTicket();
//reset internal counter to last start value
void resetDispenser();
//reset internal counter and use given value as new increment step
void resetDispenser(T);
//reset internal counter and use given values as new start value and increment step
void resetDispenser(T, T);
private:
T init;
T inc;
T value;
LockType *l;
};
//dispenser with Mutex, starting with (T)0, incrementing in steps of (T)1
template <typename T>
TicketDispenser<T>::TicketDispenser() {
init = (T)0;
inc = (T)1;
l = new Mutex;
value = init;
}
//dispenser with Mutex, starting with (T)0, custom increment steps
template <typename T>
TicketDispenser<T>::TicketDispenser(T _inc) {
init = (T)0;
inc = _inc;
l = new Mutex;
value = init;
}
//dispenser with Mutex, custom start value, custom increment steps
template <typename T>
TicketDispenser<T>::TicketDispenser(T _init, T _inc) {
init = _init;
inc = _inc;
l = new Mutex;
value = init;
}
//dispenser with custom lock, custom start value, custom increment steps
template <typename T>
TicketDispenser<T>::TicketDispenser(T _init, T _inc, LockType &_l) {
init = _init;
inc = _inc;
l = &_l;
value = init;
}
//destructor
template <typename T>
TicketDispenser<T>::~TicketDispenser() {
delete l;
}
//get a ticket and increment counter (in that order)
template <typename T>
T TicketDispenser<T>::getTicket() {
T rv;
l->Lock();
rv = value;
value += inc;
l->Unlock();
return rv;
}
//reset internal counter to last start value
template <typename T>
void TicketDispenser<T>::resetDispenser() {
l->Lock();
value = init;
l->Unlock();
}
//reset internal counter and use given value as new increment step
template <typename T>
void TicketDispenser<T>::resetDispenser(T _inc) {
l->Lock();
inc = _inc;
value = init;
l->Unlock();
}
//reset internal counter and use given values as new start value and increment step
template <typename T>
void TicketDispenser<T>::resetDispenser(T _init, T _inc) {
l->Lock();
init = _init;
inc = _inc;
value = init;
l->Unlock();
}
} //namespace threads
#endif //TICKETDISPENSER_H