Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Static / dynamic allocator #9922

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 26 additions & 37 deletions src/lib/mdns/minimal/responders/QueryResponder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,28 +26,23 @@ namespace Minimal {

const QNamePart kDnsSdQueryPath[] = { "_services", "_dns-sd", "_udp", "local" };

QueryResponderBase::QueryResponderBase(Internal::QueryResponderInfo * infos, size_t infoSizes) :
Responder(QType::PTR, FullQName(kDnsSdQueryPath)), mResponderInfos(infos), mResponderInfoSize(infoSizes)
QueryResponderBase::QueryResponderBase(chip::GenericAllocatorBase<Internal::QueryResponderInfo> * infos) :
Responder(QType::PTR, FullQName(kDnsSdQueryPath)), mResponderInfos(infos)
{}

void QueryResponderBase::Init()
{
for (size_t i = 0; i < mResponderInfoSize; i++)
for (auto it = mResponderInfos->begin(); it != mResponderInfos->end();)
{
mResponderInfos[i].Clear();
it = mResponderInfos->Free(it);
}

if (mResponderInfoSize > 0)
Internal::QueryResponderInfo * serviceResponderInfo = mResponderInfos->Allocate();
if (serviceResponderInfo == nullptr)
{
// reply to queries about services available
mResponderInfos[0].responder = this;
}

if (mResponderInfoSize < 2)
{
// Nothing usefull really
ChipLogError(Discovery, "Query responder storage size too small");
ChipLogError(Discovery, "Insufficient memory in query responder pool");
return;
}
serviceResponderInfo->responder = this;
}

QueryResponderSettings QueryResponderBase::AddResponder(RecordResponder * responder)
Expand All @@ -56,47 +51,41 @@ QueryResponderSettings QueryResponderBase::AddResponder(RecordResponder * respon
{
return QueryResponderSettings();
}

for (size_t i = 0; i < mResponderInfoSize; i++)
Internal::QueryResponderInfo * info = mResponderInfos->Allocate();
if (info != nullptr)
{
if (mResponderInfos[i].responder == nullptr)
{
mResponderInfos[i].Clear();
mResponderInfos[i].responder = responder;

return QueryResponderSettings(&mResponderInfos[i]);
}
info->responder = responder;
return QueryResponderSettings(info);
}
return QueryResponderSettings();
}

void QueryResponderBase::ResetAdditionals()
{

for (size_t i = 0; i < mResponderInfoSize; i++)
for (auto & i : *mResponderInfos)
{
mResponderInfos[i].reportNowAsAdditional = false;
i.reportNowAsAdditional = false;
}
}

size_t QueryResponderBase::MarkAdditional(const FullQName & qname)
{
size_t count = 0;
for (size_t i = 0; i < mResponderInfoSize; i++)
for (auto & i : *mResponderInfos)
{
if (mResponderInfos[i].responder == nullptr)
if (i.responder == nullptr)
{
continue; // not a valid entry
}

if (mResponderInfos[i].reportNowAsAdditional)
if (i.reportNowAsAdditional)
{
continue; // already marked
}

if (mResponderInfos[i].responder->GetQName() == qname)
if (i.responder->GetQName() == qname)
{
mResponderInfos[i].reportNowAsAdditional = true;
i.reportNowAsAdditional = true;
count++;
}
}
Expand Down Expand Up @@ -142,27 +131,27 @@ void QueryResponderBase::AddAllResponses(const chip::Inet::IPPacketInfo * source
ChipLogProgress(Discovery, "Replying to DNS-SD service listing request");

// reply to dns-sd service list request
for (size_t i = 0; i < mResponderInfoSize; i++)
for (auto & i : *mResponderInfos)
{
if (!mResponderInfos[i].reportService)
if (!i.reportService)
{
continue;
}

if (mResponderInfos[i].responder == nullptr)
if (i.responder == nullptr)
{
continue;
}

delegate->AddResponse(PtrResourceRecord(GetQName(), mResponderInfos[i].responder->GetQName()));
delegate->AddResponse(PtrResourceRecord(GetQName(), i.responder->GetQName()));
}
}

void QueryResponderBase::ClearBroadcastThrottle()
{
for (size_t i = 0; i < mResponderInfoSize; i++)
for (auto & i : *mResponderInfos)
{
mResponderInfos[i].lastMulticastTime = 0;
i.lastMulticastTime = 0;
}
}

Expand Down
71 changes: 30 additions & 41 deletions src/lib/mdns/minimal/responders/QueryResponder.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "Responder.h"

#include <inet/InetLayer.h>
#include <lib/support/GenericAllocator.h>

namespace mdns {
namespace Minimal {
Expand All @@ -43,14 +44,6 @@ struct QueryResponderInfo : public QueryResponderRecord

bool alsoReportAdditionalQName = false; // report more data when this record is listed
FullQName additionalQName; // if alsoReportAdditionalQName is set, send this extra data

void Clear()
{
responder = nullptr;
reportService = false;
reportNowAsAdditional = false;
alsoReportAdditionalQName = false;
}
};

} // namespace Internal
Expand Down Expand Up @@ -161,29 +154,32 @@ class QueryResponderRecordFilter

/// Iterates over an array of QueryResponderRecord items, providing only 'valid' ones, where
/// valid is based on the provided filter.
class QueryResponderIterator
class QueryResponderIterator : chip::GenericAllocatorIterator<Internal::QueryResponderInfo>
{
public:
using value_type = QueryResponderRecord;
using pointer = QueryResponderRecord *;
using reference = QueryResponderRecord &;

QueryResponderIterator() : mCurrent(nullptr), mRemaining(0) {}
QueryResponderIterator(QueryResponderRecordFilter * recordFilter, Internal::QueryResponderInfo * pos, size_t size) :
mFilter(recordFilter), mCurrent(pos), mRemaining(size)
QueryResponderIterator(QueryResponderRecordFilter * recordFilter,
chip::GenericAllocatorIterator<Internal::QueryResponderInfo> itBase) :
chip::GenericAllocatorIterator<Internal::QueryResponderInfo>(itBase),
mFilter(recordFilter)
{
SkipInvalid();
}
QueryResponderIterator(const QueryResponderIterator & other) = default;
QueryResponderIterator & operator=(const QueryResponderIterator & other) = default;

bool operator==(const QueryResponderIterator & rhs) const
{
return chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator==(rhs);
}
bool operator!=(const QueryResponderIterator & rhs) const { return !(*this == rhs); }

QueryResponderIterator & operator++()
{
if (mRemaining != 0)
{
mCurrent++;
mRemaining--;
}
chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator++();
SkipInvalid();
return *this;
}
Expand All @@ -195,34 +191,28 @@ class QueryResponderIterator
return tmp;
}

bool operator==(const QueryResponderIterator & rhs) const { return mCurrent == rhs.mCurrent; }
bool operator!=(const QueryResponderIterator & rhs) const { return mCurrent != rhs.mCurrent; }
// bool operator==(const QueryResponderIterator & rhs) const { return mCurrent == rhs.mCurrent; }
// bool operator!=(const QueryResponderIterator & rhs) const { return mCurrent != rhs.mCurrent; }

QueryResponderRecord & operator*() { return *mCurrent; }
QueryResponderRecord * operator->() { return mCurrent; }
QueryResponderRecord & operator*() { return chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator*(); }
QueryResponderRecord * operator->() { return chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator->(); }

Internal::QueryResponderInfo * GetInternal() { return mCurrent; }
const Internal::QueryResponderInfo * GetInternal() const { return mCurrent; }
Internal::QueryResponderInfo * GetInternal()
{
return chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator->();
}

private:
/// Skips invalid/not useful values.
/// ensures that if mRemaining is 0, mCurrent is nullptr;
void SkipInvalid()
{
while ((mRemaining > 0) && !mFilter->Accept(mCurrent))
while (!chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::IsEnd() && !mFilter->Accept(GetInternal()))
{
mRemaining--;
mCurrent++;
}
if (mRemaining == 0)
{
mCurrent = nullptr;
chip::GenericAllocatorIterator<Internal::QueryResponderInfo>::operator++();
}
}

QueryResponderRecordFilter * mFilter;
Internal::QueryResponderInfo * mCurrent;
size_t mRemaining;
};

/// Responds to mDNS queries.
Expand All @@ -237,7 +227,7 @@ class QueryResponderBase : public Responder // "_services._dns-sd._udp.local"
{
public:
/// Builds a new responder with the given storage for the response infos
QueryResponderBase(Internal::QueryResponderInfo * infos, size_t infoSizes);
QueryResponderBase(chip::GenericAllocatorBase<Internal::QueryResponderInfo> * infos);
virtual ~QueryResponderBase() {}

/// Setup initial settings (clears all infos and sets up dns-sd query replies)
Expand All @@ -255,9 +245,9 @@ class QueryResponderBase : public Responder // "_services._dns-sd._udp.local"

QueryResponderIterator begin(QueryResponderRecordFilter * filter)
{
return QueryResponderIterator(filter, mResponderInfos, mResponderInfoSize);
return QueryResponderIterator(filter, mResponderInfos->begin());
}
QueryResponderIterator end() { return QueryResponderIterator(); }
QueryResponderIterator end() { return QueryResponderIterator(nullptr, mResponderInfos->end()); }

/// Clear any items marked as 'additional'.
void ResetAdditionals();
Expand All @@ -274,18 +264,17 @@ class QueryResponderBase : public Responder // "_services._dns-sd._udp.local"
void ClearBroadcastThrottle();

private:
Internal::QueryResponderInfo * mResponderInfos;
size_t mResponderInfoSize;
chip::GenericAllocatorBase<Internal::QueryResponderInfo> * mResponderInfos;
};

template <size_t kSize>
template <size_t kPoolSize>
class QueryResponder : public QueryResponderBase
{
public:
QueryResponder() : QueryResponderBase(mData, kSize) { Init(); }
QueryResponder() : QueryResponderBase(&mData) { Init(); }

private:
Internal::QueryResponderInfo mData[kSize];
chip::GenericAllocator<Internal::QueryResponderInfo, kPoolSize> mData;
};

} // namespace Minimal
Expand Down
1 change: 1 addition & 0 deletions src/lib/support/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ static_library("support") {
"FibonacciUtils.h",
"FixedBufferAllocator.cpp",
"FixedBufferAllocator.h",
"GenericAllocator.h",
"LifetimePersistedCounter.cpp",
"LifetimePersistedCounter.h",
"ObjectLifeCycle.h",
Expand Down
Loading