]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Dial API: add self destruct option when complete
authorScott Griepentrog <sgriepentrog@digium.com>
Thu, 26 Feb 2015 18:52:56 +0000 (18:52 +0000)
committerScott Griepentrog <sgriepentrog@digium.com>
Thu, 26 Feb 2015 18:52:56 +0000 (18:52 +0000)
This patch adds a self-destruction option to the
dial api.  The usefulness of this is mostly when
using async mode to spawn a separate thread used
to handle the new call, while the calling thread
is allowed to go on about other business.

The only alternative to this option would be the
calling thread spawning a new thread, or hanging
around itself waiting to destroy the dial struct
after completion.

Example of use (minus error checking):

  struct ast_dial *dial = ast_dial_create();

  ast_dial_append(dial, "PJSIP", "200", NULL);

  ast_dial_option_global_enable(dial, AST_DIAL_OPTION_ANSWER_EXEC, "Echo");
  ast_dial_option_global_enable(dial, AST_DIAL_OPTION_SELF_DESTROY, NULL);

  ast_dial_run(dial, NULL, 1);

The dial_run call will return almost immediately
after spawning the new thread to run and monitor
the dial.  If the call is answered, it is placed
into the echo app.  When completed, it will call
ast_dial_destroy() on the dial structure.

Note that any allocations made to pass values to
ast_dial_set_user_data() or dial options must be
free'd in a state callback function on any of:
  AST_DIAL_RESULT_UNASWERED,
  AST_DIAL_RESULT_ANSWERED,
  AST_DIAL_RESULT_HANGUP, or
  AST_DIAL_RESULT_TIMEOUT.

Review: https://reviewboard.asterisk.org/r/4443/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@432385 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/dial.h
main/dial.c

index ab92198116ecf7e2bc7a08c92478f3d4b9773113..c59257ce5b367d680a26f46813f4b6d5150d2057 100644 (file)
@@ -46,6 +46,7 @@ enum ast_dial_option {
        AST_DIAL_OPTION_DISABLE_CALL_FORWARDING, /*!< Disable call forwarding on channels */
        AST_DIAL_OPTION_PREDIAL,                 /*!< Execute a predial subroutine before dialing */
        AST_DIAL_OPTION_DIAL_REPLACES_SELF,      /*!< The dial operation is a replacement for the requester */
+       AST_DIAL_OPTION_SELF_DESTROY,            /*!< Destroy self at end of ast_dial_run */
        AST_DIAL_OPTION_MAX,                     /*!< End terminator -- must always remain last */
 };
 
index a27ac5b59792d27f9cb6312a73ee91c9fa91c3af..827b5ef2348f9d75d64452f8859488c57a28f89f 100644 (file)
@@ -206,6 +206,7 @@ static const struct ast_option_types option_types[] = {
        { AST_DIAL_OPTION_DISABLE_CALL_FORWARDING, NULL, NULL },                  /*!< Disable call forwarding on channels */
        { AST_DIAL_OPTION_PREDIAL, predial_enable, predial_disable },             /*!< Execute a subroutine on the outbound channels prior to dialing */
        { AST_DIAL_OPTION_DIAL_REPLACES_SELF, NULL, NULL },                       /*!< The dial operation is a replacement for the requester */
+       { AST_DIAL_OPTION_SELF_DESTROY, NULL, NULL},                              /*!< Destroy self at end of ast_dial_run */
        { AST_DIAL_OPTION_MAX, NULL, NULL },                                      /*!< Terminator of list */
 };
 
@@ -889,6 +890,13 @@ static enum ast_dial_result monitor_dial(struct ast_dial *dial, struct ast_chann
                AST_LIST_UNLOCK(&dial->channels);
        }
 
+       if (dial->options[AST_DIAL_OPTION_SELF_DESTROY]) {
+               enum ast_dial_result state = dial->state;
+
+               ast_dial_destroy(dial);
+               return state;
+       }
+
        return dial->state;
 }