TMB Documentation  v1.9.11
toggle_thread_safe_R.hpp
Go to the documentation of this file.
1 
24 #ifdef _OPENMP
25 
26 #ifndef TMB_HAVE_THREAD_SAFE_R
27 
28 inline SEXP Ts_getAttrib(SEXP x, SEXP y) {
29  SEXP ans;
30 #pragma omp critical
31  {
32  ans = Rf_getAttrib(x, y);
33  }
34  return ans;
35 }
36 
37 inline SEXP Ts_STRING_ELT(SEXP x, size_t i) {
38  SEXP ans;
39 #pragma omp critical
40  {
41  ans = STRING_ELT(x, i);
42  }
43  return ans;
44 }
45 
46 inline const char* Ts_CHAR(SEXP x) {
47  const char* ans;
48 #pragma omp critical
49  {
50  ans = R_CHAR(x);
51  }
52  return ans;
53 }
54 
55 inline SEXP Ts_VECTOR_ELT(SEXP x, size_t i) {
56  SEXP ans;
57 #pragma omp critical
58  {
59  ans = VECTOR_ELT(x, i);
60  }
61  return ans;
62 }
63 
64 inline R_len_t Ts_length(SEXP x) {
65  R_len_t ans;
66 #pragma omp critical
67  {
68  ans = Rf_length(x);
69  }
70  return ans;
71 }
72 
73 inline int* Ts_INTEGER(SEXP x) {
74  int* ans;
75 #pragma omp critical
76  {
77  ans = INTEGER(x);
78  }
79  return ans;
80 }
81 
82 inline double* Ts_REAL(SEXP x) {
83  double* ans;
84 #pragma omp critical
85  {
86  ans = REAL(x);
87  }
88  return ans;
89 }
90 
91 extern "C"
92 inline void Ts_GetRNGstate() {
93 #pragma omp critical
94  {
95  GetRNGstate();
96  }
97  // Wait for all threads to get to this point
98 #pragma omp barrier
99 }
100 
101 inline Rboolean Ts_isNumeric(SEXP x) {
102  Rboolean ans;
103 #pragma omp critical
104  {
105  ans = Rf_isNumeric(x);
106  }
107  return ans;
108 }
109 
110 inline int Ts_LENGTH(SEXP x) {
111  int ans;
112 #pragma omp critical
113  {
114  ans = LENGTH(x);
115  }
116  return ans;
117 }
118 
119 inline R_xlen_t Ts_XLENGTH(SEXP x) {
120  R_xlen_t ans;
121 #pragma omp critical
122  {
123  ans = XLENGTH(x);
124  }
125  return ans;
126 }
127 
128 inline SEXP Ts_install(const char *x) {
129  SEXP ans;
130 #pragma omp critical
131  {
132  ans = Rf_install(x);
133  }
134  return ans;
135 }
136 
137 inline SEXP Ts_findVar(SEXP x, SEXP y) {
138  SEXP ans;
139 #pragma omp critical
140  {
141  ans = Rf_findVar(x, y);
142  }
143  return ans;
144 }
145 
146 inline SEXP Ts_ENCLOS(SEXP x) {
147  SEXP ans;
148 #pragma omp critical
149  {
150  ans = ENCLOS(x);
151  }
152  return ans;
153 }
154 
155 inline void Ts_warning(const char *x, ...) {
156  if (omp_get_thread_num() == 0) {
157  Rf_warning("%s",x);
158  }
159 }
160 
161 /* --- Re-define ---------------------------------------------------------- */
162 #define TMB_HAVE_THREAD_SAFE_R
163 #define Rf_getAttrib Ts_getAttrib
164 #define STRING_ELT Ts_STRING_ELT
165 #undef CHAR
166 #define CHAR(x) Ts_CHAR(x)
167 #define VECTOR_ELT Ts_VECTOR_ELT
168 #define Rf_length Ts_length
169 #define INTEGER Ts_INTEGER
170 #define REAL Ts_REAL
171 #define GetRNGstate Ts_GetRNGstate
172 #define Rf_isNumeric Ts_isNumeric
173 #define LENGTH Ts_LENGTH
174 #define XLENGTH Ts_XLENGTH
175 #define Rf_install Ts_install
176 #define Rf_findVar Ts_findVar
177 #define ENCLOS Ts_ENCLOS
178 #define Rf_warning Ts_warning
179 
180 #else
181 
182 /* --- Un-define ---------------------------------------------------------- */
183 #undef TMB_HAVE_THREAD_SAFE_R
184 #undef Rf_getAttrib
185 #undef STRING_ELT
186 #undef CHAR
187 #define CHAR(x) R_CHAR(x)
188 #undef VECTOR_ELT
189 #undef Rf_length
190 #undef INTEGER
191 #undef REAL
192 #undef GetRNGstate
193 #undef Rf_isNumeric
194 #undef LENGTH
195 #undef XLENGTH
196 #undef Rf_install
197 #undef Rf_findVar
198 #undef ENCLOS
199 #undef Rf_warning
200 
201 #endif // TMB_HAVE_THREAD_SAFE_R
202 
203 #endif // _OPENMP
License: GPL v2