Oh awesome! Thanks for clarifying that up Erik. Regards, Reko Tiira
On Apr 14, 10:33 am, Erik Corry <[email protected]> wrote: > Den 13. apr. 2010 14.12 skrev Reko Tiira <[email protected]>: > > > > > Hey, > > > I want to embed V8 in my game engine, mainly because I prefer it's C++ > > API over that of SpiderMonkey's. However I'm having some thoughts > > about thread-safety, since my engine would be executing each script in > > its own thread. > > > I know that only a single thread can use V8 at a time, and that you > > use the v8::Locker to lock access to V8 per-thread basis. This is all > > good for me, because I can still unlock the thread if I have to wait > > for some resource that is not related to V8. For sake of simplicity, > > let's say I have to sleep for 2 seconds in a script, I could do this > > by: > > > { > > v8::Unlocker ul; > > Sleep(2); > > } > > > And while the thread sleeps, other scripts could still execute since > > v8 is unlocked. However what I'm concerned about is how will > > HandleScopes scope with this. Consider the following example: > > > { > > v8::Locker l; > > v8::HandleScope handle_scope; > > > { > > v8::Unlocker ul; > > Sleep(2); > > } > > > v8::Local<v8::Value> str = v8::String::New("foobar"); > > > // For sake of not having to write almost two identical functions, > > // assume that ONLY thread 1 does this: > > { > > v8::Unlocker ul; > > Sleep(2); > > } > > std::string s = String::AsciiValue ascii(str); > > > // And thread 2 would ONLY do this: > > return; > > } > > > Let's say that two threads run this same script. When the first thread > > unlocks for the first time and goes to sleep, the 2nd thread will > > create a new HandleScope, and thus all consecutive allocations are > > done on the 2nd thread's handle scope. So when thread 2 goes to sleep, > > and thread 1 wakes up, it'll create a new String using the HandleScope > > that was created on the thread 2 while thread 1 was sleeping. Now > > No, this case is taken care of. The Locker and Unlocker objects make sure > to activate the right handle scopes, so when thread 1 wakes up, the > allocation takes place with the correct HandleScope. > > > thread 1 will go to sleep again, and thread 2 will wake up. At this > > point thread 2 simply returns, and since the HandleScope goes out of > > scope, it'll free all the locals that it had allocated, _including_ > > the string created in thread 1 (since it was allocated using the wrong > > HandleScope). After this the control returns back to the thread 1, > > which tries to use the already de-allocated value, and probably crash > > because of that. > > > Am I getting this right? If I am, is there any plausible way to get > > around this, because I really need to be able to run multiple scripts > > at the same time, but I have plenty of scripts that would block until > > some sort of an event happens in the game, and other scripts need to > > be able to run during the time the script waits. > > > Regards, > > Reko Tiira > > > -- > > v8-users mailing list > > [email protected] > >http://groups.google.com/group/v8-users -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users To unsubscribe, reply using "remove me" as the subject.
