mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-09 01:06:00 +00:00
102 lines
2.2 KiB
C
102 lines
2.2 KiB
C
|
/*=============================================================================
|
||
|
The functions handle static stuff -- the functions do not operate on
|
||
|
any particular Abyss object, but rather on the global environment of
|
||
|
the program that uses the Abyss library. abyssInit() is essentially
|
||
|
and extension of the program loader.
|
||
|
|
||
|
The intent is for any program that uses the Abyss library to call
|
||
|
AbyssInit() just as it starts up, and AbyssTerm() just as it exits.
|
||
|
It should do both when the program is only one thread, because they
|
||
|
are not thread-safe.
|
||
|
|
||
|
These functions do the bare minimum they can get away with; we prefer
|
||
|
context to be local to invidual objects.
|
||
|
=============================================================================*/
|
||
|
|
||
|
#include <assert.h>
|
||
|
|
||
|
#include "xmlrpc-c/string_int.h"
|
||
|
|
||
|
#include "chanswitch.h"
|
||
|
#include "channel.h"
|
||
|
|
||
|
#include "xmlrpc-c/abyss.h"
|
||
|
|
||
|
|
||
|
static unsigned int AbyssInitCount = 0;
|
||
|
|
||
|
static void
|
||
|
initAbyss(const char ** const errorP) {
|
||
|
|
||
|
const char * error;
|
||
|
|
||
|
DateInit();
|
||
|
MIMETypeInit();
|
||
|
|
||
|
ChanSwitchInit(&error);
|
||
|
|
||
|
if (error) {
|
||
|
xmlrpc_asprintf(errorP,
|
||
|
"Could not initialize channel swtich class. %s",
|
||
|
error);
|
||
|
|
||
|
xmlrpc_strfree(error);
|
||
|
} else {
|
||
|
const char * error;
|
||
|
ChannelInit(&error);
|
||
|
|
||
|
if (error) {
|
||
|
xmlrpc_asprintf(errorP, "Could not initialize Channel class. %s",
|
||
|
error);
|
||
|
|
||
|
xmlrpc_strfree(error);
|
||
|
} else {
|
||
|
AbyssInitCount = 1;
|
||
|
*errorP = NULL;
|
||
|
|
||
|
if (*errorP)
|
||
|
ChannelTerm();
|
||
|
}
|
||
|
if (*errorP)
|
||
|
ChanSwitchTerm();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
AbyssInit(const char ** const errorP) {
|
||
|
|
||
|
if (AbyssInitCount > 0) {
|
||
|
*errorP = NULL;
|
||
|
++AbyssInitCount;
|
||
|
} else {
|
||
|
initAbyss(errorP);
|
||
|
if (!*errorP)
|
||
|
AbyssInitCount = 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static void
|
||
|
termAbyss(void) {
|
||
|
|
||
|
ChannelTerm();
|
||
|
ChanSwitchTerm();
|
||
|
MIMETypeTerm();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void
|
||
|
AbyssTerm(void) {
|
||
|
|
||
|
assert(AbyssInitCount > 0);
|
||
|
|
||
|
--AbyssInitCount;
|
||
|
|
||
|
if (AbyssInitCount == 0)
|
||
|
termAbyss();
|
||
|
}
|