This file is indexed.

/usr/include/ns3.26/ns3/calendar-scheduler.h is in libns3-dev 3.26+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
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2009 INRIA
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
 */

#ifndef CALENDAR_SCHEDULER_H
#define CALENDAR_SCHEDULER_H

#include "scheduler.h"
#include <stdint.h>
#include <list>

/**
 * \file
 * \ingroup scheduler
 * Declaration of ns3::CalendarScheduler class.
 */

namespace ns3 {

class EventImpl;

/**
 * \ingroup scheduler
 * \brief a calendar queue event scheduler
 *
 * This event scheduler is a direct implementation of the algorithm
 * known as a calendar queue, first published in 1988 in
 * "Calendar Queues: A Fast O(1) Priority Queue Implementation for
 * the Simulation Event Set Problem" by Randy Brown. There are many
 * refinements published later but this class implements
 * the original algorithm (to the best of my knowledge).
 *
 * \note
 * This queue is much slower than I expected (much slower than the
 * std::map queue) and this seems to be because the original resizing policy
 * is horribly bad.  This is most likely the reason why there have been
 * so many variations published which all slightly tweak the resizing
 * heuristics to obtain a better distribution of events across buckets.
 */
class CalendarScheduler : public Scheduler
{
public:
  /**
   *  Register this type.
   *  \return The object TypeId.
   */
  static TypeId GetTypeId (void);

  /** Constructor. */
  CalendarScheduler ();
  /** Destructor. */
  virtual ~CalendarScheduler ();

  // Inherited
  virtual void Insert (const Scheduler::Event &ev);
  virtual bool IsEmpty (void) const;
  virtual Scheduler::Event PeekNext (void) const;
  virtual Scheduler::Event RemoveNext (void);
  virtual void Remove (const Scheduler::Event &ev);

private:
  /** Double the number of buckets if necessary. */
  void ResizeUp (void);
  /** Halve the number of buckets if necessary. */
  void ResizeDown (void);
  /**
   * Resize to a new number of buckets, with automatically computed width.
   *
   * \param [in] newSize The new number of buckets.
   */
  void Resize (uint32_t newSize);
  /**
   * Compute the new bucket size, based on up to the first 25 entries.
   *
   * \returns The new width.
   */
  uint32_t CalculateNewWidth (void);
  /**
   * Initialize the calendar queue.
   *
   * \param [in] nBuckets The number of buckets.
   * \param [in] width The bucket size, in dimensionless time units.
   * \param [in] startPrio The starting time.
   */
  void Init (uint32_t nBuckets,
             uint64_t width,
             uint64_t startPrio);
  /**
   * Hash the dimensionless time to a bucket.
   *
   * \param [in] key The dimensionless time.
   * \returns The bucket index.
   */
  inline uint32_t Hash (uint64_t key) const;
  /** Print the configuration and bucket size distribution. */
  void PrintInfo (void);
  /**
   * Resize the number of buckets and width.
   *
   * \param [in] newSize The number of buckets.
   * \param [in] newWidth The size of the new buckets.
   */
  void DoResize (uint32_t newSize, uint32_t newWidth);
  /**
   * Remove the earliest event.
   *
   * \returns The earliest event.
   */
  Scheduler::Event DoRemoveNext (void);
  /**
   * Insert a new event in to the correct bucket.
   *
   * \param [in] ev The new Event.
   */
  void DoInsert (const Scheduler::Event &ev);

  /** Calendar bucket type: a list of Events. */
  typedef std::list<Scheduler::Event> Bucket;
  
  /** Array of buckets. */
  Bucket *m_buckets;
  /** Number of buckets in the array. */
  uint32_t m_nBuckets;
  /** Duration of a bucket, in dimensionless time units. */
  uint64_t m_width;
  /** Bucket index from which the last event was dequeued. */
  uint32_t m_lastBucket;
  /** Priority at the top of the bucket from which last event was dequeued. */
  uint64_t m_bucketTop;
  /** The priority of the last event removed. */
  uint64_t m_lastPrio;
  /** Number of events in queue. */
  uint32_t m_qSize;
};

} // namespace ns3

#endif /* CALENDAR_SCHEDULER_H */