Do not read the unitmap after destroying the parcel.
Change-Id: I26c9bf4d35c845c6e3bd9d44086d3452a6eac1cf
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
if (rpc_port_proxy_lem_is_connected(h->lem)) {
map_ = rpc_port_unit_map_create();
rpc_port_parcel_read(result_parcel_, &map_->parcelable, map_);
- rpc_port_parcel_destroy(result_parcel_);
} else {
- __<PREFIX>_<NAME>_consume_command(h->port, seq_num_, &map_);
+ __<PREFIX>_<NAME>_consume_command(h->port, seq_num_, &map_, &result_parcel_);
}
if (map_ == nullptr) {
<METHOD_UNIT_MAP_READ>
rpc_port_unit_map_destroy(map_);
+ rpc_port_parcel_destroy(result_parcel_);
} while (0);
g_rec_mutex_unlock(&h->mutex);
set_last_result(res_);
}
rpc_port_parcel_read(parcel, &map->parcelable, map);
- rpc_port_parcel_destroy(parcel);
rpc_port_unit_map_read_int(map, <HASH_METHOD> /*[METHOD]*/, &cmd);
if (cmd != <UPPERCASE_PREFIX>_<UPPERCASE_NAME>_METHOD_CALLBACK_) {
__<PREFIX>_<NAME>_process_received_event(&h->delegates, map);
g_rec_mutex_unlock(&h->mutex);
rpc_port_unit_map_destroy(map);
+ rpc_port_parcel_destroy(parcel);
}
)__c_cb";
*/
constexpr const char CB_INTERFACE_BASE[] =
R"__c_cb(
-static void __<PREFIX>_<NAME>_consume_command(rpc_port_h port, int seq_num, rpc_port_unit_map_h *unit_map)
+static void __<PREFIX>_<NAME>_consume_command(rpc_port_h port, int seq_num, rpc_port_unit_map_h *unit_map, rpc_port_parcel_h *received_parcel)
{
rpc_port_parcel_h parcel;
rpc_port_parcel_header_h header;
}
rpc_port_parcel_read(parcel, &map->parcelable, map);
- rpc_port_parcel_destroy(parcel);
rpc_port_unit_map_read_int(map, <HASH_METHOD> /*[METHOD]*/, &cmd);
if (cmd == <UPPERCASE_PREFIX>_<UPPERCASE_NAME>_METHOD_RESULT_) {
rpc_port_unit_map_read_remote_exception(map, <HASH_REMOTE_EXCEPTION> /*[REMOTE_EXCEPTION]*/, &__<PREFIX>_remote_exception);
*unit_map = map;
+ *received_parcel = parcel;
return;
}
rpc_port_unit_map_clear(map);
+ rpc_port_parcel_destroy(parcel);
} while (true);
rpc_port_unit_map_destroy(map);
if (rpc_port_proxy_lem_is_connected(h->lem)) {
map_ = rpc_port_unit_map_create();
rpc_port_parcel_read(result_parcel_, &map_->parcelable, map_);
- rpc_port_parcel_destroy(result_parcel_);
} else {
- __<PREFIX>_<NAME>_consume_command(h->port, seq_num_, &map_);
+ __<PREFIX>_<NAME>_consume_command(h->port, seq_num_, &map_, &result_parcel_);
}
if (map_ == nullptr) {
<METHOD_UNIT_MAP_READ>
rpc_port_unit_map_destroy(map_);
+ rpc_port_parcel_destroy(result_parcel_);
} while (0);
g_rec_mutex_unlock(&h->mutex);
set_last_result(res_);
}
}
-void <CLS_NAME>::ConsumeCommand(rpc_port_h port, int seq_num, UnitMap& unit_map) {
+void <CLS_NAME>::ConsumeCommand(rpc_port_h port, int seq_num, UnitMap& unit_map, rpc_port_parcel_h* received_parcel) {
do {
rpc_port_parcel_h parcel;
int ret = rpc_port_parcel_create_from_port(&parcel, port);
}
unit_map.Deserialize(parcel);
- rpc_port_parcel_destroy(parcel);
int cmd = -1;
unit_map.Read(<HASH_METHOD> /*[METHOD]*/, cmd);
- if (cmd == static_cast<int>(MethodId::__Result))
+ if (cmd == static_cast<int>(MethodId::__Result)) {
+ *received_parcel = parcel;
return;
+ }
unit_map.Clear();
+ rpc_port_parcel_destroy(parcel);
} while (true);
}
UnitMap unit_map;
unit_map.Deserialize(parcel);
- rpc_port_parcel_destroy(parcel);
int cmd = -1;
unit_map.Read(<HASH_METHOD> /*[METHOD]*/, cmd);
if (cmd != static_cast<int>(MethodId::__Callback)) {
_E("Invalid procotol");
+ rpc_port_parcel_destroy(parcel);
return;
}
handle->ProcessReceivedEvent(unit_map);
+ rpc_port_parcel_destroy(parcel);
}
)__cpp_cb";
UnitMap received_map_;
if (local_execution_.get() != nullptr && local_execution_->IsConnected()) {
received_map_.Deserialize(result_parcel_);
- rpc_port_parcel_destroy(result_parcel_);
} else {
- ConsumeCommand(port_, seq_num_, received_map_);
+ ConsumeCommand(port_, seq_num_, received_map_, &result_parcel_);
}
if (received_map_.GetSize() == 0) {
if (unit_ != nullptr) {
RemoteException remote_except;
unit_->Read(remote_except);
+ rpc_port_parcel_destroy(result_parcel_);
throw remote_except;
}
</DESERIALIZE*>
received_map_.Read(<HASH_RESULT> /*[RESULT]*/, result_);
+ rpc_port_parcel_destroy(result_parcel_);
return result_;
}
)__cpp_cb";
<DELEGATE_IDS>
void ProcessReceivedEvent(const UnitMap& unit_map);
- void ConsumeCommand(rpc_port_h port, int seq_num, UnitMap& unit_map);
+ void ConsumeCommand(rpc_port_h port, int seq_num, UnitMap& unit_map, rpc_port_parcel_h* received_parcel);
static void OnConnectedCb(const char* endpoint, const char* port_name, rpc_port_h port, void* user_data);
static void OnDisconnectedCb(const char* endpoint, const char* port_name, void* user_data);
static void OnRejectedCb(const char* endpoint, const char* port_name, void* user_data);
}
}
- private void ConsumeCommand(out UnitMap unitMap, Port port, ParcelHeader header)
+ private void ConsumeCommand(out UnitMap unitMap, out Parcel parcelReceived, Port port, ParcelHeader header)
{
do
{
catch (InvalidIOException)
{
unitMap = null;
+ parcelReceived = null;
return;
}
map.Deserialize(p);
unitMap = map;
+ parcelReceived = p;
return;
} while (true);
}
else
{
// Receive
- ConsumeCommand(out mapReceived, Port, header);
+ ConsumeCommand(out mapReceived, out ret_parcel, Port, header);
}
if (mapReceived == null)
)__cs_cb";
-#endif // IDLC_CS_GEN_VERSION2_CS_PROXY_GENRATOR_CB_H_
\ No newline at end of file
+#endif // IDLC_CS_GEN_VERSION2_CS_PROXY_GENRATOR_CB_H_
<SYNC?>
let mut __map_received = UnitMap::new();
+ let mut __parcel_received = Parcel::from(&__port);
loop {
- let __parcel_received = Parcel::from(&__port);
if __parcel_received.get_seq_num() != seq_num {
+ __parcel_received = Parcel::from(&__port);
continue;
}