Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: ppapi/shared_impl/tracked_callback.h

Issue 10909244: PPAPI: Get TrackedCallback ready for running on non-main threads. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_ 5 #ifndef PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_
6 #define PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_ 6 #define PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/synchronization/condition_variable.h" 14 #include "base/synchronization/condition_variable.h"
16 #include "ppapi/c/pp_completion_callback.h" 15 #include "ppapi/c/pp_completion_callback.h"
17 #include "ppapi/c/pp_instance.h" 16 #include "ppapi/c/pp_instance.h"
18 #include "ppapi/c/pp_resource.h" 17 #include "ppapi/c/pp_resource.h"
19 #include "ppapi/shared_impl/ppapi_shared_export.h" 18 #include "ppapi/shared_impl/ppapi_shared_export.h"
20 19
21 namespace ppapi { 20 namespace ppapi {
22 21
23 class CallbackTracker; 22 class CallbackTracker;
24 class Resource; 23 class Resource;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 66
68 // These run the callback in an abortive manner, or post a task to do so (but 67 // These run the callback in an abortive manner, or post a task to do so (but
69 // immediately marking the callback as to be aborted). 68 // immediately marking the callback as to be aborted).
70 void Abort(); 69 void Abort();
71 void PostAbort(); 70 void PostAbort();
72 71
73 // Run the callback with the given result. If the callback had previously been 72 // Run the callback with the given result. If the callback had previously been
74 // marked as to be aborted (by |PostAbort()|), |result| will be ignored and 73 // marked as to be aborted (by |PostAbort()|), |result| will be ignored and
75 // the callback will be run with result |PP_ERROR_ABORTED|. 74 // the callback will be run with result |PP_ERROR_ABORTED|.
76 // 75 //
77 // See also ClearAndRun(). 76 // Run() will invoke the call immediately, if invoked from the target thread
77 // (as determined by target_loop_). If invoked on a different thread, the
78 // callback will be schedule to run later on target_loop_.
79 // TODO(dmichael): Make the above part about different threads actually true.
78 void Run(int32_t result); 80 void Run(int32_t result);
81 // PostRun is like Run(), except it guarantees that the callback will be run
82 // later. In particular, if you invoke PostRun on the same thread on which the
83 // callback is targeted to run, it will *not* be run immediately.
79 void PostRun(int32_t result); 84 void PostRun(int32_t result);
80 85
81 void BlockUntilRun(); 86 void BlockUntilRun();
82 87
83 // Returns the ID of the resource which "owns" the callback, or 0 if the 88 // Returns the ID of the resource which "owns" the callback, or 0 if the
84 // callback is not associated with any resource. 89 // callback is not associated with any resource.
85 PP_Resource resource_id() const { return resource_id_; } 90 PP_Resource resource_id() const { return resource_id_; }
86 91
87 // Returns true if the callback was completed (possibly aborted). 92 // Returns true if the callback was completed (possibly aborted).
88 bool completed() const { return completed_; } 93 bool completed() const { return completed_; }
89 94
90 // Returns true if the callback was or should be aborted; this will be the 95 // Returns true if the callback was or should be aborted; this will be the
91 // case whenever |Abort()| or |PostAbort()| is called before a non-abortive 96 // case whenever |Abort()| or |PostAbort()| is called before a non-abortive
92 // completion. 97 // completion.
93 bool aborted() const { return aborted_; } 98 bool aborted() const { return aborted_; }
94 99
95 // Helper to determine if the given callback is set and not yet completed. 100 // Helper to determine if the given callback is set and not yet completed.
96 // The normal pattern is to use a scoped_refptr to hold a callback. This 101 // The normal pattern is to use a scoped_refptr to hold a callback. This
97 // function tells you if the operation is currently in progress by checking 102 // function tells you if the operation is currently in progress by checking
98 // both the null-ness of the scoped_refptr, as well as the completion state 103 // both the null-ness of the scoped_refptr, as well as the completion state
99 // of the callback (which may still be out-standing via a PostAbort). 104 // of the callback (which may still be out-standing via a PostAbort).
100 static bool IsPending(const scoped_refptr<TrackedCallback>& callback); 105 static bool IsPending(const scoped_refptr<TrackedCallback>& callback);
101 106
102 // Runs the given callback, clearing the given scoped_refptr before execution.
103 // This is useful for cases where there can be only one pending callback, and
104 // the presence of the callback indicates one is pending. Such code would
105 // normally want to clear it before execution so the plugin can issue a new
106 // request.
107 static void ClearAndRun(scoped_refptr<TrackedCallback>* callback,
108 int32_t result);
109
110 // Same as ClearAndRun except it calls Abort().
111 static void ClearAndAbort(scoped_refptr<TrackedCallback>* callback);
112
113 protected: 107 protected:
114 bool is_blocking() { 108 bool is_blocking() {
115 return !callback_.func; 109 return !callback_.func;
116 } 110 }
117 bool is_required() { 111 bool is_required() {
118 return (callback_.func && 112 return (callback_.func &&
119 !(callback_.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL)); 113 !(callback_.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL));
120 } 114 }
121 bool is_optional() { 115 bool is_optional() {
122 return (callback_.func && 116 return (callback_.func &&
(...skipping 12 matching lines...) Expand all
135 129
136 // Mark this object as complete and remove it from the tracker. This must only 130 // Mark this object as complete and remove it from the tracker. This must only
137 // be called once. Note that running this may result in this object being 131 // be called once. Note that running this may result in this object being
138 // deleted (so keep a reference if it'll still be needed). 132 // deleted (so keep a reference if it'll still be needed).
139 void MarkAsCompleted(); 133 void MarkAsCompleted();
140 134
141 // This class is ref counted. 135 // This class is ref counted.
142 friend class base::RefCountedThreadSafe<TrackedCallback>; 136 friend class base::RefCountedThreadSafe<TrackedCallback>;
143 virtual ~TrackedCallback(); 137 virtual ~TrackedCallback();
144 138
145 // Factory used by |PostAbort()| and |PostRun()|. Note that it's safe to 139 // Flag used by |PostAbort()| and |PostRun()| to check that we don't schedule
146 // cancel any pending posted tasks on destruction -- before it's destroyed, 140 // the callback more than once.
147 // the "owning" |CallbackTracker| must have gone through and done 141 bool is_scheduled_;
148 // (synchronous) |Abort()|s.
149 base::WeakPtrFactory<TrackedCallback> weak_ptr_factory_;
150 142
151 scoped_refptr<CallbackTracker> tracker_; 143 scoped_refptr<CallbackTracker> tracker_;
152 PP_Resource resource_id_; 144 PP_Resource resource_id_;
153 bool completed_; 145 bool completed_;
154 bool aborted_; 146 bool aborted_;
155 PP_CompletionCallback callback_; 147 PP_CompletionCallback callback_;
156 148
157 int32_t result_for_blocked_callback_; 149 int32_t result_for_blocked_callback_;
158 // Used for pausing/waking the blocked thread if this is a blocking completion 150 // Used for pausing/waking the blocked thread if this is a blocking completion
159 // callback. Note that in-process, there is no lock, blocking callbacks are 151 // callback. Note that in-process, there is no lock, blocking callbacks are
160 // not allowed, and therefore this pointer will be NULL. 152 // not allowed, and therefore this pointer will be NULL.
161 scoped_ptr<base::ConditionVariable> operation_completed_condvar_; 153 scoped_ptr<base::ConditionVariable> operation_completed_condvar_;
162 154
163 DISALLOW_IMPLICIT_CONSTRUCTORS(TrackedCallback); 155 DISALLOW_IMPLICIT_CONSTRUCTORS(TrackedCallback);
164 }; 156 };
165 157
166 } // namespace ppapi 158 } // namespace ppapi
167 159
168 #endif // PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_ 160 #endif // PPAPI_SHARED_IMPL_TRACKED_CALLBACK_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698