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

Side by Side Diff: include/v8.h

Issue 6788023: Per-isolate v8::Locker and v8::Unlocker (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixes for simulator (arm/mips) Created 9 years, 7 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
« no previous file with comments | « no previous file | src/api.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3375 matching lines...) Expand 10 before | Expand all | Expand 10 after
3386 3386
3387 /** 3387 /**
3388 * Multiple threads in V8 are allowed, but only one thread at a time 3388 * Multiple threads in V8 are allowed, but only one thread at a time
3389 * is allowed to use any given V8 isolate. See Isolate class 3389 * is allowed to use any given V8 isolate. See Isolate class
3390 * comments. The definition of 'using V8 isolate' includes 3390 * comments. The definition of 'using V8 isolate' includes
3391 * accessing handles or holding onto object pointers obtained 3391 * accessing handles or holding onto object pointers obtained
3392 * from V8 handles while in the particular V8 isolate. It is up 3392 * from V8 handles while in the particular V8 isolate. It is up
3393 * to the user of V8 to ensure (perhaps with locking) that this 3393 * to the user of V8 to ensure (perhaps with locking) that this
3394 * constraint is not violated. 3394 * constraint is not violated.
3395 * 3395 *
3396 * More then one thread and multiple V8 isolates can be used 3396 * v8::Locker is a scoped lock object. While it's
3397 * without any locking if each isolate is created and accessed 3397 * active (i.e. between its construction and destruction) the current thread is
3398 * by a single thread only. For example, one thread can use 3398 * allowed to use the locked isolate. V8 guarantees that an isolate can be locke d
3399 * multiple isolates or multiple threads can each create and run 3399 * by at most one thread at any time. In other words, the scope of a v8::Locker is
3400 * their own isolate. 3400 * a critical section.
3401 * 3401 *
3402 * If you wish to start using V8 isolate in more then one thread 3402 * Sample usage:
3403 * you can do this by constructing a v8::Locker object to guard 3403 * \code
3404 * access to the isolate. After the code using V8 has completed
3405 * for the current thread you can call the destructor. This can
3406 * be combined with C++ scope-based construction as follows
3407 * (assumes the default isolate that is used if not specified as
3408 * a parameter for the Locker):
3409 *
3410 * \code
3411 * ... 3404 * ...
3412 * { 3405 * {
3413 * v8::Locker locker; 3406 * v8::Locker locker(isolate);
3407 * v8::Isolate::Scope isolate_scope(isolate);
3414 * ... 3408 * ...
3415 * // Code using V8 goes here. 3409 * // Code using V8 and isolate goes here.
3416 * ... 3410 * ...
3417 * } // Destructor called here 3411 * } // Destructor called here
3418 * \endcode 3412 * \endcode
3419 * 3413 *
3420 * If you wish to stop using V8 in a thread A you can do this by either 3414 * If you wish to stop using V8 in a thread A you can do this by either
3421 * by destroying the v8::Locker object as above or by constructing a 3415 * by destroying the v8::Locker object as above or by constructing a
3422 * v8::Unlocker object: 3416 * v8::Unlocker object:
3423 * 3417 *
3424 * \code 3418 * \code
3425 * { 3419 * {
3426 * v8::Unlocker unlocker; 3420 * isolate->Exit();
3421 * v8::Unlocker unlocker(isolate);
3427 * ... 3422 * ...
3428 * // Code not using V8 goes here while V8 can run in another thread. 3423 * // Code not using V8 goes here while V8 can run in another thread.
3429 * ... 3424 * ...
3430 * } // Destructor called here. 3425 * } // Destructor called here.
3426 * isolate->Enter();
3431 * \endcode 3427 * \endcode
3432 * 3428 *
3433 * The Unlocker object is intended for use in a long-running callback 3429 * The Unlocker object is intended for use in a long-running callback
3434 * from V8, where you want to release the V8 lock for other threads to 3430 * from V8, where you want to release the V8 lock for other threads to
3435 * use. 3431 * use.
3436 * 3432 *
3437 * The v8::Locker is a recursive lock. That is, you can lock more than 3433 * The v8::Locker is a recursive lock. That is, you can lock more than
3438 * once in a given thread. This can be useful if you have code that can 3434 * once in a given thread. This can be useful if you have code that can
3439 * be called either from code that holds the lock or from code that does 3435 * be called either from code that holds the lock or from code that does
3440 * not. The Unlocker is not recursive so you can not have several 3436 * not. The Unlocker is not recursive so you can not have several
3441 * Unlockers on the stack at once, and you can not use an Unlocker in a 3437 * Unlockers on the stack at once, and you can not use an Unlocker in a
3442 * thread that is not inside a Locker's scope. 3438 * thread that is not inside a Locker's scope.
3443 * 3439 *
3444 * An unlocker will unlock several lockers if it has to and reinstate 3440 * An unlocker will unlock several lockers if it has to and reinstate
3445 * the correct depth of locking on its destruction. eg.: 3441 * the correct depth of locking on its destruction. eg.:
3446 * 3442 *
3447 * \code 3443 * \code
3448 * // V8 not locked. 3444 * // V8 not locked.
3449 * { 3445 * {
3450 * v8::Locker locker; 3446 * v8::Locker locker(isolate);
3447 * Isolate::Scope isolate_scope(isolate);
3451 * // V8 locked. 3448 * // V8 locked.
3452 * { 3449 * {
3453 * v8::Locker another_locker; 3450 * v8::Locker another_locker(isolate);
3454 * // V8 still locked (2 levels). 3451 * // V8 still locked (2 levels).
3455 * { 3452 * {
3456 * v8::Unlocker unlocker; 3453 * isolate->Exit();
3454 * v8::Unlocker unlocker(isolate);
3457 * // V8 not locked. 3455 * // V8 not locked.
3458 * } 3456 * }
3457 * isolate->Enter();
3459 * // V8 locked again (2 levels). 3458 * // V8 locked again (2 levels).
3460 * } 3459 * }
3461 * // V8 still locked (1 level). 3460 * // V8 still locked (1 level).
3462 * } 3461 * }
3463 * // V8 Now no longer locked. 3462 * // V8 Now no longer locked.
3464 * \endcode 3463 * \endcode
3464 *
3465 *
3465 */ 3466 */
3466 class V8EXPORT Unlocker { 3467 class V8EXPORT Unlocker {
3467 public: 3468 public:
3468 Unlocker(); 3469 /**
3470 * Initialize Unlocker for a given Isolate. NULL means default isolate.
3471 */
3472 explicit Unlocker(Isolate* isolate = NULL);
3469 ~Unlocker(); 3473 ~Unlocker();
3474 private:
3475 internal::Isolate* isolate_;
3470 }; 3476 };
3471 3477
3472 3478
3473 class V8EXPORT Locker { 3479 class V8EXPORT Locker {
3474 public: 3480 public:
3475 Locker(); 3481 /**
3482 * Initialize Locker for a given Isolate. NULL means default isolate.
3483 */
3484 explicit Locker(Isolate* isolate = NULL);
3476 ~Locker(); 3485 ~Locker();
3477 3486
3478 /** 3487 /**
3479 * Start preemption. 3488 * Start preemption.
3480 * 3489 *
3481 * When preemption is started, a timer is fired every n milli seconds 3490 * When preemption is started, a timer is fired every n milli seconds
3482 * that will switch between multiple threads that are in contention 3491 * that will switch between multiple threads that are in contention
3483 * for the V8 lock. 3492 * for the V8 lock.
3484 */ 3493 */
3485 static void StartPreemption(int every_n_ms); 3494 static void StartPreemption(int every_n_ms);
3486 3495
3487 /** 3496 /**
3488 * Stop preemption. 3497 * Stop preemption.
3489 */ 3498 */
3490 static void StopPreemption(); 3499 static void StopPreemption();
3491 3500
3492 /** 3501 /**
3493 * Returns whether or not the locker is locked by the current thread. 3502 * Returns whether or not the locker for a given isolate, or default isolate i f NULL is given,
3503 * is locked by the current thread.
3494 */ 3504 */
3495 static bool IsLocked(); 3505 static bool IsLocked(Isolate* isolate = NULL);
3496 3506
3497 /** 3507 /**
3498 * Returns whether v8::Locker is being used by this V8 instance. 3508 * Returns whether v8::Locker is being used by this V8 instance.
3499 */ 3509 */
3500 static bool IsActive() { return active_; } 3510 static bool IsActive() { return active_; }
3501 3511
3502 private: 3512 private:
3503 bool has_lock_; 3513 bool has_lock_;
3504 bool top_level_; 3514 bool top_level_;
3515 internal::Isolate* isolate_;
3505 3516
3506 static bool active_; 3517 static bool active_;
3507 3518
3508 // Disallow copying and assigning. 3519 // Disallow copying and assigning.
3509 Locker(const Locker&); 3520 Locker(const Locker&);
3510 void operator=(const Locker&); 3521 void operator=(const Locker&);
3511 }; 3522 };
3512 3523
3513 3524
3514 /** 3525 /**
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
4063 4074
4064 4075
4065 } // namespace v8 4076 } // namespace v8
4066 4077
4067 4078
4068 #undef V8EXPORT 4079 #undef V8EXPORT
4069 #undef TYPE_CHECK 4080 #undef TYPE_CHECK
4070 4081
4071 4082
4072 #endif // V8_H_ 4083 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698