00001 /* @file value.h 00002 concurrency helpers Atomic<T> and DiagStr 00003 */ 00004 00021 #pragma once 00022 00023 namespace mongo { 00024 00025 extern mutex _atomicMutex; 00026 00030 template<typename T> 00031 class Atomic : boost::noncopyable { 00032 T val; 00033 public: 00034 Atomic<T>() { } 00035 00036 void operator=(const T& a) { 00037 scoped_lock lk(_atomicMutex); 00038 val = a; 00039 } 00040 00041 operator T() const { 00042 scoped_lock lk(_atomicMutex); 00043 return val; 00044 } 00045 00055 class tran : private scoped_lock { 00056 Atomic<T>& _a; 00057 public: 00058 tran(Atomic<T>& a) : scoped_lock(_atomicMutex), _a(a) { } 00059 T& ref() { return _a.val; } 00060 }; 00061 }; 00062 00067 class DiagStr { 00068 char buf1[256]; 00069 char buf2[256]; 00070 char *p; 00071 public: 00072 DiagStr() { 00073 memset(buf1, 0, 256); 00074 memset(buf2, 0, 256); 00075 p = buf1; 00076 } 00077 00078 const char * get() const { return p; } 00079 00080 void set(const char *s) { 00081 char *q = (p==buf1) ? buf2 : buf1; 00082 strncpy(q, s, 255); 00083 p = q; 00084 } 00085 }; 00086 00087 }