 Chromium Code Reviews
 Chromium Code Reviews Issue 9693048:
  Make sure ports are closed when they're no longer used.  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 9693048:
  Make sure ports are closed when they're no longer used.  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| Index: chrome/renderer/extensions/miscellaneous_bindings.cc | 
| diff --git a/chrome/renderer/extensions/miscellaneous_bindings.cc b/chrome/renderer/extensions/miscellaneous_bindings.cc | 
| index 31a892399cd0e61440402854e9bcf01d4c9eda7b..b45a9249b89bca56228837fe8fb584d5d63797a2 100644 | 
| --- a/chrome/renderer/extensions/miscellaneous_bindings.cc | 
| +++ b/chrome/renderer/extensions/miscellaneous_bindings.cc | 
| @@ -84,6 +84,8 @@ class ExtensionImpl : public ChromeV8Extension { | 
| return v8::FunctionTemplate::New(PortAddRef); | 
| } else if (name->Equals(v8::String::New("PortRelease"))) { | 
| return v8::FunctionTemplate::New(PortRelease); | 
| + } else if (name->Equals(v8::String::New("BindToGC"))) { | 
| + return v8::FunctionTemplate::New(BindToGC); | 
| } | 
| return ChromeV8Extension::GetNativeFunction(name); | 
| } | 
| @@ -149,6 +151,33 @@ class ExtensionImpl : public ChromeV8Extension { | 
| } | 
| return v8::Undefined(); | 
| } | 
| + | 
| + struct GCCallbackArgs { | 
| + v8::Persistent<v8::Object> object; | 
| + v8::Persistent<v8::Function> callback; | 
| + }; | 
| + | 
| + static void GCCallback(v8::Persistent<v8::Value> object, void* parameter) { | 
| + v8::HandleScope handle_scope; | 
| + GCCallbackArgs* args = reinterpret_cast<GCCallbackArgs*>(parameter); | 
| + args->callback->Call(args->callback->CreationContext()->Global(), 0, NULL); | 
| + args->callback.Dispose(); | 
| + args->object.Dispose(); | 
| + delete args; | 
| + } | 
| + | 
| + // Binds a callback to be invoked when the given object is garbage collected. | 
| + static v8::Handle<v8::Value> BindToGC(const v8::Arguments& args) { | 
| + if (args.Length() == 2 && args[0]->IsObject() && args[1]->IsFunction()) { | 
| + GCCallbackArgs* context = new GCCallbackArgs; | 
| + context->callback = v8::Persistent<v8::Function>::New( | 
| + v8::Handle<v8::Function>::Cast(args[1])); | 
| + context->object = v8::Persistent<v8::Object>::New( | 
| + v8::Handle<v8::Object>::Cast(args[0])); | 
| + context->object.MakeWeak(context, GCCallback); | 
| + } | 
| 
Matt Perry
2012/03/13 19:54:39
nit: can you add an "else NOTREACHED()" here so we
 | 
| + return v8::Undefined(); | 
| + } | 
| }; | 
| } // namespace |