/* Send each report multiple times. */
uint config_resend_count = 5;
+
+/* These control the size of the per-send-count press queues.
+When the button is pressed more than config_maximum_queue_size times
+within the resend interval, some presses will be reported fewer
+than config_resend_count times. This is usually fine because it's
+the old, longest-delayed, most-redundant reports that get dropped;
+fresh, timely reports of new button presses will not get anywhere near
+config_resend_count in a resend interval because the early resend internals
+are so short. */
+uint config_maximum_queue_size = 512;
+
+/* This is paranoia about unanticipated delays. Setting this to zero
+would probably be fine, but imposing a minimum queue size is an easy
+safety measure. */
+uint config_minimum_queue_size = 32;
/* Send each report multiple times. */
extern uint config_resend_count;
+/* These control the size of the per-send-count press queues.
+When the button is pressed more than config_maximum_queue_size times
+within the resend interval, some presses will be reported fewer
+than config_resend_count times. This is usually fine because it's
+the old, longest-delyed, most-redundant reports that get dropped;
+fresh, timely reports of new button presses will not get anywhere near
+config_resend_count in a resend interval because the early resend interals
+are so short. */
+extern uint config_maximum_queue_size;
+
+/* This is paranoia about unanticipated delays. Setting this to zero
+would pobably be fine, but imposing a minimum queue size is an easy
+safety measure. */
+extern uint config_minimum_queue_size;
+
#endif
pp->presses = (queue_t *)xcalloc(config_resend_count, sizeof(queue_t));
pp->sleeps = (queue_t **)xcalloc(config_resend_count, sizeof(queue_t *));
for (int i = 0; i < config_resend_count; i++) {
- uint element_count = 1 << i;
- element_count = MAX(element_count, 32);
- element_count = MIN(element_count, 512);
+ const uint paranoid_safety_fudge = 10;
+ uint element_count = paranoid_safety_fudge + (1 << i);
+ element_count = MAX(element_count, config_minimum_queue_size);
+ element_count = MIN(element_count, config_maximum_queue_size);
queue_init(&pp->presses[i], sizeof(press_t), element_count);
}
pp->sleeps_heap =