/usr/include/music/subconnector.hh is in libmusic-dev 1.0.7-1.2ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 | /*
* This file is part of MUSIC.
* Copyright (C) 2007, 2008, 2009 INCF
*
* MUSIC 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 3 of the License, or
* (at your option) any later version.
*
* MUSIC 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef MUSIC_SUBCONNECTOR_HH
#include <mpi.h>
#include <string>
#include <music/synchronizer.hh>
#include <music/FIBO.hh>
#include <music/BIFO.hh>
#include <music/event.hh>
#include <music/message.hh>
namespace MUSIC {
// NOTE: Must be divisible by the size of the datatype of the data
// maps passed to cont ports
const int SPIKE_BUFFER_MAX = 10000 * sizeof (Event);
const int CONT_BUFFER_MAX = SPIKE_BUFFER_MAX;
const int MESSAGE_BUFFER_MAX = 10000;
// The subconnector is responsible for the local side of the
// communication between two MPI processes, one for each port of a
// port pair. It is created in connector::connect ().
class Subconnector {
private:
protected:
Synchronizer* synch;
MPI::Intercomm intercomm;
int remoteRank_; // rank in inter-communicatir
int remoteWorldRank_; // rank in COMM_WORLD
int receiverRank_;
int receiverPortCode_;
public:
Subconnector () { }
Subconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode);
virtual ~Subconnector ();
virtual void initialCommunication () { }
virtual void maybeCommunicate () = 0;
virtual void flush (bool& dataStillFlowing) = 0;
int remoteRank () const { return remoteRank_; }
int remoteWorldRank () const { return remoteWorldRank_; }
int receiverRank () const { return receiverRank_; }
int receiverPortCode () const { return receiverPortCode_; }
};
class OutputSubconnector : virtual public Subconnector {
public:
virtual FIBO* buffer () { return 0; }
};
class BufferingOutputSubconnector : virtual public OutputSubconnector {
protected:
FIBO buffer_;
public:
BufferingOutputSubconnector (int elementSize);
FIBO* buffer () { return &buffer_; }
};
class InputSubconnector : virtual public Subconnector {
protected:
InputSubconnector ();
bool flushed;
public:
virtual BIFO* buffer () { return NULL; }
};
class ContSubconnector : virtual public Subconnector {
protected:
MPI::Datatype type_;
public:
ContSubconnector (MPI::Datatype type)
: type_ (type) { };
};
class ContOutputSubconnector : public BufferingOutputSubconnector,
public ContSubconnector {
public:
ContOutputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverPortCode,
MPI::Datatype type);
void initialCommunication ();
void maybeCommunicate ();
void send ();
void flush (bool& dataStillFlowing);
};
class ContInputSubconnector : public InputSubconnector,
public ContSubconnector {
protected:
BIFO buffer_;
public:
ContInputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode,
MPI::Datatype type);
BIFO* buffer () { return &buffer_; }
void initialCommunication ();
void maybeCommunicate ();
void receive ();
void flush (bool& dataStillFlowing);
};
class EventSubconnector : virtual public Subconnector {
protected:
static const int FLUSH_MARK = -1;
};
class EventOutputSubconnector : public BufferingOutputSubconnector,
public EventSubconnector {
public:
EventOutputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverPortCode);
void maybeCommunicate ();
void send ();
void flush (bool& dataStillFlowing);
};
class EventInputSubconnector : public InputSubconnector,
public EventSubconnector {
public:
EventInputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode);
void maybeCommunicate ();
virtual void receive () = 0;
virtual void flush (bool& dataStillFlowing);
};
class EventInputSubconnectorGlobal : public EventInputSubconnector {
EventHandlerGlobalIndex* handleEvent;
static EventHandlerGlobalIndexDummy dummyHandler;
public:
EventInputSubconnectorGlobal (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode,
EventHandlerGlobalIndex* eh);
void receive ();
void flush (bool& dataStillFlowing);
};
class EventInputSubconnectorLocal : public EventInputSubconnector {
EventHandlerLocalIndex* handleEvent;
static EventHandlerLocalIndexDummy dummyHandler;
public:
EventInputSubconnectorLocal (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode,
EventHandlerLocalIndex* eh);
void receive ();
void flush (bool& dataStillFlowing);
};
class MessageSubconnector : virtual public Subconnector {
protected:
static const int FLUSH_MARK = -1;
};
class MessageOutputSubconnector : public OutputSubconnector,
public MessageSubconnector {
FIBO* buffer_;
public:
MessageOutputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverPortCode,
FIBO* buffer);
void maybeCommunicate ();
void send ();
void flush (bool& dataStillFlowing);
};
class MessageInputSubconnector : public InputSubconnector,
public MessageSubconnector {
MessageHandler* handleMessage;
static MessageHandlerDummy dummyHandler;
public:
MessageInputSubconnector (Synchronizer* synch,
MPI::Intercomm intercomm,
int remoteLeader,
int remoteRank,
int receiverRank,
int receiverPortCode,
MessageHandler* mh);
void maybeCommunicate ();
void receive ();
void flush (bool& dataStillFlowing);
};
}
#define MUSIC_SUBCONNECTOR_HH
#endif
|