summaryrefslogtreecommitdiff
path: root/util/concurrency/value.h
diff options
context:
space:
mode:
Diffstat (limited to 'util/concurrency/value.h')
-rw-r--r--util/concurrency/value.h35
1 files changed, 19 insertions, 16 deletions
diff --git a/util/concurrency/value.h b/util/concurrency/value.h
index 08d5306..0a0ef85 100644
--- a/util/concurrency/value.h
+++ b/util/concurrency/value.h
@@ -60,28 +60,31 @@ namespace mongo {
};
};
- /** this string COULD be mangled but with the double buffering, assuming writes
- are infrequent, it's unlikely. thus, this is reasonable for lockless setting of
- diagnostic strings, where their content isn't critical.
- */
class DiagStr {
- char buf1[256];
- char buf2[256];
- char *p;
+ string _s;
+ static mutex m;
public:
- DiagStr() {
- memset(buf1, 0, 256);
- memset(buf2, 0, 256);
- p = buf1;
+ DiagStr(const DiagStr& r) : _s(r.get()) { }
+ DiagStr() { }
+ bool empty() const {
+ mutex::scoped_lock lk(m);
+ return _s.empty();
+ }
+ string get() const {
+ mutex::scoped_lock lk(m);
+ return _s;
}
-
- const char * get() const { return p; }
void set(const char *s) {
- char *q = (p==buf1) ? buf2 : buf1;
- strncpy(q, s, 255);
- p = q;
+ mutex::scoped_lock lk(m);
+ _s = s;
+ }
+ void set(const string& s) {
+ mutex::scoped_lock lk(m);
+ _s = s;
}
+ operator string() const { return get(); }
+ void operator=(const string& s) { set(s); }
};
}