Skip to content

Commit

Permalink
Fix #868: Recoups some of performance losses from PR #841 (#869)
Browse files Browse the repository at this point in the history
* fixed lockReg shared_ptr

* down to 5% increase from original

* get logs from github to verify behavior

* reverting performance yml and adding move constructor (default) for RegistrationLocks
:
  • Loading branch information
tcormackMW authored and carneyweb committed Jul 6, 2023
1 parent 15edfba commit 8860be6
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ namespace cppmicroservices

ServiceRegistrationBase(BundlePrivate* bundle, InterfaceMapConstPtr const& service, Properties&& props);

std::shared_ptr<ServiceRegistrationLocks> LockServiceRegistration() const;
ServiceRegistrationLocks LockServiceRegistration() const;

std::shared_ptr<ServiceRegistrationBasePrivate> d;
};
Expand Down
4 changes: 2 additions & 2 deletions framework/src/service/ServiceReferenceBasePrivate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ namespace cppmicroservices

ServiceReferenceBasePrivate::~ServiceReferenceBasePrivate() = default;

std::shared_ptr<ServiceRegistrationLocks>
ServiceRegistrationLocks
ServiceReferenceBasePrivate::LockServiceRegistration() const
{
return std::make_shared<ServiceRegistrationLocks>(registration.lock(), coreInfo);
return ServiceRegistrationLocks(registration.lock(), coreInfo);
}

InterfaceMapConstPtr
Expand Down
2 changes: 1 addition & 1 deletion framework/src/service/ServiceReferenceBasePrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ namespace cppmicroservices

~ServiceReferenceBasePrivate();

std::shared_ptr<ServiceRegistrationLocks> LockServiceRegistration() const;
ServiceRegistrationLocks LockServiceRegistration() const;

/**
* Get the service object.
Expand Down
13 changes: 5 additions & 8 deletions framework/src/service/ServiceRegistrationBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -330,10 +330,10 @@ namespace cppmicroservices
}
}

std::shared_ptr<ServiceRegistrationLocks>
ServiceRegistrationLocks
ServiceRegistrationBase::LockServiceRegistration() const
{
return std::make_shared<ServiceRegistrationLocks>(d, d->coreInfo);
return ServiceRegistrationLocks(d, d->coreInfo);
}

bool
Expand All @@ -353,12 +353,9 @@ namespace cppmicroservices
return true;
}

ServiceReferenceBase sr1;
ServiceReferenceBase sr2;
{
LockServiceRegistration(), sr1 = d->reference;
o.LockServiceRegistration(), sr2 = o.d->reference;
}
ServiceReferenceBase sr1 = (LockServiceRegistration(), d->reference);
ServiceReferenceBase sr2 = (o.LockServiceRegistration(), o.d->reference);

return sr1 < sr2;
}

Expand Down
13 changes: 5 additions & 8 deletions framework/src/util/ServiceRegistrationLocks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,11 @@
namespace cppmicroservices
{

ServiceRegistrationLocks::ServiceRegistrationLocks(std::shared_ptr<ServiceRegistrationBasePrivate> reg,
std::shared_ptr<ServiceRegistrationCoreInfo> coreInfo)
{
if (reg != nullptr)
{
regL = reg->Lock();
}
coreInfoL = coreInfo->Lock();
ServiceRegistrationLocks::ServiceRegistrationLocks(const std::shared_ptr<ServiceRegistrationBasePrivate>& reg,
const std::shared_ptr<ServiceRegistrationCoreInfo>& coreInfo)
: regL(reg != nullptr ? reg->Lock() : cppmicroservices::detail::MutexLockingStrategy<>::UniqueLock())
, coreInfoL(coreInfo->Lock())
{
}
} // namespace cppmicroservices

Expand Down
12 changes: 9 additions & 3 deletions framework/src/util/ServiceRegistrationLocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,18 @@ namespace cppmicroservices
class ServiceRegistrationLocks final
{
public:
ServiceRegistrationLocks(std::shared_ptr<ServiceRegistrationBasePrivate> reg,
std::shared_ptr<ServiceRegistrationCoreInfo> coreInfo);
ServiceRegistrationLocks(const std::shared_ptr<ServiceRegistrationBasePrivate>& reg,
const std::shared_ptr<ServiceRegistrationCoreInfo>& coreInfo);

// Delete all copy and move to enforce that it is only ever constructed into one object -- avoids deadlocks
ServiceRegistrationLocks(ServiceRegistrationLocks const& lockObj) = delete;
ServiceRegistrationLocks(ServiceRegistrationLocks&& lockObj) = default;
ServiceRegistrationLocks& operator=(ServiceRegistrationLocks const& lockObj) = delete;
ServiceRegistrationLocks& operator=(ServiceRegistrationLocks&& lockObj) = delete;

private:
cppmicroservices::detail::MutexLockingStrategy<>::UniqueLock coreInfoL;
cppmicroservices::detail::MutexLockingStrategy<>::UniqueLock regL;
cppmicroservices::detail::MutexLockingStrategy<>::UniqueLock coreInfoL;
};
} // namespace cppmicroservices

Expand Down

0 comments on commit 8860be6

Please sign in to comment.