Globals: Global Memory

LightWave

Font List Host Display Info Globals Table of Contents

Global Memory
Global Render Memory

Availability  LightWave 6.0
Component  Layout
Header  lwrender.h

These globals allow plug-ins to allocate and share named chunks of memory. The memory comes from a pool managed by Layout. "Global Render Memory" is used during rendering and is freed automatically when rendering ends. "Global Memory" persists until the scene is cleared.

Global Call

   LWGlobalPool *memfunc;
   memfunc = global( LWGLOBALPOOL_RENDER_GLOBAL, GFUSE_TRANSIENT );
   memfunc = global( LWGLOBALPOOL_GLOBAL, GFUSE_TRANSIENT );

The global function returns a pointer to an LWGlobalPool.

   typedef struct st_LWGlobalPool {
      LWMemChunk   (*first)  (void);
      LWMemChunk   (*next)   (LWMemChunk);
      const char * (*ID)     (LWMemChunk);
      int          (*size)   (LWMemChunk);
      LWMemChunk   (*find)   (const char *ID);
      LWMemChunk   (*create) (const char *ID, int size);
   } LWGlobalPool;
mem = first()
Returns the first memory chunk in the pool. This and the next function allow you to traverse the entire list of memory chunks in the pool. Use them if you need to search for memory chunks using criteria more complex than just the chunk ID string.

mem = next( mem )
Returns the next memory block in the list.

name = ID( mem )
Returns the chunk identifier. This is the name string that was passed to create.

bytes = size( mem )
Returns the size in bytes of a memory chunk.

mem = find( name )
Returns the memory chunk with the given ID. Multiple chunks may be created with the same ID, so this returns the first one.

mem = create( name, size )
Creates a memory chunk with the given size and ID and returns a pointer to the memory. If you want the name string to uniquely identify the chunk, you should try to find a chunk with your ID before using the ID in create.

Example

This code fragment allocates a render memory chunk named "my memory".

   #include <lwserver.h>
   #include <lwhost.h>
   #define COUNT 100

   static char name[] = "my widget memory";
   LWGlobalPool *memfunc;
   LWMemChunk mem;
   int *p, i;

   memfunc = global( LWGLOBALPOOL_RENDER_GLOBAL, GFUSE_TRANSIENT );
   if ( !memfunc ) goto NoMemFunc;  /* global calls can fail */

   mem = memfunc->find( name );
   if ( !mem )
      mem = memfunc->create( name, COUNT * sizeof( int ));
   if ( !mem )
      goto ErrorNoMem;

   p = ( int * ) mem;
   for ( i = 0; i < COUNT; i++ ) {
      p[ i ] = ...