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