This file is indexed.

/usr/include/sphde/sphlogportal.h is in libsphde-dev 1.3.0-1+b1.

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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/*
 * Copyright (c) 2011-2014 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation, Steven Munroe - initial API and implementation
 */

#ifndef __SPH_LOG_PORTAL_H
#define __SPH_LOG_PORTAL_H

/**! \file sphlogportal.h
*  \brief Shared Persistent Heap, log Portal.
*	For shared memory multi-thread/multi-core applications.
*	This implementation uses atomic operations to collect a set of Lock
*	Free Loggers (SPHLFLogger_t) and control the switching to a fresh
*	logger when it fills up, in a non-blocking but thread safe manner.
*
*	A Log Portal manages a set of Lock Free Loggers. This includes:
*	-# Managing a list of Logger spaces available for logging events.
*	  - Allocating the next free slot for adding a logger to the list.
*	  - Managing the current Logger within the list.
*	  - Control access to the Logger list elements.
*	-# Passing Logger event allocation requests through to the current
*	   Logger.
*	-# Advancing the Current logger to next free Logger when the current
*	   Logger fills up.
*
*	A portal is used when the required capacity for logger entries
*	exceeds that posible for a single logger. Or we need to support
*	rolling/continuous logs over a long period of time. By switching out
*	filled loggers with new/empty loggers, logging can continue indeffinitely.
*/

#include "sastype.h"
#include "sphlflogger.h"

/** \brief Handle to an instance of SPH Log Portal.
*
*	The type is SAS_RUNTIME_LOGPORTAL
*/
typedef void *SPHLogPortal_t;

#ifdef __cplusplus
#define __C__ "C"
#else
#define __C__
#endif

/** \brief Instance of a Log Portal Iterator.
*
*	Contains a Log Iterator plus additional fields required to access the
*	containing log portal and trace the current logger and detect end
*	conditions (last entry in the last active logger).
*
*	Iterators should be allocated in private (local stack) storage to allow
*	concurrent access from multiple threads.
*/
typedef struct {
    /** Included instant of a Lock Free Logger Iterator **/
	SPHLFLogIterator_t	logIter;
    /** Handle of the portal containing this logger **/
	SPHLogPortal_t		portal;
    /** Index of the current logger **/
	longPtr_t			current;
    /** Index of the next free logger (end of the list for non-circular portals) **/
	longPtr_t			next_free;
	/** Capacity (number of attached loggers) of this portal **/
	longPtr_t			capacity;
	} SPHLFPortalIterator_t;

/** \brief Initialize a shared storage block as a Log Portal.
*
*	Initialize the control blocks within the specified storage
*	block as a Log Portal.
*	The storage block must be power of two in size and have the
*	same power of two (or better) alignment.
*	The type will be SAS_RUNTIME_LOGPORTAL.
*
*	@param buf_seg a block of allocated SAS storage matching the buf_size.
*	@param buf_size power of two size of the portal to be initialized.
*	@return a handle to the initialized SPHLFLogger_t.
*/
extern __C__ SPHLogPortal_t
SPHLogPortalInit (void* buf_seg,  block_size_t buf_size);

/** \brief Allocate and initialize a shared storage block as a Log Portal.
*
*	Allocate a block from SAS storage and initialize that block
*	as a Log Portal.
*	The storage block must be power of two in size.
*
*	@param buf_size power of two size of the portal to be created.
*	@return a handle to the initialized SPHLFLogger_t.
*/
extern __C__ SPHLogPortal_t
SPHLogPortalCreate (block_size_t buf_size);

/** \brief Return the status of the specified Log Portal.
*
*	@param portal Handle to a Log Portal.
*	@return true if the portal is currently Empty (no entries).
*	Otherwise False.
*/
extern __C__ int
SPHLogPortalEmpty (SPHLogPortal_t portal);

/** \brief Return the number of active Loggers in the portal list.
*
*	@param portal Handle to a Log Portal.
*	@return current number of Logger entries for this portal.
*/
extern __C__ int
SPHLogPortalEntries (SPHLogPortal_t portal);

/** \brief Return the maximum number of Loggers the list can hold.
*
*	@param portal Handle to a Log Portal.
*	@return maximum number of Logger entries for this portal.
*/
extern __C__ int
SPHLogPortalCapacity (SPHLogPortal_t portal);

/** \brief Insert a SPHLFLogger_t into the next free slot og this Log Portal.
*	This Logger can be then be used to log events via the Log
*	Portal (when it becomes the current logger). Use the
*	SPHLogPortalAlloc* functions to allocate and complete log entries.
*
*	@param portal Handle to a Log Portal.
*	@param log Handle to a Lock Free Logger to be inserted.
*	@return The provided SPHLFLogger_t handle or NULL.
*	If successful, the provided Logger handle is returned.
*	Otherwise NULL (For example the Add may fail
*	if the Logger list is already at capacity.)
*/
extern __C__ SPHLFLogger_t
SPHLogPortalAddLogger (SPHLogPortal_t portal, SPHLFLogger_t log);

/** \brief Return the handle of the current Logger target of the Portal.
*
*	@param portal Handle to a Log Portal.
*	@return SPHLFLogger_t or NULL, The Logger handle is returned if
*	successful, or NULL if unsuccessful. For example the Get may fail
*	if the Logger list is currently empty or the last available Logger
*	is already full.
*/
extern __C__ SPHLFLogger_t
SPHLogPortalGetCurrentLogger (SPHLogPortal_t portal);

