Cześć!
Potrzebuję połączyć ostream
z istream
przez dany ograniczony obszar w pamięci.
Tłumaczę o co chodzi:
Są 2 niezależne programy napisane w C++.
Mają swoje odrębne pamięci operacyjne, ale mają wspólny mały fragment pamięci pod adresem 0xXXXX o wielkości ~(256B+64B).
Chciałbym móc odczytać poprzez ostream to co zostało wpisane w istream.
Po zagłębieniu się w działanie strumieni, pojawił się problem z implementacją pbackfail
i nie tylko.
Problemem jest to że gdy przesyłane dane są większe od 256B to strumienie muszą działać na przemian, dodatkowo utrudniają to metody, które chcą odczytywać poprzednie dane...
Zresztą, zobaczcie sami (wątpliwości/pytania w komentarzach):
// wspolny obszar pamieci
typedef struct{
volatile int reading;
volatile int ir; // index odczytu danych
volatile int iw; // index zapisu danych
char data[256];
} mstream_t;
void mstream_init(mstream_t * ms){
ms->reading = 0;
ms->iw = ms->ir = 0;
}
class omstream: public std::ostream, std::streambuf
{
private:
mstream_t * ms;
public:
omstream(mstream_t * mstream) : std::ostream(this), ms(mstream){}
~omstream(){
sync();
}
int sync() {
dbg("-");
if(ms->reading == 0){
ms->reading = 1;
}
return 0;
}
void wait(){
while(ms->reading); // TODO - sleep
}
int overflow(int c){
dbg("-");
wait();
ms->data[ms->iw] = c;
if(++ms->iw == sizeof(ms->data))
sync();
return 0;
}
};
class imstream: public std::istream, std::streambuf
{
private:
mstream_t * ms;
public:
imstream(mstream_t * mstream) : std::istream(this), ms(mstream){}
~imstream(){
sync();
}
int sync(){
if(ms->reading){
ms->iw = ms->ir = ms->iw > 0; // zostawic troche danych dla pbackfail?
ms->reading = 0;
}
return 0;
}
void wait(){
while(!ms->reading); // TODO - sleep
}
int uflow(){
dbg("-");
wait();
if(ms->ir == ms->iw){
sync();
return EOF; // TODO return uflow()? - pobranie dalszych danych z omstream
}
return ms->data[ms->ir++];
}
int underflow(){
dbg("-");
wait();
if(ms->ir == ms->iw){
sync();
return EOF; // TODO return underflow() ?
}
return ms->data[ms->ir];
}
int pbackfail(int ch){
dbg("-");
if(ms->ir == ms->iw || (ch != EOF && ch != ms->data[ms->ir-1]))
return EOF; // TODO
ms->ir--;
return ms->data[ms->ir];
}
std::streamsize showmanyc(){
dbg("unip");
exit(0);
return 0;
}
};