Bug 825785 Signaling - monitor threads for shutdown r=jesup

This commit is contained in:
Ethan Hugg 2013-01-03 19:12:28 -08:00
parent 19aa0823f3
commit 86f510779d
9 changed files with 253 additions and 75 deletions

View File

@ -14,7 +14,7 @@
},
'targets': [
#
# ECC
#
@ -53,8 +53,8 @@
'../../../netwerk/srtp/src/include',
'../../../netwerk/srtp/src/crypto/include',
'../../../ipc/chromium/src',
],
],
#
# DEPENDENCIES
#
@ -63,13 +63,13 @@
'export_dependent_settings': [
],
#
# SOURCES
#
'sources': [
# Media Conduit
# Media Conduit
'./src/media-conduit/AudioConduit.h',
'./src/media-conduit/AudioConduit.cpp',
'./src/media-conduit/VideoConduit.h',
@ -143,15 +143,15 @@
'./src/mediapipeline/SrtpFlow.h',
'./src/mediapipeline/SrtpFlow.cpp',
],
#
# DEFINES
#
'defines' : [
'LOG4CXX_STATIC',
'_NO_LOG4CXX',
'USE_SSLEAY',
'LOG4CXX_STATIC',
'_NO_LOG4CXX',
'USE_SSLEAY',
'_CPR_USE_EXTERNAL_LOGGER',
'WEBRTC_RELATIVE_PATH',
'HAVE_WEBRTC_VIDEO',
@ -177,7 +177,7 @@
'defines' : [
'MOZILLA_INTERNAL_API'
],
}],
}],
['build_for_test!=0', {
'include_dirs': [
'./test'
@ -186,7 +186,7 @@
'NO_CHROMIUM_LOGGING',
'USE_FAKE_MEDIA_STREAMS'
],
}],
}],
['(OS=="linux") or (OS=="android")', {
'include_dirs': [
],
@ -194,26 +194,26 @@
'defines': [
'SIP_OS_LINUX',
'_GNU_SOURCE',
'LINUX',
'GIPS_VER=3510',
'LINUX',
'GIPS_VER=3510',
'SECLIB_OPENSSL',
],
'cflags_mozilla': [
],
}],
['OS=="win"', {
'include_dirs': [
],
],
'defines': [
'SIP_OS_WINDOWS',
'WIN32',
'WIN32',
'GIPS_VER=3480',
'SIPCC_BUILD',
'HAVE_WINSOCK2_H',
'CPR_STDINT_INCLUDE=\\"mozilla/StandardInteger.h\\"'
],
'cflags_mozilla': [
],
}],
@ -222,23 +222,23 @@
],
'defines': [
'SIP_OS_OSX',
'OSX',
'OSX',
'_FORTIFY_SOURCE=2',
],
'cflags_mozilla': [
],
}],
],
},
#
# SIPCC
#
{
'target_name': 'sipcc',
'type': 'static_library',
#
# INCLUDES
#
@ -261,18 +261,18 @@
# Danger: this is to include config.h. This could be bad.
'../trunk/third_party/libsrtp/config',
],
#
# DEPENDENCIES
#
'dependencies': [
],
'export_dependent_settings': [
],
#
# SOURCES
#
@ -280,7 +280,7 @@
# CCAPP
'./src/sipcc/core/ccapp/call_logger.c',
'./src/sipcc/core/ccapp/call_logger.h',
'./src/sipcc/core/ccapp/capability_set.c',
'./src/sipcc/core/ccapp/capability_set.c',
'./src/sipcc/core/ccapp/capability_set.h',
'./src/sipcc/core/ccapp/cc_blf.c',
'./src/sipcc/core/ccapp/cc_call_feature.c',
@ -332,6 +332,8 @@
'./src/sipcc/core/common/subscription_handler.h',
'./src/sipcc/core/common/text_strings.c',
'./src/sipcc/core/common/text_strings.h',
'./src/sipcc/core/common/thread_monitor.h',
'./src/sipcc/core/common/thread_monitor.c',
'./src/sipcc/core/common/ui.c',
# GSM
'./src/sipcc/core/gsm/ccapi.c',
@ -567,7 +569,7 @@
# PLAT
'./src/sipcc/plat/csf2g/model.c',
'./src/sipcc/plat/csf2g/reset_api.c',
#
#
# './src/sipcc/plat/common/plat_debug.h',
# './src/sipcc/plat/common/tnp_blf.h',
@ -580,7 +582,7 @@
#
# DEFINES
#
'defines' : [
# CPR timers are needed by SIP, but are disabled for now
# to avoid the extra timer thread and stale cleanup code
@ -694,18 +696,18 @@
['OS=="win"', {
'include_dirs': [
],
'sources': [
# SIPSTACK
'./src/sipcc/core/sipstack/sip_platform_win32_task.c',
# PLAT
'./src/sipcc/plat/win32/dns_utils.c',
'./src/sipcc/plat/win32/mystub.c',
'./src/sipcc/plat/win32/plat_api_stub.c',
'./src/sipcc/plat/win32/plat_api_win.c',
'./src/sipcc/plat/win32/StdAfx.h',
# CPR
'./src/sipcc/cpr/win32/cpr_win_assert.h',
'./src/sipcc/cpr/win32/cpr_win_debug.c',
@ -735,36 +737,36 @@
'./src/sipcc/cpr/win32/cpr_win_types.h',
],
'defines' : [
'SIP_OS_WINDOWS',
'WIN32',
'WIN32',
'SIPCC_BUILD',
'SDP_WIN32',
'STUBBED_OUT',
'EXTERNAL_TICK_REQUIRED',
'GIPS_VER=3480',
],
'cflags_mozilla': [
],
}],
['OS=="mac"', {
'include_dirs': [
],
'sources': [
# SIPSTACK
'./src/sipcc/core/sipstack/sip_platform_task.c',
# PLAT
'./src/sipcc/plat/common/dns_utils.c',
#'./src/sipcc/plat/darwin/netif.c',
'./src/sipcc/plat/darwin/plat_api_stub.c',
#'./src/sipcc/plat/unix-common/random.c',
# CPR
'./src/sipcc/cpr/darwin/cpr_darwin_assert.h',
'./src/sipcc/cpr/darwin/cpr_darwin_errno.c',
@ -791,7 +793,7 @@
'./src/sipcc/cpr/darwin/cpr_darwin_tst.h',
'./src/sipcc/cpr/darwin/cpr_darwin_types.h',
],
'defines' : [
'SIP_OS_OSX',
@ -805,12 +807,12 @@
'_DARWIN_C_SOURCE',
'NO_NSPR_10_SUPPORT',
],
'cflags_mozilla': [
],
}],
],
},
],
}

