diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-11-08 05:28:47 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-11-08 05:28:47 +0000 |
commit | a45a413db3bdce126d5cb28ed49b776fdebb4b1d (patch) | |
tree | 444ea944312fd31b5524ee43f8cfc97e2884c6de /main/audiohook.c | |
parent | beabbf77e66fbdd59fdcb5e12dade8039fd0b683 (diff) |
improve linked-list macros in two ways:
- the *_CURRENT macros no longer need the list head pointer argument
- add AST_LIST_MOVE_CURRENT to encapsulate the remove/add operation when moving entries between lists
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@89106 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/audiohook.c')
-rw-r--r-- | main/audiohook.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/main/audiohook.c b/main/audiohook.c index d1dc6d0fd..4b7eacbca 100644 --- a/main/audiohook.c +++ b/main/audiohook.c @@ -346,35 +346,29 @@ int ast_audiohook_detach_list(struct ast_audiohook_list *audiohook_list) struct ast_audiohook *audiohook = NULL; /* Drop any spies */ - AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->spy_list, audiohook, list) { + while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->spy_list, list))) { ast_audiohook_lock(audiohook); - AST_LIST_REMOVE_CURRENT(&audiohook_list->spy_list, list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_cond_signal(&audiohook->trigger); ast_audiohook_unlock(audiohook); } - AST_LIST_TRAVERSE_SAFE_END /* Drop any whispering sources */ - AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->whisper_list, audiohook, list) { + while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->whisper_list, list))) { ast_audiohook_lock(audiohook); - AST_LIST_REMOVE_CURRENT(&audiohook_list->whisper_list, list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_cond_signal(&audiohook->trigger); ast_audiohook_unlock(audiohook); } - AST_LIST_TRAVERSE_SAFE_END /* Drop any manipulaters */ - AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { + while ((audiohook = AST_LIST_REMOVE_HEAD(&audiohook_list->manipulate_list, list))) { ast_audiohook_lock(audiohook); ast_mutex_lock(&audiohook->lock); - AST_LIST_REMOVE_CURRENT(&audiohook_list->manipulate_list, list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_audiohook_unlock(audiohook); audiohook->manipulate_callback(audiohook, NULL, NULL, 0); } - AST_LIST_TRAVERSE_SAFE_END /* Drop translation paths if present */ for (i = 0; i < 2; i++) { @@ -453,7 +447,7 @@ static struct ast_frame *dtmf_audiohook_write_list(struct ast_channel *chan, str AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { ast_audiohook_lock(audiohook); if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) { - AST_LIST_REMOVE_CURRENT(&audiohook_list->manipulate_list, list); + AST_LIST_REMOVE_CURRENT(list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_audiohook_unlock(audiohook); audiohook->manipulate_callback(audiohook, NULL, NULL, 0); @@ -463,7 +457,7 @@ static struct ast_frame *dtmf_audiohook_write_list(struct ast_channel *chan, str audiohook->manipulate_callback(audiohook, chan, frame, direction); ast_audiohook_unlock(audiohook); } - AST_LIST_TRAVERSE_SAFE_END + AST_LIST_TRAVERSE_SAFE_END; return frame; } @@ -500,7 +494,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->spy_list, audiohook, list) { ast_audiohook_lock(audiohook); if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) { - AST_LIST_REMOVE_CURRENT(&audiohook_list->spy_list, list); + AST_LIST_REMOVE_CURRENT(list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_cond_signal(&audiohook->trigger); ast_audiohook_unlock(audiohook); @@ -519,7 +513,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->whisper_list, audiohook, list) { ast_audiohook_lock(audiohook); if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) { - AST_LIST_REMOVE_CURRENT(&audiohook_list->whisper_list, list); + AST_LIST_REMOVE_CURRENT(list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_cond_signal(&audiohook->trigger); ast_audiohook_unlock(audiohook); @@ -544,7 +538,7 @@ static struct ast_frame *audio_audiohook_write_list(struct ast_channel *chan, st AST_LIST_TRAVERSE_SAFE_BEGIN(&audiohook_list->manipulate_list, audiohook, list) { ast_audiohook_lock(audiohook); if (audiohook->status != AST_AUDIOHOOK_STATUS_RUNNING) { - AST_LIST_REMOVE_CURRENT(&audiohook_list->manipulate_list, list); + AST_LIST_REMOVE_CURRENT(list); audiohook->status = AST_AUDIOHOOK_STATUS_DONE; ast_audiohook_unlock(audiohook); /* We basically drop all of our links to the manipulate audiohook and prod it to do it's own destructive things */ |