Left: | ||
Right: |
OLD | NEW |
---|---|
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2005,2006 INRIA | 3 * Copyright (c) 2005,2006 INRIA |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 Packet::Packet (uint32_t size) | 177 Packet::Packet (uint32_t size) |
178 : m_buffer (size), | 178 : m_buffer (size), |
179 m_byteTagList (), | 179 m_byteTagList (), |
180 m_packetTagList (), | 180 m_packetTagList (), |
181 m_metadata (m_globalUid, size), | 181 m_metadata (m_globalUid, size), |
182 m_nixVector (0), | 182 m_nixVector (0), |
183 m_refCount (1) | 183 m_refCount (1) |
184 { | 184 { |
185 m_globalUid++; | 185 m_globalUid++; |
186 } | 186 } |
187 Packet::Packet (uint32_t mpiRank, uint32_t uid, uint32_t size) | |
craigdo
2009/11/13 20:20:02
Okay, this means we have nix-specific code in our
| |
188 : m_buffer (size), | |
189 m_byteTagList (), | |
190 m_packetTagList (), | |
191 m_metadata (mpiRank, uid, size), | |
192 m_nixVector (0), | |
193 m_refCount (1) | |
194 {} | |
195 | |
187 Packet::Packet (uint8_t const*buffer, uint32_t size) | 196 Packet::Packet (uint8_t const*buffer, uint32_t size) |
188 : m_buffer (), | 197 : m_buffer (), |
189 m_byteTagList (), | 198 m_byteTagList (), |
190 m_packetTagList (), | 199 m_packetTagList (), |
191 m_metadata (m_globalUid, size), | 200 m_metadata (m_globalUid, size), |
192 m_nixVector (0), | 201 m_nixVector (0), |
193 m_refCount (1) | 202 m_refCount (1) |
194 { | 203 { |
195 m_globalUid++; | 204 m_globalUid++; |
196 m_buffer.AddAtStart (size); | 205 m_buffer.AddAtStart (size); |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 { | 394 { |
386 return m_buffer.CopyData (os, size); | 395 return m_buffer.CopyData (os, size); |
387 } | 396 } |
388 | 397 |
389 uint32_t· | 398 uint32_t· |
390 Packet::GetUid (void) const | 399 Packet::GetUid (void) const |
391 { | 400 { |
392 return m_metadata.GetUid (); | 401 return m_metadata.GetUid (); |
393 } | 402 } |
394 | 403 |
404 uint32_t· | |
405 Packet::GetMpiRank (void) const | |
406 { | |
407 return m_metadata.GetMpiRank (); | |
408 } | |
409 | |
395 void· | 410 void· |
396 Packet::PrintByteTags (std::ostream &os) const | 411 Packet::PrintByteTags (std::ostream &os) const |
397 { | 412 { |
398 ByteTagIterator i = GetByteTagIterator (); | 413 ByteTagIterator i = GetByteTagIterator (); |
399 while (i.HasNext ()) | 414 while (i.HasNext ()) |
400 { | 415 { |
401 ByteTagIterator::Item item = i.Next (); | 416 ByteTagIterator::Item item = i.Next (); |
402 os << item.GetTypeId ().GetName () << " [" << item.GetStart () << "-" << i tem.GetEnd () << "]"; | 417 os << item.GetTypeId ().GetName () << " [" << item.GetStart () << "-" << i tem.GetEnd () << "]"; |
403 Callback<ObjectBase *> constructor = item.GetTypeId ().GetConstructor (); | 418 Callback<ObjectBase *> constructor = item.GetTypeId ().GetConstructor (); |
404 if (constructor.IsNull ()) | 419 if (constructor.IsNull ()) |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
552 PacketMetadata::Enable (); | 567 PacketMetadata::Enable (); |
553 } | 568 } |
554 | 569 |
555 void | 570 void |
556 Packet::EnableChecking (void) | 571 Packet::EnableChecking (void) |
557 { | 572 { |
558 NS_LOG_FUNCTION_NOARGS (); | 573 NS_LOG_FUNCTION_NOARGS (); |
559 PacketMetadata::EnableChecking (); | 574 PacketMetadata::EnableChecking (); |
560 } | 575 } |
561 | 576 |
577 Buffer | |
578 Packet::SerializeForMpi (void) const | |
craigdo
2009/11/13 20:20:02
There's got to be a better way. This is the begin
| |
579 { | |
580 /* | |
581 This function stores the following· | |
582 information in the buffer to be· | |
583 transmitted via MPI: | |
584 | |
585 ------------------------------------ | |
586 | UID (4B) | | |
587 ------------------------------------ | |
588 | rank (4B) | | |
589 ------------------------------------ | |
590 | Nix-vector Length (4B) | | |
591 ------------------------------------ | |
592 | Nix-vector (x4B) | | |
593 ------------------------------------ | |
594 | Tags | | |
595 ------------------------------------ | |
596 | Meta-data | | |
597 ------------------------------------ | |
598 | Zero-byte data Length (4B) | | |
599 ------------------------------------ | |
600 | Packet (start) buffer Length (4B) | | |
601 ------------------------------------ | |
602 | Packet (start) buffer | | |
603 ------------------------------------ | |
604 | Packet (end) buffer Length (4B) | | |
605 ------------------------------------ | |
606 | Packet (end) buffer | | |
607 ------------------------------------ | |
608 | |
609 */ | |
610 | |
611 NS_LOG_FUNCTION (this); | |
612 Buffer writeBuffer; | |
613 | |
614 // write Packet byte buffer | |
615 writeBuffer = m_buffer.CreateLimitedCopy (); | |
616 | |
617 // write Meta-data | |
618 uint32_t metaReserve = m_metadata.GetSerializedSize (); | |
619 writeBuffer.AddAtStart (metaReserve); | |
620 m_metadata.Serialize (writeBuffer.Begin (), metaReserve); | |
621 | |
622 // write Tags | |
623 //XXX | |
624 //reserve = m_tags.GetSerializedSize (); | |
625 //buffer.AddAtStart (reserve); | |
626 //m_tags.Serialize (buffer.Begin (), reserve); | |
627 | |
628 // write Nix-vector | |
629 if (m_nixVector) | |
630 { | |
631 uint32_t nixReserve = m_nixVector->GetSerializedSize (); | |
632 writeBuffer.AddAtStart (nixReserve); | |
633 m_nixVector->Serialize (writeBuffer.Begin(), nixReserve); | |
634 } | |
635 else | |
636 { | |
637 writeBuffer.AddAtStart (4); | |
638 writeBuffer.Begin ().WriteU32 (0); | |
639 } | |
640 | |
641 // write Rank | |
642 writeBuffer.AddAtStart (4); | |
643 if (MPIInterface::IsEnabled ()) | |
644 writeBuffer.Begin ().WriteU32 (MPIInterface::Rank ()); | |
645 else | |
646 writeBuffer.Begin ().WriteU32 (0); | |
647 | |
648 // write UID | |
649 writeBuffer.AddAtStart (4); | |
650 writeBuffer.Begin ().WriteU32 (GetUid ()); | |
651 | |
652 return writeBuffer; | |
653 } | |
654 | |
655 void· | |
656 Packet::DeserializeForMpi (Buffer buffer) | |
657 { | |
658 NS_LOG_FUNCTION (this); | |
659 | |
660 // uid and rank have already been stripped· | |
661 // off immediately before calling this· | |
662 // function. So we start with the nix-vector. | |
663 | |
664 // read nix-vector | |
665 NS_ASSERT (!m_nixVector); | |
666 if (buffer.Begin ().ReadU32 ()) | |
667 { | |
668 Ptr<NixVector> nix = CreateObject<NixVector> (); | |
669 uint32_t nixDeserialized = nix->Deserialize (buffer.Begin ()); | |
670 m_nixVector = nix; | |
671 buffer.RemoveAtStart (nixDeserialized); | |
672 } | |
673 else | |
674 buffer.RemoveAtStart (4); | |
675 | |
676 // read tags | |
677 //XXX | |
678 //uint32_t tagsDeserialized = m_tags.Deserialize (buffer.Begin ()); | |
679 //buffer.RemoveAtStart (tagsDeserialized); | |
680 | |
681 // read metadata | |
682 uint32_t metadataDeserialized =· | |
683 m_metadata.Deserialize (buffer.Begin ()); | |
684 buffer.RemoveAtStart (metadataDeserialized); | |
685 | |
686 // read zero-byte length | |
687 uint32_t zeroByteLength = buffer.Begin ().ReadU32 (); | |
688 Buffer zeroByteBuffer (zeroByteLength); | |
689 buffer.RemoveAtStart (4); | |
690 | |
691 // read (start) packet buffer | |
692 uint32_t startLength = buffer.Begin ().ReadU32 (); | |
693 buffer.RemoveAtStart (4); | |
694 Buffer startBuffer = buffer; | |
695 buffer.RemoveAtStart (startLength); | |
696 | |
697 // read (end) packet buffer | |
698 uint32_t endLength = buffer.Begin ().ReadU32 (); | |
699 buffer.RemoveAtStart (4); | |
700 | |
701 // remove end buffer from start buffer | |
702 startBuffer.RemoveAtEnd (endLength+4); | |
703 | |
704 // fill in m_buffer with everything in· | |
705 // the right order | |
706 // something strange happened when I tried to use· | |
707 // AddAtEnd to add the end data (after the zero-byte), | |
708 // so i used Write instead | |
709 zeroByteBuffer.AddAtStart (startLength); | |
710 zeroByteBuffer.Begin ().Write (startBuffer.PeekData (), startLength); | |
711 zeroByteBuffer.AddAtEnd (endLength); | |
712 zeroByteBuffer.End ().Write (buffer.PeekData (), endLength); | |
713 buffer.RemoveAtStart (endLength); | |
714 m_buffer = zeroByteBuffer; | |
715 } | |
716 | |
562 Buffer· | 717 Buffer· |
563 Packet::Serialize (void) const | 718 Packet::Serialize (void) const |
564 { | 719 { |
565 NS_LOG_FUNCTION (this); | 720 NS_LOG_FUNCTION (this); |
566 Buffer buffer; | 721 Buffer buffer; |
567 uint32_t reserve; | 722 uint32_t reserve; |
568 | 723 |
569 // write metadata | 724 // write metadata |
570 reserve = m_metadata.GetSerializedSize (); | 725 reserve = m_metadata.GetSerializedSize (); |
571 buffer.AddAtStart (reserve); | 726 buffer.AddAtStart (reserve); |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1122 PacketTestSuite::PacketTestSuite () | 1277 PacketTestSuite::PacketTestSuite () |
1123 : TestSuite ("packet", UNIT) | 1278 : TestSuite ("packet", UNIT) |
1124 { | 1279 { |
1125 AddTestCase (new PacketTest); | 1280 AddTestCase (new PacketTest); |
1126 } | 1281 } |
1127 | 1282 |
1128 PacketTestSuite g_packetTestSuite; | 1283 PacketTestSuite g_packetTestSuite; |
1129 | 1284 |
1130 | 1285 |
1131 } // namespace ns3 | 1286 } // namespace ns3 |
OLD | NEW |