summaryrefslogtreecommitdiff
path: root/src/mongo/util/concurrency/ticketholder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/concurrency/ticketholder.cpp')
-rw-r--r--src/mongo/util/concurrency/ticketholder.cpp236
1 files changed, 119 insertions, 117 deletions
diff --git a/src/mongo/util/concurrency/ticketholder.cpp b/src/mongo/util/concurrency/ticketholder.cpp
index ca0c2560ef0..17efed9300d 100644
--- a/src/mongo/util/concurrency/ticketholder.cpp
+++ b/src/mongo/util/concurrency/ticketholder.cpp
@@ -36,161 +36,163 @@
namespace mongo {
#if defined(__linux__)
- namespace {
- void _check(int ret) {
- if (ret == 0)
- return;
- int err = errno;
- severe() << "error in Ticketholder: " << errnoWithDescription(err);
- fassertFailed(28604);
- }
- }
+namespace {
+void _check(int ret) {
+ if (ret == 0)
+ return;
+ int err = errno;
+ severe() << "error in Ticketholder: " << errnoWithDescription(err);
+ fassertFailed(28604);
+}
+}
- TicketHolder::TicketHolder(int num)
- : _outof(num) {
- _check(sem_init(&_sem, 0, num));
- }
+TicketHolder::TicketHolder(int num) : _outof(num) {
+ _check(sem_init(&_sem, 0, num));
+}
- TicketHolder::~TicketHolder(){
- _check(sem_destroy(&_sem));
- }
+TicketHolder::~TicketHolder() {
+ _check(sem_destroy(&_sem));
+}
- bool TicketHolder::tryAcquire() {
- while (0 != sem_trywait(&_sem)) {
- switch(errno) {
- case EAGAIN: return false;
- case EINTR: break;
- default: _check(-1);
- }
+bool TicketHolder::tryAcquire() {
+ while (0 != sem_trywait(&_sem)) {
+ switch (errno) {
+ case EAGAIN:
+ return false;
+ case EINTR:
+ break;
+ default:
+ _check(-1);
}
- return true;
}
+ return true;
+}
- void TicketHolder::waitForTicket() {
- while (0 != sem_wait(&_sem)) {
- switch(errno) {
- case EINTR: break;
- default: _check(-1);
- }
+void TicketHolder::waitForTicket() {
+ while (0 != sem_wait(&_sem)) {
+ switch (errno) {
+ case EINTR:
+ break;
+ default:
+ _check(-1);
}
}
+}
- void TicketHolder::release() {
- _check(sem_post(&_sem));
- }
-
- Status TicketHolder::resize(int newSize) {
- stdx::lock_guard<stdx::mutex> lk(_resizeMutex);
+void TicketHolder::release() {
+ _check(sem_post(&_sem));
+}
- if (newSize < 5)
- return Status(ErrorCodes::BadValue,
- str::stream() << "Minimum value for semaphore is 5; given "
- << newSize);
+Status TicketHolder::resize(int newSize) {
+ stdx::lock_guard<stdx::mutex> lk(_resizeMutex);
- if (newSize > SEM_VALUE_MAX)
- return Status(ErrorCodes::BadValue,
- str::stream() << "Maximum value for semaphore is "
- << SEM_VALUE_MAX << "; given " << newSize );
+ if (newSize < 5)
+ return Status(ErrorCodes::BadValue,
+ str::stream() << "Minimum value for semaphore is 5; given " << newSize);
- while (_outof.load() < newSize) {
- release();
- _outof.fetchAndAdd(1);
- }
-
- while (_outof.load() > newSize) {
- waitForTicket();
- _outof.subtractAndFetch(1);
- }
+ if (newSize > SEM_VALUE_MAX)
+ return Status(ErrorCodes::BadValue,
+ str::stream() << "Maximum value for semaphore is " << SEM_VALUE_MAX
+ << "; given " << newSize);
- invariant(_outof.load() == newSize);
- return Status::OK();
+ while (_outof.load() < newSize) {
+ release();
+ _outof.fetchAndAdd(1);
}
- int TicketHolder::available() const {
- int val = 0;
- _check(sem_getvalue(&_sem, &val));
- return val;
+ while (_outof.load() > newSize) {
+ waitForTicket();
+ _outof.subtractAndFetch(1);
}
- int TicketHolder::used() const {
- return outof() - available();
- }
+ invariant(_outof.load() == newSize);
+ return Status::OK();
+}
- int TicketHolder::outof() const {
- return _outof.load();
- }
+int TicketHolder::available() const {
+ int val = 0;
+ _check(sem_getvalue(&_sem, &val));
+ return val;
+}
+
+int TicketHolder::used() const {
+ return outof() - available();
+}
+
+int TicketHolder::outof() const {
+ return _outof.load();
+}
#else
- TicketHolder::TicketHolder( int num ) : _outof(num), _num(num) {}
+TicketHolder::TicketHolder(int num) : _outof(num), _num(num) {}
- TicketHolder::~TicketHolder() = default;
+TicketHolder::~TicketHolder() = default;
- bool TicketHolder::tryAcquire() {
- stdx::lock_guard<stdx::mutex> lk( _mutex );
- return _tryAcquire();
- }
+bool TicketHolder::tryAcquire() {
+ stdx::lock_guard<stdx::mutex> lk(_mutex);
+ return _tryAcquire();
+}
- void TicketHolder::waitForTicket() {
- stdx::unique_lock<stdx::mutex> lk( _mutex );
+void TicketHolder::waitForTicket() {
+ stdx::unique_lock<stdx::mutex> lk(_mutex);
- while( ! _tryAcquire() ) {
- _newTicket.wait( lk );
- }
+ while (!_tryAcquire()) {
+ _newTicket.wait(lk);
}
+}
- void TicketHolder::release() {
- {
- stdx::lock_guard<stdx::mutex> lk( _mutex );
- _num++;
- }
- _newTicket.notify_one();
+void TicketHolder::release() {
+ {
+ stdx::lock_guard<stdx::mutex> lk(_mutex);
+ _num++;
}
+ _newTicket.notify_one();
+}
- Status TicketHolder::resize( int newSize ) {
- stdx::lock_guard<stdx::mutex> lk( _mutex );
+Status TicketHolder::resize(int newSize) {
+ stdx::lock_guard<stdx::mutex> lk(_mutex);
- int used = _outof.load() - _num;
- if ( used > newSize ) {
- std::stringstream ss;
- ss << "can't resize since we're using (" << used << ") "
- << "more than newSize(" << newSize << ")";
+ int used = _outof.load() - _num;
+ if (used > newSize) {
+ std::stringstream ss;
+ ss << "can't resize since we're using (" << used << ") "
+ << "more than newSize(" << newSize << ")";
- std::string errmsg = ss.str();
- log() << errmsg;
- return Status(ErrorCodes::BadValue, errmsg);
- }
+ std::string errmsg = ss.str();
+ log() << errmsg;
+ return Status(ErrorCodes::BadValue, errmsg);
+ }
- _outof.store(newSize);
- _num = _outof.load() - used;
+ _outof.store(newSize);
+ _num = _outof.load() - used;
- // Potentially wasteful, but easier to see is correct
- _newTicket.notify_all();
- return Status::OK();
- }
+ // Potentially wasteful, but easier to see is correct
+ _newTicket.notify_all();
+ return Status::OK();
+}
- int TicketHolder::available() const {
- return _num;
- }
+int TicketHolder::available() const {
+ return _num;
+}
- int TicketHolder::used() const {
- return outof() - _num;
- }
+int TicketHolder::used() const {
+ return outof() - _num;
+}
- int TicketHolder::outof() const {
- return _outof.load();
- }
+int TicketHolder::outof() const {
+ return _outof.load();
+}
- bool TicketHolder::_tryAcquire(){
- if ( _num <= 0 ) {
- if ( _num < 0 ) {
- std::cerr << "DISASTER! in TicketHolder" << std::endl;
- }
- return false;
+bool TicketHolder::_tryAcquire() {
+ if (_num <= 0) {
+ if (_num < 0) {
+ std::cerr << "DISASTER! in TicketHolder" << std::endl;
}
- _num--;
- return true;
+ return false;
}
+ _num--;
+ return true;
+}
#endif
-
}