Modify stream stop API to prevent segfault 29/165129/5 accepted/tizen/5.0/unified/20181102.014429 accepted/tizen/unified/20171228.121317 submit/tizen/20171228.085802 submit/tizen_5.0/20181101.000002
authoraravind.gara <aravind.gara@samsung.com>
Tue, 26 Dec 2017 09:46:09 +0000 (18:46 +0900)
committeraravind.gara <aravind.gara@samsung.com>
Thu, 28 Dec 2017 08:43:52 +0000 (17:43 +0900)
Modified stream stop API to inculde deallocation of allocated resources.
Isolated the isolator callback thread with stream (stream destory function is called only at source callback function).

[Version] 0.0.14
[Issue Type] Bug fix and Enhancement

Change-Id: If3b116694748fc76333479dbeb9795032a0be2ae
Signed-off-by: aravind.gara <aravind.gara@samsung.com>
include/internal/stream_cb_manager.h
packaging/capi-media-sound-pool.spec
src/priority.c
src/source.c
src/stream.c
src/stream_cb_manager.c

index af51d86..94f1358 100644 (file)
@@ -47,7 +47,9 @@ struct stream_cb_manager_s {
 };
 
 typedef struct stream_cb_manager_event_data_s {
-       sound_stream_t *stream;
+       unsigned stream_id;
+       sound_pool_stream_state_changed_cb callback;
+       void *user_data;
        sound_pool_stream_state_e state;
        sound_pool_stream_state_e state_previous;
 } stream_cb_manager_event_data_t;
index 2a038c4..49f63b4 100644 (file)
@@ -1,5 +1,5 @@
 Name:       capi-media-sound-pool
-Version:    0.0.13
+Version:    0.0.14
 Summary:    Tizen Sound Pool module
 Release:    0
 Group:      Multimedia/Framework
index b279dfb..8c465b6 100644 (file)
@@ -102,13 +102,12 @@ sound_pool_error_e _sound_stream_priority_remove_stream(
        SP_DEBUG_FENTER();
        SP_INST_CHECK(mgr, SOUND_POOL_ERROR_INVALID_PARAMETER);
        SP_INST_CHECK(stream, SOUND_POOL_ERROR_INVALID_PARAMETER);
-
        GList* to_delete;
+
        to_delete = g_list_find(mgr->priority_queue, (gpointer)stream);
        SP_RETVM_IF(NULL == to_delete, SOUND_POOL_ERROR_INVALID_PARAMETER,
                        "Can't find to deleting link to stream [id:%d] from priority queue.",
                        stream->id);
-
        mgr->priority_queue = g_list_delete_link(mgr->priority_queue, to_delete);
        _sound_stream_priority_update_playback(mgr);
 
index 1618eb7..83f2fcd 100644 (file)
@@ -78,17 +78,8 @@ static sound_pool_error_e __sound_pool_remove_source(sound_pool_t *pool, sound_s
                while (g_hash_table_iter_next(&iter, &key, &value)) {
                        guint size_before = g_hash_table_size(pool->streams);
                        sound_stream_t *stream = (sound_stream_t*)value;
-                       if (src == stream->parent_source) {
-                               if (stream->state == SOUND_POOL_STREAM_STATE_STOPPED || stream->state == SOUND_POOL_STREAM_STATE_FINISHED) {
-                                       SP_DEBUG("Callback isolator thread destroying the stream");
-                               } else {
-                                       if (stream->state == SOUND_POOL_STREAM_STATE_SUSPENDED
-                                               || stream->state == SOUND_POOL_STREAM_STATE_PLAYING
-                                               || stream->state == SOUND_POOL_STREAM_STATE_PAUSED)
-                                       SP_DEBUG("Callback isolator thread destroys the stream");
-                                       _sound_stream_stop(stream);
-                               }
-                       }
+                       if (src == stream->parent_source)
+                               _sound_stream_stop(stream);
                        guint size_after = g_hash_table_size(pool->streams);
                        if (size_before != size_after)
                                g_hash_table_iter_init(&iter, pool->streams);
index c088476..359a8b5 100644 (file)
@@ -99,6 +99,9 @@ static void __al_source_state_cb(ALuint source, ALenum state, ALvoid *data)
        SP_RETM_IF(_stream_cb_manager_register_event(pool->cbmgr, stream) !=
                        SOUND_POOL_ERROR_NONE, "State changing event wasn't registered."
                        "Callbacks will be not called");
+       if (stream->state == SOUND_POOL_STREAM_STATE_FINISHED
+               || stream->state == SOUND_POOL_STREAM_STATE_STOPPED)
+               _sound_stream_destroy(stream);
 
        SP_DEBUG_FLEAVE();
 }
index 53c53ca..42990af 100644 (file)
@@ -116,16 +116,12 @@ static gpointer __sound_pool_callback_isolator(gpointer user_data)
                                g_async_queue_try_pop(cbmgr->isolator_callback_queue))) {
 
                        sound_pool_t* _pool = cbmgr->pool;
-                       if (NULL != event_data->stream->state_cb_info.callback) {
-                               event_data->stream->state_cb_info.callback(_pool,
-                                               event_data->stream->id, event_data->state_previous,
+                       if (NULL != event_data->callback) {
+                               event_data->callback(_pool,
+                                               event_data->stream_id, event_data->state_previous,
                                                event_data->state,
-                                               event_data->stream->state_cb_info.user_data);
+                                               event_data->user_data);
                        }
-                       /* If SoundPool final state is FINISHED or STOPPED, then release item */
-                       if (event_data->state == SOUND_POOL_STREAM_STATE_FINISHED ||
-                                       event_data->state == SOUND_POOL_STREAM_STATE_STOPPED)
-                               _sound_stream_destroy(event_data->stream);
                        SP_SAFE_GFREE(event_data);
                }
                /* Signal indicating isolator callback thread completed the events */
@@ -277,7 +273,9 @@ sound_pool_error_e _stream_cb_manager_register_event(stream_cb_manager_t *cbmgr,
        SP_RETVM_IF(!(event_data = g_try_malloc0(sizeof(stream_cb_manager_event_data_t))),
                        SOUND_POOL_ERROR_OUT_OF_MEMORY,
                        "Memory alloc failure. Can't create stream callback event data structure.");
-       event_data->stream = stream;
+       event_data->stream_id = stream->id;
+       event_data->callback = stream->state_cb_info.callback;
+       event_data->user_data = stream->state_cb_info.user_data;
        event_data->state = stream->state;
        event_data->state_previous = stream->state_previous;