This file is indexed.

/usr/include/tclutil/Mem.h is in skycat 3.1.2+starlink1~b+dfsg-1.

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
// -*-c++-*-
#ifndef _Mem_h_
#define _Mem_h_
/*
 * E.S.O. - VLT project / ESO Archive
 *
 * "@(#) $Id: Mem.h,v 1.1.1.1 2009/03/31 14:11:52 cguirao Exp $" 
 *
 * Mem.h - declarations for class Mem, a class for managing memory areas,
 *         which may or may not be shared memory.
 *
 * who             when       what
 * --------------  --------   ----------------------------------------
 * Allan Brighton  07 Mar 96  Created
 *                 03 Dec 96  added filename() method to return mmap filename
 *                            or NULL if mmap is not being used.
 * D.Hopkinson      21/01/97  Added constructor to use when
 *                            multi-buffering  shared memory.
 * Peter W. Draper  23/01/00  Added constructor and methods for
 *                            accepting a piece of malloc'd memory.
 *                  03/09/04  Added addr parameter to Mem and Mem_Rep
 *                            constructors. Starlink fortran 64 bit
 *                            interoperability requires that addresses may be
 *                            changed.
 *                  04/04/06  Added "refcnt" member so that owner can control
 *                            when to release memory.
 *                  05/12/07  Change length function to return off_t instead
 *                            of int.
 */

#include <cstdio>
#include <sys/types.h>
class Mem_Map;

// internal struct used for reference counting
struct MemRep {
    size_t size;		// size in bytes
    int owner;			// true if we should delete the shm when no longer needed
    int refcnt;			// count of the number of reference to this memory area
    void* ptr;			// pointer to memory area
    int newmem;                 // memory allocated using "new"
    int shmId;			// shared memory id, or 0 if not shared
    int shmNum;                 // shm buffer number, if multi-buffering
    int semId;                  // Semaphore ID for locking shm
    int options;		// mmap options for read/write access
    int status;			// status after constructor
    int verbose;		// if true, print diagnostic messages
    Mem_Map *m_map;             // Used when mapping a file
    char* linkName;		// If a file name specified for mmap was a link, it is
				// replaced with the real name and the name of the link
				// is recorded here.

    // default constructor: empty memory
    MemRep();

    // attach to sysV shared memory
    MemRep(size_t size, int owner, int shmId, int verbose);

    // create memory (sysV shared, if useShm is 1) with given size
    MemRep(size_t size, int useShm, int verbose);

    // mmap the given file, create/extend if nbytes > 0
    MemRep(const char *filename, int flags, int prot, int share,
           size_t nbytes, int owner, int verbose, void *addr = NULL);

    // accept pointer to malloc'd memory.
    MemRep(void *inptr, size_t size, int owner);

    // destructor
    ~MemRep();

    // return name of mmap file or NULL if mmap not being used
    const char* filename(int flag = 0) const;

    // temporarily unmap the shared memory
    void unmap();

    // remap the shared memory after a call to unmap(), optionally specifying
    // new mapping options and a new file size.
    int remap(int options = 0, size_t newsize = 0);

};


/*
 * This class uses reference counting to help manage memory areas.  The
 * class keeps track of who owns the (shared) memory, who is responsible
 * for deleting it when no longer needed and how many references there
 * are to the memory area. When there are no more references, we
 * can safely detach a shared memory area and if we are the "owner",
 * delete it.
 */
class Mem {
private:
    MemRep* rep_;		// internal representation, reference counting
    long offset_;		// optional offset in memory area
    long length_;		// optional different length of memory area used

public:
    // default constructor
    Mem() : rep_(new MemRep), offset_(0), length_(0) { 
    }

    // constructor: attach (if needed) to existing shared memory area
    Mem(size_t size, int shmId, int owner, int verbose);

    // constructor: create new memory area, shared if useShm is true
    Mem(size_t size, int useShm, int verbose = 0) 
	: rep_(new MemRep(size, useShm, verbose)), offset_(0), length_(0) {
    }

    // mmap options
    enum MemFileOptions {
	FILE_DEFAULTS = 0,   // File RDONLY, MAP_SHARED
	FILE_RDWR = 1,       // Make mapped file writable
	FILE_PRIVATE = 2,    // Make written segments private
	FILE_FIXED = 4       // Fixed address, not in use
    };

    // Constructor uses mmap to map a file
    Mem(const char *filename, int verbose = 0);

    // Constructor uses mmap to map a file and adds file options
    // PWD: Use the addr argument if you need to suggest an address to map
    // the file. Starlink Fortran interoperability sometimes needs this.
    Mem(const char *filename, int options, int verbose, void *addr = NULL);

    // Constructor: creates a file of the given size and uses mmap
    // to map the file read/write.
    Mem(size_t size, const char *filename, int owner, int verbose = 0 );

    // Constructor to use when multi-buffering shared memory.
    Mem(size_t size, int shmId, int owner, int verbose, int shmNum, int semId);

    // Accept pointer to malloc'd memory
    Mem(void *ptr, size_t size, int owner);

    // copy constructor, just copy ptr and increment ref count
    Mem(const Mem& m)
	: rep_(m.rep_), offset_(m.offset_), length_(m.length_) {
	    rep_->refcnt++;
    }

    // destructor, detach and/or delete memory if needed
    ~Mem();

    // assignment
    Mem& operator=(const Mem&);

    int operator==(const Mem& m) const {
	return m.rep_ == rep_ && m.offset_ == offset_ && m.length_ == length_;
    }
    int operator!=(const Mem& m) const {
	return m.rep_ != rep_ || m.offset_ != offset_ || m.length_ != length_;
    }

    //  reference counts of memory
    int refcnt();

    // return true if the memory is shared
    int shared() const {return shmId() >= 0;}

    // force the memory to be shared (1) or not shared (0)
    int shared(int share);

    // temporarily unmap the shared memory
    void unmap() {rep_->unmap();}

    // remap the shared memory after a call to unmap(), optionally specifying
    // new mapping options and a new file size
    int remap(int options = 0, size_t newsize = 0) {
	return rep_->remap(options, newsize);
    }

    // remove all "owned" shared memory areas (should be called before exit)
    static void cleanup();

    // return the working length of the memory
    off_t length() const {return off_t(length_ ? length_ : (rep_->size - offset_));}

    // set optional length
    void length(long newLength) {length_ = newLength;}

    // member access
    size_t size() const {return rep_->size;}
    void* ptr() const {return rep_->ptr ? ((void *)((char *)rep_->ptr + offset_)) : NULL;}
    int shmId() const {return rep_->shmId;}
    int shmNum() const {return rep_->shmNum;}
    int semId() const {return rep_->semId;}
    int options() const {return rep_->options;}
    int status() const {return rep_->status;}
    int verbose() const {return rep_->verbose;}
    Mem_Map* m_map() const {return rep_->m_map;}

    // return a pointer to the internal representation
    // (This should only be used, if needed, in special cases)
    const MemRep* rep() const {return rep_;}

    // set/get the owner flag: if non-zero, memory will be deleted when there
    // are no more references
    void owner(int b) {rep_->owner = b;}
    int owner() {return rep_->owner;}

    // return name of mmap file or NULL if mmap not being used
    const char* filename(int flag = 0) const {return rep_->filename(flag);}

    // set/get offset
    void offset(long newOffset) {offset_ = newOffset;}
    long offset() const {return offset_;}

  };

/* cleanup shared mem and exit: for use as a signal handler */
void Mem_cleanup(int);


#endif /* _Mem_h_ */