/** \brief Return the handle of the Logger in the Portal list slot specified
*	by the index number.
*
*	@param portal Handle to a Log Portal.
*	@param index index of the logger to be returned.
*	@return SPHLFLogger_t or NULL, The Logger address is returned if
*	successful, or NULL if unsuccessful. For example the Get may fail
*	if the Logger list is currently empty or the index is out of range.
*/
extern __C__ SPHLFLogger_t
SPHLogPortalGetLoggerByIndex (SPHLogPortal_t portal, longPtr_t index);

/** \brief Return the index of the current Logger target of the Portal.
*
*	@param portal Handle to a Log Portal.
*	@return Non-negative int or -1, The current Logger index is
*	returned if successful, or -1 if unsuccessful. For example the Get
*	may fail if the Logger list is currently empty.
*/
extern __C__ int
SPHLogPortalGetCurrentIndex (SPHLogPortal_t portal);

/** \brief Return the handle of a Logger entry allocated from the current
*	logger of the Portal. If the current logger is full, attempt to
*	move current to the next available Logger and retry.
*
*	@param portal Handle to a Log Portal.
*	@param catcode Category code for the new entry.
*	@param subcode subcategory code for the new entry.
*	@param handlespace Address of local area that will be initialied as a
*	SPHLFLoggerHandle_t for the allocated entry.
*	@return address of handleorg or NULL, The address of the
*	initialized Log Entry Handle is returned if successful, or NULL
*	if unsuccessful (for example the Allocate may fail if the last
*	Logger in the list is full).
*/
extern __C__ SPHLFLoggerHandle_t*
SPHLogPortalAllocStrideTimeStamped (SPHLogPortal_t portal,
                             int catcode, int subcode,
                             SPHLFLoggerHandle_t *handlespace);

/** \brief Return the handle of a Logger entry allocated from the current
*	logger of the Portal. If the current logger is full, attempt to
*	move current to the next available Logger and retry.
*
*	@param portal Handle to a Log Portal.
*	@param catcode Category code for the new entry.
*	@param subcode subcategory code for the new entry.
*	@param alloc_size Size in bytes of the entry to be allocated.
*	The actual entry will be +16 bytes to include the entry header.
*	@param handlespace Address of local area that will be initialied as a
*	SPHLFLoggerHandle_t for the allocated entry.
*	@return address of handleorg or NULL, The address of the
*	initialized Log Entry Handle is returned if successful, or NULL
*	if unsuccessful (for example the allocate may fail if the last
*	Logger in the list is full).
*/
extern __C__ SPHLFLoggerHandle_t*
SPHLogPortalAllocTimeStamped (SPHLogPortal_t portal,
                             int catcode, int subcode,
                             block_size_t alloc_size,
                             SPHLFLoggerHandle_t *handlespace);

/** \brief Create an iterator positioned at the first entry of the first
*	logger attached to this portal.
*
*	Returns the handle of a Portal Iterator. The iterator can be used to
*	iterate through the completed entries of the attached loggers.
*	Starting with the initial logger and continuing in sequence through
*	any additional loggers that are non-empty.
*
*	@param portal Handle to a Log Portal.
*	@param iteratorSpace Address of local area that will be initialied as a
*	SPHLFLogIterator_t associated with the log.
*	@return the address of the provided Iterator_space or NULL.
*	If successful, The address of Iterator_space initialized as a
*	SPHLFPortalIterator_t is returned.
*	Otherwise NULL is returned (for example if the Portal was empty).
*/
extern __C__ SPHLFPortalIterator_t*
SPHLFPortalCreateIterator (SPHLogPortal_t portal,
                          SPHLFPortalIterator_t *iteratorSpace);

/** \brief Access a sequence of completed logger entries in-order.
*
*	Returns the handle of the current logger entry for the current logger
*	for the provided Portal Iterator. The logger entry handle can
*	of then be used to access the contents of the logger entry.
*	The iterator is advanced to the next logger entry.
*	If the iterator is positioned at the end of the current
*	logger then the iterator will be advanced to the first entry of
*	the next logger allocated to this portal.
*	If we are at the end of the list of allocated loggers we are done.
*
*	@param iterator Handle associated with a Log Portal.
*	@param handlespace Address of local area that will be initialied as a
*	SPHLFLoggerHandle_t for the allocated entry.
*	@return the address of the provided handlespace or NULL.
*	If successful, The address of handlespace initialized as a
*	SPHLFLoggerHandle_t is returned.
*	Otherwise NULL is returned (for example if the Portal was empty or
*	we are at the end of the last logger).
*/
extern __C__ SPHLFLoggerHandle_t*
SPHLFPortalIteratorNext (SPHLFPortalIterator_t *iterator,
                         SPHLFLoggerHandle_t *handlespace);

/** \brief Return the address of a (raw) Logger entry allocated from
*   the current logger.
*
*	The allocation size is rounded up to the next quadword
*	boundary. Mostly for internal use and testing.
*	If the specified portal's loggers are full the allocation may fail.
*
*	@param portal Handle to a Log Portal.
*	@param alloc_size size in bytes of the entry to be allocated.
*	@return the address of the raw Log Entry is returned if successful,
*	or NULL if unsuccessful.
*/
extern __C__ void *
SPHLogPortalAllocRaw (SPHLogPortal_t portal,
                         block_size_t alloc_size);

/** \brief Destroy the Log Portal and free the storage.
*
*	NOTE need to add code to free any attached Loggers
*
*	@param portal Handle to a Logger to be destroyed.
*	@return 0 if successful.
*/
extern __C__ int
SPHLogPortalDestroy(SPHLogPortal_t portal);

#endif /* __SPH_LOG_PORTAL_H */