From cd283c8825c9a94400f27735acb1c9385e90ffc8 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 19 Jul 2011 03:42:28 +0000 Subject: Re #1326: Initial code integration from branch 2.0-dev to trunk as "2.0-pre-alpha-svn". git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3664 74dad513-b988-da41-8d7b-12977e46ad98 --- pjlib/src/pj/os_core_darwin.m | 86 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 pjlib/src/pj/os_core_darwin.m (limited to 'pjlib/src/pj/os_core_darwin.m') diff --git a/pjlib/src/pj/os_core_darwin.m b/pjlib/src/pj/os_core_darwin.m new file mode 100644 index 00000000..686d64be --- /dev/null +++ b/pjlib/src/pj/os_core_darwin.m @@ -0,0 +1,86 @@ +/* $Id$ */ +/* + * Copyright (C) 2011-2011 Teluu Inc. (http://www.teluu.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include + +#define THIS_FILE "os_core_darwin.m" + +typedef struct run_app_t { + pj_main_func_ptr main_func; + int argc; + char **argv; + int retval; +} run_app_t; + +@interface DeadThread: NSObject { ;; } ++ (void)enterMultiThreadedMode; ++ (void)emptyThreadMethod:(id)obj; +@end + +@implementation DeadThread ++ (void)enterMultiThreadedMode +{ + [NSThread detachNewThreadSelector:@selector(emptyThreadMethod:) + toTarget:[DeadThread class] withObject:nil]; +} + ++ (void)emptyThreadMethod:(id)obj { ; } +@end + +static void* main_thread(void *data) +{ + run_app_t *param = (run_app_t *)data; + + param->retval = (*param->main_func)(param->argc, param->argv); + CFRunLoopStop(CFRunLoopGetMain()); + + return NULL; +} + +/* + * pj_run_app() + * This function has to be called from the main thread. The purpose of + * this function is to initialize the application's memory pool, event + * loop management, and multi-threading environment. + */ +PJ_DEF(int) pj_run_app(pj_main_func_ptr main_func, int argc, char *argv[], + unsigned flags) +{ + pthread_t thread; + run_app_t param; + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + [NSApplication sharedApplication]; + [DeadThread enterMultiThreadedMode]; + + param.argc = argc; + param.argv = (char **)argv; + param.main_func = main_func; + if (pthread_create(&thread, NULL, &main_thread, ¶m) == 0) { + CFRunLoopRun(); + } + + PJ_UNUSED_ARG(pool); + + return param.retval; +} -- cgit v1.2.3