Home | History | Annotate | Download | only in gin
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "gin/public/isolate_holder.h"
      6 
      7 #include <stdlib.h>
      8 #include <string.h>
      9 
     10 #include "base/logging.h"
     11 #include "base/rand_util.h"
     12 #include "base/sys_info.h"
     13 #include "gin/array_buffer.h"
     14 #include "gin/function_template.h"
     15 #include "gin/per_isolate_data.h"
     16 
     17 namespace gin {
     18 
     19 namespace {
     20 
     21 bool GenerateEntropy(unsigned char* buffer, size_t amount) {
     22   base::RandBytes(buffer, amount);
     23   return true;
     24 }
     25 
     26 
     27 void EnsureV8Initialized(bool gin_managed) {
     28   static bool v8_is_initialized = false;
     29   static bool v8_is_gin_managed = false;
     30   if (v8_is_initialized) {
     31     CHECK_EQ(v8_is_gin_managed, gin_managed);
     32     return;
     33   }
     34   v8_is_initialized = true;
     35   v8_is_gin_managed = gin_managed;
     36   if (!gin_managed)
     37     return;
     38 
     39   v8::V8::SetArrayBufferAllocator(ArrayBufferAllocator::SharedInstance());
     40   static const char v8_flags[] = "--use_strict --harmony";
     41   v8::V8::SetFlagsFromString(v8_flags, sizeof(v8_flags) - 1);
     42   v8::V8::SetEntropySource(&GenerateEntropy);
     43   v8::V8::Initialize();
     44 }
     45 
     46 }  // namespace
     47 
     48 IsolateHolder::IsolateHolder()
     49   : isolate_owner_(true) {
     50   EnsureV8Initialized(true);
     51   isolate_ = v8::Isolate::New();
     52   v8::ResourceConstraints constraints;
     53   constraints.ConfigureDefaults(base::SysInfo::AmountOfPhysicalMemory(),
     54                                 base::SysInfo::NumberOfProcessors());
     55   v8::SetResourceConstraints(isolate_, &constraints);
     56   Init();
     57 }
     58 
     59 IsolateHolder::IsolateHolder(v8::Isolate* isolate)
     60     : isolate_owner_(false),
     61       isolate_(isolate) {
     62   EnsureV8Initialized(false);
     63   Init();
     64 }
     65 
     66 IsolateHolder::~IsolateHolder() {
     67   isolate_data_.reset();
     68   if (isolate_owner_)
     69     isolate_->Dispose();
     70 }
     71 
     72 void IsolateHolder::Init() {
     73   v8::Isolate::Scope isolate_scope(isolate_);
     74   v8::HandleScope handle_scope(isolate_);
     75   isolate_data_.reset(new PerIsolateData(isolate_));
     76   InitFunctionTemplates(isolate_data_.get());
     77 }
     78 
     79 }  // namespace gin
     80