Rev 30 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/** 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.*/#include "FacebookBase.h"using namespace facebook::fb303;using apache::thrift::concurrency::Guard;FacebookBase::FacebookBase(std::string name) :name_(name) {aliveSince_ = (int64_t) time(NULL);}inline void FacebookBase::getName(std::string& _return) {_return = name_;}void FacebookBase::setOption(const std::string& key, const std::string& value) {Guard g(optionsLock_);options_[key] = value;}void FacebookBase::getOption(std::string& _return, const std::string& key) {Guard g(optionsLock_);_return = options_[key];}void FacebookBase::getOptions(std::map<std::string, std::string> & _return) {Guard g(optionsLock_);_return = options_;}int64_t FacebookBase::incrementCounter(const std::string& key, int64_t amount) {counters_.acquireRead();// if we didn't find the key, we need to write lock the whole map to create itReadWriteCounterMap::iterator it = counters_.find(key);if (it == counters_.end()) {counters_.release();counters_.acquireWrite();// we need to check again to make sure someone didn't create this key// already while we released the lockit = counters_.find(key);if(it == counters_.end()){counters_[key].value = amount;counters_.release();return amount;}}it->second.acquireWrite();int64_t count = it->second.value + amount;it->second.value = count;it->second.release();counters_.release();return count;}int64_t FacebookBase::setCounter(const std::string& key, int64_t value) {counters_.acquireRead();// if we didn't find the key, we need to write lock the whole map to create itReadWriteCounterMap::iterator it = counters_.find(key);if (it == counters_.end()) {counters_.release();counters_.acquireWrite();counters_[key].value = value;counters_.release();return value;}it->second.acquireWrite();it->second.value = value;it->second.release();counters_.release();return value;}void FacebookBase::getCounters(std::map<std::string, int64_t>& _return) {// we need to lock the whole thing and actually build the map since we don't// want our read/write structure to go over the wirecounters_.acquireRead();for(ReadWriteCounterMap::iterator it = counters_.begin();it != counters_.end(); it++){_return[it->first] = it->second.value;}counters_.release();}int64_t FacebookBase::getCounter(const std::string& key) {int64_t rv = 0;counters_.acquireRead();ReadWriteCounterMap::iterator it = counters_.find(key);if (it != counters_.end()) {it->second.acquireRead();rv = it->second.value;it->second.release();}counters_.release();return rv;}inline int64_t FacebookBase::aliveSince() {return aliveSince_;}