15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The LevelDB 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. See the AUTHORS file for names of contributors. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See port_example.h for documentation for the following types/functions. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef STORAGE_LEVELDB_PORT_PORT_CHROMIUM_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define STORAGE_LEVELDB_PORT_PORT_CHROMIUM_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/condition_variable.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Linux's ThreadIdentifier() needs this. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# include <linux/unistd.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define snprintf _snprintf 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)typedef SSIZE_T ssize_t; 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if !defined(__clang__) && _MSC_VER <= 1700 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# define va_copy(a, b) do { (a) = (b); } while (0) 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace leveldb { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace port { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromium only supports little endian. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const bool kLittleEndian = true; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Mutex { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mutex(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Mutex(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Lock(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Unlock(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AssertHeld(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock mu_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CondVar; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Mutex); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CondVar { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CondVar(Mutex* mu); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CondVar(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Signal(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SignalAll(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ConditionVariable cv_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CondVar); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AtomicPointer { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::subtle::AtomicWord Rep; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rep rep_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicPointer() { } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit AtomicPointer(void* p) : rep_(reinterpret_cast<Rep>(p)) {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void* Acquire_Load() const { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<void*>(::base::subtle::Acquire_Load(&rep_)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void Release_Store(void* v) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::base::subtle::Release_Store(&rep_, reinterpret_cast<Rep>(v)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void* NoBarrier_Load() const { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<void*>(::base::subtle::NoBarrier_Load(&rep_)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void NoBarrier_Store(void* v) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::base::subtle::NoBarrier_Store(&rep_, reinterpret_cast<Rep>(v)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation of OnceType and InitOnce() pair, this is equivalent to 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pthread_once_t and pthread_once(). 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ::base::subtle::Atomic32 OnceType; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ONCE_STATE_UNINITIALIZED = 0, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ONCE_STATE_EXECUTING_CLOSURE = 1, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ONCE_STATE_DONE = 2 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LEVELDB_ONCE_INIT leveldb::port::ONCE_STATE_UNINITIALIZED 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// slow code path 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitOnceImpl(OnceType* once, void (*initializer)()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void InitOnce(OnceType* once, void (*initializer)()) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (::base::subtle::Acquire_Load(once) != ONCE_STATE_DONE) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitOnceImpl(once, initializer); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Snappy_Compress(const char* input, size_t input_length, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* output); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Snappy_GetUncompressedLength(const char* input, size_t length, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t* result); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Snappy_Uncompress(const char* input_data, size_t input_length, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* output); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // STORAGE_LEVELDB_PORT_PORT_CHROMIUM_H_ 122