summaryrefslogtreecommitdiff
path: root/decoder/threadlocal.h
diff options
context:
space:
mode:
authorgraehl@gmail.com <graehl@gmail.com@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-08-02 07:57:23 +0000
committergraehl@gmail.com <graehl@gmail.com@ec762483-ff6d-05da-a07a-a48fb63a330f>2010-08-02 07:57:23 +0000
commitf9859ad4116733e145d7b8eb31c3cc9318ff7564 (patch)
tree92f6942fc7fd7066eb400bce6d2cbd2fee46c801 /decoder/threadlocal.h
parent6da285dfa7b0a1929dcec882d7e48a585e878d18 (diff)
fake tdict names for non-ids, push viterbi cost to root in hg, store as feature. type erased fsa feature via virtual interface. made lexical_cast assume C locale for speed.
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@465 ec762483-ff6d-05da-a07a-a48fb63a330f
Diffstat (limited to 'decoder/threadlocal.h')
-rwxr-xr-xdecoder/threadlocal.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/decoder/threadlocal.h b/decoder/threadlocal.h
new file mode 100755
index 00000000..d79f5d9d
--- /dev/null
+++ b/decoder/threadlocal.h
@@ -0,0 +1,71 @@
+#ifndef THREADLOCAL_H
+#define THREADLOCAL_H
+
+#ifndef SETLOCAL_SWAP
+# define SETLOCAL_SWAP 0
+#endif
+
+#ifdef BOOST_NO_MT
+
+# define THREADLOCAL
+
+#else
+
+#ifdef _MSC_VER
+
+//FIXME: doesn't work with DLLs ... use TLS apis instead (http://www.boost.org/libs/thread/doc/tss.html)
+# define THREADLOCAL __declspec(thread)
+
+#else
+
+# define THREADLOCAL __thread
+
+#endif
+
+#endif
+
+#include <algorithm> //swap
+
+// naturally, the below are only thread-safe if value is THREADLOCAL
+template <class D>
+struct SaveLocal {
+ D &value;
+ D old_value;
+ SaveLocal(D& val) : value(val), old_value(val) {}
+ ~SaveLocal() {
+#if SETLOCAL_SWAP
+ swap(value,old_value);
+#else
+ value=old_value;
+#endif
+ }
+};
+
+template <class D>
+struct SetLocal {
+ D &value;
+ D old_value;
+ SetLocal(D& val,const D &new_value) : value(val), old_value(
+#if SETLOCAL_SWAP
+ new_value
+#else
+ val
+#endif
+ ) {
+#if SETLOCAL_SWAP
+ swap(value,old_value);
+#else
+ value=new_value;
+#endif
+ }
+ ~SetLocal() {
+#if SETLOCAL_SWAP
+ swap(value,old_value);
+#else
+ value=old_value;
+#endif
+ }
+};
+
+
+#endif