]> git.scottworley.com Git - tattlekey/commitdiff
client: next_scheduled_send()
authorScott Worley <scottworley@scottworley.com>
Tue, 10 Oct 2023 02:46:28 +0000 (19:46 -0700)
committerScott Worley <scottworley@scottworley.com>
Wed, 11 Oct 2023 01:49:07 +0000 (18:49 -0700)
client/sends.c
client/sends.h
client/tattlekey.c

index b2656347a80c0be912f19e7f4a69c4e15d02c74c..0125bf2bb0142fc5b4736f63210697b0c7281b81 100644 (file)
@@ -1,6 +1,6 @@
 #include "sends.h"
 
-uint32_t next_send(send_t *s) {
+static uint32_t next_send(send_t *s) {
   return s->timestamp + (1 << s->send_count) - 1;
 }
 
@@ -23,3 +23,10 @@ void create_send(send_t *sleeping_sends, pheap_t *sleeps_heap,
   sleeping_sends[i].send_count = 0;
   ph_insert_node(sleeps_heap, i);
 }
+
+int32_t next_scheduled_send(send_t *sleeping_sends, pheap_t *sleeps_heap) {
+  pheap_node_id_t i = ph_peek_head(sleeps_heap);
+  if (i == 0)
+    return -1;
+  return next_send(&sleeping_sends[i]);
+}
index 651d0e48ab783d368f400d70d7dfa894db20b1d0..3dc1c7436f3e326cfb791985513c2c9f2c62ce24 100644 (file)
@@ -10,11 +10,13 @@ typedef struct {
   u8_t send_count;
 } send_t;
 
-uint32_t next_send(send_t *s);
-
 bool next_send_less_than(void *user_data, pheap_node_id_t a, pheap_node_id_t b);
 
 void create_send(send_t *sleeping_sends, pheap_t *sleeps_heap,
                  uint32_t timestamp, u16_t seq);
 
+/* When do we next need to send something (in seconds since boot)?
+ * Returns -1 if there's nothing pending. */
+int32_t next_scheduled_send(send_t *sleeping_sends, pheap_t *sleeps_heap);
+
 #endif
index b433b4435b4950de5b561abb48a69aadc89aaa98..f5306c28b8130dffceeef916951202f7d71b5b8f 100644 (file)
@@ -60,19 +60,18 @@ void service_sleeps(int alarm, send_t *sleeping_sends, pheap_t *sleeps_heap) {
 
   while (1) {
     uint32_t now = time_s();
-    pheap_node_id_t i = ph_peek_head(sleeps_heap);
-    if (i == 0)
+    int32_t act_time = next_scheduled_send(sleeping_sends, sleeps_heap);
+    if (act_time == -1)
       return;
-    send_t *send = &sleeping_sends[i];
-    if (next_send(send) > now) {
-      uint32_t sleep_duration = next_send(send) - now;
+    if (act_time > now) {
+      uint32_t sleep_duration = act_time - now;
       if (hardware_alarm_set_target(
               alarm, make_timeout_time_ms(sleep_duration * 1000)))
         signal_error_by_blinking();
       return;
     }
-    if (ph_remove_head(sleeps_heap, false) != i)
-      signal_error_by_blinking();
+    pheap_node_id_t i = ph_remove_head(sleeps_heap, false);
+    send_t *send = &sleeping_sends[i];
     uint32_t ago = now - send->timestamp;
     send_report(send->seq, ago);
     send->send_count++;