gmp-platform.h (3853B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* Copyright (c) 2014, Mozilla 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 ** Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 ** Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 ** Neither the name of Google nor the names of its contributors may 17 * be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef GMP_PLATFORM_h_ 34 #define GMP_PLATFORM_h_ 35 36 #include <stdint.h> 37 38 #include "gmp-errors.h" 39 #include "gmp-storage.h" 40 41 /* Platform helper API. */ 42 43 class GMPTask { 44 public: 45 virtual void Destroy() = 0; // Deletes object. 46 virtual ~GMPTask() = default; 47 virtual void Run() = 0; 48 }; 49 50 class GMPThread { 51 public: 52 virtual ~GMPThread() = default; 53 virtual void Post(GMPTask* aTask) = 0; 54 virtual void Join() = 0; // Deletes object after join completes. 55 }; 56 57 // A re-entrant monitor; can be locked from the same thread multiple times. 58 // Must be unlocked the same number of times it's locked. 59 class GMPMutex { 60 public: 61 virtual ~GMPMutex() = default; 62 virtual void Acquire() = 0; 63 virtual void Release() = 0; 64 virtual void Destroy() = 0; // Deletes object. 65 }; 66 67 // Time is defined as the number of milliseconds since the 68 // Epoch (00:00:00 UTC, January 1, 1970). 69 typedef int64_t GMPTimestamp; 70 71 typedef GMPErr (*GMPCreateThreadPtr)(GMPThread** aThread); 72 typedef GMPErr (*GMPRunOnMainThreadPtr)(GMPTask* aTask); 73 typedef GMPErr (*GMPSyncRunOnMainThreadPtr)(GMPTask* aTask); 74 typedef GMPErr (*GMPCreateMutexPtr)(GMPMutex** aMutex); 75 76 // Call on main thread only. 77 typedef GMPErr (*GMPCreateRecordPtr)(const char* aRecordName, 78 uint32_t aRecordNameSize, 79 GMPRecord** aOutRecord, 80 GMPRecordClient* aClient); 81 82 // Call on main thread only. 83 typedef GMPErr (*GMPSetTimerOnMainThreadPtr)(GMPTask* aTask, 84 int64_t aTimeoutMS); 85 typedef GMPErr (*GMPGetCurrentTimePtr)(GMPTimestamp* aOutTime); 86 87 struct GMPPlatformAPI { 88 // Increment the version when things change. Can only add to the struct, 89 // do not change what already exists. Pointers to functions may be NULL 90 // when passed to plugins, but beware backwards compat implications of 91 // doing that. 92 uint16_t version; // Currently version 0 93 94 GMPCreateThreadPtr createthread; 95 GMPRunOnMainThreadPtr runonmainthread; 96 GMPSyncRunOnMainThreadPtr syncrunonmainthread; 97 GMPCreateMutexPtr createmutex; 98 GMPCreateRecordPtr createrecord; 99 GMPSetTimerOnMainThreadPtr settimer; 100 GMPGetCurrentTimePtr getcurrenttime; 101 }; 102 103 #endif // GMP_PLATFORM_h_