78411db4b5
* spec: clean up after a failed window count assertion Previously when this assertion failed all tests that ran after the failed assertion also failed. This ensure that the assertion fails for the test that actually caused the issue but cleans up the left-over windows so that future tests do not fail. * fix: maintain a ref count for objects sent over remote Previously there was a race condition where a GC could occur in the renderer process between the main process sending a meta.id and the renderer pulling the proxy out its weakmap to stop it being GC'ed. This fixes that race condition by maintaining a "sent" ref count in the object registry and a "received" ref count in the object cache on the renderer side. The deref request now sends the number of refs the renderer thinks it owns, if the number does not match the value in the object registry it is assumed that there is an IPC message containing a new reference in flight and this race condition was hit. The browser side ref count is then reduced and we wait for the new deref message. This guaruntees that an object will only be removed from the registry if every reference we sent has been guarunteed to be unreffed.
45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
// Copyright (c) 2016 GitHub, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef ATOM_COMMON_API_REMOTE_OBJECT_FREER_H_
|
|
#define ATOM_COMMON_API_REMOTE_OBJECT_FREER_H_
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
#include "atom/common/api/object_life_monitor.h"
|
|
|
|
namespace atom {
|
|
|
|
class RemoteObjectFreer : public ObjectLifeMonitor {
|
|
public:
|
|
static void BindTo(v8::Isolate* isolate,
|
|
v8::Local<v8::Object> target,
|
|
const std::string& context_id,
|
|
int object_id);
|
|
static void AddRef(const std::string& context_id, int object_id);
|
|
|
|
protected:
|
|
RemoteObjectFreer(v8::Isolate* isolate,
|
|
v8::Local<v8::Object> target,
|
|
const std::string& context_id,
|
|
int object_id);
|
|
~RemoteObjectFreer() override;
|
|
|
|
void RunDestructor() override;
|
|
|
|
// { context_id => { object_id => ref_count }}
|
|
static std::map<std::string, std::map<int, int>> ref_mapper_;
|
|
|
|
private:
|
|
std::string context_id_;
|
|
int object_id_;
|
|
int routing_id_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(RemoteObjectFreer);
|
|
};
|
|
|
|
} // namespace atom
|
|
|
|
#endif // ATOM_COMMON_API_REMOTE_OBJECT_FREER_H_
|