* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
*
* HDF is dual licensed: you can use it either under the terms of
* the GPL, or the BSD license, at your option.
* See the LICENSE file in the root of this repository for complete details.
*/
#include "hdf_sref.h"
#include "hdf_log.h"
#define HDF_LOG_TAG hdf_sref
void HdfSRefAcquire(struct HdfSRef *sref)
{
int32_t lockRef;
if (sref == NULL) {
HDF_LOGE("Acquire input sref is null");
return;
}
OsalAtomicInc(&sref->refs);
lockRef = OsalAtomicRead(&sref->refs);
if ((lockRef == 1) && (sref->listener != NULL)) {
struct IHdfSRefListener *listener = sref->listener;
if (listener->OnFirstAcquire != NULL) {
listener->OnFirstAcquire(sref);
}
}
}
int HdfSRefCount(const struct HdfSRef *sref)
{
if (sref == NULL) {
HDF_LOGE("invalid sref");
return 0;
}
return OsalAtomicRead(&sref->refs);
}
void HdfSRefRelease(struct HdfSRef *sref)
{
int32_t lockRef;
if (sref == NULL) {
HDF_LOGE("Release input sref is null");
return;
}
OsalAtomicDec(&sref->refs);
lockRef = OsalAtomicRead(&sref->refs);
if ((lockRef == 0) && (sref->listener != NULL)) {
struct IHdfSRefListener *listener = sref->listener;
if (listener->OnLastRelease != NULL) {
listener->OnLastRelease(sref);
}
}
}
void HdfSRefConstruct(struct HdfSRef *sref, struct IHdfSRefListener *listener)
{
if ((sref == NULL) || (listener == NULL)) {
HDF_LOGE("Input params is invalid");
return;
}
OsalAtomicSet(&sref->refs, 0);
sref->listener = listener;
sref->Acquire = HdfSRefAcquire;
sref->Release = HdfSRefRelease;
sref->Count = HdfSRefCount;
}