Wed Oct 28 13:31:46 2009

Asterisk developer's documentation


asterisk.h File Reference

Asterisk main include file. File version handling, generic pbx functions. More...

#include "asterisk/autoconfig.h"
#include "asterisk/compat.h"

Include dependency graph for asterisk.h:

Go to the source code of this file.

Defines

#define AST_DIR_MODE   0777
#define AST_FILE_MODE   0666
#define ASTERISK_FILE_VERSION(file, version)
 Register/unregister a source code file with the core.
#define bcopy   0x__dont_use_bcopy__use_memmove_instead()
#define bzero   0x__dont_use_bzero__use_memset_instead""
#define DEFAULT_LANGUAGE   "en"
#define DEFAULT_SAMPLE_RATE   8000
#define DEFAULT_SAMPLES_PER_MS   ((DEFAULT_SAMPLE_RATE)/1000)
#define sched_setscheduler   __PLEASE_USE_ast_set_priority_INSTEAD_OF_sched_setscheduler__
#define setpriority   __PLEASE_USE_ast_set_priority_INSTEAD_OF_setpriority__

Functions

int ast_add_profile (const char *, uint64_t scale)
 support for event profiling
char * ast_complete_source_filename (const char *partial, int n)
int ast_fd_init (void)
const char * ast_file_version_find (const char *file)
 Find version for given module name.
int64_t ast_mark (int, int start1_stop0)
int64_t ast_profile (int, int64_t)
int ast_register_atexit (void(*func)(void))
 Register a function to be executed before Asterisk exits.
void ast_register_file_version (const char *file, const char *version)
 Register the version of a source code file with the core.
int ast_set_priority (int)
 We set ourselves to a high priority, that we might pre-empt everything else. If your PBX has heavy activity on it, this is a good thing.
void ast_unregister_atexit (void(*func)(void))
 Unregister a function registered with ast_register_atexit().
void ast_unregister_file_version (const char *file)
 Unregister a source code file from the core.


Detailed Description

Asterisk main include file. File version handling, generic pbx functions.

Definition in file asterisk.h.


Define Documentation

#define AST_DIR_MODE   0777

Definition at line 33 of file asterisk.h.

#define AST_FILE_MODE   0666

#define ASTERISK_FILE_VERSION ( file,
version   ) 

Register/unregister a source code file with the core.

Parameters:
file the source file name
version the version string (typically a SVN revision keyword string)
This macro will place a file-scope constructor and destructor into the source of the module using it; this will cause the version of this file to registered with the Asterisk core (and unregistered) at the appropriate times.

Example:

 ASTERISK_FILE_VERSION(__FILE__, "\$Revision\$")

Note:
The dollar signs above have been protected with backslashes to keep SVN from modifying them in this file; under normal circumstances they would not be present and SVN would expand the Revision keyword into the file's revision number.

Definition at line 163 of file asterisk.h.

#define bcopy   0x__dont_use_bcopy__use_memmove_instead()

Definition at line 223 of file asterisk.h.

#define bzero   0x__dont_use_bzero__use_memset_instead""

Definition at line 222 of file asterisk.h.

#define DEFAULT_LANGUAGE   "en"

Definition at line 39 of file asterisk.h.

Referenced by fileexists_core().

#define DEFAULT_SAMPLE_RATE   8000

Definition at line 41 of file asterisk.h.

Referenced by check_header(), ogg_vorbis_open(), ogg_vorbis_rewrite(), setformat(), and write_header().

#define DEFAULT_SAMPLES_PER_MS   ((DEFAULT_SAMPLE_RATE)/1000)

Definition at line 42 of file asterisk.h.

Referenced by ast_stream_fastforward(), ast_stream_rewind(), and isAnsweringMachine().

#define sched_setscheduler   __PLEASE_USE_ast_set_priority_INSTEAD_OF_sched_setscheduler__

Definition at line 44 of file asterisk.h.

Referenced by ast_set_priority().

#define setpriority   __PLEASE_USE_ast_set_priority_INSTEAD_OF_setpriority__

Definition at line 43 of file asterisk.h.

Referenced by ast_set_priority().


Function Documentation

int ast_add_profile ( const char *  name,
uint64_t  scale 
)

support for event profiling

(note, this must be documented a lot more) ast_add_profile allocates a generic 'counter' with a given name, which can be shown with the command 'core show profile <name>'

The counter accumulates positive or negative values supplied by

See also:
ast_add_profile(), dividing them by the 'scale' value passed in the create call, and also counts the number of 'events'. Values can also be taked by the TSC counter on ia32 architectures, in which case you can mark the start of an event calling ast_mark(id, 1) and then the end of the event with ast_mark(id, 0). For non-i386 architectures, these two calls return 0.
support for event profiling

Returns:
Returns the identifier of the counter.

Definition at line 672 of file asterisk.c.

References ast_calloc, ast_realloc, ast_strdup, profile_data::e, profile_data::entries, profile_entry::events, profile_entry::mark, profile_data::max_size, profile_entry::name, prof_data, profile_entry::scale, and profile_entry::value.

