1// lock.h
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15// Author: riley@google.com (Michael Riley)
16//
17// \file
18// Google-compatibility locking declarations and inline definitions
19//
20// Classes and functions here are no-ops (by design); proper locking requires
21// actual implementation.
22
23#ifndef FST_LIB_LOCK_H__
24#define FST_LIB_LOCK_H__
25
26#include <fst/compat.h>  // for DISALLOW_COPY_AND_ASSIGN
27
28namespace fst {
29
30using namespace std;
31
32//
33// Single initialization  - single-thread implementation
34//
35
36typedef int FstOnceType;
37
38static const int FST_ONCE_INIT = 1;
39
40inline int FstOnceInit(FstOnceType *once, void (*init)(void)) {
41  if (*once)
42    (*init)();
43  *once = 0;
44  return 0;
45}
46
47//
48// Thread locking - single-thread (non-)implementation
49//
50
51class Mutex {
52 public:
53  Mutex() {}
54
55 private:
56  DISALLOW_COPY_AND_ASSIGN(Mutex);
57};
58
59class MutexLock {
60 public:
61  MutexLock(Mutex *) {}
62
63 private:
64  DISALLOW_COPY_AND_ASSIGN(MutexLock);
65};
66
67class ReaderMutexLock {
68 public:
69  ReaderMutexLock(Mutex *) {}
70
71 private:
72  DISALLOW_COPY_AND_ASSIGN(ReaderMutexLock);
73};
74
75// Reference counting - single-thread implementation
76class RefCounter {
77 public:
78  RefCounter() : count_(1) {}
79
80  int count() const { return count_; }
81  int Incr() const { return ++count_; }
82  int Decr() const {  return --count_; }
83
84 private:
85  mutable int count_;
86
87  DISALLOW_COPY_AND_ASSIGN(RefCounter);
88};
89
90}  // namespace fst
91
92#endif  // FST_LIB_LOCK_H__
93