Skip to content

Commit

Permalink
[dnssd] Make sure initialization is not run twice
Browse files Browse the repository at this point in the history
Currently, the platform implementation of DNS-SD uses
a boolean member to indicate if the backend has already been
initialized, but the initialization is asynchronous so it
may happen that the initialization is invoked twice. Add
another "initializing" state to handle that case.
  • Loading branch information
Damian-Nordic committed Jan 27, 2023
1 parent 9dbf432 commit 37365d8
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
17 changes: 8 additions & 9 deletions src/lib/dnssd/Discovery_ImplPlatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -358,20 +358,21 @@ DiscoveryImplPlatform::DiscoveryImplPlatform() = default;

CHIP_ERROR DiscoveryImplPlatform::InitImpl()
{
ReturnErrorCodeIf(mDnssdInitialized, CHIP_NO_ERROR);
ReturnErrorOnFailure(ChipDnssdInit(HandleDnssdInit, HandleDnssdError, this));
VerifyOrReturnError(mState == State::kUninitialized, CHIP_NO_ERROR);
mState = State::kInitializing;

ReturnErrorOnFailure(ChipDnssdInit(HandleDnssdInit, HandleDnssdError, this));
UpdateCommissionableInstanceName();

return CHIP_NO_ERROR;
}

void DiscoveryImplPlatform::Shutdown()
{
VerifyOrReturn(mDnssdInitialized);
VerifyOrReturn(mState != State::kUninitialized);
mResolverProxy.Shutdown();
ChipDnssdShutdown();
mDnssdInitialized = false;
mState = State::kUninitialized;
}

void DiscoveryImplPlatform::HandleDnssdInit(void * context, CHIP_ERROR initError)
Expand All @@ -380,7 +381,7 @@ void DiscoveryImplPlatform::HandleDnssdInit(void * context, CHIP_ERROR initError

if (initError == CHIP_NO_ERROR)
{
publisher->mDnssdInitialized = true;
publisher->mState = State::kInitialized;

// TODO: this is wrong, however we need resolverproxy initialized
// otherwise DiscoveryImplPlatform is not usable.
Expand Down Expand Up @@ -409,14 +410,12 @@ void DiscoveryImplPlatform::HandleDnssdInit(void * context, CHIP_ERROR initError
else
{
ChipLogError(Discovery, "DNS-SD initialization failed with %" CHIP_ERROR_FORMAT, initError.Format());
publisher->mDnssdInitialized = false;
publisher->mState = State::kUninitialized;
}
}

void DiscoveryImplPlatform::HandleDnssdError(void * context, CHIP_ERROR error)
{
DiscoveryImplPlatform * publisher = static_cast<DiscoveryImplPlatform *>(context);

if (error == CHIP_ERROR_FORCED_RESET)
{
DeviceLayer::ChipDeviceEvent event;
Expand Down Expand Up @@ -487,7 +486,7 @@ CHIP_ERROR DiscoveryImplPlatform::PublishService(const char * serviceType, TextE
Inet::InterfaceId interfaceId, const chip::ByteSpan & mac,
DnssdServiceProtocol protocol, PeerId peerId)
{
ReturnErrorCodeIf(mDnssdInitialized == false, CHIP_ERROR_INCORRECT_STATE);
VerifyOrReturnError(mState == State::kInitialized, CHIP_ERROR_INCORRECT_STATE);

DnssdService service;
ReturnErrorOnFailure(MakeHostName(service.mHostName, sizeof(service.mHostName), mac));
Expand Down
11 changes: 8 additions & 3 deletions src/lib/dnssd/Discovery_ImplPlatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ class DiscoveryImplPlatform : public ServiceAdvertiser, public Resolver
static DiscoveryImplPlatform & GetInstance();

private:
enum class State : uint8_t
{
kUninitialized,
kInitializing,
kInitialized
};

DiscoveryImplPlatform();

DiscoveryImplPlatform(const DiscoveryImplPlatform &) = delete;
Expand All @@ -83,10 +90,8 @@ class DiscoveryImplPlatform : public ServiceAdvertiser, public Resolver
size_t subTypeSize, uint16_t port, Inet::InterfaceId interfaceId, const chip::ByteSpan & mac,
DnssdServiceProtocol procotol, PeerId peerId);

State mState = State::kUninitialized;
uint8_t mCommissionableInstanceName[sizeof(uint64_t)];

bool mDnssdInitialized = false;

ResolverProxy mResolverProxy;

static DiscoveryImplPlatform sManager;
Expand Down

0 comments on commit 37365d8

Please sign in to comment.