blob: 0881a058b4b3ebf97d0c139f6941a0a984492a67 [file] [log] [blame]
/*
* Copyright (c) 2011 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef NATIVE_CLIENT_SRC_SHARED_PLATFORM_REFCOUNT_BASE_H_
#define NATIVE_CLIENT_SRC_SHARED_PLATFORM_REFCOUNT_BASE_H_
#include "native_client/src/include/portability.h"
#include "native_client/src/include/nacl_macros.h"
#include "native_client/src/shared/platform/nacl_sync.h"
#include "native_client/src/shared/platform/nacl_sync_checked.h"
// syntactic glucose to refcount arbitrary object using platform
// library's synchronization primitives.
namespace nacl {
//
// base class for refcounted objects
//
class RefCountBase {
public:
RefCountBase();
RefCountBase* Ref();
// subclasses probably want co-variant overloads
void Unref();
protected:
virtual ~RefCountBase();
// dtor (or one method) must be virtual to ensure that the base
// class has a vtbl pointer, so that the covariant casts of Ref()
// using reinterpret_cast<SubClass>(RefCountBase::Ref()) in
// subclasses that have virtual functions
private:
NaClMutex mu_;
uint32_t refcount_;
NACL_DISALLOW_COPY_AND_ASSIGN(RefCountBase);
};
} // namespace
#endif