Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
edb7f5d6
提交
edb7f5d6
authored
11月 19, 2007
作者:
Brian West
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
movin
git-svn-id:
http://svn.freeswitch.org/svn/freeswitch/trunk@6327
d0543943-73ff-0310-b7d9-9358b9ac24b2
上级
840208ff
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
0 行增加
和
324 行删除
+0
-324
Makefile
src/mod/languages/mod_mono/Makefile
+0
-42
mod_mono.c
src/mod/languages/mod_mono/mod_mono.c
+0
-282
没有找到文件。
src/mod/languages/mod_mono/Makefile
deleted
100644 → 0
浏览文件 @
840208ff
MONO
=
mono-1.2.3.1
MONO_DIR
=
$(switch_srcdir)
/libs/
$(MONO)
GLIB
=
glib-2.12.3
GLIB_DIR
=
$(switch_srcdir)
/libs/
$(GLIB)
GETTEXT
=
gettext-0.15
GETTEXT_DIR
=
$(switch_srcdir)
/libs/
$(GETTEXT)
PKGCONFIG
=
pkg-config-0.21
PKGCONFIG_DIR
=
$(switch_srcdir)
/libs/
$(PKGCONFIG)
LOCAL_CFLAGS
=
-w
`
$(PREFIX)
/bin/pkg-config
--cflags
mono
`
LOCAL_LDFLAGS
=
`
$(PREFIX)
/bin/pkg-config
--libs
mono
`
include
../../../../build/modmake.rules
DEFAULT_ARGS
=
--prefix
=
$(PREFIX)
--with-pic
MONO_ARGS
=
--with-preview
=
yes
--without-sigaltstack
--disable-mcs-build
MONO_CFLAGS
=
"-I
$(GLIB_DIR)
/glib -I
$(GLIB_DIR)
/gmodule -I
$(GLIB_DIR)
"
local_depend
:
$(GETTEXT_DIR) $(PKGCONFIG_DIR) $(GLIB_DIR) $(MONO_DIR)
$(GETTEXT_DIR)
:
$(GETLIB)
$(GETTEXT)
.tar.gz
cd
$(GETTEXT_DIR)
&&
./configure
$(DEFAULT_ARGS)
cd
$(GETTEXT_DIR)
&&
$(MAKE)
install
$(PKGCONFIG_DIR)
:
$(GETLIB)
$(PKGCONFIG)
.tar.gz
cd
$(PKGCONFIG_DIR)
&&
./configure
$(DEFAULT_ARGS)
cd
$(PKGCONFIG_DIR)
&&
$(MAKE)
install
$(GLIB_DIR)
:
$(GETLIB)
$(GLIB)
.tar.gz
export
PKG_CONFIG
=
$(PREFIX)
/bin/pkg-config
export
MSGFMT
=
$(PREFIX)
/bin/
cd
$(GLIB_DIR)
&&
./configure
$(DEFAULT_ARGS)
cd
$(GLIB_DIR)
&&
$(MAKE)
install
$(MONO_DIR)
:
$(GETLIB)
$(MONO)
.tar.gz
export
PATH
=
$(PATH)
:
$(PREFIX)
/bin/
cd
$(MONO_DIR)
&&
PKG_CONFIG_PATH
=
$(PREFIX)
/lib/pkgconfig
CFLAGS
=
$(MONO_CFLAGS)
top_builddir
=
"
$(switch_srcdir)
/libs/
$(MONO)
"
./configure
$(DEFAULT_ARGS)
$(MONO_ARGS)
cd
$(MONO_DIR)
&&
$(MAKE)
install
src/mod/languages/mod_mono/mod_mono.c
deleted
100644 → 0
浏览文件 @
840208ff
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2006, James Martelletti <james@nerdc0re.com>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
*
* The Initial Developer of the Original Code is
* James Martelletti <james@nerdc0re.com>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* James Martelletti <james@nerdc0re.com>
*
*
* mod_mono.c -- Embedded mono runtime.
*
*/
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/tokentype.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/image.h>
#include <mono/metadata/threads.h>
//#include <gc/gc.h>
#include <switch.h>
#define SWITCH_MONO_MODULES "mono/"
#define SWITCH_MONO_LIBDIR "lib/"
#define SWITCH_MONO_ASSEMBLY "FreeSwitch.dll"
/* Module functions */
switch_status_t
mod_mono_load_modules
(
const
char
*
module_dir
);
MonoClass
*
mod_mono_find_assembly_class
(
MonoImage
*
image
);
/* Managed functions */
void
mod_mono_switch_console_printf
(
switch_text_channel_t
channel
,
char
*
file
,
const
char
*
func
,
int
line
,
char
*
fmt
,
char
*
msg
);
SWITCH_MODULE_LOAD_FUNCTION
(
mod_mono_load
);
SWITCH_MODULE_SHUTDOWN_FUNCTION
(
mod_mono_shutdown
);
SWITCH_MODULE_DEFINITION
(
mod_mono
,
mod_mono_load
,
mod_mono_shutdown
,
NULL
);
static
switch_memory_pool_t
*
mono_pool
=
NULL
;
static
struct
{
MonoDomain
*
domain
;
switch_hash_t
*
plugins
;
}
globals
;
typedef
struct
{
MonoAssembly
*
assembly
;
MonoClass
*
class
;
MonoObject
*
object
;
}
mono_plugin
;
static
switch_loadable_module_interface_t
mono_module_interface
=
{
/*.module_name */
modname
,
};
/*
* Load mod_mono module and initialise domain
*
* This function will initialise the memory pool and plugin hash for this module,
* it will then initialise a new mono domain.
*/
SWITCH_MODULE_LOAD_FUNCTION
(
mod_mono_load
)
{
*
module_interface
=
mono_module_interface
;
/* Initialise memory pool */
if
(
switch_core_new_memory_pool
(
&
mono_pool
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Could not allocate memory pool
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
/* Initialise plugin hash */
if
(
switch_core_hash_init
(
&
globals
.
plugins
,
mono_pool
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Could not initialise plugins hash
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
/* Construct the path to the FreeSwitch assembly, then check to make sure it exists */
switch_size_t
assembly_dir_len
=
strlen
(
SWITCH_GLOBAL_dirs
.
base_dir
)
+
strlen
(
SWITCH_MONO_LIBDIR
)
+
2
;
/* Account for / and \0 */
switch_size_t
assembly_file_len
=
assembly_dir_len
+
strlen
(
SWITCH_MONO_ASSEMBLY
);
char
*
assembly_dir
=
(
char
*
)
switch_core_alloc
(
mono_pool
,
assembly_dir_len
);
char
*
assembly_file
=
(
char
*
)
switch_core_alloc
(
mono_pool
,
assembly_file_len
);
snprintf
(
assembly_dir
,
assembly_dir_len
,
"%s%s%s"
,
SWITCH_GLOBAL_dirs
.
base_dir
,
SWITCH_PATH_SEPARATOR
,
SWITCH_MONO_LIBDIR
);
snprintf
(
assembly_file
,
assembly_file_len
,
"%s%s%s%s"
,
SWITCH_GLOBAL_dirs
.
base_dir
,
SWITCH_PATH_SEPARATOR
,
SWITCH_MONO_LIBDIR
,
SWITCH_MONO_ASSEMBLY
);
if
(
switch_file_exists
(
assembly_file
,
mono_pool
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Could not find FreeSwitch.NET assembly
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
/* Mono wants to know where it will be able to find the FreeSwitch assembly if it's not in the GAC */
if
(
getenv
(
"MONO_PATH"
)
!=
NULL
)
{
switch_size_t
mono_path_len
=
strlen
(
getenv
(
"MONO_PATH"
))
+
strlen
(
assembly_dir
)
+
2
;
/* Account for : and \0 */
char
*
mono_path
=
(
char
*
)
switch_core_alloc
(
mono_pool
,
mono_path_len
);
snprintf
(
mono_path
,
mono_path_len
,
"%s:%s"
,
getenv
(
"MONO_PATH"
),
assembly_dir
);
setenv
(
"MONO_PATH"
,
mono_path
,
1
);
}
else
setenv
(
"MONO_PATH"
,
assembly_dir
,
1
);
/* Now find where our managed modules are */
switch_size_t
module_dir_len
=
strlen
(
SWITCH_GLOBAL_dirs
.
mod_dir
)
+
strlen
(
SWITCH_MONO_MODULES
)
+
2
;
/* Account for / and \0 */
char
*
module_dir
=
(
char
*
)
switch_core_alloc
(
mono_pool
,
module_dir_len
);
snprintf
(
module_dir
,
module_dir_len
,
"%s%s%s"
,
SWITCH_GLOBAL_dirs
.
mod_dir
,
SWITCH_PATH_SEPARATOR
,
SWITCH_MONO_MODULES
);
/* Initialise the mono domain */
if
(
!
(
globals
.
domain
=
mono_jit_init
(
"freeswitch"
)))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Error initialising mono runtime
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
/* Let user know everything initialised fine */
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Initialised mono runtime
\n
"
);
/* Load our modules */
if
(
mod_mono_load_modules
(
module_dir
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Error loading modules
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
/* Finally, go through and initialise each plugin before returning SUCCESS */
switch_hash_index_t
*
p
=
NULL
;
for
(
p
=
switch_hash_first
(
NULL
,
globals
.
plugins
);
p
;
p
=
switch_hash_next
(
p
))
{
mono_plugin
*
plugin
=
(
mono_plugin
*
)
switch_core_alloc
(
mono_pool
,
sizeof
(
*
plugin
));
switch_ssize_t
*
key_length
=
NULL
;
const
void
*
key
=
NULL
;
void
*
value
=
NULL
;
switch_hash_this
(
p
,
&
key
,
key_length
,
&
value
);
plugin
=
(
mono_plugin
*
)
value
;
mono_runtime_object_init
(
plugin
->
object
);
}
return
SWITCH_STATUS_SUCCESS
;
}
/*
* Function for cleanly shutting down mod_mono
*
*/
SWITCH_MODULE_SHUTDOWN_FUNCTION
(
mod_mono_shutdown
)
{
if
(
globals
.
domain
)
{
mono_jit_cleanup
(
globals
.
domain
);
globals
.
domain
=
NULL
;
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Deallocated mono runtime.
\n
"
);
}
switch_core_hash_destroy
(
&
globals
.
plugins
);
return
SWITCH_STATUS_SUCCESS
;
}
/*
* This function will load the managed modules
*
*/
switch_status_t
mod_mono_load_modules
(
const
char
*
module_dir
)
{
if
(
switch_file_exists
(
module_dir
,
mono_pool
)
!=
SWITCH_STATUS_SUCCESS
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Could not access module dir!.
\n
"
);
return
SWITCH_STATUS_FALSE
;
}
switch_dir_t
*
module_dir_handle
;
char
*
file
;
size_t
len
;
const
char
*
ext
=
".dll"
;
const
char
*
EXT
=
".DLL"
;
MonoAssembly
*
assembly
;
MonoImage
*
image
;
gpointer
iter
;
iter
=
NULL
;
mono_plugin
*
plugin
=
NULL
;
const
char
*
fname
=
NULL
;
char
buf
[
512
]
=
""
;
if
(
switch_dir_open
(
&
module_dir_handle
,
module_dir
,
mono_pool
)
!=
SWITCH_STATUS_SUCCESS
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Could not open directory: %s
\n
"
,
module_dir
);
/* Read the modules directory */
while
((
fname
=
switch_dir_next_file
(
module_dir_handle
,
buf
,
sizeof
(
buf
))))
{
assembly
=
(
MonoAssembly
*
)
switch_core_alloc
(
mono_pool
,
sizeof
(
assembly
));
image
=
(
MonoImage
*
)
switch_core_alloc
(
mono_pool
,
sizeof
(
image
));
if
(
!
strstr
(
fname
,
ext
)
&&
!
strstr
(
fname
,
EXT
))
continue
;
len
=
strlen
(
module_dir
)
+
strlen
(
fname
)
+
2
;
file
=
(
char
*
)
switch_core_alloc
(
mono_pool
,
len
);
snprintf
(
file
,
len
,
"%s%s"
,
module_dir
,
fname
);
/* Attempt to open the assembly */
assembly
=
mono_domain_assembly_open
(
globals
.
domain
,
file
);
if
(
!
assembly
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Not a valid assembly
\n
"
);
continue
;
}
/* Get the image from assembly */
image
=
mono_assembly_get_image
(
assembly
);
plugin
=
(
mono_plugin
*
)
switch_core_alloc
(
mono_pool
,
sizeof
(
*
plugin
));
plugin
->
assembly
=
assembly
;
plugin
->
class
=
mod_mono_find_assembly_class
(
mono_assembly_get_image
(
plugin
->
assembly
));
if
(
!
plugin
->
class
)
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"No plugin class
\n
"
);
plugin
->
object
=
mono_object_new
(
globals
.
domain
,
plugin
->
class
);
switch_core_hash_insert
(
globals
.
plugins
,
(
char
*
)
mono_image_get_name
(
mono_assembly_get_image
(
assembly
)),
plugin
);
plugin
=
NULL
;
}
return
SWITCH_STATUS_SUCCESS
;
}
/*
*
*/
MonoClass
*
mod_mono_find_assembly_class
(
MonoImage
*
image
)
{
MonoClass
*
class
,
*
parent_class
=
NULL
;
int
i
,
total
;
total
=
mono_image_get_table_rows
(
image
,
MONO_TABLE_TYPEDEF
);
for
(
i
=
1
;
i
<=
total
;
++
i
)
{
class
=
mono_class_get
(
image
,
MONO_TOKEN_TYPE_DEF
|
i
);
parent_class
=
mono_class_get_parent
(
class
);
if
(
parent_class
)
if
(
!
strcmp
(
"Module"
,
mono_class_get_name
(
parent_class
)))
return
class
;
}
return
NULL
;
}
/*
*
*/
void
mono_switch_console_printf
(
switch_text_channel_t
channel
,
char
*
file
,
const
char
*
func
,
int
line
,
char
*
fmt
,
char
*
msg
)
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
msg
);
}
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:nil
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
*/
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论