This file is indexed.

/usr/include/tango/log4tango/threading/PThreads.hh is in liblog4tango-dev 9.2.5a+dfsg1-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
//
// PThreads.hh
//
// Copyright (C) :  2000 - 2002
//					LifeLine Networks BV (www.lifeline.nl). All rights reserved.
//					Bastiaan Bakker. All rights reserved.   
//					
//					2004,2005,2006,2007,2008,2009,2010,2011,2012
//					Synchrotron SOLEIL
//                	L'Orme des Merisiers
//                	Saint-Aubin - BP 48 - France
//
// This file is part of log4tango.
//
// Log4ango is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Log4tango is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with Log4Tango.  If not, see <http://www.gnu.org/licenses/>.

#ifndef _LOG4TANGO_THREADING_PTHREADS_H
#define _LOG4TANGO_THREADING_PTHREADS_H

#include <log4tango/Portability.hh>  
#include <stdio.h>
#include <pthread.h>
#include <string>
#include <assert.h>

namespace log4tango {

namespace threading {

std::string get_thread_id (void);

long thread_id (void);

//-----------------------------------------------------------------------------
// Class : Mutex
//-----------------------------------------------------------------------------
class Mutex
{
private:
  pthread_mutex_t mutex;

  
public:
  inline Mutex() {
    ::pthread_mutex_init(&mutex, NULL);
  }
  
  inline ~Mutex() {
    ::pthread_mutex_destroy(&mutex);
  }
  
  inline void lock() {
    ::pthread_mutex_lock(&mutex);
  }

  inline void unlock() {
    ::pthread_mutex_unlock(&mutex);
  }
};

//-----------------------------------------------------------------------------
// Class : ScopedLock
//-----------------------------------------------------------------------------
class ScopedLock
{
private:
  Mutex& _mutex;

public:
  inline ScopedLock(Mutex &m) : _mutex(m) {
    _mutex.lock();
  }

  inline ~ScopedLock() {
    _mutex.unlock();
  }
};

//-----------------------------------------------------------------------------
// Class : RecursiveMutex
//-----------------------------------------------------------------------------
class RecursiveMutex
{
public:
  // ctor
  RecursiveMutex (void); 

  // dtor
  ~RecursiveMutex (void);

  // Locking an RecursiveMutex:
  // If <timeout_> is null (the default), <lock> blocks until 
  // the mutex is acquired and returns 1 (true). Otherwise, 
  // <lock> blocks until the mutex is acquired or times out 
  // after <timeout_> milliseconds in which case 0 (false) is 
  // returned. 
  int lock (long timeout_ = 0);
  
  // Releasing an RecursiveMutex:
  // Call unlock <recursion level> times (i.e. one call for 
  // each previous call to lock) or call unlockn just once. 
  // These two methods do nothing if the caller is not the
  // current owner of the mutex.
  void unlock (void); 
  void unlockn (void); 

protected:
  // guards the <recursion level> and <owner id>
  pthread_mutex_t guard_;

  // this condition variable suspends other waiting threads 
  // until the mutex is available
  pthread_cond_t mutex_available_;
  
private:
  // current level of the recursion
  long recursion_level_;

  // current owner of the lock.
  pthread_t owner_id_;
  
  // dummy copy constructor and operator= to prevent copying
  RecursiveMutex (const RecursiveMutex&);
  RecursiveMutex& operator= (const RecursiveMutex&);
};

//-----------------------------------------------------------------------------
// Class : ThreadLocalDataHolder
//-----------------------------------------------------------------------------
#ifdef LOG4TANGO_HAS_NDC
template<typename T> class ThreadLocalDataHolder {

private:
  pthread_key_t _key;

public:
  typedef T data_type;

  inline ThreadLocalDataHolder() {
    ::pthread_key_create(&_key, freeHolder);
  }

  inline static void freeHolder(void *p) {
    assert(p != NULL);
    delete reinterpret_cast<T *>(p);
  }

  inline ~ThreadLocalDataHolder() {
    T *data = get();
    if (data != NULL) {
      delete data;
    }
    ::pthread_key_delete(_key);
  }

  inline T* get() const {
    return reinterpret_cast<T *>(::pthread_getspecific(_key));
  }

  inline T* operator->() const { return get(); }
  inline T& operator*() const { return *get(); }

  inline T* release() {
   T* result = get();
   ::pthread_setspecific(_key, NULL);
   return result;
  }

  inline void reset(T* p = NULL) {
    T *data = get();
    if (data != NULL) {
      delete data;
    }
    ::pthread_setspecific(_key, p);
  }
};
#endif //LOG4TANGO_HAS_NDC

} // namespace threading

} // namespace log4tango

#endif  // _LOG4TANGO_THREADING_PTHREADS_H