]> git.meshlink.io Git - meshlink/commitdiff
Add the MESHLINK_CHANNEL_NO_PARTIAL flag.
authorGuus Sliepen <guus@meshlink.io>
Thu, 8 Aug 2019 13:20:42 +0000 (15:20 +0200)
committerGuus Sliepen <guus@meshlink.io>
Thu, 8 Aug 2019 13:20:42 +0000 (15:20 +0200)
This ensures that calls to meshlink_channel_send() either succeed with all
data sent, or no data sent at all.

src/meshlink++.h
src/meshlink.h
src/utcp

index 8287e0382632777df5d4c0f1a7e59d4c398259ad..2dcac00201f8f658903cdaef2c0b604aa45d2131 100644 (file)
@@ -113,6 +113,7 @@ public:
        static const uint32_t ORDERED = MESHLINK_CHANNEL_ORDERED;
        static const uint32_t FRAMED = MESHLINK_CHANNEL_FRAMED;
        static const uint32_t DROP_LATE = MESHLINK_CHANNEL_DROP_LATE;
+       static const uint32_t NO_PARTIAL = MESHLINK_CHANNEL_NO_PARTIAL;
        static const uint32_t TCP = MESHLINK_CHANNEL_TCP;
        static const uint32_t UDP = MESHLINK_CHANNEL_UDP;
 };
@@ -714,6 +715,8 @@ public:
         *  @param len          The length of the data.
         *
         *  @return             The amount of data that was queued, which can be less than len, or a negative value in case of an error.
+        *                      If MESHLINK_CHANNEL_NO_PARTIAL is set, then the result will either be len,
+        *                      0 if the buffer is currently too full, or -1 if len is too big even for an empty buffer.
         */
        ssize_t channel_send(channel *channel, void *data, size_t len) {
                return meshlink_channel_send(handle, channel, data, len);
index 6a1c758a65011666b5f8731dd02c40f079223d72..40deb5f1a04a111a0bcaf1bc4e3baa4ed5a92e38 100644 (file)
@@ -94,6 +94,7 @@ static const uint32_t MESHLINK_CHANNEL_RELIABLE = 1;   // Data is retransmitted
 static const uint32_t MESHLINK_CHANNEL_ORDERED = 2;    // Data is delivered in-order to the application.
 static const uint32_t MESHLINK_CHANNEL_FRAMED = 4;     // Data is delivered in chunks of the same length as data was originally sent.
 static const uint32_t MESHLINK_CHANNEL_DROP_LATE = 8;  // When packets are reordered, late packets are ignored.
+static const uint32_t MESHLINK_CHANNEL_NO_PARTIAL = 16; // Calls to meshlink_channel_send() will either send all data or nothing.
 static const uint32_t MESHLINK_CHANNEL_TCP = 3;        // Select TCP semantics.
 static const uint32_t MESHLINK_CHANNEL_UDP = 0;        // Select UDP semantics.
 
@@ -1119,6 +1120,8 @@ extern void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *
  *  @param len          The length of the data, or 0 if there is no data to send.
  *
  *  @return             The amount of data that was queued, which can be less than len, or a negative value in case of an error.
+ *                      If MESHLINK_CHANNEL_NO_PARTIAL is set, then the result will either be len,
+ *                      0 if the buffer is currently too full, or -1 if len is too big even for an empty buffer.
  */
 extern ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len);
 
index fa93ca75a603758e00781f2e9acb52bdbe6695b7..3bc564058072a79a22320f8c5bc50e8844896114 160000 (submodule)
--- a/src/utcp
+++ b/src/utcp
@@ -1 +1 @@
-Subproject commit fa93ca75a603758e00781f2e9acb52bdbe6695b7
+Subproject commit 3bc564058072a79a22320f8c5bc50e8844896114