Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_callback.h |
=================================================================== |
--- ppapi/native_client/src/shared/ppapi_proxy/plugin_callback.h (revision 0) |
+++ ppapi/native_client/src/shared/ppapi_proxy/plugin_callback.h (revision 0) |
@@ -0,0 +1,65 @@ |
+// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_CALLBACK_H_ |
+#define NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_CALLBACK_H_ |
+ |
+#include <pthread.h> |
+#include <map> |
+#include "native_client/src/shared/ppapi_proxy/plugin_globals.h" |
+#include "ppapi/c/pp_completion_callback.h" |
+ |
+namespace ppapi_proxy { |
+ |
+// Skips callback invocation and returns |result| if callback function is NULL |
+// or PP_COMPLETIONCALLBACK_FLAG_OPTIONAL is set. Otherwise, schedules the |
+// callback with |result| as an argument and returns PP_OK_COMPLETIONPENDING. |
+int32_t MayForceCallback(PP_CompletionCallback callback, int32_t result); |
+ |
+// Maintains a table of PP_CompletionCallback objects and their respective |
+// identifiers that can be used to retrieve the objects. |
+class CompletionCallbackTable { |
+ public: |
+ // Return a singleton instance. |
+ static CompletionCallbackTable* Get() { |
+ static CompletionCallbackTable table; |
+ return &table; |
+ } |
+ |
+ // Adds the given |callback| and optionally the associated |read_buffer|, |
+ // generating and returning an identifier for it. |
+ // If |callback| is NULL, then returns 0. |
+ int32_t AddCallback(const PP_CompletionCallback& callback); |
+ int32_t AddCallback(const PP_CompletionCallback& callback, void* read_buffer); |
+ // Removes and returns the callback and optionally the associated |
+ // |read_buffer| corresponding to the given |callback_id|. |
+ // If no callback is found, returns a NULL callback. |
+ PP_CompletionCallback RemoveCallback(int32_t callback_id, void** read_buffer); |
+ |
+ private: |
+ // Currently implemented as singleton, so use a private constructor. |
+ CompletionCallbackTable() : next_id_(1) { } |
+ ~CompletionCallbackTable() { } |
+ |
+ struct CallbackInfo { |
+ PP_CompletionCallback callback; |
+ void* read_buffer; // To be used with callbacks invoked on byte reads. |
+ }; |
+ |
+ typedef std::map<int32_t, CallbackInfo> CallbackTable; |
+ CallbackTable table_; |
+ int32_t next_id_; |
+ |
+ // Single static mutex used as critical section for all callback tables. |
+ static pthread_mutex_t mutex_; |
+ class CallbackTableCriticalSection { |
+ public: |
+ CallbackTableCriticalSection() { pthread_mutex_lock(&mutex_); } |
+ ~CallbackTableCriticalSection() { pthread_mutex_unlock(&mutex_); } |
+ }; |
+}; |
+ |
+} // namespace ppapi_proxy |
+ |
+#endif // NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_CALLBACK_H_ |