1// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5#include "port/port_chromium.h"
6
7#include "base/threading/platform_thread.h"
8#include "util/logging.h"
9
10#if defined(USE_SNAPPY)
11#  include "third_party/snappy/src/snappy.h"
12#endif
13
14namespace leveldb {
15namespace port {
16
17Mutex::Mutex() {
18}
19
20Mutex::~Mutex() {
21}
22
23void Mutex::Lock() {
24  mu_.Acquire();
25}
26
27void Mutex::Unlock() {
28  mu_.Release();
29}
30
31void Mutex::AssertHeld() {
32  mu_.AssertAcquired();
33}
34
35CondVar::CondVar(Mutex* mu)
36    : cv_(&mu->mu_) {
37}
38
39CondVar::~CondVar() { }
40
41void CondVar::Wait() {
42  cv_.Wait();
43}
44
45void CondVar::Signal(){
46  cv_.Signal();
47}
48
49void CondVar::SignalAll() {
50  cv_.Broadcast();
51}
52
53void InitOnceImpl(OnceType* once, void (*initializer)()) {
54  OnceType state = ::base::subtle::Acquire_Load(once);
55  if (state == ONCE_STATE_DONE)
56    return;
57
58  state = ::base::subtle::NoBarrier_CompareAndSwap(
59              once,
60              ONCE_STATE_UNINITIALIZED,
61              ONCE_STATE_EXECUTING_CLOSURE);
62
63  if (state == ONCE_STATE_UNINITIALIZED) {
64    // We are the first thread, we have to call the closure.
65    (*initializer)();
66    ::base::subtle::Release_Store(once, ONCE_STATE_DONE);
67  } else {
68    // Another thread is running the closure, wait until completion.
69    while (state == ONCE_STATE_EXECUTING_CLOSURE) {
70      ::base::PlatformThread::YieldCurrentThread();
71      state = ::base::subtle::Acquire_Load(once);
72    }
73  }
74}
75
76bool Snappy_Compress(const char* input, size_t input_length,
77                     std::string* output) {
78#if defined(USE_SNAPPY)
79  output->resize(snappy::MaxCompressedLength(input_length));
80  size_t outlen;
81  snappy::RawCompress(input, input_length, &(*output)[0], &outlen);
82  output->resize(outlen);
83  return true;
84#else
85  return false;
86#endif
87}
88
89bool Snappy_GetUncompressedLength(const char* input_data,
90                                  size_t input_length,
91                                  size_t* result) {
92#if defined(USE_SNAPPY)
93  return snappy::GetUncompressedLength(input_data, input_length, result);
94#else
95  return false;
96#endif
97}
98
99bool Snappy_Uncompress(const char* input_data, size_t input_length,
100                       char* output) {
101#if defined(USE_SNAPPY)
102  return snappy::RawUncompress(input_data, input_length, output);
103#else
104  return false;
105#endif
106}
107
108}
109}
110