summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-05-03 18:37:45 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-05-03 18:37:45 +0200
commitb3d9e2e69163ff17a0023d08daa5ab0f3e1551a0 (patch)
tree1217fd58b035e7f19faed61fee8d800fa53c1a93
parentf8b8bca54f7efc5f1c442d87e57848b3e2e52613 (diff)
Potential missed events fix.
-rw-r--r--include/relabsd/device/physical_device.h3
-rw-r--r--src/device/physical/physical_device.c36
-rw-r--r--src/server/conversion_main_loop.c35
3 files changed, 45 insertions, 29 deletions
diff --git a/include/relabsd/device/physical_device.h b/include/relabsd/device/physical_device.h
index 9bee391..c6dc81f 100644
--- a/include/relabsd/device/physical_device.h
+++ b/include/relabsd/device/physical_device.h
@@ -23,7 +23,8 @@ void relabsd_physical_device_close
/*
* Returns -1 on (warning) error,
- * 0 on successful read.
+ * 0 if there is nothing to read,
+ * 1 if something was read (and there may be more to read).
*
* The 'input_*' parameters do not need to be initialized, as the function will
* do that for you (on success).
diff --git a/src/device/physical/physical_device.c b/src/device/physical/physical_device.c
index cf74b3c..797c734 100644
--- a/src/device/physical/physical_device.c
+++ b/src/device/physical/physical_device.c
@@ -148,14 +148,13 @@ int relabsd_physical_device_read
* through them in order.
* TODO: add an option to allow users to drop events when late.
*/
- device->is_late ?
+ (device->is_late == 1) ?
LIBEVDEV_READ_FLAG_SYNC
: LIBEVDEV_READ_FLAG_NORMAL
)
/* "The fd is not in O_NONBLOCK and a read may block." */
| LIBEVDEV_READ_FLAG_BLOCKING
- )
- ,
+ ),
&event
);
@@ -166,7 +165,7 @@ int relabsd_physical_device_read
RELABSD_DEBUG
(
RELABSD_DEBUG_REAL_EVENTS,
- "Valid event received: {type = %s; code = %s; value = %d}.",
+ "SUCCESS Valid event received: {type = %s; code = %s; value = %d}.",
libevdev_event_type_get_name(event.type),
libevdev_event_code_get_name(event.type, event.code),
event.value
@@ -176,7 +175,9 @@ int relabsd_physical_device_read
*input_code = event.code;
*input_value = event.value;
- return 0;
+ device->is_late = 0;
+
+ return 1;
/* Code indicating that we are late. */
case LIBEVDEV_READ_STATUS_SYNC:
@@ -187,21 +188,26 @@ int relabsd_physical_device_read
* so we don't actually have any input event in hand.
*/
- /* FIXME: Really make sure this cannot recurse a second time. */
- return
- relabsd_physical_device_read
- (
- device,
- input_type,
- input_code,
- input_value
- );
+ *input_type = event.type;
+ *input_code = event.code;
+ *input_value = event.value;
+
+ RELABSD_DEBUG
+ (
+ RELABSD_DEBUG_REAL_EVENTS,
+ "SYNC Valid event received: {type = %s; code = %s; value = %d}.",
+ libevdev_event_type_get_name(event.type),
+ libevdev_event_code_get_name(event.type, event.code),
+ event.value
+ );
+
+ return 1;
/* No event to read. */
case -EAGAIN:
device->is_late = 0;
- return -1;
+ return 0;
default:
RELABSD_FATAL
diff --git a/src/server/conversion_main_loop.c b/src/server/conversion_main_loop.c
index 5a0dc7d..174ff26 100644
--- a/src/server/conversion_main_loop.c
+++ b/src/server/conversion_main_loop.c
@@ -17,27 +17,33 @@
/******************************************************************************/
/**** LOCAL FUNCTIONS *********************************************************/
/******************************************************************************/
-static void convert_input
+
+/*
+ * Returned values:
+ * -1 -> error.
+ * 0 -> No more events available.
+ * 1 -> Maybe more events available.
+ */
+static int convert_input
(
struct relabsd_server server [const restrict static 1]
)
{
unsigned int input_type, input_code;
- int value;
+ int value, return_code;
- if
- (
+ return_code =
relabsd_physical_device_read
(
&(server->physical_device),
&input_type,
&input_code,
&value
- )
- < 0
- )
+ );
+
+ if (return_code <= 0)
{
- return;
+ return 0;
}
if (input_type == EV_REL)
@@ -52,7 +58,7 @@ static void convert_input
if (axis_name == RELABSD_UNKNOWN)
{
- return;
+ return return_code;
}
axis = relabsd_parameters_get_axis(axis_name, &(server->parameters));
@@ -83,7 +89,7 @@ static void convert_input
{
case -1:
/* Doesn't want the event to be transmitted. */
- return;
+ return return_code;
case 1:
(void) relabsd_virtual_device_write_evdev_event
@@ -99,7 +105,7 @@ static void convert_input
0,
&(server->virtual_device)
);
- return;
+ return return_code;
case 0:
(void) relabsd_virtual_device_write_evdev_event
@@ -109,7 +115,7 @@ static void convert_input
input_code,
value
);
- return;
+ return return_code;
}
}
else
@@ -123,6 +129,8 @@ static void convert_input
value
);
}
+
+ return return_code;
}
static void reset_axes
@@ -266,7 +274,8 @@ int relabsd_server_conversion_loop
)
{
pthread_mutex_lock(&(server->mutex));
- convert_input(server);
+ /* convert all events in the libevdev buffer. */
+ while (convert_input(server) > 0);
pthread_mutex_unlock(&(server->mutex));
}