Referenced by extension_match_core().

00673 {
00674    int l = sizeof(struct profile_data);
00675    int n = 10; /* default entries */
00676 
00677    if (prof_data == NULL) {
00678       prof_data = ast_calloc(1, l + n*sizeof(struct profile_entry));
00679       if (prof_data == NULL)
00680          return -1;
00681       prof_data->entries = 0;
00682       prof_data->max_size = n;
00683    }
00684    if (prof_data->entries >= prof_data->max_size) {
00685       void *p;
00686       n = prof_data->max_size + 20;
00687       p = ast_realloc(prof_data, l + n*sizeof(struct profile_entry));
00688       if (p == NULL)
00689          return -1;
00690       prof_data = p;
00691       prof_data->max_size = n;
00692    }
00693    n = prof_data->entries++;
00694    prof_data->e[n].name = ast_strdup(name);
00695    prof_data->e[n].value = 0;
00696    prof_data->e[n].events = 0;
00697    prof_data->e[n].mark = 0;
00698    prof_data->e[n].scale = scale;
00699    return n;
00700 }

char* ast_complete_source_filename ( const char *  partial,
int  n 
)

Definition at line 334 of file asterisk.c.

References AST_RWLIST_RDLOCK, AST_RWLIST_TRAVERSE, AST_RWLIST_UNLOCK, ast_strdup, file_version::file, len(), and ast_atexit::list.

Referenced by handle_verbose().

00335 {
00336    struct file_version *find;
00337    size_t len = strlen(partial);
00338    int count = 0;
00339    char *res = NULL;
00340 
00341    AST_RWLIST_RDLOCK(&file_versions);
00342    AST_RWLIST_TRAVERSE(&file_versions, find, list) {
00343       if (!strncasecmp(find->file, partial, len) && ++count > n) {
00344          res = ast_strdup(find->file);
00345          break;
00346       }
00347    }
00348    AST_RWLIST_UNLOCK(&file_versions);
00349    return res;
00350 }

int ast_fd_init ( void   ) 

Provided by astfd.c

Definition at line 270 of file astfd.c.

Referenced by main().

00271 {
00272    return 0;
00273 }

const char* ast_file_version_find ( const char *  file  ) 

Find version for given module name.

Parameters:
file Module name (i.e. chan_sip.so)
Returns:
version string or NULL if the module is not found

Definition at line 353 of file asterisk.c.

References AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, file_version::file, ast_atexit::list, and file_version::version.

Referenced by manager_modulecheck().

00354 {
00355    struct file_version *iterator;
00356 
00357    AST_RWLIST_WRLOCK(&file_versions);
00358    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&file_versions, iterator, list) {
00359       if (!strcasecmp(iterator->file, file))
00360          break;
00361    }
00362    AST_RWLIST_TRAVERSE_SAFE_END;
00363    AST_RWLIST_UNLOCK(&file_versions);
00364    if (iterator)
00365       return iterator->version;
00366    return NULL;
00367 }      

int64_t ast_mark ( int  ,
int  start1_stop0 
)

Definition at line 737 of file asterisk.c.

References profile_data::e, profile_data::entries, profile_entry::events, profile_entry::mark, prof_data, rdtsc(), profile_entry::scale, and profile_entry::value.

Referenced by extension_match_core().

00738 {
00739    if (!prof_data || i < 0 || i > prof_data->entries) /* invalid index */
00740       return 0;
00741    if (startstop == 1)
00742       prof_data->e[i].mark = rdtsc();
00743    else {
00744       prof_data->e[i].mark = (rdtsc() - prof_data->e[i].mark);
00745       if (prof_data->e[i].scale > 1)
00746          prof_data->e[i].mark /= prof_data->e[i].scale;
00747       prof_data->e[i].value += prof_data->e[i].mark;
00748       prof_data->e[i].events++;
00749    }
00750    return prof_data->e[i].mark;
00751 }

int64_t ast_profile ( int  ,
int64_t   
)

Definition at line 702 of file asterisk.c.

References profile_data::e, profile_data::entries, profile_entry::events, prof_data, profile_entry::scale, and profile_entry::value.

00703 {
00704    if (!prof_data || i < 0 || i > prof_data->entries) /* invalid index */
00705       return 0;
00706    if (prof_data->e[i].scale > 1)
00707       delta /= prof_data->e[i].scale;
00708    prof_data->e[i].value += delta;
00709    prof_data->e[i].events++;
00710    return prof_data->e[i].value;
00711 }

int ast_register_atexit ( void(*)(void)  func  ) 

Register a function to be executed before Asterisk exits.

Parameters:
func The callback function to use.
Return values:
0 on success.
-1 on error.

Definition at line 913 of file asterisk.c.

References ast_calloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_unregister_atexit(), ast_atexit::func, and ast_atexit::list.

Referenced by ast_cel_engine_init(), do_reload(), and load_module().