View File

@ -21,6 +21,8 @@
#include "misc_apps_task.h"
#include "plat_api.h"
#include "ccapp_task.h"
#include "thread_monitor.h"
#include "mozilla/Assertions.h"
#include "phone_platform_constants.h"
/** The following defines are used to tune the total memory that pSIPCC
@ -266,7 +268,10 @@ thread_init ()
ccapp_thread = cprCreateThread("CCAPP Task",
(cprThreadStartRoutine) CCApp_task,
GSMSTKSZ, CCPROVIDER_THREAD_RELATIVE_PRIORITY /* pri */, ccapp_msgq);
if (ccapp_thread == NULL) {
MOZ_ASSERT(ccapp_thread);
if (ccapp_thread) {
thread_started(THREADMON_CCAPP, ccapp_thread);
} else {
err_msg("failed to create CCAPP task \n");
}
@ -286,7 +291,10 @@ thread_init ()
sip_thread = cprCreateThread("SIPStack task",
(cprThreadStartRoutine) sip_platform_task_loop,
STKSZ, SIP_THREAD_RELATIVE_PRIORITY /* pri */, sip_msgq);
if (sip_thread == NULL) {
MOZ_ASSERT(sip_thread);
if (sip_thread) {
thread_started(THREADMON_SIP, sip_thread);
} else {
err_msg("failed to create sip task \n");
}
@ -296,7 +304,10 @@ thread_init ()
(cprThreadStartRoutine)
sip_platform_task_msgqwait,
STKSZ, SIP_THREAD_RELATIVE_PRIORITY /* pri */, sip_msgq);
if (sip_msgqwait_thread == NULL) {
MOZ_ASSERT(sip_msgqwait_thread);
if (sip_msgqwait_thread) {
thread_started(THREADMON_MSGQ, sip_msgqwait_thread);
} else {
err_msg("failed to create sip message queue wait task\n");
}
#endif
@ -304,7 +315,10 @@ thread_init ()
gsm_thread = cprCreateThread("GSM Task",
(cprThreadStartRoutine) GSMTask,
GSMSTKSZ, GSM_THREAD_RELATIVE_PRIORITY /* pri */, gsm_msgq);
if (gsm_thread == NULL) {
MOZ_ASSERT(gsm_thread);
if (gsm_thread) {
thread_started(THREADMON_GSM, gsm_thread);
} else {
err_msg("failed to create gsm task \n");
}
@ -569,8 +583,11 @@ ccUnload (void)
send_task_unload_msg(CC_SRC_CCAPP);
cprSleep(200);
gStopTickTask = TRUE;
/*
* Here we are waiting until all threads that were started exit.
*/
join_all_threads();
}

View File

@ -0,0 +1,51 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "cpr_types.h"
#include "cpr_stdlib.h"
#include "thread_monitor.h"
#include "prtypes.h"
#include "mozilla/Assertions.h"
/*
* If thread is running, should have a non-zero entry here that is the threadId
*/
static cprThread_t thread_list[THREADMON_MAX];
/*
* thread_started
*
* Should be called exactly once for each thread created.
*
* @param[in] monitor_id - enum of which thread created
* @param[in] thread - created thread
*/
void thread_started(thread_monitor_id_t monitor_id, cprThread_t thread) {
MOZ_ASSERT(monitor_id < THREADMON_MAX);
if (monitor_id >= THREADMON_MAX) {
return;
}
/* Should not already be started */
MOZ_ASSERT(thread_list[monitor_id] == NULL);
thread_list[monitor_id] = thread;
}
/*
* join_all_threads
*
* Join all threads that were started.
*/
void join_all_threads() {
int i;
for (i = 0; i < THREADMON_MAX; i++) {
if (thread_list[i] != NULL) {
cprJoinThread(thread_list[i]);
cpr_free(thread_list[i]);
thread_list[i] = NULL;
}
}
}

View File

@ -0,0 +1,40 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef THREAD_MONITOR_H_
#define THREAD_MONITOR_H_
#include "cpr_threads.h"
/*
* This should be a list of threads that could be created by SIPCC
* On Windows, the MSGQ thread is not started.
*/
typedef enum {
THREADMON_CCAPP,
THREADMON_SIP,
THREADMON_MSGQ,
THREADMON_GSM,
THREADMON_MAX
} thread_monitor_id_t;
/*
* thread_started
*
* Should be called exactly once for each thread created.
*
* @param[in] monitor_id - enum of which thread created
* @param[in] thread - created thread
*/
void thread_started(thread_monitor_id_t monitor_id, cprThread_t thread);
/*
* join_all_threads
*
* Join all threads that were started.
*/
void join_all_threads();
#endif

View File

@ -9,6 +9,9 @@
#include <errno.h>
#include <unistd.h>
#include <sys/resource.h>
#include "thread_monitor.h"
#include "prtypes.h"
#include "mozilla/Assertions.h"
#define ANDROID_MIN_THREAD_PRIORITY (-20) /* tbd: check MV linux: current val from Larry port */
#define ANDROID_MAX_THREAD_PRIORITY (+19) /* tbd: check MV linux. current val from Larry port */
@ -99,6 +102,19 @@ cprCreateThread (const char *name,
return (cprThread_t)NULL;
}
/*
* cprJoinThread
*
* wait for thread termination
*/
void cprJoinThread(cprThread_t thread)
{
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
MOZ_ASSERT(cprThreadPtr);
pthread_join(cprThreadPtr->u.handleInt, NULL);
}
/**
* cprDestroyThread
@ -118,29 +134,28 @@ cprCreateThread (const char *name,
cprRC_t
cprDestroyThread (cprThread_t thread)
{
static const char fname[] = "cprDestroyThread";
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
if (cprThreadPtr != NULL) {
if (cprThreadPtr) {
/*
* Make sure thread is trying to destroy itself.
*/
if ((pthread_t) cprThreadPtr->u.handleInt == pthread_self()) {
cprThreadPtr->threadId = 0;
cpr_free(cprThreadPtr);
CPR_INFO("%s: Destroying Thread %d", __FUNCTION__, cprThreadPtr->threadId);
pthread_exit(NULL);
return CPR_SUCCESS;
}
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.\n",
fname);
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.",
__FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}
/* Bad application! */
CPR_ERROR("%s - NULL pointer passed in.\n", fname);
CPR_ERROR("%s - NULL pointer passed in.", __FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}

