OK, here's how I understand it. Gurus, please correct me if I'm wrong.

V8 supports three modes of operation - thread-oblivious, thread-safe,
and
multi-isolate (my terms). Thread-oblivious means you always use the
default
isolate and don't bother with locks. This is the default mode and is
safe for
single-threaded applications.

By instantiating a locker, however, you're switching into thread-safe
mode, and
from that point on must always use a locker when accessing V8.

But that's not enough. Presumably you're using thread-safe mode
because your
application is multi-threaded. To use V8 from a given thread, not only
must you
lock the relevant isolate, but the thread must also enter that
isolate. This is
the "assist" that thread-safe mode provides over full-blown multi-
isolate mode;
when you lock the default isolate, the current thread automatically
enters
it; when you unlock it, the current thread automatically exits it.

So when your first locker goes out of scope, not only does it unlock
the
default isolate, but it also causes the thread to exit it, and that
causes it
to discard its record of the currently entered context.


On Feb 7, 12:46 pm, cruisercoder <[email protected]> wrote:
> The code below assets with the error "cannot exit non-entered context"
> and occurs in v8 versions 3.1.8 and 3.6.2.   Can anyone indicate why?
>
> {
>     using namespace v8;
>
>     Persistent<Context> context;
>
>     {
>         Locker l;
>         HandleScope handle_scope;
>         context = Persistent<Context>::New(Context::New());
>         context->Enter();
>     }
>
>     {
>         Locker l;
>         context->Exit();
>         context.Dispose();
>     }
>
> }
>
> #
> # Fatal error in v8::Context::Exit()
> # Cannot exit non-entered context
> #

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to