| Index: Source/core/workers/WorkerLoaderProxy.h
|
| diff --git a/Source/core/workers/WorkerLoaderProxy.h b/Source/core/workers/WorkerLoaderProxy.h
|
| index 21e5dd4e3f2d178e0324328446cd0951280ff3fb..dc1cd574f4fdd81edd4be4336c4c990dcab52ecb 100644
|
| --- a/Source/core/workers/WorkerLoaderProxy.h
|
| +++ b/Source/core/workers/WorkerLoaderProxy.h
|
| @@ -34,17 +34,30 @@
|
| #include "core/dom/ExecutionContext.h"
|
| #include "wtf/Forward.h"
|
| #include "wtf/PassOwnPtr.h"
|
| +#include "wtf/ThreadSafeRefCounted.h"
|
|
|
| namespace blink {
|
|
|
| -// A proxy to talk to the loader context. Normally, the document on the main thread
|
| -// provides loading services for the subordinate workers. This interface provides 2-way
|
| -// communications to the Document context and back to the worker.
|
| +// The WorkerLoaderProxy is a proxy to the loader context. Normally, the
|
| +// document on the main thread provides loading services for the subordinate
|
| +// workers. WorkerLoaderProxy provides 2-way communications to the Document
|
| +// context and back to the worker.
|
| +//
|
| // Note that in multi-process browsers, the Worker object context and the Document
|
| // context can be distinct.
|
| -class WorkerLoaderProxy {
|
| +
|
| +// The abstract interface providing the methods for actually posting tasks; separated
|
| +// from the thread-safe & ref-counted WorkerLoaderProxy object which keeps a protected
|
| +// reference to the provider object. This to support non-overlapping lifetimes, the
|
| +// provider may be destructed before all references to the WorkerLoaderProxy object
|
| +// have been dropped.
|
| +//
|
| +// A provider implementation must detach itself when finalizing by calling
|
| +// WorkerLoaderProxy::detachProvider(). This stops the WorkerLoaderProxy from accessing
|
| +// the now-dead object, but it will remain alive while ref-ptrs are still kept to it.
|
| +class WorkerLoaderProxyProvider {
|
| public:
|
| - virtual ~WorkerLoaderProxy() { }
|
| + virtual ~WorkerLoaderProxyProvider() { }
|
|
|
| // Posts a task to the thread which runs the loading code (normally, the main thread).
|
| virtual void postTaskToLoader(PassOwnPtr<ExecutionContextTask>) = 0;
|
| @@ -54,6 +67,30 @@ public:
|
| virtual bool postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask>) = 0;
|
| };
|
|
|
| +class WorkerLoaderProxy : public ThreadSafeRefCounted<WorkerLoaderProxy>, public WorkerLoaderProxyProvider {
|
| +public:
|
| + static PassRefPtr<WorkerLoaderProxy> create(WorkerLoaderProxyProvider* loaderProxyProvider)
|
| + {
|
| + return adoptRef(new WorkerLoaderProxy(loaderProxyProvider));
|
| + }
|
| +
|
| + ~WorkerLoaderProxy() override;
|
| +
|
| + void postTaskToLoader(PassOwnPtr<ExecutionContextTask>) override;
|
| + bool postTaskToWorkerGlobalScope(PassOwnPtr<ExecutionContextTask>) override;
|
| +
|
| + // Notification from the provider that it can no longer be
|
| + // accessed. An implementation of WorkerLoaderProxyProvider is
|
| + // required to call detachProvider() when finalizing.
|
| + void detachProvider(WorkerLoaderProxyProvider*);
|
| +
|
| +private:
|
| + explicit WorkerLoaderProxy(WorkerLoaderProxyProvider*);
|
| +
|
| + Mutex m_lock;
|
| + WorkerLoaderProxyProvider* m_loaderProxyProvider;
|
| +};
|
| +
|
| } // namespace blink
|
|
|
| #endif // WorkerLoaderProxy_h
|
|
|