00914 {
00915    struct ast_atexit *ae;
00916 
00917    if (!(ae = ast_calloc(1, sizeof(*ae))))
00918       return -1;
00919 
00920    ae->func = func;
00921 
00922    ast_unregister_atexit(func);  
00923 
00924    AST_RWLIST_WRLOCK(&atexits);
00925    AST_RWLIST_INSERT_HEAD(&atexits, ae, list);
00926    AST_RWLIST_UNLOCK(&atexits);
00927 
00928    return 0;
00929 }

void ast_register_file_version ( const char *  file,
const char *  version 
)

Register the version of a source code file with the core.

Parameters:
file the source file name
version the version string (typically a SVN revision keyword string)
Returns:
nothing
This function should not be called directly, but instead the ASTERISK_FILE_VERSION macro should be used to register a file with the core.

Definition at line 295 of file asterisk.c.

References ast_calloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, ast_strdupa, ast_strip(), and ast_strip_quoted().

00296 {
00297    struct file_version *new;
00298    char *work;
00299    size_t version_length;
00300 
00301    work = ast_strdupa(version);
00302    work = ast_strip(ast_strip_quoted(work, "$", "$"));
00303    version_length = strlen(work) + 1;
00304    
00305    if (!(new = ast_calloc(1, sizeof(*new) + version_length)))
00306       return;
00307 
00308    new->file = file;
00309    new->version = (char *) new + sizeof(*new);
00310    memcpy(new->version, work, version_length);
00311    AST_RWLIST_WRLOCK(&file_versions);
00312    AST_RWLIST_INSERT_HEAD(&file_versions, new, list);
00313    AST_RWLIST_UNLOCK(&file_versions);
00314 }

int ast_set_priority ( int   ) 

We set ourselves to a high priority, that we might pre-empt everything else. If your PBX has heavy activity on it, this is a good thing.

Provided by asterisk.c

Definition at line 1503 of file asterisk.c.

References ast_log(), ast_verbose, LOG_WARNING, sched_setscheduler, and setpriority.

Referenced by app_exec(), ast_safe_system(), canary_thread(), icesencode(), launch_script(), main(), mp3play(), NBScatplay(), send_waveform_to_fd(), spawn_mp3(), and spawn_ras().

01504 {
01505    struct sched_param sched;
01506    memset(&sched, 0, sizeof(sched));
01507 #ifdef __linux__
01508    if (pri) {  
01509       sched.sched_priority = 10;
01510       if (sched_setscheduler(0, SCHED_RR, &sched)) {
01511          ast_log(LOG_WARNING, "Unable to set high priority\n");
01512          return -1;
01513       } else
01514          if (option_verbose)
01515             ast_verbose("Set to realtime thread\n");
01516    } else {
01517       sched.sched_priority = 0;
01518       /* According to the manpage, these parameters can never fail. */
01519       sched_setscheduler(0, SCHED_OTHER, &sched);
01520    }
01521 #else
01522    if (pri) {
01523       if (setpriority(PRIO_PROCESS, 0, -10) == -1) {
01524          ast_log(LOG_WARNING, "Unable to set high priority\n");
01525          return -1;
01526       } else
01527          if (option_verbose)
01528             ast_verbose("Set to high priority\n");
01529    } else {
01530       /* According to the manpage, these parameters can never fail. */
01531       setpriority(PRIO_PROCESS, 0, 0);
01532    }
01533 #endif
01534    return 0;
01535 }

void ast_unregister_atexit ( void(*)(void)  func  ) 

Unregister a function registered with ast_register_atexit().

Parameters:
func The callback function to unregister.

Definition at line 931 of file asterisk.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, free, ast_atexit::func, and ast_atexit::list.

Referenced by ast_register_atexit(), do_reload(), and unload_module().

00932 {
00933    struct ast_atexit *ae = NULL;
00934 
00935    AST_RWLIST_WRLOCK(&atexits);
00936    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&atexits, ae, list) {
00937       if (ae->func == func) {
00938          AST_RWLIST_REMOVE_CURRENT(list);
00939          break;
00940       }
00941    }
00942    AST_RWLIST_TRAVERSE_SAFE_END;
00943    AST_RWLIST_UNLOCK(&atexits);
00944 
00945    free(ae);
00946 }

void ast_unregister_file_version ( const char *  file  ) 

Unregister a source code file from the core.

Parameters:
file the source file name
Returns:
nothing
This function should not be called directly, but instead the ASTERISK_FILE_VERSION macro should be used to automatically unregister the file when the module is unloaded.

Definition at line 316 of file asterisk.c.

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, file_version::file, and ast_atexit::list.

00317 {
00318    struct file_version *find;
00319 
00320    AST_RWLIST_WRLOCK(&file_versions);
00321    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&file_versions, find, list) {
00322       if (!strcasecmp(find->file, file)) {
00323          AST_RWLIST_REMOVE_CURRENT(list);
00324          break;
00325       }
00326    }
00327    AST_RWLIST_TRAVERSE_SAFE_END;
00328    AST_RWLIST_UNLOCK(&file_versions);
00329 
00330    if (find)
00331       ast_free(find);
00332 }


Generated on Wed Oct 28 13:31:46 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6