Pergunta

O que você recomendaria que eu fizesse para armazenar vários streams (cada stream exigiria seu próprio buffer) em C?

Eu meio que montei uma solução na minha cabeça:

Este é um "pseudocódigo" teórico

[ptr, ptr, ptr, ptr ... ]

Cada ptr é um ponteiro para uma estrutura:

{
    stream_id
    buff_ptr
}

stream_id é o ID do fluxo (eu tenho essa informação) e buff_ptr é um ponteiro para alguns dados malloced. Além disso, os buffers provavelmente teriam que ser flexíveis e chamar muito malloc e free para torná-lo flexível (pelo menos acho que seria?

Basicamente, eu encontraria o buffer de que preciso iterando pela matriz de ptrs.


Então, essa "arquitetura" é boa ou existe uma melhor?

Se alguém está se perguntando "Por que diabos ela precisa disso ?!" Fiz um servidor em Ruby / EventMachine, o protocolo está realmente podre (para dizer o mínimo) e não sei mais como lidar com isso ... A menos que haja uma maneira de forçar EventMachine a armazená-lo em buffer para mim, seria a melhor solução, suponho.

Obrigado.

P.S: Desculpe pela rave! ~

Foi útil?

Solução

Bem, parece a única opção, mas você pode mudar algumas coisas:

  • Não malloc e free.Em vez disso, use realloc
  • Iterar pela lista pode funcionar, mas se houver muitos buffers

    • Você pode fazer o chamador passar um ponteiro para o buffer?
    • Você pode usar um hash em vez de uma lista e pesquisar por stream_id?Por exemplo, glib2 fornece tal hash

Muitas APIs (por exemplo, epoll) permitem que você associe um ponteiro a um id (um descritor no caso de epoll).Quando algo interessante acontece a esse id, a API passa seu ponteiro -> pesquisa zero à custa de 4 a 8 bytes de memória.

Outras dicas

Use libev para fazer um loop de evento simples e deixá-lo lidar com descritores de arquivo de pesquisa.Existem muitos exemplos por aí e sua página de manual (man 3 libev) é uma das melhores que já li.

Basta definir alguns retornos de chamada e criar alguns buffers para seus pools de leitura e gravação.O tamanho desses pools pode permanecer estático, desde que você bloqueie ou ignore suas leituras e gravações quando o buffer se enche ou se esgota, respectivamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top