Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(668)

Side by Side Diff: runtime/platform/thread_macos.cc

Issue 25909002: Sampling profiler (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/globals.h" 5 #include "platform/globals.h"
6 #if defined(TARGET_OS_MACOS) 6 #if defined(TARGET_OS_MACOS)
7 7
8 #include "platform/thread.h" 8 #include "platform/thread.h"
9 9
10 #include <sys/errno.h> // NOLINT 10 #include <sys/errno.h> // NOLINT
11 #include <sys/types.h> // NOLINT
12 #include <sys/sysctl.h> // NOLINT
13 #include <mach/mach_init.h> // NOLINT
14 #include <mach/mach_host.h> // NOLINT
15 #include <mach/mach_port.h> // NOLINT
16 #include <mach/mach_traps.h> // NOLINT
17 #include <mach/task_info.h> // NOLINT
18 #include <mach/thread_info.h> // NOLINT
19 #include <mach/thread_act.h> // NOLINT
11 20
12 #include "platform/assert.h" 21 #include "platform/assert.h"
13 22
14 namespace dart { 23 namespace dart {
15 24
16 #define VALIDATE_PTHREAD_RESULT(result) \ 25 #define VALIDATE_PTHREAD_RESULT(result) \
17 if (result != 0) { \ 26 if (result != 0) { \
18 const int kBufferSize = 1024; \ 27 const int kBufferSize = 1024; \
19 char error_message[kBufferSize]; \ 28 char error_message[kBufferSize]; \
20 strerror_r(result, error_message, kBufferSize); \ 29 strerror_r(result, error_message, kBufferSize); \
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 VALIDATE_PTHREAD_RESULT(result); 130 VALIDATE_PTHREAD_RESULT(result);
122 } 131 }
123 132
124 133
125 intptr_t Thread::GetMaxStackSize() { 134 intptr_t Thread::GetMaxStackSize() {
126 const int kStackSize = (128 * kWordSize * KB); 135 const int kStackSize = (128 * kWordSize * KB);
127 return kStackSize; 136 return kStackSize;
128 } 137 }
129 138
130 139
140 ThreadId Thread::GetCurrentThreadId() {
141 return pthread_self();
142 }
143
144
145 void Thread::GetThreadCPUUsage(int64_t* cpu_usage) {
146 ASSERT(cpu_usage != NULL);
147 mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
148 thread_basic_info_data_t info_data;
149 thread_basic_info_t info = &info_data;
150 mach_port_t thread_port = mach_thread_self();
151 kern_return_t r = thread_info(thread_port, THREAD_BASIC_INFO,
152 (thread_info_t)info, &count);
153 mach_port_deallocate(mach_task_self(), thread_port);
154 if (r == KERN_SUCCESS) {
155 *cpu_usage = (info->user_time.seconds * kMicrosecondsPerSecond) +
156 info->user_time.microseconds;
157 return;
158 }
159 *cpu_usage = 0;
160 }
161
162
131 Mutex::Mutex() { 163 Mutex::Mutex() {
132 pthread_mutexattr_t attr; 164 pthread_mutexattr_t attr;
133 int result = pthread_mutexattr_init(&attr); 165 int result = pthread_mutexattr_init(&attr);
134 VALIDATE_PTHREAD_RESULT(result); 166 VALIDATE_PTHREAD_RESULT(result);
135 167
136 #if defined(DEBUG) 168 #if defined(DEBUG)
137 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); 169 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
138 VALIDATE_PTHREAD_RESULT(result); 170 VALIDATE_PTHREAD_RESULT(result);
139 #endif // defined(DEBUG) 171 #endif // defined(DEBUG)
140 172
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 &ts); 279 &ts);
248 ASSERT((result == 0) || (result == ETIMEDOUT)); 280 ASSERT((result == 0) || (result == ETIMEDOUT));
249 if (result == ETIMEDOUT) { 281 if (result == ETIMEDOUT) {
250 retval = kTimedOut; 282 retval = kTimedOut;
251 } 283 }
252 } 284 }
253 return retval; 285 return retval;
254 } 286 }
255 287
256 288
289 Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
290 // TODO(iposva): Do we need to track lock owners?
291 Monitor::WaitResult retval = kNotified;
292 if (micros == 0) {
siva 2013/10/28 05:19:21 ditto comment about using the named constant.
Cutch 2013/11/04 20:36:05 Done.
293 // Wait forever.
294 int result = pthread_cond_wait(data_.cond(), data_.mutex());
295 VALIDATE_PTHREAD_RESULT(result);
296 } else {
297 struct timespec ts;
298 int64_t secs = micros / kMicrosecondsPerSecond;
299 int64_t nanos =
300 (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
301 ts.tv_sec = secs;
302 ts.tv_nsec = nanos;
303 int result = pthread_cond_timedwait_relative_np(data_.cond(),
304 data_.mutex(),
305 &ts);
306 ASSERT((result == 0) || (result == ETIMEDOUT));
307 if (result == ETIMEDOUT) {
308 retval = kTimedOut;
309 }
siva 2013/10/28 05:19:21 else { VALIDATE_PTHREAD_RESULT(result); }
Cutch 2013/11/04 20:36:05 Above assert handles this.
310 }
311 return retval;
312 }
313
314
257 void Monitor::Notify() { 315 void Monitor::Notify() {
258 // TODO(iposva): Do we need to track lock owners? 316 // TODO(iposva): Do we need to track lock owners?
259 int result = pthread_cond_signal(data_.cond()); 317 int result = pthread_cond_signal(data_.cond());
260 VALIDATE_PTHREAD_RESULT(result); 318 VALIDATE_PTHREAD_RESULT(result);
261 } 319 }
262 320
263 321
264 void Monitor::NotifyAll() { 322 void Monitor::NotifyAll() {
265 // TODO(iposva): Do we need to track lock owners? 323 // TODO(iposva): Do we need to track lock owners?
266 int result = pthread_cond_broadcast(data_.cond()); 324 int result = pthread_cond_broadcast(data_.cond());
267 VALIDATE_PTHREAD_RESULT(result); 325 VALIDATE_PTHREAD_RESULT(result);
268 } 326 }
269 327
270 } // namespace dart 328 } // namespace dart
271 329
272 #endif // defined(TARGET_OS_MACOS) 330 #endif // defined(TARGET_OS_MACOS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698