15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_CPP_CORE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_CPP_CORE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// @file
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// This file defines APIs related to memory management, time, and threads.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompletionCallback;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Module;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// APIs related to memory management, time, and threads.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Core {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that we explicitly don't expose Resource& versions of this function
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since Resource will normally manage the refcount properly. These should
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called only when doing manual management on raw PP_Resource handles,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which should be fairly rare.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// AddRefResource() increments the reference count for the provided
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <code>resource</code>.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] resource A <code>PP_Resource</code> corresponding to a
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// resource.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRefResource(PP_Resource resource) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interface_->AddRefResource(resource);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ReleaseResource() decrements the reference count for the provided
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <code>resource</code>. The resource will be deallocated if the
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// reference count reaches zero.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] resource A <code>PP_Resource</code> corresponding to a
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// resource.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseResource(PP_Resource resource) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interface_->ReleaseResource(resource);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// GetTime() returns the "wall clock time" according to the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// browser.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return A <code>PP_Time</code> containing the "wall clock time" according
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// to the browser.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Time GetTime() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return interface_->GetTime();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// GetTimeTicks() returns the "tick time" according to the browser.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// This clock is used by the browser when passing some event times to the
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// module (for example, using the
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <code>PP_InputEvent::time_stamp_seconds</code> field). It is not
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// correlated to any actual wall clock time (like GetTime()). Because
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// of this, it will not change if the user changes their computer clock.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return A <code>PP_TimeTicks</code> containing the "tick time" according
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// to the browser.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_TimeTicks GetTimeTicks() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return interface_->GetTimeTicks();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// CallOnMainThread() schedules work to be executed on the main pepper
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// thread after the specified delay. The delay may be 0 to specify a call
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// back as soon as possible.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// The |result| parameter will just be passed as the second argument to the
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// callback. Many applications won't need this, but it allows a module to
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// emulate calls of some callbacks which do use this value.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <strong>Note:</strong> CallOnMainThread(), even when used from the main
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// thread with a delay of 0 milliseconds, will never directly invoke the
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// callback.  Even in this case, the callback will be scheduled
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// asynchronously.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <strong>Note:</strong> If the browser is shutting down or if the module
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// has no instances, then the callback function may not be called.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] delay_in_milliseconds An int32_t delay in milliseconds.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] callback A <code>CompletionCallback</code> callback function
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// that the browser will call after the specified delay.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param[in] result An int32_t that the browser will pass to the given
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// <code>CompletionCallback</code>.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallOnMainThread(int32_t delay_in_milliseconds,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const CompletionCallback& callback,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int32_t result = 0);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// IsMainThread() returns true if the current thread is the main pepper
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// thread.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// This function is useful for implementing sanity checks, and deciding if
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// dispatching using CallOnMainThread() is required.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return true if the current thread is the main pepper thread, otherwise
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// false.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMainThread();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow Module to construct.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class Module;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only module should make this class so this constructor is private.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Core(const PPB_Core* inter) : interface_(inter) {}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copy and assignment are disallowed.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Core(const Core& other);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Core& operator=(const Core& other);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPB_Core* interface_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace pp
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_CPP_CORE_H_
120