Skip to content

Commit 75738cd

Browse files
authored
Use the sequence number correctly when sending a request (#63)
Signed-off-by: Ivan Santiago Paunovic <[email protected]>
1 parent f75820c commit 75738cd

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

rcljava/include/org_ros2_rcljava_client_ClientImpl.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ extern "C" {
2525
* Method: nativeSendClientRequest
2626
* Signature: (JJJJJLorg/ros2/rcljava/interfaces/MessageDefinition;)V
2727
*/
28-
JNIEXPORT void
28+
JNIEXPORT jlong
2929
JNICALL Java_org_ros2_rcljava_client_ClientImpl_nativeSendClientRequest(
30-
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jlong, jobject);
30+
JNIEnv *, jclass, jlong, jlong, jlong, jlong, jobject);
3131

3232
/*
3333
* Class: org_ros2_rcljava_client_ClientImpl

rcljava/src/main/cpp/org_ros2_rcljava_client_ClientImpl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ using rcljava_common::exceptions::rcljava_throw_rclexception;
3434
using rcljava_common::signatures::convert_from_java_signature;
3535
using rcljava_common::signatures::destroy_ros_message_signature;
3636

37-
JNIEXPORT void JNICALL
37+
JNIEXPORT jlong JNICALL
3838
Java_org_ros2_rcljava_client_ClientImpl_nativeSendClientRequest(
39-
JNIEnv * env, jclass, jlong client_handle, jlong sequence_number,
39+
JNIEnv * env, jclass, jlong client_handle,
4040
jlong jrequest_from_java_converter_handle, jlong jrequest_to_java_converter_handle,
4141
jlong jrequest_destructor_handle, jobject jrequest_msg)
4242
{
@@ -53,6 +53,7 @@ Java_org_ros2_rcljava_client_ClientImpl_nativeSendClientRequest(
5353

5454
void * request_msg = convert_from_java(jrequest_msg, nullptr);
5555

56+
int64_t sequence_number;
5657
rcl_ret_t ret = rcl_send_request(client, request_msg, &sequence_number);
5758

5859
destroy_ros_message_signature destroy_ros_message =
@@ -65,6 +66,7 @@ Java_org_ros2_rcljava_client_ClientImpl_nativeSendClientRequest(
6566
rcl_reset_error();
6667
rcljava_throw_rclexception(env, ret, msg);
6768
}
69+
return static_cast<jlong>(sequence_number);
6870
}
6971

7072
JNIEXPORT void JNICALL

rcljava/src/main/java/org/ros2/rcljava/client/ClientImpl.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.time.Duration;
1919
import java.lang.ref.WeakReference;
20+
import java.lang.IllegalStateException;
2021
import java.lang.InterruptedException;
2122
import java.lang.Long;
2223
import java.util.AbstractMap;
@@ -52,7 +53,6 @@ public class ClientImpl<T extends ServiceDefinition> implements Client<T> {
5253
private final WeakReference<Node> nodeReference;
5354
private long handle;
5455
private final String serviceName;
55-
private long sequenceNumber = 0;
5656
private Map<Long, Map.Entry<Consumer, RCLFuture>> pendingRequests;
5757

5858
private final Class<MessageDefinition> requestType;
@@ -79,8 +79,8 @@ public void accept(Future<V> input) {}
7979
public final <U extends MessageDefinition, V extends MessageDefinition> Future<V>
8080
asyncSendRequest(final U request, final Consumer<Future<V>> callback) {
8181
synchronized (pendingRequests) {
82-
sequenceNumber++;
83-
nativeSendClientRequest(handle, sequenceNumber, request.getFromJavaConverterInstance(),
82+
long sequenceNumber = nativeSendClientRequest(
83+
handle, request.getFromJavaConverterInstance(),
8484
request.getToJavaConverterInstance(), request.getDestructorInstance(), request);
8585
RCLFuture<V> future = new RCLFuture<V>(this.nodeReference);
8686

@@ -96,15 +96,20 @@ public final <U extends MessageDefinition> void handleResponse(
9696
synchronized (pendingRequests) {
9797
long sequenceNumber = header.sequenceNumber;
9898
Map.Entry<Consumer, RCLFuture> entry = pendingRequests.remove(sequenceNumber);
99-
Consumer<Future> callback = entry.getKey();
100-
RCLFuture<U> future = entry.getValue();
101-
future.set(response);
102-
callback.accept(future);
99+
if (entry != null) {
100+
Consumer<Future> callback = entry.getKey();
101+
RCLFuture<U> future = entry.getValue();
102+
future.set(response);
103+
callback.accept(future);
104+
return;
105+
}
106+
throw new IllegalStateException(
107+
"No request made with the given sequence number: " + sequenceNumber);
103108
}
104109
}
105110

106-
private static native void nativeSendClientRequest(long handle, long sequenceNumber,
107-
long requestFromJavaConverterHandle, long requestToJavaConverterHandle,
111+
private static native long nativeSendClientRequest(
112+
long handle, long requestFromJavaConverterHandle, long requestToJavaConverterHandle,
108113
long requestDestructorHandle, MessageDefinition requestMessage);
109114

110115
public final Class<MessageDefinition> getRequestType() {

0 commit comments

Comments
 (0)