On Tue, Apr 13, 2010 at 5:05 PM, Stephan Beal <[email protected]> wrote: > On Tue, Apr 13, 2010 at 2:12 PM, Reko Tiira <[email protected]> wrote: >> >> I want to embed V8 in my game engine, mainly because I prefer it's C++ >> API over that of SpiderMonkey's. > > Amen, Reko! > >> >> { >> v8::Unlocker ul; >> Sleep(2); >> } > > Be aware that you must have a Locker in place before you do that, or the > Unlocker will crash/assert. My case was very similar to yours, but since my > code which uses Unlocker is plugin code (which might or might not be loaded > by any given client), i had to go back and hack each client application to > add a Locker before creating the context. > >> >> // 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); > > i might be mis-understanding the context here, but make sure that you do not > use any v8 resources (e.g. the String constructor) while you are unlocked. > >> >> 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. > > Another tip: get rid of the HandleScopes. i've spent many hours > experimenting and they cause me nothing but grief. Mysterious segfaults when > a bound function returns? 9 times out of 10 it's caused by the mere > existence of a HandleScope. i don't use them at all any more, and i can't > see a functional difference (other than that my apps don't crash when the > bound functions return, unless i've done something else illegal).
That is a tip on the verge of FUD ;-) Can you be any more specific about your problems? It sounds to me like you're accessing a Local after the HandleScope in which it was created went away. Matthias > >> >> So when thread 2 goes to sleep, >> and thread 1 wakes up > > will GET A CHANCE to wake up. Other threads might contend. > >> >> , it'll create a new String using the HandleScope >> that was created on the thread 2 while thread 1 was sleeping. Now >> 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. > > That sounds right to me (i say, without having actually run the code). >> >> 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. > > To me it looks like you're on the right track, but: > - IMO you should not try to use a var created from Thread A over in Thread B > - that just "sounds dangerous" to me. Maybe v8 does allow this, though. > - My opinions are limited to my experience and the meager docs on the topic. > Happy hacking! > -- > ----- stephan beal > http://wanderinghorse.net/home/stephan/ > > -- > 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.
