This file is indexed.

/usr/include/tango/log4tango/threading/MSThreads.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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
//
// MSThreads.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_MSTHREADS_H
#define _LOG4TANGO_THREADING_MSTHREADS_H

#include <string>

// deal with ERROR #define

// This #includes windows.h with NOGDI and WIN32_LEAN_AND_MEAN 
// #defined. If this is not what the user wants, #include 
// windows.h before this file.

#ifndef _WINDOWS_ 
#  ifndef NOGDI
#    define NOGDI  // circumvent the ERROR #define in windows.h
#    define LOG4TANGO_UNDEFINE_NOGDI
#  endif

#  ifndef WIN32_LEAN_AND_MEAN
#    define WIN32_LEAN_AND_MEAN
#    define LOG4TANGO_UNDEFINE_WIN32_LEAN_AND_MEAN
#  endif

#  include <windows.h>

#  ifdef LOG4TANGO_UNDEFINE_NOGDI
#    undef NOGDI
#  endif

#  ifdef LOG4TANGO_UNDEFINE_WIN32_LEAN_AND_MEAN
#    undef WIN32_LEAN_AND_MEAN
#  endif

#endif 
// done dealing with ERROR #define

namespace log4tango {

namespace threading {

std::string get_thread_id (void);

long thread_id (void);

//-----------------------------------------------------------------------------
// Class : MSMutex 
//-----------------------------------------------------------------------------      
class LOG4TANGO_EXPORT Mutex 
{
public:

  Mutex() { 
    InitializeCriticalSection(&_criticalSection); 
  }

  ~Mutex() { 
    DeleteCriticalSection(&_criticalSection); 
  }

  inline LPCRITICAL_SECTION get_critical_section (void) {
    return &_criticalSection;
  }

private:
  Mutex(const Mutex&);
  Mutex operator=(const Mutex&);

  CRITICAL_SECTION _criticalSection;
};

//-----------------------------------------------------------------------------
// Class : ScopedLock 
//-----------------------------------------------------------------------------
class ScopedLock 
{
 public:

  ScopedLock (Mutex& mutex) {
    _criticalSection = mutex.get_critical_section();
    EnterCriticalSection(_criticalSection);
  }

  ~ScopedLock() { 
    LeaveCriticalSection(_criticalSection); 
  }

private:
  ScopedLock(const ScopedLock&);
  ScopedLock operator=(const ScopedLock&);

  LPCRITICAL_SECTION _criticalSection;
};

//-----------------------------------------------------------------------------
// Class : RecursiveMutex
//-----------------------------------------------------------------------------
class RecursiveMutex
{
public:
  // ctor
  RecursiveMutex (void) : recursion_level_(0) {
    ::InitializeCriticalSection(&guard_); 
  }

  // dtor
  ~RecursiveMutex (void) { 
    ::DeleteCriticalSection(&guard_); 
  }

  // 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. 
  inline int lock (long timeout_ = 0) {
    ::EnterCriticalSection(&guard_);
    recursion_level_++; 
    return 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.
  inline void unlock (void) {
    //-should work if called by owner 
    recursion_level_--;
    ::LeaveCriticalSection(&guard_); 
  }

  inline void unlockn (void) {
    //-should work if called by owner 
    while (recursion_level_ > 0) {
       recursion_level_--;
      ::LeaveCriticalSection(&guard_); 
    }
  }

protected:
  // guards the <recursion level>
  CRITICAL_SECTION guard_;
  
private:
  // current level of the recursion
  unsigned long recursion_level_;
  
  // dummy copy constructor and operator= to prevent copying
  RecursiveMutex (const RecursiveMutex&);
  RecursiveMutex& operator= (const RecursiveMutex&);
};

//-----------------------------------------------------------------------------
// Class : ThreadLocalDataHolder
//-----------------------------------------------------------------------------
/** 
 * This class holds Thread local data of type T, i.e. for each
 * thread a ThreadLocalDataHolder holds 0 or 1 instance of T. 
 * The held object must be heap allocated and will be deleted 
 * upon termination of the thread to which it belongs.
 **/
#ifdef LOG4TANGO_HAS_NDC
template<typename T> class ThreadLocalDataHolder 
{
public:
            
  inline ThreadLocalDataHolder() 
    : _key(TlsAlloc()) {
  };

  inline ~ThreadLocalDataHolder() { 
    TlsFree(_key); 
  };
            
  /**
   * Obtains the Object held for the current thread.
   * @return a pointer to the held Object or NULL if no
   * Object has been set for the current thread.
   **/
  inline T* get (void) const {
    return (T*)TlsGetValue(_key);
  };

  /**
   * Obtains the Object held for the current thread. 
   * Initially each thread holds NULL.
   * @return a pointer to the held Object or NULL if no
   * Object has been set for the current thread.
   **/
  inline T* operator->() const { 
    return get(); 
  };

  /**
   * Obtains the Object held for the current thread.
   * @pre get() != NULL
   * @return a reference to the held Object.
   **/
  inline T& operator*() const { 
    return *get(); 
  };

  /**
   * Releases the Object held for the current thread.
   * @post get() == NULL
   * @return a pointer to the Object thas was held for 
   * the current thread or NULL if no Object was held.
   **/
  inline T* release() {
    T* result = (T*)TlsGetValue(_key);
    TlsSetValue(_key, NULL);
    return result;
  };

  /**
   * Sets a new Object to be held for the current thread. A 
   * previously set Object will be deleted.
   * @param p the new object to hold.
   * @post get() == p
   **/
  inline void reset(T* p = NULL) {
    T* thing = (T*)TlsGetValue(_key);
    delete thing;
    TlsSetValue(_key, p);
  };

private:
            
    DWORD _key;          
};

#endif // LOG4TANGO_HAS_NDC

} // namespace threading

} // namespace log4tango

#endif // _LOG4TANGO_THREADING_MSTHREADS_H