avoid recursive initialization of uid static variable

Mathieu Lacage 2007-05-31 13:52:29 +02:00
parent 2e686bcca7
commit 4736067ed2
2 changed files with 31 additions and 8 deletions

View File

@ -166,5 +166,22 @@ PacketPrinter::DoDefaultPrintFragment (std::ostream & os,
os << std::endl;
}
void
PacketPrinter::DoAddPrinter (uint32_t uid,
Ptr<CallbackImplBase> printer,
Callback<void,
std::ostream &,
uint32_t,
uint32_t,
std::string &,
struct PacketPrinter::FragmentInformation> fragmentPrinter)
{
struct PacketPrinter::Printer p;
p.m_chunkUid = uid;
p.m_printer = printer;
p.m_fragmentPrinter = fragmentPrinter;
m_printerList.push_back (p);
}
} // namespace ns3

View File

@ -157,6 +157,14 @@ private:
uint32_t fragmentEnd) const;
void PrintPayload (std::ostream &os, uint32_t packetUid, uint32_t size,
uint32_t fragmentStart, uint32_t fragmentEnd) const;
void DoAddPrinter (uint32_t uid,
Ptr<CallbackImplBase> printer,
Callback<void,
std::ostream &,
uint32_t,
uint32_t,
std::string &,
struct PacketPrinter::FragmentInformation> fragmentPrinter);
static PacketPrinter m_defaultPacketPrinter;
PrinterList m_printerList;
@ -180,11 +188,7 @@ PacketPrinter::AddPrinter (Callback<void,std::ostream &, uint32_t, uint32_t, con
struct PacketPrinter::FragmentInformation> fragmentPrinter)
{
static uint32_t uid = PacketPrinter::GetUid<T> ();
struct PacketPrinter::Printer p;
p.m_chunkUid = uid;
p.m_printer = printer.GetImpl ();
p.m_fragmentPrinter = fragmentPrinter;
m_printerList.push_back (p);
DoAddPrinter (uid, printer.GetImpl (), fragmentPrinter);
}
template <typename T>
@ -225,9 +229,11 @@ PacketPrinter::AllocateUid (void)
RegisteredChunks *chunks = PacketPrinter::GetRegisteredChunks ();
chunks->push_back (std::make_pair(&PacketPrinter::DoPrint<T>,
&PacketPrinter::DoGetName<T>));
PacketPrinter::PeekDefault ()->AddPrinter (MakeCallback (&PacketPrinter::DoDefaultPrint<T>),
MakeCallback (&PacketPrinter::DoDefaultPrintFragment));
return chunks->size ();
uint32_t uid = chunks->size ();
PacketPrinter::PeekDefault ()->DoAddPrinter (uid,
MakeCallback (&PacketPrinter::DoDefaultPrint<T>).GetImpl (),
MakeCallback (&PacketPrinter::DoDefaultPrintFragment));
return uid;
}
template <typename T>