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

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, 1 month 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
« no previous file with comments | « runtime/platform/thread_macos.h ('k') | runtime/platform/thread_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(ThreadId thread_id, int64_t* cpu_usage) {
146 ASSERT(thread_id == GetCurrentThreadId());
147 ASSERT(cpu_usage != NULL);
148 mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
149 thread_basic_info_data_t info_data;
150 thread_basic_info_t info = &info_data;
151 mach_port_t thread_port = mach_thread_self();
152 kern_return_t r = thread_info(thread_port, THREAD_BASIC_INFO,
153 (thread_info_t)info, &count);
154 mach_port_deallocate(mach_task_self(), thread_port);
155 if (r == KERN_SUCCESS) {
156 *cpu_usage = (info->user_time.seconds * kMicrosecondsPerSecond) +
157 info->user_time.microseconds;
158 return;
159 }
160 *cpu_usage = 0;
161 }
162
163
131 Mutex::Mutex() { 164 Mutex::Mutex() {
132 pthread_mutexattr_t attr; 165 pthread_mutexattr_t attr;
133 int result = pthread_mutexattr_init(&attr); 166 int result = pthread_mutexattr_init(&attr);
134 VALIDATE_PTHREAD_RESULT(result); 167 VALIDATE_PTHREAD_RESULT(result);
135 168
136 #if defined(DEBUG) 169 #if defined(DEBUG)
137 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); 170 result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
138 VALIDATE_PTHREAD_RESULT(result); 171 VALIDATE_PTHREAD_RESULT(result);
139 #endif // defined(DEBUG) 172 #endif // defined(DEBUG)
140 173
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 255
223 256
224 void Monitor::Exit() { 257 void Monitor::Exit() {
225 // TODO(iposva): Do we need to track lock owners? 258 // TODO(iposva): Do we need to track lock owners?
226 int result = pthread_mutex_unlock(data_.mutex()); 259 int result = pthread_mutex_unlock(data_.mutex());
227 VALIDATE_PTHREAD_RESULT(result); 260 VALIDATE_PTHREAD_RESULT(result);
228 } 261 }
229 262
230 263
231 Monitor::WaitResult Monitor::Wait(int64_t millis) { 264 Monitor::WaitResult Monitor::Wait(int64_t millis) {
265 return WaitMicros(millis * kMicrosecondsPerMillisecond);
266 }
267
268
269 Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
232 // TODO(iposva): Do we need to track lock owners? 270 // TODO(iposva): Do we need to track lock owners?
233 Monitor::WaitResult retval = kNotified; 271 Monitor::WaitResult retval = kNotified;
234 if (millis == 0) { 272 if (micros == kNoTimeout) {
235 // Wait forever. 273 // Wait forever.
236 int result = pthread_cond_wait(data_.cond(), data_.mutex()); 274 int result = pthread_cond_wait(data_.cond(), data_.mutex());
237 VALIDATE_PTHREAD_RESULT(result); 275 VALIDATE_PTHREAD_RESULT(result);
238 } else { 276 } else {
239 struct timespec ts; 277 struct timespec ts;
240 int64_t secs = millis / kMillisecondsPerSecond; 278 int64_t secs = micros / kMicrosecondsPerSecond;
241 int64_t nanos = (millis - (secs * kMillisecondsPerSecond)) * 279 int64_t nanos =
242 kNanosecondsPerMillisecond; 280 (micros - (secs * kMicrosecondsPerSecond)) * kNanosecondsPerMicrosecond;
243 ts.tv_sec = secs; 281 ts.tv_sec = secs;
244 ts.tv_nsec = nanos; 282 ts.tv_nsec = nanos;
245 int result = pthread_cond_timedwait_relative_np(data_.cond(), 283 int result = pthread_cond_timedwait_relative_np(data_.cond(),
246 data_.mutex(), 284 data_.mutex(),
247 &ts); 285 &ts);
248 ASSERT((result == 0) || (result == ETIMEDOUT)); 286 ASSERT((result == 0) || (result == ETIMEDOUT));
249 if (result == ETIMEDOUT) { 287 if (result == ETIMEDOUT) {
250 retval = kTimedOut; 288 retval = kTimedOut;
251 } 289 }
252 } 290 }
(...skipping 10 matching lines...) Expand all
263 301
264 void Monitor::NotifyAll() { 302 void Monitor::NotifyAll() {
265 // TODO(iposva): Do we need to track lock owners? 303 // TODO(iposva): Do we need to track lock owners?
266 int result = pthread_cond_broadcast(data_.cond()); 304 int result = pthread_cond_broadcast(data_.cond());
267 VALIDATE_PTHREAD_RESULT(result); 305 VALIDATE_PTHREAD_RESULT(result);
268 } 306 }
269 307
270 } // namespace dart 308 } // namespace dart
271 309
272 #endif // defined(TARGET_OS_MACOS) 310 #endif // defined(TARGET_OS_MACOS)
OLDNEW
« no previous file with comments | « runtime/platform/thread_macos.h ('k') | runtime/platform/thread_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698