www.pudn.com > fsm.rar > port_thread.c
/* The oSIP library implements the Session Initiation Protocol (SIP -rfc2543-) Copyright (C) 2001 Aymeric MOIZARD jack@atosc.org This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifdef OSIP_MT #include#include #include #ifdef WIN32 #include #endif /********************************/ /* Methods from port_thread.c */ /********************************/ /* launch a new thread. */ /* INPUT : int stacksize | size of the stack (for VxWorks only).*/ /* INPUT : void *(*func)(void *) | .*/ /* INPUT : void *arg | arg is the parameter for func.*/ /* OUTPUT: pthread_t *thread | thread ID. */ /* returns SIP_NULL on error */ #ifndef __VXWORKS_OS__ #ifdef THREAD_PTHREAD sthread_t * sthread_create(int stacksize, sthread_t *thread, void *(*func)(void *), void *arg) { int i; if (thread==NULL) thread = (sthread_t *) smalloc(sizeof(sthread_t)); i = pthread_create(thread,NULL ,func ,(void *)arg); if (i!=0) { DEBUG(fprintf(stdout," Error while creating a new thread %i\n",i)); return NULL; } return thread; } int sthread_setpriority(sthread_t *thread, int priority) { return 0; } int sthread_join(sthread_t *thread) { return pthread_join(*thread,NULL); } void sthread_exit() { pthread_exit(NULL); } #endif #endif #ifndef __VXWORKS_OS__ #ifdef WIN32 sthread_t *sthread_create(int stacksize, sthread_t *thread, void *(*func)(void *), void *arg) { if (thread==NULL) thread = (sthread_t *) smalloc(sizeof(sthread_t)); thread->h = _beginthread((void *)func, stacksize, arg); if (thread->h == 0) { DEBUG(fprintf(stdout," Error while creating a new thread\n")); return NULL; } return thread; } int sthread_setpriority(sthread_t *thread, int priority) { return 0; } int sthread_join(sthread_t *thread) { if (GetThreadPriority((HANDLE)thread->h) != THREAD_PRIORITY_ERROR_RETURN) TerminateThread((HANDLE)thread->h, 0); return(0); } void sthread_exit() { _endthread(); } #endif #ifdef __PSOS__ sthread_t *sthread_create(int stacksize, sthread_t *thread, void *(*func)(void *), void *arg) { if (thread==NULL) thread = (sthread_t *) smalloc(sizeof(sthread_t)); if (t_create("sip", 150, stacksize, 0, 0, &thread->tid) != 0) { sfree(thread); return(NULL); } if (t_start(thread->tid, T_PREEMPT | T_ISR, func, 0) != 0) { sfree(thread); return(NULL); } return thread; } int sthread_setpriority(sthread_t *thread, int priority) { unsigned long oldprio; t_setpri(thread->tid, priority, &oldprio); return 0; } int sthread_join(sthread_t *thread) { t_delete(thread->tid); return(0); } void sthread_exit() { t_delete(0); } #endif #ifdef THREAD_PTH sthread_t * sthread_create(int stacksize, sthread_t *thread, void *(*func)(void *), void *arg) { int i; if (thread!=NULL) DEBUG(fprintf(stdout," Never use sthread_create with thread!=NULL under vxworks\n")); pth_spawn(NULL, func, (void *)arg); if (i!=0) { DEBUG(fprintf(stdout," Error while creating a new thread %i\n",i)); return NULL; } return thread; } int sthread_setpriority(sthread_t *thread, int priority) { /* .PTH_PRIO_MIN and PTH_PRIO_MAX. default is PTH_PRIO_STD. */ return 0; } int sthread_join(sthread_t *thread) { return pth_join(thread,NULL); } void sthread_exit() { pth_exit(NULL); } #endif #endif #ifdef __VXWORKS_OS__ int sthread_create(int stacksize, sthread_t *thread, void *(*func)(void *), void *arg) { if (thread!=NULL) /* thread = (sthread_t *) smalloc(sizeof(sthread_t)); */ DEBUG(fprintf(stdout, " Never use sthread_create with thread!=NULL under vxworks\n")); /* return ERROR (==-1?) if it fails */ return taskSpawn(NULL,5,0,stacksize,(FUNCPTR)func,(int)arg,0,0,0,0,0,0,0,0,0); } int sthread_setpriority(int thread, int priority) { taskPrioritySet(dest->threadid, 1); return 0; } int sthread_join(int thread) { return taskDelete(thread); } void sthread_exit() { } #endif #endif