Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

autoservice.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <math.h>
#include <asterisk/pbx.h>
#include <asterisk/frame.h>
#include <asterisk/sched.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>
#include <asterisk/logger.h>
#include <asterisk/file.h>
#include <asterisk/translate.h>
#include <asterisk/manager.h>
#include <asterisk/chanvars.h>
#include <asterisk/linkedlists.h>
#include <asterisk/indications.h>

Go to the source code of this file.

Data Structures

struct  asent

Defines

#define MAX_AUTOMONS   256

Functions

int ast_autoservice_start (struct ast_channel *chan)
int ast_autoservice_stop (struct ast_channel *chan)


Define Documentation

#define MAX_AUTOMONS   256
 

Definition at line 37 of file autoservice.c.


Function Documentation

int ast_autoservice_start struct ast_channel chan  ) 
 

Automatically service a channel for us...

Definition at line 87 of file autoservice.c.

References ast_log(), ast_mutex_lock, ast_mutex_unlock, free, LOG_WARNING, malloc, asent::next, and ast_channel::next.

Referenced by ast_get_enum(), ast_get_srv(), and ast_rtp_bridge().

00088 {
00089    int res = -1;
00090    struct asent *as;
00091    int needstart;
00092    ast_mutex_lock(&autolock);
00093    needstart = (asthread == (pthread_t) -1) ? 1 : 0 /* aslist ? 0 : 1 */;
00094    as = aslist;
00095    while(as) {
00096       if (as->chan == chan)
00097          break;
00098       as = as->next;
00099    }
00100    if (!as) {
00101       as = malloc(sizeof(struct asent));
00102       if (as) {
00103          memset(as, 0, sizeof(struct asent));
00104          as->chan = chan;
00105          as->next = aslist;
00106          aslist = as;
00107          res = 0;
00108          if (needstart) {
00109             if (pthread_create(&asthread, NULL, autoservice_run, NULL)) {
00110                ast_log(LOG_WARNING, "Unable to create autoservice thread :(\n");
00111                free(aslist);
00112                aslist = NULL;
00113                res = -1;
00114             } else
00115                pthread_kill(asthread, SIGURG);
00116          }
00117       }
00118    }
00119    ast_mutex_unlock(&autolock);
00120    return res;
00121 }

int ast_autoservice_stop struct ast_channel chan  ) 
 

Stop servicing a channel for us... Returns -1 on error or if channel has been hungup

Definition at line 123 of file autoservice.c.

References ast_channel::_softhangup, ast_mutex_lock, ast_mutex_unlock, ast_channel::blocking, free, and asent::next.

Referenced by ast_get_enum(), ast_get_srv(), and ast_rtp_bridge().

00124 {
00125    int res = -1;
00126    struct asent *as, *prev;
00127    ast_mutex_lock(&autolock);
00128    as = aslist;
00129    prev = NULL;
00130    while(as) {
00131       if (as->chan == chan)
00132          break;
00133       prev = as;
00134       as = as->next;
00135    }
00136    if (as) {
00137       if (prev)
00138          prev->next = as->next;
00139       else
00140          aslist = as->next;
00141       free(as);
00142       if (!chan->_softhangup)
00143          res = 0;
00144    }
00145    if (asthread != (pthread_t) -1) 
00146       pthread_kill(asthread, SIGURG);
00147    ast_mutex_unlock(&autolock);
00148    /* Wait for it to un-block */
00149    while(chan->blocking)
00150       usleep(1000);
00151    return res;
00152 }


Generated on Fri Oct 31 07:05:09 2003 for Asterisk by doxygen 1.3.4