C# Fast I/O

Home Forums Discussions Support C# Fast I/O

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #12819
    AndyG
    Participant

      Hi,

      Can you provide a C# example on how to use Fast I/O?

      Regards.

      #12820
      Vadim Smirnov
      Keymaster

        Hi,

        I apologize, but I don’t have one. However, I don’t believe it would be a significant issue to port the C++ code to C#. I’m not an expert in C# but it can be something like this:

                foreach (PFAST_IO_SECTION i in fast_io_section)
                {
                    if (Interlocked.CompareExchange(ref i.fast_io_header.fast_io_write_union.union_.join, 0, 0) != 0)
                    {
                        Interlocked.Exchange(ref i.fast_io_header.read_in_progress_flag, 1);
        
                        var write_union = Interlocked.CompareExchange(ref i.fast_io_header.fast_io_write_union.union_.join, 0, 0);
        
                        uint current_packets_success = (uint)write_union.union_.split.number_of_packets;
        
                        //
                        // Copy packets and reset section
                        //
        
                        Buffer.BlockCopy(i.fast_io_packets, 0, packet_buffer_, (int)(fast_io_packets_success * Marshal.SizeOf<INTERMEDIATE_BUFFER>()), (int)(current_packets_success - 1) * Marshal.SizeOf<INTERMEDIATE_BUFFER>());
        
                        // For the last packet(s) wait the write completion if in progress
                        write_union = Interlocked.CompareExchange(ref i.fast_io_header.fast_io_write_union.union_.join, 0, 0);
        
                        while (write_union.union_.split.write_in_progress_flag != 0)
                        {
                            write_union = Interlocked.CompareExchange(ref i.fast_io_header.fast_io_write_union.union_.join, 0, 0);
                        }
        
                        // Copy the last packet(s)
                        Buffer.BlockCopy(i.fast_io_packets, (int)(current_packets_success - 1) * Marshal.SizeOf<INTERMEDIATE_BUFFER>(), packet_buffer_, (int)(fast_io_packets_success + current_packets_success - 1) * Marshal.SizeOf<INTERMEDIATE_BUFFER>(), Marshal.SizeOf<INTERMEDIATE_BUFFER>());
                        if (current_packets_success < write_union.union_.split.number_of_packets)
                        {
                            current_packets_success = write_union.union_.split.number_of_packets;
                            Buffer.BlockCopy(i.fast_io_packets, (int)(current_packets_success - 1) * Marshal.SizeOf<INTERMEDIATE_BUFFER>(), packet_buffer_, (int)(fast_io_packets_success + current_packets_success - 1) * Marshal.SizeOf<INTERMEDIATE_BUFFER>(), Marshal.SizeOf<INTERMEDIATE_BUFFER>());
                        }
        
                        Interlocked.Exchange(ref i.fast_io_header.fast_io_write_union.union_.join, 0);
                        Interlocked.Exchange(ref i.fast_io_header.read_in_progress_flag, 0);
        
                        fast_io_packets_success += current_packets_success;
                    }
                }
      Viewing 2 posts - 1 through 2 (of 2 total)
      • You must be logged in to reply to this topic.