View File

@ -9,6 +9,10 @@
#include <errno.h>
#include <unistd.h>
#include <sys/resource.h>
#include "thread_monitor.h"
#include "prtypes.h"
#include "mozilla/Assertions.h"
#define LINUX_MIN_THREAD_PRIORITY (-20) /* tbd: check MV linux: current val from Larry port */
#define LINUX_MAX_THREAD_PRIORITY (+19) /* tbd: check MV linux. current val from Larry port */
@ -99,6 +103,19 @@ cprCreateThread (const char *name,
return (cprThread_t)NULL;
}
/*
* cprJoinThread
*
* wait for thread termination
*/
void cprJoinThread(cprThread_t thread)
{
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
MOZ_ASSERT(cprThreadPtr);
pthread_join(cprThreadPtr->u.handleInt, NULL);
}
/**
* cprDestroyThread
@ -118,29 +135,28 @@ cprCreateThread (const char *name,
cprRC_t
cprDestroyThread (cprThread_t thread)
{
static const char fname[] = "cprDestroyThread";
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
if (cprThreadPtr != NULL) {
if (cprThreadPtr) {
/*
* Make sure thread is trying to destroy itself.
*/
if (cprThreadPtr->u.handlePtr == (void*) pthread_self()) {
cprThreadPtr->threadId = 0;
cpr_free(cprThreadPtr);
CPR_INFO("%s: Destroying Thread %d", __FUNCTION__, cprThreadPtr->threadId);
pthread_exit(NULL);
return CPR_SUCCESS;
}
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.\n",
fname);
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.",
__FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}
/* Bad application! */
CPR_ERROR("%s - NULL pointer passed in.\n", fname);
CPR_ERROR("%s - NULL pointer passed in.", __FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}

