Asynchronously writing data from streambuf while appending to it





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf be safely used for that?



asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;

// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}

void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}


While the lifetime of the streambuf itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.



It appears that



socket.async_write_some(send_buffer, (auto, auto){});


does not work at all, it would require send_buffer.data() - which would be invalidated by operations on send_buffer as is documented.



I have also considered asio::buffered_write_stream, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.



The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.










share|improve this question























  • See stackoverflow.com/a/12801042/85371

    – sehe
    Nov 24 '18 at 15:46


















0















I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf be safely used for that?



asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;

// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}

void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}


While the lifetime of the streambuf itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.



It appears that



socket.async_write_some(send_buffer, (auto, auto){});


does not work at all, it would require send_buffer.data() - which would be invalidated by operations on send_buffer as is documented.



I have also considered asio::buffered_write_stream, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.



The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.










share|improve this question























  • See stackoverflow.com/a/12801042/85371

    – sehe
    Nov 24 '18 at 15:46














0












0








0








I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf be safely used for that?



asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;

// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}

void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}


While the lifetime of the streambuf itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.



It appears that



socket.async_write_some(send_buffer, (auto, auto){});


does not work at all, it would require send_buffer.data() - which would be invalidated by operations on send_buffer as is documented.



I have also considered asio::buffered_write_stream, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.



The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.










share|improve this question














I like to implement a "fire and forget" kind of stream where I may asynchronously append data that is to be written during writing. Can asio::streambuf be safely used for that?



asio::streambuf send_buffer;
bool flushing = false;
asio::ip::tcp::socket socket;

// may be called by timers, read handlers, whatever
void new_data_handler(const char* data, size_t size) {
send_buffer.sputn(data, size);
flush();
}

void flush() {
if (flushing || send_buffer.size() == 0) return;
flushing = true;
asio::async_write(socket, send_buffer, [&](auto, auto) {
// error handling
// as per doc data is consumed from the buffer automatically
flushing = false;
flush(); // not sure if this even needs to be called
});
}


While the lifetime of the streambuf itself is clear, I am concerned that adding new data will invalidate any buffers that view into its memory. That would be find if this is isolated to within handlers, but I cannot find any documentation as to whether that is true or not.



It appears that



socket.async_write_some(send_buffer, (auto, auto){});


does not work at all, it would require send_buffer.data() - which would be invalidated by operations on send_buffer as is documented.



I have also considered asio::buffered_write_stream, but it seems that it does not provide a simple way to dump data in a guaranteed non-blocking way.



The underlying sockets are tcp and ssl sockets. All handlers are executed in the same strand.







c++ boost io boost-asio






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 13:29









ZulanZulan

16k63373




16k63373













  • See stackoverflow.com/a/12801042/85371

    – sehe
    Nov 24 '18 at 15:46



















  • See stackoverflow.com/a/12801042/85371

    – sehe
    Nov 24 '18 at 15:46

















See stackoverflow.com/a/12801042/85371

– sehe
Nov 24 '18 at 15:46





See stackoverflow.com/a/12801042/85371

– sehe
Nov 24 '18 at 15:46












0






active

oldest

votes












Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447623%2fasynchronously-writing-data-from-streambuf-while-appending-to-it%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53447623%2fasynchronously-writing-data-from-streambuf-while-appending-to-it%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

"Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

Alcedinidae

RAC Tourist Trophy