1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
static const char *RcsId = "$Id: cbthread.cpp 15556 2011-02-11 08:25:58Z taurel $\n$Name$";
//+============================================================================
//
// file : cbthread.cpp
//
// description : C++ source code for the CallBackThread class.
// This class is used in automatic callback mode.
// The thread mainly waits on aa asynchronous callback
// request and will call the get_asynch_replies() call
// to fire the callback when the answer is received
//
// project : TANGO
//
// author(s) : E.Taurel
//
// Copyright (C) : 2004,2005,2006,2007,2008,2009,2010,2011
// European Synchrotron Radiation Facility
// BP 220, Grenoble 38043
// FRANCE
//
// This file is part of Tango.
//
// Tango 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 3 of the License, or
// (at your option) any later version.
//
// Tango 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 Tango. If not, see <http://www.gnu.org/licenses/>.
//
// $Revision: 15556 $
//
// $Log$
// Revision 3.7 2010/09/09 13:43:38 taurel
// - Add year 2010 in Copyright notice
//
// Revision 3.6 2009/01/21 12:45:15 taurel
// - Change CopyRights for 2009
//
// Revision 3.5 2008/10/06 15:02:16 taurel
// - Changed the licensing info from GPL to LGPL
//
// Revision 3.4 2008/10/02 16:09:25 taurel
// - Add some licensing information in each files...
//
// Revision 3.3 2007/04/20 14:38:33 taurel
// - Ported to Windows 64 bits x64 architecture
//
// Revision 3.2 2005/01/13 08:36:36 taurel
// - Merge trunk with Release_5_0 from brach Release_5_branch
//
// Revision 3.1.4.1 2004/10/22 11:23:16 taurel
// Added warning alarm
// Change attribute config. It now includes alarm and event parameters
// Array attribute property now supported
// subscribe_event throws exception for change event if they are not correctly configured
// Change in the polling thread: The event heartbeat has its own work in the work list
// Also add some event_unregister
// Fix order in which classes are destructed
// Fix bug in asynchronous mode (PUSH_CALLBACK). The callback thread ate all the CPU
// Change in the CORBA info call for the device type
//
// Revision 3.1 2003/05/28 14:42:55 taurel
// Add (conditionaly) autoconf generated include file
//
// Revision 3.0 2003/03/25 16:30:47 taurel
// Change revision number to 3.0 before release 3.0.0 of Tango lib
//
// Revision 1.1 2003/03/20 08:56:12 taurel
// New file to support asynchronous calls
//
//
//-============================================================================
#if HAVE_CONFIG_H
#include <ac_config.h>
#endif
#include <tango.h>
#include <cbthread.h>
namespace Tango
{
//+-------------------------------------------------------------------------
//
// method : CallBackThread::CallBackThread
//
// description : Two constructors for the PollObj class. The first one
// constructs a PollObji nstance with the default polling
// ring depth
// The second one create a PollObj instance with a
// specified polling ring depth
//
// argument : in :
//
//--------------------------------------------------------------------------
void *CallBackThread::run_undetached(void *ptr)
{
while(shared_cmd.is_stopped() == false)
{
try
{
// sleep(2);
// cout << "In the automatic callback thread" << endl;
{
omni_mutex_lock sync(*asyn_ptr);
if (asyn_ptr->get_cb_request_nb_i() == 0)
{
asyn_ptr->wait();
}
}
if (asyn_ptr->get_cb_request_nb() != 0)
ApiUtil::instance()->get_asynch_replies(0);
}
catch (omni_thread_fatal &)
{
cerr << "OUPS !! A omni thread fatal exception !!!!!!!!" << endl;
#ifndef _TG_WINDOWS_
time_t t = time(NULL);
cerr << ctime(&t);
#endif
cerr << "Trying to re-enter the main loop" << endl;
}
}
omni_thread::exit();
return NULL;
}
} // End of Tango namespace
|