diff --git a/include/dap_client.h b/include/dap_client.h index c9555590ec9f457f3785600eb030a79c2747a606..bad823d001dcded6802cc7a91401427b5351d997 100755 --- a/include/dap_client.h +++ b/include/dap_client.h @@ -38,7 +38,8 @@ typedef enum dap_client_stage { STAGE_STREAM_CTL=2, STAGE_STREAM_SESSION=3, STAGE_STREAM_CONNECTED=4, - STAGE_STREAM_STREAMING=5 + STAGE_STREAM_STREAMING=5, + STAGE_STREAM_ABORT=10 } dap_client_stage_t; typedef enum dap_client_stage_status { @@ -69,6 +70,7 @@ typedef enum dap_client_error { * @brief The dap_client struct */ typedef struct dap_client{ + pthread_mutex_t mutex; void * _internal; void * _inheritor; } dap_client_t; diff --git a/libdap b/libdap index 4ab41cdcaa8087323652cd5fef702876ccc25dab..4896ad4eeda5b8d4b3ba92dfe2eb6d4cf34efcc7 160000 --- a/libdap +++ b/libdap @@ -1 +1 @@ -Subproject commit 4ab41cdcaa8087323652cd5fef702876ccc25dab +Subproject commit 4896ad4eeda5b8d4b3ba92dfe2eb6d4cf34efcc7 diff --git a/libdap-crypto b/libdap-crypto index ff63d762657f9687173db825705b8bf4b958abee..bcfcef1cd87cc6cfbc7e47887894c0fa3742a218 160000 --- a/libdap-crypto +++ b/libdap-crypto @@ -1 +1 @@ -Subproject commit ff63d762657f9687173db825705b8bf4b958abee +Subproject commit bcfcef1cd87cc6cfbc7e47887894c0fa3742a218 diff --git a/libdap-server b/libdap-server index 2cc113d3ef8234037016ac21f33731998bba6552..5c4bf1f472a48086f71822355c14197ff416831a 160000 --- a/libdap-server +++ b/libdap-server @@ -1 +1 @@ -Subproject commit 2cc113d3ef8234037016ac21f33731998bba6552 +Subproject commit 5c4bf1f472a48086f71822355c14197ff416831a diff --git a/libdap-server-core b/libdap-server-core index 1008394f0ecdbc41d995a4cc5bbc4b51ad789eaf..bbe4d2b4e00012effac21cda4c2d3554dc6173e0 160000 --- a/libdap-server-core +++ b/libdap-server-core @@ -1 +1 @@ -Subproject commit 1008394f0ecdbc41d995a4cc5bbc4b51ad789eaf +Subproject commit bbe4d2b4e00012effac21cda4c2d3554dc6173e0 diff --git a/libdap-server-udp b/libdap-server-udp index bbf1b9db2c3af9a3a59f6debb90ddc8db55ae2eb..e320774de51a831559fbeafb2dab6e7c063dcc99 160000 --- a/libdap-server-udp +++ b/libdap-server-udp @@ -1 +1 @@ -Subproject commit bbf1b9db2c3af9a3a59f6debb90ddc8db55ae2eb +Subproject commit e320774de51a831559fbeafb2dab6e7c063dcc99 diff --git a/libdap-stream b/libdap-stream index 7a53ab997e1079000d0f7477d30e4d58cf4185f7..d970b74478fc582e75c3e287fa63bec207b92598 160000 --- a/libdap-stream +++ b/libdap-stream @@ -1 +1 @@ -Subproject commit 7a53ab997e1079000d0f7477d30e4d58cf4185f7 +Subproject commit d970b74478fc582e75c3e287fa63bec207b92598 diff --git a/libdap-stream-ch b/libdap-stream-ch index 268f422bde88a5f4f254a31b7d52b18d2cad71fc..09e76911c2f76c6cc1c4651a99f0e545c1c1c840 160000 --- a/libdap-stream-ch +++ b/libdap-stream-ch @@ -1 +1 @@ -Subproject commit 268f422bde88a5f4f254a31b7d52b18d2cad71fc +Subproject commit 09e76911c2f76c6cc1c4651a99f0e545c1c1c840 diff --git a/src/dap_client.c b/src/dap_client.c index 391b95b3cf45dfa00bb237f7548e034884a6828a..08051acdbae23c279b44c2bf671f46164b39c09e 100644 --- a/src/dap_client.c +++ b/src/dap_client.c @@ -58,6 +58,8 @@ dap_client_t * dap_client_new(dap_events_t * a_events, dap_client_callback_t a_s if (!l_client) goto MEM_ALLOC_ERR; + pthread_mutex_init(&l_client->mutex, NULL); + l_client->_internal = DAP_NEW_Z(dap_client_pvt_t); if (!l_client->_internal) goto MEM_ALLOC_ERR; @@ -172,12 +174,19 @@ void dap_client_delete(dap_client_t * a_client) if(!a_client) return; + pthread_mutex_lock(&a_client->mutex); + dap_client_disconnect(a_client); + dap_client_reset(a_client); if (DAP_CLIENT_PVT(a_client) ) dap_client_pvt_delete(DAP_CLIENT_PVT(a_client)); - DAP_DELETE(a_client); + pthread_mutex_t *l_mutex = &a_client->mutex; + memset(a_client, 0, sizeof(dap_client_t)); + pthread_mutex_unlock(l_mutex); + // a_client will be deleted in dap_events_socket_delete() -> free( a_es->_inheritor ); + //DAP_DELETE(a_client); } /** @@ -207,7 +216,7 @@ void dap_client_go_stage(dap_client_t * a_client, dap_client_stage_t a_stage_tar , dap_client_stage_str(l_client_internal->stage)); break; case STAGE_STATUS_IN_PROGRESS:{ - log_it(L_WARNING, "Aborting the stage %s" + log_it(L_WARNING, "Status progress the stage %s" , dap_client_stage_str(l_client_internal->stage)); }break; case STAGE_STATUS_DONE: @@ -314,6 +323,8 @@ int dap_client_disconnect( dap_client_t *a_client ) } //l_client_internal->stream_socket = 0; + l_client_internal->is_reconnect = false; + log_it(L_DEBUG, "dap_client_disconnect( ) done" ); return -1; @@ -417,7 +428,7 @@ const char * dap_client_stage_str(dap_client_stage_t a_stage) */ dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client) { - return DAP_CLIENT_PVT(a_client)->stage_status; + return (a_client && DAP_CLIENT_PVT(a_client)) ? DAP_CLIENT_PVT(a_client)->stage_status : STAGE_STATUS_NONE; } /** @@ -426,7 +437,7 @@ dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client) * @return */ dap_enc_key_t * dap_client_get_key_stream(dap_client_t * a_client){ - return DAP_CLIENT_PVT(a_client)->stream_key; + return (a_client && DAP_CLIENT_PVT(a_client)) ? DAP_CLIENT_PVT(a_client)->stream_key : NULL; } @@ -444,7 +455,7 @@ dap_stream_t * dap_client_get_stream(dap_client_t * a_client) dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch_id) { dap_stream_ch_t * l_ch = NULL; - dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); + dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL; if(l_client_internal && l_client_internal->stream) for(int i = 0; i < l_client_internal->stream->channel_count; i++) { dap_stream_ch_proc_t *l_ch_id = l_client_internal->stream->channel[i]->proc; @@ -463,8 +474,7 @@ dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch */ const char * dap_client_get_stream_id(dap_client_t * a_client) { - dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); - if(!l_client_internal) + if(!(a_client || !DAP_CLIENT_PVT(a_client))) return NULL; return DAP_CLIENT_PVT(a_client)->stream_id; } diff --git a/src/dap_client_pvt.c b/src/dap_client_pvt.c index 0c8b85145f6703b7b819baa56c47c18d02d1ad91..6529320b7139a1b4e7cc153b1ab6085af9a2e3ca 100644 --- a/src/dap_client_pvt.c +++ b/src/dap_client_pvt.c @@ -129,6 +129,8 @@ void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt) if (a_client_pvt->stream_key) dap_enc_key_delete(a_client_pvt->stream_key); + + DAP_DELETE(a_client_pvt); } /** @@ -310,6 +312,10 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) } } break; +// case STAGE_STATUS_ABORTING: { +// log_it(L_ERROR, "Aborting state"); +// } + break; case STAGE_STATUS_ERROR: { log_it(L_ERROR, "Error state, doing callback if present"); if(a_client_pvt->stage_status_error_callback) { @@ -318,10 +324,16 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) //a_client_internal->stage_status_error_callback = NULL; } - a_client_pvt->stage = STAGE_ENC_INIT; - // Trying the step again - a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS; - s_stage_status_after(a_client_pvt); + if(a_client_pvt->stage_target == STAGE_STREAM_ABORT){ + a_client_pvt->stage = STAGE_STREAM_ABORT; + a_client_pvt->stage_status = STAGE_STATUS_ABORTING; + } + else{ + a_client_pvt->stage = STAGE_ENC_INIT; + // Trying the step again + a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS; + s_stage_status_after(a_client_pvt); + } } break; case STAGE_STATUS_DONE: { @@ -845,10 +857,12 @@ void m_es_stream_delete( dap_events_socket_t *a_es, void *arg ) log_it(L_ERROR, "dap_client is not initialized"); return; } + pthread_mutex_lock(&l_client->mutex); dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(l_client); if( l_client_pvt == NULL ) { log_it(L_ERROR, "dap_client_pvt is not initialized"); + pthread_mutex_unlock(&l_client->mutex); return; } @@ -868,6 +882,8 @@ void m_es_stream_delete( dap_events_socket_t *a_es, void *arg ) l_client_pvt->stream_session = NULL; + pthread_mutex_unlock(&l_client->mutex); + if ( l_client_pvt->is_reconnect ) { log_it(L_DEBUG, "l_client_pvt->is_reconnect = true");