summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-01-03 13:45:42 +0800
committeryangwei <[email protected]>2024-01-03 13:45:42 +0800
commitadc1d1a384a120d66e25db087553a5cc765598da (patch)
tree715843c026ca6995cba8d63bd32fc7df5730d562
parentf18f2834f002f6aa9a04225c68565ea21048a94f (diff)
🐞 fix(fix packet free before ex_data_free):
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/adapter/adapter.c35
-rw-r--r--src/adapter/session_manager.c9
-rw-r--r--src/adapter/session_manager.h7
4 files changed, 33 insertions, 22 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 90bef99..83042c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -78,12 +78,12 @@ add_subdirectory(vendor)
add_subdirectory(deps/toml)
add_subdirectory(src/adapter)
add_subdirectory(src/stellar_on_sapp)
-add_subdirectory(src/http_decoder)
+#add_subdirectory(src/http_decoder)
add_subdirectory(examples/sapp_plugin)
add_subdirectory(examples/stellar_plugin)
enable_testing()
-add_subdirectory(test)
+#add_subdirectory(test)
install(FILES include/stellar/session_exdata.h DESTINATION ${CMAKE_INSTALL_PREFIX}/framework/include/stellar COMPONENT Headers)
install(FILES include/stellar/session_mq.h DESTINATION ${CMAKE_INSTALL_PREFIX}/framework/include/stellar COMPONENT Headers)
diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c
index 518b16f..e9703b9 100644
--- a/src/adapter/adapter.c
+++ b/src/adapter/adapter.c
@@ -157,6 +157,15 @@ struct packet
struct streaminfo *a_stream;
};
+static void adapter_packet_free(struct session *sess, struct packet *pkt, void *arg)
+{
+ if(pkt)
+ {
+ FREE(pkt);
+ }
+ return;
+}
+
struct session *adapter_session_new(struct stellar *st, struct streaminfo *stream)
{
enum session_type type;
@@ -172,8 +181,14 @@ struct session *adapter_session_new(struct stellar *st, struct streaminfo *strea
{
return NULL;
}
-
- return session_new(st, type, stream->threadnum);
+ struct session *sess = session_new(st, type, stream->threadnum);
+ if(sess)
+ {
+ struct packet *pkt = CALLOC(struct packet, 1);
+ session_set_current_packet(sess, pkt,adapter_packet_free, NULL);
+ pkt->a_stream = stream;
+ }
+ return sess;
}
void adapter_session_free(struct session *sess)
@@ -186,23 +201,9 @@ unsigned char adapter_session_state_update(struct streaminfo *stream, struct ses
struct packet *pkt = NULL;
if(sess)
{
- if(state == SESSION_STATE_OPENING)
- {
- pkt=CALLOC(struct packet, 1);
- session_set_current_packet(sess, pkt);
- pkt->a_stream=stream;
- }
- else
- {
- pkt=(struct packet *)session_get0_current_packet(sess);
- }
+ pkt=(struct packet *)session_get0_current_packet(sess);
pkt->raw_pkt=(void *)get_current_rawpkt_from_streaminfo(stream);
session_dispatch( sess, state, pkt);
- if(state == SESSION_STATE_CLOSING)
- {
- FREE(pkt);
- session_set_current_packet(sess, NULL);
- }
if(sess->set_detach_others==1)
{
return APP_STATE_GIVEME|APP_STATE_KILL_OTHER;
diff --git a/src/adapter/session_manager.c b/src/adapter/session_manager.c
index b552b96..eace0bd 100644
--- a/src/adapter/session_manager.c
+++ b/src/adapter/session_manager.c
@@ -372,9 +372,11 @@ inline struct packet *session_get_current_packet(struct session *sess)
return sess->cur_pkt;
}
-inline void session_set_current_packet(struct session *sess, struct packet *pkt)
+inline void session_set_current_packet(struct session *sess, struct packet *pkt, session_packet_free *free_cb, void *arg)
{
sess->cur_pkt = pkt;
+ sess->cur_pkt_free_arg = arg;
+ sess->cur_pkt_free_cb = free_cb;
}
void session_free(struct session *sess)
@@ -387,7 +389,10 @@ void session_free(struct session *sess)
session_free_exdata_runtime(sess, sess->ex_data_rt);
if(sess->cur_pkt)
{
- FREE(sess->cur_pkt);
+ if(sess->cur_pkt_free_cb)
+ {
+ sess->cur_pkt_free_cb(sess, sess->cur_pkt, sess->cur_pkt_free_arg);
+ }
}
FREE(sess->ex_data_rt);
FREE(sess);
diff --git a/src/adapter/session_manager.h b/src/adapter/session_manager.h
index e1e06a1..b48e4f2 100644
--- a/src/adapter/session_manager.h
+++ b/src/adapter/session_manager.h
@@ -8,11 +8,16 @@
struct session_exdata_runtime;
struct session_mq;
struct packet;
+
+typedef void session_packet_free(struct session *sess, struct packet *pkt, void *arg);
+
struct session
{
enum session_type type;
enum session_state state;
struct packet *cur_pkt;
+ session_packet_free *cur_pkt_free_cb;
+ void *cur_pkt_free_arg;
struct stellar *st;
struct session_exdata_runtime *ex_data_rt;
struct session_mq *mq;
@@ -23,7 +28,7 @@ struct session
struct session *session_new(struct stellar *st, enum session_type type, int thread_id);
struct packet *session_get_current_packet(struct session *sess);
-void session_set_current_packet(struct session *sess, struct packet *pkt);
+void session_set_current_packet(struct session *sess, struct packet *pkt, session_packet_free *free_cb, void *arg);
void session_free(struct session *sess);