void Client::SendPackets() { msguse.Synchronize(); FillBuckets( messages ); messages.clear(); msguse.Release(); bool notdone = true; unsigned num = GetMaxPackSend(); while ( notdone && --num ) { unsigned char Buffer[MaxPacketSize]; unsigned offset = sizeof( UDPHeader ); while ( notdone = GetNextMessage( *reinterpret_cast<MessagePacket *>( Buffer + offset ) ) && ( offset += sizeof( MessagePacket ) ) < MaxPacketSize ); unsigned Size = offset - sizeof( UDPHeader ); UDPHeader Header = { CW, GetId(), seqnum, lastseqnum, Size, MissedPackets }; packetsent.push_back( Tick( seqnum++, Clock() ) ); memcpy( Buffer, &Header, sizeof Header ); currentdatasent += offset; int n = sendto( sock, ( char * )Buffer, offset, 0, ( sockaddr * )&serversin, sizeof( sockaddr_in ) ); Check( n ); } }
int main(int argc, char** argv) { if (argc != 5) { fprintf(stderr, "Usage: %s <lower> <upper> <max-length> <bucket-size>\n", argv[0]); return -1; } size_t lower = atoll(argv[1]); size_t upper = atoll(argv[2]); size_t maxLength = atoll(argv[3]); size_t bucketSize = atoll(argv[4]); // Start timing. tbb::tick_count startTime = tbb::tick_count::now(); // Fill in the lookup table for sequence lengths of numbers up to kNumStoredSequences. gSequenceLength[0] = 0; HailstoneFiller filler(maxLength); tbb::parallel_for(tbb::blocked_range<size_t>(1, kNumStoredSequences), filler); // Calculate the sequence lengths for the input range, using the lookup tables // where possible. HailstoneGathererFull gatherFull(maxLength, lower, upper); tbb::parallel_reduce(tbb::blocked_range<size_t>(lower, upper + 1), gatherFull); // Combine the length counts into their buckets. size_t numBuckets = maxLength / bucketSize; if (maxLength % bucketSize != 0) ++numBuckets; size_t buckets[kMaxPossibleLength]; size_t overflow; FillBuckets(gatherFull._buckets, maxLength, bucketSize, numBuckets, buckets, overflow); // Stop timing. tbb::tick_count endTime = tbb::tick_count::now(); // Print the results. PrintResults(startTime, endTime, lower, upper, maxLength, bucketSize, numBuckets, buckets, overflow); return 0; }