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 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_LIB_LOCK_H__ 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_LIB_LOCK_H__ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/compat.h> // for DISALLOW_COPY_AND_ASSIGN 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing namespace std; 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Single initialization - single-thread implementation 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontypedef int FstOnceType; 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstatic const int FST_ONCE_INIT = 1; 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsoninline int FstOnceInit(FstOnceType *once, void (*init)(void)) { 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (*once) 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (*init)(); 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *once = 0; 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return 0; 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Thread locking - single-thread (non-)implementation 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass Mutex { 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Mutex() {} 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(Mutex); 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass MutexLock { 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson MutexLock(Mutex *) {} 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(MutexLock); 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Reference counting - single-thread implementation 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass RefCounter { 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson RefCounter() : count_(1) {} 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int count() const { return count_; } 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int Incr() const { return ++count_; } 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int Decr() const { return --count_; } 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mutable int count_; 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(RefCounter); 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_LIB_LOCK_H__ 82