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

Side by Side Diff: runtime/vm/os_thread_android.cc

Issue 1426743002: Add lock owner information for class Monitor and add assertions for wait/notify/notifyall. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review-comments Created 5 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
« no previous file with comments | « runtime/vm/os_thread.h ('k') | runtime/vm/os_thread_linux.cc » ('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" // NOLINT 5 #include "platform/globals.h" // NOLINT
6 #if defined(TARGET_OS_ANDROID) 6 #if defined(TARGET_OS_ANDROID)
7 7
8 #include "vm/os_thread.h" 8 #include "vm/os_thread.h"
9 9
10 #include <errno.h> // NOLINT 10 #include <errno.h> // NOLINT
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 VALIDATE_PTHREAD_RESULT(result); 209 VALIDATE_PTHREAD_RESULT(result);
210 #endif // defined(DEBUG) 210 #endif // defined(DEBUG)
211 211
212 result = pthread_mutex_init(data_.mutex(), &attr); 212 result = pthread_mutex_init(data_.mutex(), &attr);
213 // Verify that creating a pthread_mutex succeeded. 213 // Verify that creating a pthread_mutex succeeded.
214 VALIDATE_PTHREAD_RESULT(result); 214 VALIDATE_PTHREAD_RESULT(result);
215 215
216 result = pthread_mutexattr_destroy(&attr); 216 result = pthread_mutexattr_destroy(&attr);
217 VALIDATE_PTHREAD_RESULT(result); 217 VALIDATE_PTHREAD_RESULT(result);
218 218
219 #if defined(DEBUG)
219 // When running with assertions enabled we do track the owner. 220 // When running with assertions enabled we do track the owner.
220 #if defined(DEBUG)
221 owner_ = OSThread::kInvalidThreadId; 221 owner_ = OSThread::kInvalidThreadId;
222 #endif // defined(DEBUG) 222 #endif // defined(DEBUG)
223 } 223 }
224 224
225 225
226 Mutex::~Mutex() { 226 Mutex::~Mutex() {
227 int result = pthread_mutex_destroy(data_.mutex()); 227 int result = pthread_mutex_destroy(data_.mutex());
228 // Verify that the pthread_mutex was destroyed. 228 // Verify that the pthread_mutex was destroyed.
229 VALIDATE_PTHREAD_RESULT(result); 229 VALIDATE_PTHREAD_RESULT(result);
230 230
231 #if defined(DEBUG)
231 // When running with assertions enabled we do track the owner. 232 // When running with assertions enabled we do track the owner.
232 #if defined(DEBUG)
233 ASSERT(owner_ == OSThread::kInvalidThreadId); 233 ASSERT(owner_ == OSThread::kInvalidThreadId);
234 #endif // defined(DEBUG) 234 #endif // defined(DEBUG)
235 } 235 }
236 236
237 237
238 void Mutex::Lock() { 238 void Mutex::Lock() {
239 int result = pthread_mutex_lock(data_.mutex()); 239 int result = pthread_mutex_lock(data_.mutex());
240 // Specifically check for dead lock to help debugging. 240 // Specifically check for dead lock to help debugging.
241 ASSERT(result != EDEADLK); 241 ASSERT(result != EDEADLK);
242 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors. 242 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors.
243 #if defined(DEBUG)
243 // When running with assertions enabled we do track the owner. 244 // When running with assertions enabled we do track the owner.
244 #if defined(DEBUG)
245 owner_ = OSThread::GetCurrentThreadId(); 245 owner_ = OSThread::GetCurrentThreadId();
246 #endif // defined(DEBUG) 246 #endif // defined(DEBUG)
247 } 247 }
248 248
249 249
250 bool Mutex::TryLock() { 250 bool Mutex::TryLock() {
251 int result = pthread_mutex_trylock(data_.mutex()); 251 int result = pthread_mutex_trylock(data_.mutex());
252 // Return false if the lock is busy and locking failed. 252 // Return false if the lock is busy and locking failed.
253 if (result == EBUSY) { 253 if (result == EBUSY) {
254 return false; 254 return false;
255 } 255 }
256 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors. 256 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors.
257 #if defined(DEBUG)
257 // When running with assertions enabled we do track the owner. 258 // When running with assertions enabled we do track the owner.
258 #if defined(DEBUG)
259 owner_ = OSThread::GetCurrentThreadId(); 259 owner_ = OSThread::GetCurrentThreadId();
260 #endif // defined(DEBUG) 260 #endif // defined(DEBUG)
261 return true; 261 return true;
262 } 262 }
263 263
264 264
265 void Mutex::Unlock() { 265 void Mutex::Unlock() {
266 #if defined(DEBUG)
266 // When running with assertions enabled we do track the owner. 267 // When running with assertions enabled we do track the owner.
267 #if defined(DEBUG)
268 ASSERT(IsOwnedByCurrentThread()); 268 ASSERT(IsOwnedByCurrentThread());
269 owner_ = OSThread::kInvalidThreadId; 269 owner_ = OSThread::kInvalidThreadId;
270 #endif // defined(DEBUG) 270 #endif // defined(DEBUG)
271 int result = pthread_mutex_unlock(data_.mutex()); 271 int result = pthread_mutex_unlock(data_.mutex());
272 // Specifically check for wrong thread unlocking to aid debugging. 272 // Specifically check for wrong thread unlocking to aid debugging.
273 ASSERT(result != EPERM); 273 ASSERT(result != EPERM);
274 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors. 274 ASSERT_PTHREAD_SUCCESS(result); // Verify no other errors.
275 } 275 }
276 276
277 277
(...skipping 15 matching lines...) Expand all
293 293
294 pthread_condattr_t cond_attr; 294 pthread_condattr_t cond_attr;
295 result = pthread_condattr_init(&cond_attr); 295 result = pthread_condattr_init(&cond_attr);
296 VALIDATE_PTHREAD_RESULT(result); 296 VALIDATE_PTHREAD_RESULT(result);
297 297
298 result = pthread_cond_init(data_.cond(), &cond_attr); 298 result = pthread_cond_init(data_.cond(), &cond_attr);
299 VALIDATE_PTHREAD_RESULT(result); 299 VALIDATE_PTHREAD_RESULT(result);
300 300
301 result = pthread_condattr_destroy(&cond_attr); 301 result = pthread_condattr_destroy(&cond_attr);
302 VALIDATE_PTHREAD_RESULT(result); 302 VALIDATE_PTHREAD_RESULT(result);
303
304 #if defined(DEBUG)
305 // When running with assertions enabled we track the owner.
306 owner_ = OSThread::kInvalidThreadId;
307 #endif // defined(DEBUG)
303 } 308 }
304 309
305 310
306 Monitor::~Monitor() { 311 Monitor::~Monitor() {
312 #if defined(DEBUG)
313 // When running with assertions enabled we track the owner.
314 ASSERT(owner_ == OSThread::kInvalidThreadId);
315 #endif // defined(DEBUG)
316
307 int result = pthread_mutex_destroy(data_.mutex()); 317 int result = pthread_mutex_destroy(data_.mutex());
308 VALIDATE_PTHREAD_RESULT(result); 318 VALIDATE_PTHREAD_RESULT(result);
309 319
310 result = pthread_cond_destroy(data_.cond()); 320 result = pthread_cond_destroy(data_.cond());
311 VALIDATE_PTHREAD_RESULT(result); 321 VALIDATE_PTHREAD_RESULT(result);
312 } 322 }
313 323
314 324
315 void Monitor::Enter() { 325 void Monitor::Enter() {
316 int result = pthread_mutex_lock(data_.mutex()); 326 int result = pthread_mutex_lock(data_.mutex());
317 VALIDATE_PTHREAD_RESULT(result); 327 VALIDATE_PTHREAD_RESULT(result);
318 // TODO(iposva): Do we need to track lock owners? 328
329 #if defined(DEBUG)
330 // When running with assertions enabled we track the owner.
331 ASSERT(owner_ == OSThread::kInvalidThreadId);
332 owner_ = OSThread::GetCurrentThreadId();
333 #endif // defined(DEBUG)
319 } 334 }
320 335
321 336
322 void Monitor::Exit() { 337 void Monitor::Exit() {
323 // TODO(iposva): Do we need to track lock owners? 338 #if defined(DEBUG)
339 // When running with assertions enabled we track the owner.
340 ASSERT(IsOwnedByCurrentThread());
341 owner_ = OSThread::kInvalidThreadId;
342 #endif // defined(DEBUG)
343
324 int result = pthread_mutex_unlock(data_.mutex()); 344 int result = pthread_mutex_unlock(data_.mutex());
325 VALIDATE_PTHREAD_RESULT(result); 345 VALIDATE_PTHREAD_RESULT(result);
326 } 346 }
327 347
328 348
329 Monitor::WaitResult Monitor::Wait(int64_t millis) { 349 Monitor::WaitResult Monitor::Wait(int64_t millis) {
330 return WaitMicros(millis * kMicrosecondsPerMillisecond); 350 return WaitMicros(millis * kMicrosecondsPerMillisecond);
331 } 351 }
332 352
333 353
334 Monitor::WaitResult Monitor::WaitMicros(int64_t micros) { 354 Monitor::WaitResult Monitor::WaitMicros(int64_t micros) {
335 // TODO(iposva): Do we need to track lock owners? 355 #if defined(DEBUG)
356 // When running with assertions enabled we track the owner.
357 ASSERT(IsOwnedByCurrentThread());
358 ThreadId saved_owner = owner_;
359 owner_ = OSThread::kInvalidThreadId;
360 #endif // defined(DEBUG)
361
336 Monitor::WaitResult retval = kNotified; 362 Monitor::WaitResult retval = kNotified;
337 if (micros == kNoTimeout) { 363 if (micros == kNoTimeout) {
338 // Wait forever. 364 // Wait forever.
339 int result = pthread_cond_wait(data_.cond(), data_.mutex()); 365 int result = pthread_cond_wait(data_.cond(), data_.mutex());
340 VALIDATE_PTHREAD_RESULT(result); 366 VALIDATE_PTHREAD_RESULT(result);
341 } else { 367 } else {
342 struct timespec ts; 368 struct timespec ts;
343 ComputeTimeSpecMicros(&ts, micros); 369 ComputeTimeSpecMicros(&ts, micros);
344 int result = pthread_cond_timedwait(data_.cond(), data_.mutex(), &ts); 370 int result = pthread_cond_timedwait(data_.cond(), data_.mutex(), &ts);
345 ASSERT((result == 0) || (result == ETIMEDOUT)); 371 ASSERT((result == 0) || (result == ETIMEDOUT));
346 if (result == ETIMEDOUT) { 372 if (result == ETIMEDOUT) {
347 retval = kTimedOut; 373 retval = kTimedOut;
348 } 374 }
349 } 375 }
376
377 #if defined(DEBUG)
378 // When running with assertions enabled we track the owner.
379 ASSERT(owner_ == OSThread::kInvalidThreadId);
380 owner_ = OSThread::GetCurrentThreadId();
381 ASSERT(owner_ == saved_owner);
382 #endif // defined(DEBUG)
350 return retval; 383 return retval;
351 } 384 }
352 385
353 386
354 void Monitor::Notify() { 387 void Monitor::Notify() {
355 // TODO(iposva): Do we need to track lock owners? 388 // When running with assertions enabled we track the owner.
389 ASSERT(IsOwnedByCurrentThread());
356 int result = pthread_cond_signal(data_.cond()); 390 int result = pthread_cond_signal(data_.cond());
357 VALIDATE_PTHREAD_RESULT(result); 391 VALIDATE_PTHREAD_RESULT(result);
358 } 392 }
359 393
360 394
361 void Monitor::NotifyAll() { 395 void Monitor::NotifyAll() {
362 // TODO(iposva): Do we need to track lock owners? 396 // When running with assertions enabled we track the owner.
397 ASSERT(IsOwnedByCurrentThread());
363 int result = pthread_cond_broadcast(data_.cond()); 398 int result = pthread_cond_broadcast(data_.cond());
364 VALIDATE_PTHREAD_RESULT(result); 399 VALIDATE_PTHREAD_RESULT(result);
365 } 400 }
366 401
367 } // namespace dart 402 } // namespace dart
368 403
369 #endif // defined(TARGET_OS_ANDROID) 404 #endif // defined(TARGET_OS_ANDROID)
OLDNEW
« no previous file with comments | « runtime/vm/os_thread.h ('k') | runtime/vm/os_thread_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698