ExtSender.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
- /* Copyright (C) 2003 MySQL AB
- 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 "ExtSender.hpp"
- /*****************************************************************************
- * Constructor / Destructor / Init / Get / Set
- *****************************************************************************/
- /**
- * @todo: signalErrorHandler is not finished. Just infrastructure.
- */
- ExtSender::ExtSender() {
- m_tf = NULL;
- m_nodeId = 0;
- m_ownRef = 0;
- }
- ExtSender::~ExtSender() {
- if (m_tf) delete m_tf;
- }
- void
- ExtSender::setNodeId(Uint32 nodeId)
- {
- #if 0
- ndbout_c("ExtSender: Set nodeid to %d", nodeId);
- #endif
- m_nodeId = nodeId;
- }
- Uint32
- ExtSender::getOwnRef() const
- {
- if(!m_ownRef) REPABORT("No m_ownRef set");
- return m_ownRef;
- }
- void
- ExtSender::setOwnRef(Uint32 ref)
- {
- // Can only be set once
- if (m_ownRef != 0) REPABORT("Trying to change m_ownRef");
- m_ownRef = ref;
- }
- /*****************************************************************************
- * Usage
- *****************************************************************************/
- int
- ExtSender::sendSignal(class NdbApiSignal * s) {
- #if 0
- ndbout_c("ExtSender: Sending signal %d to %d",
- s->readSignalNumber(), m_nodeId);
- #endif
- if (m_tf == NULL || m_nodeId == 0 || s==0) abort();
- m_tf->lock_mutex();
- int retvalue = m_tf->sendSignal(s, m_nodeId);
- if (retvalue) {
- RLOG(("sendSignal returned %d for send to node %d", retvalue, m_nodeId));
- }
- #if 0
- ndbout_c("ExtSender: Sent signal to %d", m_nodeId);
- #endif
- m_tf->unlock_mutex();
- return retvalue;
- }
- int
- ExtSender::sendFragmentedSignal(NdbApiSignal * s,
- LinearSectionPtr ptr[3],
- Uint32 sections) {
- if (m_tf == NULL || m_nodeId == 0) abort();
- m_tf->lock_mutex();
- int retvalue = m_tf->sendFragmentedSignal(s, m_nodeId, ptr, sections);
- if (retvalue) {
- RLOG(("sendFragmentedSignal returned %d for send to node %d",
- retvalue, m_nodeId));
- }
- m_tf->unlock_mutex();
- return retvalue;
- }
- /**
- * Check that TransporterFacade is connected to at least one DB node
- */
- bool
- ExtSender::connected(Uint32 timeOutMillis){
- #if 0
- ndbout_c("ExtSender: Waiting for remote component to be ready!");
- #endif
- NDB_TICKS start = NdbTick_CurrentMillisecond();
- NDB_TICKS now = start;
- // while(m_tf->theClusterMgr->getNoOfConnectedNodes() == 0 &&
- while((m_tf->get_an_alive_node() == 0) &&
- (timeOutMillis == 0 || (now - start) < timeOutMillis)){
- NdbSleep_MilliSleep(100);
- now = NdbTick_CurrentMillisecond();
- }
- return m_tf->theClusterMgr->getNoOfConnectedNodes() > 0;
- }
- bool
- ExtSender::connected(Uint32 timeOutMillis, Uint32 nodeId){
- NDB_TICKS start = NdbTick_CurrentMillisecond();
- NDB_TICKS now = start;
- // while(m_tf->theClusterMgr->getNoOfConnectedNodes() == 0 &&
- while((m_tf->get_node_alive(nodeId) != 0) &&
- (timeOutMillis == 0 || (now - start) < timeOutMillis)){
- NdbSleep_MilliSleep(100);
- now = NdbTick_CurrentMillisecond();
- }
- return m_tf->theClusterMgr->getNoOfConnectedNodes() > 0;
- }
- NdbApiSignal *
- ExtSender::getSignal()
- {
- /**
- * @todo This should use some kind of list of NdbApiSignals,
- * similar to the NDBAPI and the MGRSRVR.
- * The best thing would be to have set of code
- * shared between the programs.
- * Thus the NDBAPI and MGMSRVR should be refactored.
- * /Lars
- */
- return new NdbApiSignal(getOwnRef());
- }