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