00001 #ifdef CMWFW_WINDOWSNT
00002 #include <iostream>
00003 using namespace std;
00004 #endif
00005 #include "cmwfwThread.h"
00006
00007
00008
00009
00010 #define FILE "source file:cmwfwThread.cc"
00011 #define ID "Contact Steen JENSEN, PS/CO"
00012 #define PROGRAM "Middleware server framework"
00013 #define T(a,b,c,d,e) TRACE(a,"%s(%s): %s %s %s %s\n",myname,FILE,b,c,d,e)
00014 #define E(a,b,c,d) ERROR("%s:%s(%s):ERROR: %s %s %s %s - %s\n",PROGRAM,myname,FILE,a,b,c,d,ID)
00015
00016
00017
00018
00019
00020
00026 cmwfwThread::cmwfwThread(void*(*f)(void*),void* p){
00027 char* myname = "cmwfwThread::cmwfwThread";
00028 T(CMWFW_TRACE_CALLS,"Entering","","","");
00029
00030 thr_routine = f;
00031 thr_param.param = p;
00032 thr_param.stop_flag = false;
00033 thr_param.thr_exit_status = 0;
00034
00035 JTCInitialize init;
00036 theThread = new cmwfwActualThread_JTC(f,(void*)&thr_param);
00037 if(!theThread)heaperr(33);
00038
00039 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00040 running = false;
00041 };
00042
00043
00049 cmwfwThread::~cmwfwThread(){
00050 char* myname = "cmwfwThread::~cmwfwThread";
00051 T(CMWFW_TRACE_CALLS,"Entering","","","");
00052
00053 if(running){
00054
00055 theThread->join();
00056 running = false;
00057 };
00058
00059 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00060 };
00061
00062
00068 bool cmwfwThread::run(){
00069 char* myname = "cmwfwThread::run";
00070 T(CMWFW_TRACE_CALLS,"Entering","","","");
00071
00072 if(!running){
00073 running = true;
00074 theThread -> start();
00075 };
00076
00077 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00078 return running;
00079 };
00080
00081
00087 void* cmwfwThread::requestStop(){
00088 char* myname = "cmwfwThread::requestStop";
00089 T(CMWFW_TRACE_CALLS,"Entering","","","");
00090
00091 thr_param.stop_flag = true;
00092 theThread->join();
00093
00094 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00095 return thr_param.thr_exit_status;
00096 };
00097
00098
00104 bool cmwfwThread::isRunning(){
00105 char* myname = "cmwfwThread::isRunning";
00106 T(CMWFW_TRACE_CALLS,"Entering","","","");
00107
00108 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00109 return running;
00110 };
00111
00112
00113
00122 void cmwfwThread::heaperr(int line){
00123 char* myname = "cmwfwThread";
00124 T(CMWFW_TRACE_CALLS,"Entering","","","");
00125
00126 char l[30];
00127 itoa(line,l);
00128 E("Out of heap in line ",l,"","");
00129 T(CMWFW_TRACE_CALLS,"Exiting due to heap allocation error","","","");
00130 throw cmwfwInternalError(FILE,line,"Out of heap memory");
00131 exit(-1);
00132 };
00133
00134
00135
00140 cmwfwActualThread_JTC::cmwfwActualThread_JTC(void*(*f)(void*),void* p){
00141 char* myname = "cmwfwActualThread_JTC::cmwfwActualThread_JTC";
00142 T(CMWFW_TRACE_CALLS,"Entering","","","");
00143
00144 thr_routine = f;
00145 parameter = p;
00146
00147 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00148 };
00149
00150
00155 void cmwfwActualThread_JTC::run(){
00156 char* myname = "cmwfwActualThread_JTC::run";
00157 T(CMWFW_TRACE_CALLS,"Entering","","","");
00158
00159 (*thr_routine)(parameter);
00160
00161 T(CMWFW_TRACE_CALLS,"Returning - all ok","","","");
00162 };