diff options
| author | yangwei <[email protected]> | 2024-01-03 13:45:42 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2024-01-03 13:45:42 +0800 |
| commit | adc1d1a384a120d66e25db087553a5cc765598da (patch) | |
| tree | 715843c026ca6995cba8d63bd32fc7df5730d562 | |
| parent | f18f2834f002f6aa9a04225c68565ea21048a94f (diff) | |
🐞 fix(fix packet free before ex_data_free):
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/adapter/adapter.c | 35 | ||||
| -rw-r--r-- | src/adapter/session_manager.c | 9 | ||||
| -rw-r--r-- | src/adapter/session_manager.h | 7 |
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); |
