87 lines
3.1 KiB
Plaintext
87 lines
3.1 KiB
Plaintext
// Filename: deletedBufferChain.I
|
|
// Created by: drose (20Jul07)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: DeletedBufferChain::validate
|
|
// Access: Public
|
|
// Description: Returns true if the pointer is valid, false if it has
|
|
// been deleted or if it was never a valid pointer.
|
|
//
|
|
// This is only meaningful in debug mode, where
|
|
// USE_DELETEDCHAINFLAG is defined. If not, this
|
|
// trivially returns true.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool DeletedBufferChain::
|
|
validate(void *ptr) {
|
|
TAU_PROFILE("bool DeletedBufferChain::validate(void *)", " ", TAU_USER);
|
|
if (ptr == (void *)NULL) {
|
|
return false;
|
|
}
|
|
|
|
#ifdef USE_DELETEDCHAINFLAG
|
|
const ObjectNode *obj = buffer_to_node(ptr);
|
|
return AtomicAdjust::get(obj->_flag) == DCF_alive;
|
|
#else
|
|
return true;
|
|
#endif // USE_DELETEDCHAINFLAG
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: DeletedBufferChain::get_buffer_size
|
|
// Access: Public
|
|
// Description: Returns the size of the buffer that is actually
|
|
// returned at each request.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE size_t DeletedBufferChain::
|
|
get_buffer_size() const {
|
|
return _buffer_size;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: DeletedBufferChain::node_to_buffer
|
|
// Access: Private, Static
|
|
// Description: Casts an ObjectNode* to a void* buffer.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void *DeletedBufferChain::
|
|
node_to_buffer(DeletedBufferChain::ObjectNode *node) {
|
|
#ifdef USE_DELETEDCHAINFLAG
|
|
// In development mode, we increment the pointer so that the
|
|
// returned data does not overlap our _flags member.
|
|
return (void *)(((PN_int32 *)node) + 1);
|
|
#else
|
|
return (void *)node;
|
|
#endif // NDEBUG
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: DeletedBufferChain::buffer_to_node
|
|
// Access: Private, Static
|
|
// Description: Casts a void* buffer to an ObjectNode* .
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE DeletedBufferChain::ObjectNode *DeletedBufferChain::
|
|
buffer_to_node(void *ptr) {
|
|
#ifdef USE_DELETEDCHAINFLAG
|
|
// In development mode, we decrement the pointer to undo the
|
|
// increment we did above.
|
|
return (ObjectNode *)(((PN_int32 *)ptr) - 1);
|
|
#else
|
|
return (ObjectNode *)ptr;
|
|
#endif // NDEBUG
|
|
}
|