mfavant / tubekit

NEW PROJECT https://github.com/crust-hub/avant
MIT License
0 stars 0 forks source link

target refactor #42

Open gaowanlu opened 2 months ago

gaowanlu commented 2 months ago
代码规则:线程直接用C++11、C++版本允许使用C++17
配置提供AppID进程唯一标识
gaowanlu commented 2 months ago
#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <chrono>
#include <unordered_set>
#include <unordered_map>
using namespace std;

class Buffer
{
public:
    Buffer() : data1(10),
               data2(10),
               reader_used_len(10),
               writer_used_len(10),
               reader_idx(0),
               writer_idx(0),
               data_reader(&data1),
               data_writer(&data2)
    {
    }
    void CacheSwap()
    {
        // 判断是否读完了
        if (reader_idx != reader_used_len)
        {
            return;
        }
        // 没有其他数据
        if (writer_used_len == 0)
        {
            return;
        }

        reader_idx = 0;
        reader_used_len = writer_used_len;
        writer_used_len = 0;
        writer_idx = 0;
        // swap cache
        std::vector<std::string> *data_ptr = data_reader;
        data_reader = data_writer;
        data_writer = data_ptr;
        read_out_idx = 0;
    }

    std::string &Push()
    {
        if (writer_idx == writer_used_len)
        {
            if (writer_used_len == data_writer->size()) // full
            {
                data_writer->push_back("");
            }
            writer_used_len++;
        }

        std::string &res = data_writer->at(writer_idx);
        writer_idx++;
        res.clear();
        return res;
    }

    const std::string &First()
    {
        if (reader_idx == reader_used_len) // empty
        {
            if (data_reader->empty())
            {
                data_reader->push_back("");
                return data_reader->at(0);
            }
            else
            {
                data_reader->at(0).clear();
            }
            return data_reader->at(0);
        }
        return data_reader->at(reader_idx);
    }

    void Pop()
    {
        if (reader_idx <= reader_used_len)
        {
            data_reader->at(reader_idx).clear();
            data_reader->at(reader_idx).resize(0);
            reader_idx++;
            read_out_idx++;
        }
    }

    bool Empty()
    {
        return (reader_idx >= reader_used_len);
    }

public:
    std::vector<std::string> data1;
    std::vector<std::string> data2;
    size_t reader_used_len;
    size_t writer_used_len;
    size_t reader_idx;
    size_t writer_idx;
    std::vector<std::string> *data_reader;
    std::vector<std::string> *data_writer;

    size_t read_out_idx;
};

class Conn
{
public:
    Buffer recvBuffer;
    Buffer sendBuffer;
    // sock
    // recvFirstByteIdx
    // sendFirstByteIdx
};

int main(int argc, const char **argv)
{
    std::vector<Conn> connArray(100);
    std::unordered_set<int> connUsing;
    std::unordered_set<int> connNotUse;
    for (std::size_t index = 0; index < connArray.size(); index++)
    {
        connNotUse.insert(index);
    }

    std::unordered_map<int, int> sockfd2Conn;
    std::unordered_map<int, int> gid2sockfd;

    // constexpr int bufferCount = 20000;
    // Buffer bufferArray[bufferCount];
    // int bufferArrayIdx = 0;

    // size_t allBytes = 0;
    // do
    // {
    //     if (bufferArrayIdx + 1 >= bufferCount)
    //     {
    //         bufferArrayIdx = 0;
    //     }
    //     else
    //     {
    //         bufferArrayIdx++;
    //     }
    //     Buffer &buffer = bufferArray[bufferArrayIdx];
    //     for (int loop = 0; loop < 100; loop++)
    //     {
    //         // 写内容
    //         buffer.CacheSwap();
    //         for (int i = 0; i < 11; i++)
    //         {
    //             std::string &Item = buffer.Push();
    //             Item = std::string(10240, 't');
    //         }
    //         // 读内容
    //         buffer.CacheSwap();
    //         // 读内容
    //         while (!buffer.Empty())
    //         {
    //             const std::string &Item = buffer.First();
    //             allBytes += Item.size();
    //             buffer.Pop();
    //         }
    //     }
    //     std::cout << buffer.data_reader->size() << " " << buffer.data_writer->size() << std::endl;
    //     std::cout << allBytes / (1024 * 1024 * 1024) << "GB" << std::endl;
    //     // std::this_thread::sleep_for(std::chrono::milliseconds(4));
    // } while (true);
    return 0;
}