View File

@ -70,6 +70,13 @@ cprThread_t cprCreateThread(const char *name,
void *data);
/*
* cprJoinThread
*
* wait for thread termination
*/
void cprJoinThread(cprThread_t thread);
/**
* cprDestroyThread
*

View File

@ -5,6 +5,9 @@
#include "cpr.h"
#include "cpr_stdlib.h"
#include "cpr_stdio.h"
#include "thread_monitor.h"
#include "prtypes.h"
#include "mozilla/Assertions.h"
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
@ -99,6 +102,19 @@ cprCreateThread (const char *name,
return (cprThread_t)NULL;
}
/*
* cprJoinThread
*
* wait for thread termination
*/
void cprJoinThread(cprThread_t thread)
{
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
MOZ_ASSERT(cprThreadPtr);
pthread_join(cprThreadPtr->u.handleInt, NULL);
}
/**
* cprDestroyThread
@ -118,29 +134,28 @@ cprCreateThread (const char *name,
cprRC_t
cprDestroyThread (cprThread_t thread)
{
static const char fname[] = "cprDestroyThread";
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
if (cprThreadPtr != NULL) {
if (cprThreadPtr) {
/*
* Make sure thread is trying to destroy itself.
*/
if ((pthread_t) cprThreadPtr->u.handleInt == pthread_self()) {
cprThreadPtr->threadId = 0;
cpr_free(cprThreadPtr);
CPR_INFO("%s: Destroying Thread %d", __FUNCTION__, cprThreadPtr->threadId);
pthread_exit(NULL);
return CPR_SUCCESS;
}
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.\n",
fname);
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.",
__FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}
/* Bad application! */
CPR_ERROR("%s - NULL pointer passed in.\n", fname);
CPR_ERROR("%s - NULL pointer passed in.", __FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}

View File

@ -209,6 +209,20 @@ cprCreateThread(const char* name,
};
/*
* cprJoinThread
*
* wait for thread termination
*/
void cprJoinThread(cprThread_t thread)
{
cpr_thread_t *cprThreadPtr;
cprThreadPtr = (cpr_thread_t *) thread;
MOZ_ASSERT(cprThreadPtr);
WaitForSingleObject(cprThreadPtr->u.handlePtr, INFINITE);
}
/*
* cprDestroyThread
*
@ -233,7 +247,6 @@ cprDestroyThread(cprThread_t thread)
*/
if (cprThreadPtr->threadId == GetCurrentThreadId()) {
CPR_INFO("%s: Destroying Thread %d", __FUNCTION__, cprThreadPtr->threadId);
cpr_free(cprThreadPtr);
ExitThread(0);
return CPR_SUCCESS;
}
@ -241,11 +254,13 @@ cprDestroyThread(cprThread_t thread)
CPR_ERROR("%s: Thread attempted to destroy another thread, not itself.",
__FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
}
CPR_ERROR("%s - NULL pointer passed in.", __FUNCTION__);
MOZ_ASSERT(PR_FALSE);
errno = EINVAL;
return CPR_FAILURE;
};