83c0446f27
- make sure that all binder Bn classes define a ctor and dtor in their respective library. This avoids duplication of the ctor/dtor in libraries where these objects are instantiated. This is also cleaner, should we want these ctor/dtor to do something one day. - same change as above for some Bp classes and various other non-binder classes - moved the definition of CHECK_INTERFACE() in IInterface.h instead of having it everywhere. - improved the CHECK_INTERFACE() macro so it calls a single method in Parcel, instead of inlining its code everywhere - IBinder::getInterfaceDescriptor() now returns a "const String16&" instead of String16, which saves calls to String16 and ~String16 - implemented a cache for BpBinder::getInterfaceDescriptor(), since this does an IPC. HOWEVER, this method never seems to be called. The cache makes BpBinder bigger, so we need to figure out if we need this method at all.
125 lines
4.1 KiB
C++
125 lines
4.1 KiB
C++
/*
|
|
* Copyright (C) 2005 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ANDROID_BPBINDER_H
|
|
#define ANDROID_BPBINDER_H
|
|
|
|
#include <binder/IBinder.h>
|
|
#include <utils/KeyedVector.h>
|
|
#include <utils/threads.h>
|
|
|
|
// ---------------------------------------------------------------------------
|
|
namespace android {
|
|
|
|
class BpBinder : public IBinder
|
|
{
|
|
public:
|
|
BpBinder(int32_t handle);
|
|
|
|
inline int32_t handle() const { return mHandle; }
|
|
|
|
virtual const String16& getInterfaceDescriptor() const;
|
|
virtual bool isBinderAlive() const;
|
|
virtual status_t pingBinder();
|
|
virtual status_t dump(int fd, const Vector<String16>& args);
|
|
|
|
virtual status_t transact( uint32_t code,
|
|
const Parcel& data,
|
|
Parcel* reply,
|
|
uint32_t flags = 0);
|
|
|
|
virtual status_t linkToDeath(const sp<DeathRecipient>& recipient,
|
|
void* cookie = NULL,
|
|
uint32_t flags = 0);
|
|
virtual status_t unlinkToDeath( const wp<DeathRecipient>& recipient,
|
|
void* cookie = NULL,
|
|
uint32_t flags = 0,
|
|
wp<DeathRecipient>* outRecipient = NULL);
|
|
|
|
virtual void attachObject( const void* objectID,
|
|
void* object,
|
|
void* cleanupCookie,
|
|
object_cleanup_func func);
|
|
virtual void* findObject(const void* objectID) const;
|
|
virtual void detachObject(const void* objectID);
|
|
|
|
virtual BpBinder* remoteBinder();
|
|
|
|
status_t setConstantData(const void* data, size_t size);
|
|
void sendObituary();
|
|
|
|
class ObjectManager
|
|
{
|
|
public:
|
|
ObjectManager();
|
|
~ObjectManager();
|
|
|
|
void attach( const void* objectID,
|
|
void* object,
|
|
void* cleanupCookie,
|
|
IBinder::object_cleanup_func func);
|
|
void* find(const void* objectID) const;
|
|
void detach(const void* objectID);
|
|
|
|
void kill();
|
|
|
|
private:
|
|
ObjectManager(const ObjectManager&);
|
|
ObjectManager& operator=(const ObjectManager&);
|
|
|
|
struct entry_t
|
|
{
|
|
void* object;
|
|
void* cleanupCookie;
|
|
IBinder::object_cleanup_func func;
|
|
};
|
|
|
|
KeyedVector<const void*, entry_t> mObjects;
|
|
};
|
|
|
|
protected:
|
|
virtual ~BpBinder();
|
|
virtual void onFirstRef();
|
|
virtual void onLastStrongRef(const void* id);
|
|
virtual bool onIncStrongAttempted(uint32_t flags, const void* id);
|
|
|
|
private:
|
|
const int32_t mHandle;
|
|
|
|
struct Obituary {
|
|
wp<DeathRecipient> recipient;
|
|
void* cookie;
|
|
uint32_t flags;
|
|
};
|
|
|
|
void reportOneDeath(const Obituary& obit);
|
|
bool isDescriptorCached() const;
|
|
|
|
mutable Mutex mLock;
|
|
volatile int32_t mAlive;
|
|
volatile int32_t mObitsSent;
|
|
Vector<Obituary>* mObituaries;
|
|
ObjectManager mObjects;
|
|
Parcel* mConstantData;
|
|
mutable String16 mDescriptorCache;
|
|
};
|
|
|
|
}; // namespace android
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
#endif // ANDROID_BPBINDER_H
|