Beispiel #1
0
    void decode_parcels(Parcelport & parcelport, Connection & connection,
        boost::shared_ptr<Buffer> buffer)
    {
        typedef typename Buffer::transmission_chunk_type transmission_chunk_type;

        // add parcel data to incoming parcel queue
        std::size_t num_zero_copy_chunks =
            static_cast<std::size_t>(
                static_cast<boost::uint32_t>(buffer->num_chunks_.first));

//        boost::shared_ptr<std::vector<std::vector<char> > > in_chunks(in_chunks_);
        boost::shared_ptr<std::vector<util::serialization_chunk> > chunks;
        if (num_zero_copy_chunks != 0) {
            // decode chunk information
            chunks = boost::make_shared<std::vector<util::serialization_chunk> >();

            std::size_t num_non_zero_copy_chunks =
                static_cast<std::size_t>(
                    static_cast<boost::uint32_t>(buffer->num_chunks_.second));

            chunks->resize(num_zero_copy_chunks + num_non_zero_copy_chunks);

            // place the zero-copy chunks at their spots first
            for (std::size_t i = 0; i != num_zero_copy_chunks; ++i)
            {
                transmission_chunk_type& c = buffer->transmission_chunks_[i];
                boost::uint64_t first = c.first, second = c.second;

                HPX_ASSERT(buffer->chunks_[i].size() == second);

                (*chunks)[first] = util::create_pointer_chunk(
                        buffer->chunks_[i].data(), second);
            }

            std::size_t index = 0;
            for (std::size_t i = num_zero_copy_chunks;
                 i != num_zero_copy_chunks + num_non_zero_copy_chunks;
                 ++i)
            {
                transmission_chunk_type& c = buffer->transmission_chunks_[i];
                boost::uint64_t first = c.first, second = c.second;

                // find next free entry
                while ((*chunks)[index].size_ != 0)
                    ++index;

                // place the index based chunk at the right spot
                (*chunks)[index] = util::create_index_chunk(first, second);
                ++index;
            }
            HPX_ASSERT(index == num_zero_copy_chunks + num_non_zero_copy_chunks);
        }
        bool first_message = false;
#if defined(HPX_HAVE_SECURITY)
        if(connection.first_message_)
        {
            connection.first_message_ = false;
            first_message = true;
        }
#endif
        HPX_ASSERT(!buffer->parcels_decoded_);
        if(hpx::is_running() && parcelport.async_serialization())
        {
                hpx::applier::register_thread_nullary(
                    util::bind(
                        util::one_shot(&decode_parcels_impl<Parcelport, Buffer>),
                        boost::ref(parcelport), buffer, chunks, first_message),
                    "decode_parcels",
                    threads::pending, true, threads::thread_priority_boost);
        }
        else
        {
            decode_parcels_impl(parcelport, buffer, chunks, first_message);
        }
    }