Commit 669a0ae6 authored by tkent@chromium.org's avatar tkent@chromium.org

Oilpan: Reduce RefPtr to WorkerGlobalScope.

This CL reduces the number of required Heap::collectGarbage calls in
Heap::collectAllGarbage on Worker termination.

 - Make Event::m_target Member<>.
 - Make MessageEvent::m_source Member<>.
  MessageEvent is used to communicate between the main thread and workers.
  For consistency, this CL adjusts MessagePort argument/return types.

They reduce RefPtr to WorkerGlobalScope, which implements EventTarget.

BUG=375671

Review URL: https://codereview.chromium.org/304353004

git-svn-id: svn://svn.chromium.org/blink/trunk@175201 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent c31658cf
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
namespace WebCore { namespace WebCore {
PassRefPtr<MessagePort> MessagePort::create(ExecutionContext& executionContext) PassRefPtrWillBeRawPtr<MessagePort> MessagePort::create(ExecutionContext& executionContext)
{ {
RefPtrWillBeRawPtr<MessagePort> port = adoptRefWillBeRefCountedGarbageCollected(new MessagePort(executionContext)); RefPtrWillBeRawPtr<MessagePort> port = adoptRefWillBeRefCountedGarbageCollected(new MessagePort(executionContext));
port->suspendIfNeeded(); port->suspendIfNeeded();
......
...@@ -64,7 +64,7 @@ class MessagePort FINAL : public RefCountedWillBeRefCountedGarbageCollected<Mess ...@@ -64,7 +64,7 @@ class MessagePort FINAL : public RefCountedWillBeRefCountedGarbageCollected<Mess
REFCOUNTED_EVENT_TARGET(MessagePort); REFCOUNTED_EVENT_TARGET(MessagePort);
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MessagePort); WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MessagePort);
public: public:
static PassRefPtr<MessagePort> create(ExecutionContext&); static PassRefPtrWillBeRawPtr<MessagePort> create(ExecutionContext&);
virtual ~MessagePort(); virtual ~MessagePort();
void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionState&); void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionState&);
......
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
*/ */
[ [
ActiveDOMObject ActiveDOMObject,
WillBeGarbageCollected
] interface MessagePort : EventTarget { ] interface MessagePort : EventTarget {
[Custom, RaisesException] void postMessage(any message, optional MessagePort[] messagePorts); [Custom, RaisesException] void postMessage(any message, optional MessagePort[] messagePorts);
......
...@@ -235,6 +235,7 @@ PassRefPtrWillBeRawPtr<NodeList> Event::path() const ...@@ -235,6 +235,7 @@ PassRefPtrWillBeRawPtr<NodeList> Event::path() const
void Event::trace(Visitor* visitor) void Event::trace(Visitor* visitor)
{ {
visitor->trace(m_target);
visitor->trace(m_underlyingEvent); visitor->trace(m_underlyingEvent);
visitor->trace(m_eventPath); visitor->trace(m_eventPath);
} }
......
...@@ -204,7 +204,7 @@ private: ...@@ -204,7 +204,7 @@ private:
unsigned short m_eventPhase; unsigned short m_eventPhase;
EventTarget* m_currentTarget; EventTarget* m_currentTarget;
RefPtr<EventTarget> m_target; RefPtrWillBeMember<EventTarget> m_target;
DOMTimeStamp m_createTime; DOMTimeStamp m_createTime;
RefPtrWillBeMember<Event> m_underlyingEvent; RefPtrWillBeMember<Event> m_underlyingEvent;
OwnPtrWillBeMember<EventPath> m_eventPath; OwnPtrWillBeMember<EventPath> m_eventPath;
......
...@@ -60,7 +60,7 @@ MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& ini ...@@ -60,7 +60,7 @@ MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& ini
ASSERT(isValidSource(m_source.get())); ASSERT(isValidSource(m_source.get()));
} }
MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports) MessageEvent::MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
: Event(EventTypeNames::message, false, false) : Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeScriptValue) , m_dataType(DataTypeScriptValue)
, m_origin(origin) , m_origin(origin)
...@@ -72,7 +72,7 @@ MessageEvent::MessageEvent(const String& origin, const String& lastEventId, Pass ...@@ -72,7 +72,7 @@ MessageEvent::MessageEvent(const String& origin, const String& lastEventId, Pass
ASSERT(isValidSource(m_source.get())); ASSERT(isValidSource(m_source.get()));
} }
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports) MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray> ports)
: Event(EventTypeNames::message, false, false) : Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeSerializedScriptValue) , m_dataType(DataTypeSerializedScriptValue)
, m_dataAsSerializedScriptValue(data) , m_dataAsSerializedScriptValue(data)
...@@ -87,7 +87,7 @@ MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& ...@@ -87,7 +87,7 @@ MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String&
ASSERT(isValidSource(m_source.get())); ASSERT(isValidSource(m_source.get()));
} }
MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels) MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray> channels)
: Event(EventTypeNames::message, false, false) : Event(EventTypeNames::message, false, false)
, m_dataType(DataTypeSerializedScriptValue) , m_dataType(DataTypeSerializedScriptValue)
, m_dataAsSerializedScriptValue(data) , m_dataAsSerializedScriptValue(data)
...@@ -187,6 +187,7 @@ void MessageEvent::entangleMessagePorts(ExecutionContext* context) ...@@ -187,6 +187,7 @@ void MessageEvent::entangleMessagePorts(ExecutionContext* context)
void MessageEvent::trace(Visitor* visitor) void MessageEvent::trace(Visitor* visitor)
{ {
visitor->trace(m_dataAsBlob); visitor->trace(m_dataAsBlob);
visitor->trace(m_source);
Event::trace(visitor); Event::trace(visitor);
} }
......
...@@ -53,15 +53,15 @@ public: ...@@ -53,15 +53,15 @@ public:
{ {
return adoptRefWillBeNoop(new MessageEvent); return adoptRefWillBeNoop(new MessageEvent);
} }
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr) static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{ {
return adoptRefWillBeNoop(new MessageEvent(origin, lastEventId, source, ports)); return adoptRefWillBeNoop(new MessageEvent(origin, lastEventId, source, ports));
} }
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr) static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortArray> ports, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{ {
return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, ports)); return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, ports));
} }
static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtr<EventTarget> source = nullptr) static PassRefPtrWillBeRawPtr<MessageEvent> create(PassOwnPtr<MessagePortChannelArray> channels, PassRefPtr<SerializedScriptValue> data, const String& origin = String(), const String& lastEventId = String(), PassRefPtrWillBeRawPtr<EventTarget> source = nullptr)
{ {
return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, channels)); return adoptRefWillBeNoop(new MessageEvent(data, origin, lastEventId, source, channels));
} }
...@@ -118,13 +118,13 @@ public: ...@@ -118,13 +118,13 @@ public:
private: private:
MessageEvent(); MessageEvent();
MessageEvent(const AtomicString&, const MessageEventInit&); MessageEvent(const AtomicString&, const MessageEventInit&);
MessageEvent(const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray>); MessageEvent(const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortArray>); MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortArray>);
MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>); MessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, const String& lastEventId, PassRefPtrWillBeRawPtr<EventTarget> source, PassOwnPtr<MessagePortChannelArray>);
explicit MessageEvent(const String& data, const String& origin); MessageEvent(const String& data, const String& origin);
explicit MessageEvent(PassRefPtrWillBeRawPtr<Blob> data, const String& origin); MessageEvent(PassRefPtrWillBeRawPtr<Blob> data, const String& origin);
explicit MessageEvent(PassRefPtr<ArrayBuffer> data, const String& origin); MessageEvent(PassRefPtr<ArrayBuffer> data, const String& origin);
DataType m_dataType; DataType m_dataType;
RefPtr<SerializedScriptValue> m_dataAsSerializedScriptValue; RefPtr<SerializedScriptValue> m_dataAsSerializedScriptValue;
...@@ -133,7 +133,7 @@ private: ...@@ -133,7 +133,7 @@ private:
RefPtr<ArrayBuffer> m_dataAsArrayBuffer; RefPtr<ArrayBuffer> m_dataAsArrayBuffer;
String m_origin; String m_origin;
String m_lastEventId; String m_lastEventId;
RefPtr<EventTarget> m_source; RefPtrWillBeMember<EventTarget> m_source;
// m_ports are the MessagePorts in an engtangled state, and m_channels are // m_ports are the MessagePorts in an engtangled state, and m_channels are
// the MessageChannels in a disentangled state. Only one of them can be // the MessageChannels in a disentangled state. Only one of them can be
// non-empty at a time. entangleMessagePorts() moves between the states. // non-empty at a time. entangleMessagePorts() moves between the states.
......
...@@ -41,9 +41,9 @@ ...@@ -41,9 +41,9 @@
namespace WebCore { namespace WebCore {
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtr<MessagePort> prpPort) PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtrWillBeRawPtr<MessagePort> prpPort)
{ {
RefPtr<MessagePort> port = prpPort; RefPtrWillBeRawPtr<MessagePort> port = prpPort;
RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(adoptPtr(new MessagePortArray(1, port)), String(), String(), port); RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(adoptPtr(new MessagePortArray(1, port)), String(), String(), port);
event->initEvent(EventTypeNames::connect, false, false); event->initEvent(EventTypeNames::connect, false, false);
return event.release(); return event.release();
......
...@@ -67,7 +67,7 @@ namespace WebCore { ...@@ -67,7 +67,7 @@ namespace WebCore {
String m_name; String m_name;
}; };
PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtr<MessagePort>); PassRefPtrWillBeRawPtr<MessageEvent> createConnectEvent(PassRefPtrWillBeRawPtr<MessagePort>);
} // namespace WebCore } // namespace WebCore
......
...@@ -311,11 +311,11 @@ void WebSharedWorkerImpl::connect(WebMessagePortChannel* webChannel) ...@@ -311,11 +311,11 @@ void WebSharedWorkerImpl::connect(WebMessagePortChannel* webChannel)
void WebSharedWorkerImpl::connectTask(ExecutionContext* context, PassOwnPtr<WebMessagePortChannel> channel) void WebSharedWorkerImpl::connectTask(ExecutionContext* context, PassOwnPtr<WebMessagePortChannel> channel)
{ {
// Wrap the passed-in channel in a MessagePort, and send it off via a connect event. // Wrap the passed-in channel in a MessagePort, and send it off via a connect event.
RefPtr<MessagePort> port = MessagePort::create(*context); RefPtrWillBeRawPtr<MessagePort> port = MessagePort::create(*context);
port->entangle(channel); port->entangle(channel);
WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope->isSharedWorkerGlobalScope()); ASSERT_WITH_SECURITY_IMPLICATION(workerGlobalScope->isSharedWorkerGlobalScope());
workerGlobalScope->dispatchEvent(createConnectEvent(port)); workerGlobalScope->dispatchEvent(createConnectEvent(port.release()));
} }
void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType policyType) void WebSharedWorkerImpl::startWorkerContext(const WebURL& url, const WebString& name, const WebString& contentSecurityPolicy, WebContentSecurityPolicyType policyType)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment