Skip to content

Commit e41105a

Browse files
author
Minggang Wang
authored
Merge pull request #158 from minggangw/fix-issue-123
[UT]Enable all tests on Linux/macOS/Windows
2 parents 4a114b1 + cd14139 commit e41105a

File tree

13 files changed

+155
-58
lines changed

13 files changed

+155
-58
lines changed

binding.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
'-lrcl',
3535
'-lrcutils',
3636
'-lrmw',
37+
'-lrosidl_generator_c',
3738
],
3839
'conditions': [
3940
[

lib/client.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,22 +57,17 @@ class Client extends Entity {
5757
throw new TypeError('Invalid argument');
5858
}
5959

60-
rclRequest.serialize();
61-
let rawROSRequest = rclRequest.toRawROS();
60+
let rawROSRequest = rclRequest.serialize();
6261
this._sequenceNumber = rclnodejs.sendRequest(this._handle, rawROSRequest);
6362
this._callback = callback;
6463
}
6564

66-
get takenResponse() {
67-
return this._response.toRawROS();
68-
}
69-
7065
get sequenceNumber() {
7166
return this._sequenceNumber;
7267
}
7368

74-
processResponse() {
75-
this._response.deserialize();
69+
processResponse(response) {
70+
this._response.deserialize(response);
7671
this._callback(this._response);
7772
}
7873

lib/entity.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class Entity {
3333
get qos() {
3434
return this._qos;
3535
}
36+
37+
get typeClass() {
38+
return this._typeClass;
39+
}
3640
}
3741

3842
module.exports = Entity;

lib/node.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,24 +54,33 @@ class Node {
5454
});
5555

5656
this._subscriptions.forEach((subscription) => {
57-
let success = rclnodejs.rclTake(subscription.handle, subscription.takenMsg);
57+
let Message = subscription.typeClass;
58+
let msg = new Message();
59+
let success = rclnodejs.rclTake(subscription.handle, msg.toRawROS());
5860
if (success) {
59-
subscription.processResponse();
61+
subscription.processResponse(msg.refObject);
6062
}
63+
Message.destoryRawROS(msg);
6164
});
6265

6366
this._clients.forEach((client) => {
64-
let success = rclnodejs.rclTakeResponse(client.handle, client.sequenceNumber, client.takenResponse);
67+
let Response = client.typeClass.Response;
68+
let response = new Response();
69+
let success = rclnodejs.rclTakeResponse(client.handle, client.sequenceNumber, response.toRawROS());
6570
if (success) {
66-
client.processResponse();
71+
client.processResponse(response.refObject);
6772
}
73+
Response.destoryRawROS(response);
6874
});
6975

7076
this._services.forEach((service) => {
71-
let header = rclnodejs.rclTakeRequest(service.handle, this.handle, service.takenRequest);
77+
let Request = service.typeClass.Request;
78+
let request = new Request();
79+
let header = rclnodejs.rclTakeRequest(service.handle, this.handle, request.toRawROS());
7280
if (header) {
73-
service.processRequest(header);
81+
service.processRequest(header, request.refObject);
7482
}
83+
Request.destoryRawROS(request);
7584
});
7685
}
7786

lib/publisher.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ class Publisher extends Entity {
5050
rclMessage.data = message;
5151
}
5252

