本文整理汇总了C++中AtomicUInt32类的典型用法代码示例。如果您正苦于以下问题:C++ AtomicUInt32类的具体用法?C++ AtomicUInt32怎么用?C++ AtomicUInt32使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了AtomicUInt32类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: inc
void OID::init() {
static AtomicUInt32 inc(
static_cast<unsigned>(
scoped_ptr<SecureRandom>(SecureRandom::create())->nextInt64()));
{
unsigned t = (unsigned) time(0);
unsigned char *T = (unsigned char *) &t;
_time[0] = T[3]; // big endian order because we use memcmp() to compare OID's
_time[1] = T[2];
_time[2] = T[1];
_time[3] = T[0];
}
_machineAndPid = ourMachineAndPid;
{
int new_inc = inc.fetchAndAdd(1);
unsigned char *T = (unsigned char *) &new_inc;
_inc[0] = T[2];
_inc[1] = T[1];
_inc[2] = T[0];
}
}
示例2: PREPLOGBUFFER
namespace dur {
void PREPLOGBUFFER(JSectHeader& outParm, AlignedBuilder&);
void WRITETOJOURNAL(JSectHeader h, AlignedBuilder& uncompressed);
void WRITETODATAFILES(const JSectHeader& h, AlignedBuilder& uncompressed);
/** declared later in this file
only used in this file -- use DurableInterface::commitNow() outside
*/
static void groupCommit();
// Used to activate the flush thread
static boost::mutex flushMutex;
static boost::condition_variable flushRequested;
// When set, the flush thread will exit
static AtomicUInt32 shutdownRequested(0);
CommitJob& commitJob = *(new CommitJob()); // don't destroy
Stats stats;
void Stats::S::reset() {
memset(this, 0, sizeof(*this));
}
Stats::Stats() {
_a.reset();
_b.reset();
curr = &_a;
_intervalMicros = 3000000;
}
Stats::S * Stats::other() {
return curr == &_a ? &_b : &_a;
}
string _CSVHeader();
string Stats::S::_CSVHeader() {
return "cmts jrnMB\twrDFMB\tcIWLk\tearly\tprpLgB wrToJ\twrToDF\trmpPrVw";
}
string Stats::S::_asCSV() {
stringstream ss;
ss <<
setprecision(2) <<
_commits << '\t' << fixed <<
_journaledBytes / 1000000.0 << '\t' <<
_writeToDataFilesBytes / 1000000.0 << '\t' <<
_commitsInWriteLock << '\t' <<
_earlyCommits << '\t' <<
(unsigned) (_prepLogBufferMicros/1000) << '\t' <<
(unsigned) (_writeToJournalMicros/1000) << '\t' <<
(unsigned) (_writeToDataFilesMicros/1000) << '\t' <<
(unsigned) (_remapPrivateViewMicros/1000);
return ss.str();
}
BSONObj Stats::S::_asObj() {
BSONObjBuilder b;
b <<
"commits" << _commits <<
"journaledMB" << _journaledBytes / 1000000.0 <<
"writeToDataFilesMB" << _writeToDataFilesBytes / 1000000.0 <<
"compression" << _journaledBytes / (_uncompressedBytes+1.0) <<
"commitsInWriteLock" << _commitsInWriteLock <<
"earlyCommits" << _earlyCommits <<
"timeMs" <<
BSON( "dt" << _dtMillis <<
"prepLogBuffer" << (unsigned) (_prepLogBufferMicros/1000) <<
"writeToJournal" << (unsigned) (_writeToJournalMicros/1000) <<
"writeToDataFiles" << (unsigned) (_writeToDataFilesMicros/1000) <<
"remapPrivateView" << (unsigned) (_remapPrivateViewMicros/1000)
);
if (storageGlobalParams.journalCommitInterval != 0)
b << "journalCommitIntervalMs" << storageGlobalParams.journalCommitInterval;
return b.obj();
}
BSONObj Stats::asObj() {
return other()->_asObj();
}
void Stats::rotate() {
unsigned long long now = curTimeMicros64();
unsigned long long dt = now - _lastRotate;
if( dt >= _intervalMicros && _intervalMicros ) {
// rotate
curr->_dtMillis = (unsigned) (dt/1000);
_lastRotate = now;
curr = other();
curr->reset();
}
}
void* NonDurableImpl::writingPtr(void *x, unsigned len) {
dassert(shutdownRequested.load() == 0);
return x;
}
//.........这里部分代码省略.........
示例3: displayOpsApplied
//.........这里部分代码省略.........
int sd = theReplSet->myConfig().slaveDelay;
// ignore slaveDelay if the box is still initializing. once
// it becomes secondary we can worry about it.
if( sd && theReplSet->isSecondary() ) {
const OpTime ts = lastOp["ts"]._opTime();
long long a = ts.getSecs();
long long b = time(0);
long long lag = b - a;
long long sleeptime = sd - lag;
if( sleeptime > 0 ) {
uassert(12000, "rs slaveDelay differential too big check clocks and systems",
sleeptime < 0x40000000);
if( sleeptime < 60 ) {
sleepsecs((int) sleeptime);
}
else {
log() << "replSet slavedelay sleep long time: " << sleeptime << rsLog;
// sleep(hours) would prevent reconfigs from taking effect & such!
long long waitUntil = b + sleeptime;
while( 1 ) {
sleepsecs(6);
if( time(0) >= waitUntil )
break;
if( theReplSet->myConfig().slaveDelay != sd ) // reconf
break;
}
}
}
} // endif slaveDelay
}
static AtomicUInt32 replWriterWorkerId;
void initializeWriterThread() {
// Only do this once per thread
if (!ClientBasic::getCurrent()) {
string threadName = str::stream() << "repl writer worker "
<< replWriterWorkerId.addAndFetch(1);
Client::initThread( threadName.c_str() );
// allow us to get through the magic barrier
Lock::ParallelBatchWriterMode::iAmABatchParticipant();
replLocalAuth();
}
}
// This free function is used by the writer threads to apply each op
void multiSyncApply(const std::vector<BSONObj>& ops, SyncTail* st) {
initializeWriterThread();
// convert update operations only for 2.2.1 or greater, because we need guaranteed
// idempotent operations for this to work. See SERVER-6825
bool convertUpdatesToUpserts = theReplSet->oplogVersion > 1 ? true : false;
for (std::vector<BSONObj>::const_iterator it = ops.begin();
it != ops.end();
++it) {
try {
OperationContextImpl txn;
if (!st->syncApply(&txn, *it, convertUpdatesToUpserts)) {
fassertFailedNoTrace(16359);
}
} catch (const DBException& e) {
error() << "writer worker caught exception: " << causedBy(e)
<< " on: " << it->toString() << endl;
示例4: displayOpsApplied
//.........这里部分代码省略.........
int slaveDelaySecs = replCoord->getSlaveDelaySecs().total_seconds();
// ignore slaveDelay if the box is still initializing. once
// it becomes secondary we can worry about it.
if( slaveDelaySecs > 0 && replCoord->getCurrentMemberState().secondary() ) {
const OpTime ts = lastOp["ts"]._opTime();
long long a = ts.getSecs();
long long b = time(0);
long long lag = b - a;
long long sleeptime = slaveDelaySecs - lag;
if( sleeptime > 0 ) {
uassert(12000, "rs slaveDelay differential too big check clocks and systems",
sleeptime < 0x40000000);
if( sleeptime < 60 ) {
sleepsecs((int) sleeptime);
}
else {
warning() << "replSet slavedelay causing a long sleep of " << sleeptime
<< " seconds" << rsLog;
// sleep(hours) would prevent reconfigs from taking effect & such!
long long waitUntil = b + sleeptime;
while(time(0) < waitUntil) {
sleepsecs(6);
// Handle reconfigs that changed the slave delay
if (replCoord->getSlaveDelaySecs().total_seconds() != slaveDelaySecs)
break;
}
}
}
} // endif slaveDelay
}
static AtomicUInt32 replWriterWorkerId;
static void initializeWriterThread() {
// Only do this once per thread
if (!ClientBasic::getCurrent()) {
string threadName = str::stream() << "repl writer worker "
<< replWriterWorkerId.addAndFetch(1);
Client::initThread( threadName.c_str() );
replLocalAuth();
}
}
// This free function is used by the writer threads to apply each op
void multiSyncApply(const std::vector<BSONObj>& ops, SyncTail* st) {
initializeWriterThread();
OperationContextImpl txn;
// allow us to get through the magic barrier
Lock::ParallelBatchWriterMode::iAmABatchParticipant(txn.lockState());
bool convertUpdatesToUpserts = true;
for (std::vector<BSONObj>::const_iterator it = ops.begin();
it != ops.end();
++it) {
try {
if (!st->syncApply(&txn, *it, convertUpdatesToUpserts)) {
fassertFailedNoTrace(16359);
}
} catch (const DBException& e) {
error() << "writer worker caught exception: " << causedBy(e)
<< " on: " << it->toString() << endl;
示例5: initializeWriteNs
void DocumentSourceOutReplaceColl::initializeWriteNs() {
DBClientBase* conn = pExpCtx->mongoProcessInterface->directClient();
const auto& outputNs = getOutputNs();
_tempNs = NamespaceString(str::stream() << outputNs.db() << ".tmp.agg_out."
<< aggOutCounter.addAndFetch(1));
// Save the original collection options and index specs so we can check they didn't change
// during computation.
_originalOutOptions = pExpCtx->mongoProcessInterface->getCollectionOptions(outputNs);
_originalIndexes = conn->getIndexSpecs(outputNs.ns());
// Check if it's capped to make sure we have a chance of succeeding before we do all the work.
// If the collection becomes capped during processing, the collection options will have changed,
// and the $out will fail.
uassert(17152,
str::stream() << "namespace '" << outputNs.ns()
<< "' is capped so it can't be used for $out",
_originalOutOptions["capped"].eoo());
// We will write all results into a temporary collection, then rename the temporary
// collection to be the target collection once we are done.
_tempNs = NamespaceString(str::stream() << outputNs.db() << ".tmp.agg_out."
<< aggOutCounter.addAndFetch(1));
// Create temp collection, copying options from the existing output collection if any.
{
BSONObjBuilder cmd;
cmd << "create" << _tempNs.coll();
cmd << "temp" << true;
cmd.appendElementsUnique(_originalOutOptions);
BSONObj info;
uassert(16994,
str::stream() << "failed to create temporary $out collection '" << _tempNs.ns()
<< "': "
<< info.toString(),
conn->runCommand(outputNs.db().toString(), cmd.done(), info));
}
if (_originalIndexes.empty()) {
return;
}
// Copy the indexes of the output collection to the temp collection.
std::vector<BSONObj> tempNsIndexes;
for (const auto& indexSpec : _originalIndexes) {
// Replace the spec's 'ns' field value, which is the original collection, with the temp
// collection.
tempNsIndexes.push_back(indexSpec.addField(BSON("ns" << _tempNs.ns()).firstElement()));
}
try {
conn->createIndexes(_tempNs.ns(), tempNsIndexes);
} catch (DBException& ex) {
ex.addContext("Copying indexes for $out failed");
throw;
}
};
示例6: prepTempCollection
void DocumentSourceOut::prepTempCollection() {
verify(_conn);
verify(_tempNs.size() == 0);
_tempNs = StringData(str::stream() << _outputNs.db()
<< ".tmp.agg_out."
<< aggOutCounter.addAndFetch(1)
);
{
BSONObj info;
bool ok =_conn->runCommand(_outputNs.db().toString(),
BSON("create" << _tempNs.coll() << "temp" << true),
info);
uassert(16994, str::stream() << "failed to create temporary $out collection '"
<< _tempNs.ns() << "': " << info.toString(),
ok);
}
// copy indexes on _outputNs to _tempNs
scoped_ptr<DBClientCursor> indexes(_conn->getIndexes(_outputNs));
while (indexes->more()) {
MutableDocument index(Document(indexes->nextSafe()));
index.remove("_id"); // indexes shouldn't have _ids but some existing ones do
index["ns"] = Value(_tempNs.ns());
BSONObj indexBson = index.freeze().toBson();
_conn->insert(_tempNs.getSystemIndexesCollection(), indexBson);
BSONObj err = _conn->getLastErrorDetailed();
uassert(16995, str::stream() << "copying index for $out failed."
<< " index: " << indexBson
<< " error: " << err,
DBClientWithCommands::getLastErrorString(err).empty());
}
}
示例7: commitAndStopDurThread
void DurableImpl::commitAndStopDurThread(OperationContext* txn) {
// This is only called by clean shutdown and the global lock must be held to ensure
// there will not be any more writes.
invariant(txn->lockState()->isW());
commitNow(txn);
shutdownRequested.store(1);
}
示例8: initializeWriterThread
static void initializeWriterThread() {
// Only do this once per thread
if (!ClientBasic::getCurrent()) {
string threadName = str::stream() << "repl writer worker "
<< replWriterWorkerId.addAndFetch(1);
Client::initThread( threadName.c_str() );
replLocalAuth();
}
}
示例9: workerThread
void workerThread() {
bool r = options["r"].trueValue();
bool w = options["w"].trueValue();
cout << "read:" << r << " write:" << w << endl;
long long su = options["sleepMicros"].numberLong();
Aligned a;
while( 1 ) {
unsigned long long rofs = (rrand() * PG) % len;
unsigned long long wofs = (rrand() * PG) % len;
const unsigned P = PG/1024;
if( mmf ) {
if( r ) {
for( unsigned p = P; p <= recSizeKB; p += P ) {
if( rofs < len )
dummy += mmf[rofs];
rofs += PG;
}
iops.fetchAndAdd(1);
}
if( w ) {
for( unsigned p = P; p <= recSizeKB; p += P ) {
if( wofs < len )
mmf[wofs] = 3;
wofs += PG;
}
iops.fetchAndAdd(1);
}
}
else {
if( r ) {
lf->readAt(rofs, a.addr(), recSizeKB * 1024);
iops.fetchAndAdd(1);
}
if( w ) {
lf->writeAt(wofs, a.addr(), recSizeKB * 1024);
iops.fetchAndAdd(1);
}
}
long long micros = su / nThreadsRunning;
if( micros ) {
sleepmicros(micros);
}
}
}
示例10: initializeWriterThread
void initializeWriterThread() {
// Only do this once per thread
if (!ClientBasic::getCurrent()) {
string threadName = str::stream() << "repl writer worker " << replWriterWorkerId.addAndFetch(1);
Client::initThread( threadName.c_str() );
// allow us to get through the magic barrier
Lock::ParallelBatchWriterMode::iAmABatchParticipant();
replLocalAuth();
}
}
示例11: run
void run() {
OldThreadPool tp(nThreads);
for (unsigned i = 0; i < iterations; i++) {
tp.schedule(&ThreadPoolTest::increment, this, 2);
}
tp.join();
ASSERT_EQUALS(counter.load(), iterations * 2);
}
示例12: increment
void increment(unsigned n) {
for (unsigned i = 0; i < n; i++) {
counter.fetchAndAdd(1);
}
}
示例13: initialize
void DocumentSourceOut::initialize() {
DBClientBase* conn = pExpCtx->mongoProcessInterface->directClient();
// Save the original collection options and index specs so we can check they didn't change
// during computation.
_originalOutOptions = pExpCtx->mongoProcessInterface->getCollectionOptions(_outputNs);
_originalIndexes = conn->getIndexSpecs(_outputNs.ns());
// Check if it's sharded or capped to make sure we have a chance of succeeding before we do all
// the work. If the collection becomes capped during processing, the collection options will
// have changed, and the $out will fail. If it becomes sharded during processing, the final
// rename will fail.
uassert(17017,
str::stream() << "namespace '" << _outputNs.ns()
<< "' is sharded so it can't be used for $out'",
!pExpCtx->mongoProcessInterface->isSharded(pExpCtx->opCtx, _outputNs));
uassert(17152,
str::stream() << "namespace '" << _outputNs.ns()
<< "' is capped so it can't be used for $out",
_originalOutOptions["capped"].eoo());
// We will write all results into a temporary collection, then rename the temporary collection
// to be the target collection once we are done.
_tempNs = NamespaceString(str::stream() << _outputNs.db() << ".tmp.agg_out."
<< aggOutCounter.addAndFetch(1));
// Create output collection, copying options from existing collection if any.
{
BSONObjBuilder cmd;
cmd << "create" << _tempNs.coll();
cmd << "temp" << true;
cmd.appendElementsUnique(_originalOutOptions);
BSONObj info;
bool ok = conn->runCommand(_outputNs.db().toString(), cmd.done(), info);
uassert(16994,
str::stream() << "failed to create temporary $out collection '" << _tempNs.ns()
<< "': "
<< info.toString(),
ok);
}
// copy indexes to _tempNs
for (std::list<BSONObj>::const_iterator it = _originalIndexes.begin();
it != _originalIndexes.end();
++it) {
MutableDocument index((Document(*it)));
index.remove("_id"); // indexes shouldn't have _ids but some existing ones do
index["ns"] = Value(_tempNs.ns());
BSONObj indexBson = index.freeze().toBson();
conn->insert(_tempNs.getSystemIndexesCollection(), indexBson);
BSONObj err = conn->getLastErrorDetailed();
uassert(16995,
str::stream() << "copying index for $out failed."
<< " index: "
<< indexBson
<< " error: "
<< err,
DBClientBase::getLastErrorString(err).empty());
}
_initialized = true;
}
示例14: durThread
static void durThread() {
Client::initThread("journal");
bool samePartition = true;
try {
const std::string dbpathDir =
boost::filesystem::path(storageGlobalParams.dbpath).string();
samePartition = onSamePartition(getJournalDir().string(), dbpathDir);
}
catch(...) {
}
while (shutdownRequested.loadRelaxed() == 0) {
unsigned ms = storageGlobalParams.journalCommitInterval;
if( ms == 0 ) {
ms = samePartition ? 100 : 30;
}
unsigned oneThird = (ms / 3) + 1; // +1 so never zero
try {
stats.rotate();
boost::mutex::scoped_lock lock(flushMutex);
// commit sooner if one or more getLastError j:true is pending
for (unsigned i = 0; i <= 2; i++) {
if (flushRequested.timed_wait(lock,
Milliseconds(oneThird))) {
// Someone forced a flush
break;
}
if (commitJob._notify.nWaiting())
break;
if (commitJob.bytes() > UncommittedBytesLimit / 2)
break;
}
OperationContextImpl txn;
// Waits for all active operations to drain and won't let new ones start. This
// should be optimized to allow readers in (see SERVER-15262).
AutoAcquireFlushLockForMMAPV1Commit flushLock(txn.lockState());
groupCommit();
remapPrivateView();
}
catch(std::exception& e) {
log() << "exception in durThread causing immediate shutdown: " << e.what() << endl;
mongoAbort("exception in durThread");
}
catch (...) {
log() << "unhandled exception in durThread causing immediate shutdown" << endl;
mongoAbort("unhandled exception in durThread");
}
}
cc().shutdown();
}
示例15: writingPtr
void* DurableImpl::writingPtr(void *x, unsigned len) {
dassert(shutdownRequested.load() == 0);
void *p = x;
declareWriteIntent(p, len);
return p;
}