@@ -135,6 +135,7 @@ void ChannelSearchManager::registerSearchInstance(SearchInstance::shared_pointer
135135 if (m_canceled.get ())
136136 return ;
137137
138+ LOG (logLevelDebug, " Registering search instance: %s" , channel->getSearchInstanceName ().c_str ());
138139 bool immediateTrigger;
139140 {
140141 Lock guard (m_channelMutex);
@@ -154,6 +155,7 @@ void ChannelSearchManager::registerSearchInstance(SearchInstance::shared_pointer
154155
155156void ChannelSearchManager::unregisterSearchInstance (SearchInstance::shared_pointer const & channel)
156157{
158+ LOG (logLevelDebug, " Unregistering search instance: %s" , channel->getSearchInstanceName ().c_str ());
157159 Lock guard (m_channelMutex);
158160 pvAccessID id = channel->getSearchInstanceID ();
159161 m_channels.erase (id);
@@ -180,6 +182,7 @@ void ChannelSearchManager::searchResponse(const ServerGUID & guid, pvAccessID ci
180182 SearchInstance::shared_pointer si (channelsIter->second .lock ());
181183
182184 // remove from search list
185+ LOG (logLevelDebug, " Removing cid %d from the channel map" , cid);
183186 m_channels.erase (cid);
184187
185188 guard.unlock ();
@@ -188,6 +191,15 @@ void ChannelSearchManager::searchResponse(const ServerGUID & guid, pvAccessID ci
188191 if (si)
189192 si->searchResponse (guid, minorRevision, serverAddress);
190193 }
194+ releaseNameServerTransport ();
195+ }
196+
197+ void ChannelSearchManager::releaseNameServerTransport ()
198+ {
199+ if (m_channels.size () == 0 )
200+ {
201+ m_context.lock ()->releaseNameServerSearchTransport ();
202+ }
191203}
192204
193205void ChannelSearchManager::newServerDetected ()
@@ -196,6 +208,46 @@ void ChannelSearchManager::newServerDetected()
196208 callback ();
197209}
198210
211+ void ChannelSearchManager::send (epics::pvData::ByteBuffer* buffer, TransportSendControl* control)
212+ {
213+ control->startMessage (CMD_SEARCH, 4 +1 +3 +16 +2 +1 +4 +2 );
214+ buffer->putInt (m_sequenceNumber);
215+ buffer->putByte ((int8_t )QOS_REPLY_REQUIRED); // CAST_POSITION
216+ buffer->putByte ((int8_t )0 ); // reserved
217+ buffer->putShort ((int16_t )0 ); // reserved
218+
219+ osiSockAddr anyAddress;
220+ memset (&anyAddress, 0 , sizeof (anyAddress));
221+ anyAddress.ia .sin_family = AF_INET;
222+ anyAddress.ia .sin_port = htons (0 );
223+ anyAddress.ia .sin_addr .s_addr = htonl (INADDR_ANY);
224+ encodeAsIPv6Address (buffer, &anyAddress);
225+ buffer->putShort ((int16_t )ntohs (anyAddress.ia .sin_port ));
226+ buffer->putByte ((int8_t )1 );
227+ SerializeHelper::serializeString (" tcp" , buffer, control);
228+ buffer->putShort ((int16_t )0 ); // initial channel count
229+
230+ vector<SearchInstance::shared_pointer> toSend;
231+ {
232+ Lock guard (m_channelMutex);
233+ toSend.reserve (m_channels.size ());
234+
235+ for (m_channels_t ::iterator channelsIter = m_channels.begin ();
236+ channelsIter != m_channels.end (); channelsIter++)
237+ {
238+ SearchInstance::shared_pointer inst (channelsIter->second .lock ());
239+ if (!inst) continue ;
240+ toSend.push_back (inst);
241+ }
242+ }
243+
244+ vector<SearchInstance::shared_pointer>::iterator siter = toSend.begin ();
245+ for (; siter != toSend.end (); siter++)
246+ {
247+ generateSearchRequestMessage (*siter, buffer, control);
248+ }
249+ }
250+
199251void ChannelSearchManager::initializeSendBuffer ()
200252{
201253 // for now OK, since it is only set here
@@ -245,6 +297,13 @@ void ChannelSearchManager::flushSendBuffer()
245297 m_sendBuffer.putByte (CAST_POSITION, (int8_t )0x00 ); // b/m-cast, no reply required
246298 ut->send (&m_sendBuffer, inetAddressType_broadcast_multicast);
247299
300+ // Name server search
301+ Transport::shared_pointer nsTransport = m_context.lock ()->getNameServerSearchTransport ();
302+ if (nsTransport)
303+ {
304+ LOG (logLevelDebug, " Initiating name server search for %d channels" , int (m_channels.size ()));
305+ nsTransport->enqueueSendRequest (shared_from_this ());
306+ }
248307 initializeSendBuffer ();
249308}
250309
@@ -253,7 +312,6 @@ bool ChannelSearchManager::generateSearchRequestMessage(SearchInstance::shared_p
253312 ByteBuffer* requestMessage, TransportSendControl* control)
254313{
255314 epics::pvData::int16 dataCount = requestMessage->getShort (DATA_COUNT_POSITION);
256-
257315 dataCount++;
258316
259317 /*
@@ -262,6 +320,8 @@ bool ChannelSearchManager::generateSearchRequestMessage(SearchInstance::shared_p
262320 */
263321
264322 const std::string& name (channel->getSearchInstanceName ());
323+ LOG (logLevelDebug, " Searching for channel: %s" , name.c_str ());
324+
265325 // not nice...
266326 const int addedPayloadSize = sizeof (int32)/sizeof (int8) + (1 + sizeof (int32)/sizeof (int8) + name.length ());
267327 if (((int )requestMessage->getRemaining ()) < addedPayloadSize)
0 commit comments