53-
rclMessage.serialize();
54-
let rawRosMessage = rclMessage.toRawROS();
53+
let rawRosMessage = rclMessage.serialize();
5554
if (rawRosMessage) {
5655
rclnodejs.publish(this._handle, rawRosMessage);
5756
} else {

lib/service.js

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,11 @@ class Service extends Entity {
3030
this._callback = callback;
3131
}
3232

33-
get takenRequest() {
34-
return this._request.toRawROS();
35-
}
36-
37-
processRequest(headerHandle) {
38-
this._request.deserialize();
33+
processRequest(headerHandle, request) {
34+
this._request.deserialize(request);
3935
let response = this._callback(this._request, new this._typeClass.Response());
40-
response.serialize();
41-
let rawROSResponse = response.toRawROS();
36+
37+
let rawROSResponse = response.serialize();
4238
rclnodejs.sendResponse(this._handle, rawROSResponse, headerHandle);
4339
}
4440

lib/subscription.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,8 @@ class Subscription extends Entity {
3030
this._message = new typeClass();
3131
}
3232

33-
get takenMsg() {
34-
return this._message.toRawROS();
35-
}
36-
37-
processResponse() {
38-
this._message.deserialize();
33+
processResponse(msg) {
34+
this._message.deserialize(msg);
3935
this._callback(this._message);
4036
}
4137

rosidl_gen/deallocator.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) 2017 Intel Corporation. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
'use strict';
16+
17+
const rclnodejs = require('bindings')('rclnodejs');
18+
19+
let deallocator = {
20+
freeStructMember(refObj, type, name) {
21+
rclnodejs.freeMemeoryAtOffset(refObj.ref(), type.fields[name].offset);
22+
}
23+
};
24+
25+
module.exports = deallocator;

rosidl_gen/generator_primitive.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,21 @@ const StringRefStruct = StructType({
2626
capacity: ref.types.size_t,
2727
});
2828

29-
function initString(str) {
30-
if (! str instanceof StringRefStruct) {
31-
throw new TypeError('Invalid argument: should provide a type of StringRefStruct');
32-
}
29+
function initString(str, own = false) {
30+
if (own) {
31+
if (! str instanceof Buffer) {
32+
throw new TypeError('Invalid argument: should provide a Node Buffer to bindingsStringInit()');
33+
}
34+
rclnodejs.initString(str);
35+
} else {
36+
if (! str instanceof StringRefStruct) {
37+
throw new TypeError('Invalid argument: should provide a type of StringRefStruct');
38+
}
3339

34-
str.data = Buffer.alloc(1).fill('\u0000');
35-
str.size = 0;
36-
str.capacity = 1;
40+
str.data = Buffer.alloc(1).fill('\u0000');
41+
str.size = 0;
42+
str.capacity = 1;
43+
}
3744
}
3845

3946
module.exports = {

rosidl_gen/templates/message.dot

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const StructType = require('ref-struct');
99
const ref = require('ref');
1010
const ArrayType = require('ref-array');
1111
const primitiveTypes = require('../../rosidl_gen/generator_primitive.js');
12+
const deallocator = require('../../rosidl_gen/deallocator.js');
1213

1314
{{
1415
let objectWrapper = it.spec.msgName + 'Wrapper';
@@ -172,7 +173,7 @@ class {{=objectWrapper}} {
172173
{{?}}
173174
{{~}}
174175
}
175-
this.serialize();
176+
this.freeze();
176177
}
177178

178179
static createFromRefObject(refObject) {
@@ -198,30 +199,64 @@ class {{=objectWrapper}} {
198199
}
199200

200201
toRawROS() {
202+
this.freeze(true);
201203
return this._refObject.ref();
202204
}
203205

204-
serialize() {
206+
freeze(own = false) {
205207
{{~ it.spec.fields :field}}
206208
{{? !field.type.isPrimitiveType || field.type.isArray}}
207-
this._wrapperFields.{{=field.name}}.serialize();
209+
this._wrapperFields.{{=field.name}}.freeze(own);
208210
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
209211
{{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
212+
if (own) {
213+
primitiveTypes.initString(this._wrapperFields.{{=field.name}}.refObject.ref(), own);
214+
}
210215
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
216+
{{?? it.spec.msgName === 'String'}}
217+
if (own) {
218+
primitiveTypes.initString(this._refObject.ref(), own);
219+
}
211220
{{?}}
212221
{{~}}
213222
}
214223

215-
deserialize() {
224+
serialize() {
225+
this.freeze();
226+
return this._refObject.ref();
227+
}
228+
229+
deserialize(refObject) {
216230
{{~ it.spec.fields :field}}
217231
{{? !field.type.isPrimitiveType || field.type.isArray}}
218-
this._wrapperFields.{{=field.name}}.copyRefObject(this._refObject.{{=field.name}});
232+
this._wrapperFields.{{=field.name}}.copyRefObject(refObject.{{=field.name}});
219233
{{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
220-
this._wrapperFields.{{=field.name}}.data = this._refObject.{{=field.name}}.data;
234+
this._wrapperFields.{{=field.name}}.data = refObject.{{=field.name}}.data;
235+
{{?? field.type.isPrimitiveType}}
236+
this._refObject.{{=field.name}} = refObject.{{=field.name}};
237+
{{?}}
238+
{{~}}
239+
}
240+
241+
static freeStruct(refObject) {
242+
{{~ it.spec.fields :field}}
243+
{{? field.type.isArray}}
244+
if (refObject.{{=field.name}}.size != 0) {
245+
{{=getWrapperNameByType(field.type)}}.ArrayType.freeArray(refObject.{{=field.name}});
246+
deallocator.freeStructMember(refObject.{{=field.name}}, {{=getWrapperNameByType(field.type)}}.refObjectArrayType, 'data');
247+
}
248+
{{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
249+
{{=getWrapperNameByType(field.type)}}.freeStruct(refObject.{{=field.name}});
250+
{{?? it.spec.msgName === 'String'}}
251+
deallocator.freeStructMember(refObject, {{=getWrapperNameByType(field.type)}}.refObjectType, '{{=field.name}}');
221252
{{?}}
222253
{{~}}
223254
}
224255

256+
static destoryRawROS(msg) {
257+
{{=objectWrapper}}.freeStruct(msg.refObject);
258+
}
259+
225260
static type() {
226261
return {pkgName: '{{=it.messageInfo.pkgName}}', subFolder: '{{=it.messageInfo.subFolder}}', interfaceName: '{{=it.messageInfo.interfaceName}}'};
227262
}
@@ -319,20 +354,16 @@ class {{=arrayWrapper}} {
319354
{{?}}
320355
}
321356

322-
serialize() {
357+
freeze(own) {
323358
this._wrappers.forEach((wrapper, index) => {
324-
wrapper.serialize();
359+
wrapper.freeze(own);
325360
this._refArray[index] = wrapper.refObject;
326361
});
327362
this._refObject.size = this._wrappers.length;
328363
this._refObject.capacity = this._wrappers.length;
329364
this._refObject.data = this._refArray.buffer;
330365
}
331366

332-
deserialize(refObject) {
333-
copyRefObject(refObject)
334-
}
335-
336367
get refObject() {
337368
return this._refObject;
338369
}
@@ -406,6 +437,14 @@ class {{=arrayWrapper}} {
406437
this._wrappers[index].copy(wrapper);
407438
});
408439
}
440+
441+
static freeArray(refObject) {
442+
let refObjectArray = refObject.data;
443+
refObjectArray.length = refObject.size;
444+
for (let index = 0; index < refObject.size; index++) {
445+
{{=objectWrapper}}.freeStruct(refObjectArray[index]);
446+
}
447+
}
409448
}
410449

411450
{{? it.spec.constants != undefined && it.spec.constants.length}}

0 commit comments

Comments
 (0)