(file) Return to array.cpp CVS log (file) (dir) Up to [OMI] / omi / micxx

Diff for /omi/micxx/array.cpp between version 1.3 and 1.4

version 1.3, 2015/04/20 18:10:13 version 1.4, 2015/04/20 18:19:52
Line 27 
Line 27 
 #include <assert.h> #include <assert.h>
 #include <new> #include <new>
 #include <common.h> #include <common.h>
   #include <pal/atomic.h>
 #include "types.h" #include "types.h"
 #include "instance.h" #include "instance.h"
  
Line 34 
Line 35 
  
 struct header struct header
 { {
     AtomicType      m_refCounter;      volatile ptrdiff_t m_refCounter;
     MI_Uint32       m_capacity;     MI_Uint32       m_capacity;
 }; };
  
Line 158 
Line 159 
     header* chunk = (header*)operator new(sizeof(header) + capacity * v_traits->size);     header* chunk = (header*)operator new(sizeof(header) + capacity * v_traits->size);
  
     chunk->m_capacity = capacity;     chunk->m_capacity = capacity;
     AtomicSet(chunk->m_refCounter, 0);      Atomic_Swap(&chunk->m_refCounter, 0);
  
     return (chunk + 1);     return (chunk + 1);
 } }
Line 171 
Line 172 
 inline static void AddRef(void* data) inline static void AddRef(void* data)
 { {
     if ( data )     if ( data )
         AtomicInc(GetHeader(data)->m_refCounter);          Atomic_Inc(&GetHeader(data)->m_refCounter);
 } }
  
 static void Release(void* v_this, const ArrayTraits* v_traits) static void Release(void* v_this, const ArrayTraits* v_traits)
 { {
     Array_data* v = (Array_data*)v_this;     Array_data* v = (Array_data*)v_this;
     if ( v->p &&     if ( v->p &&
         AtomicDec(GetHeader(v->p)->m_refCounter))          Atomic_Dec(&GetHeader(v->p)->m_refCounter) == 0)
     {     {
         if (v_traits->dtor)         if (v_traits->dtor)
             v_traits->dtor(v->p,v->size);             v_traits->dtor(v->p,v->size);
Line 221 
Line 222 
 void __ArrayCOW(void* v_this, const ArrayTraits* v_traits) void __ArrayCOW(void* v_this, const ArrayTraits* v_traits)
 { {
     Array_data* v = (Array_data*)v_this;     Array_data* v = (Array_data*)v_this;
     if ( v->p && AtomicGet(GetHeader(v->p)->m_refCounter) != 1 )      if ( v->p && Atomic_Read(&GetHeader(v->p)->m_refCounter) != 1 )
     {     {
         void* new_data = Allocate(v->size,v_traits);         void* new_data = Allocate(v->size,v_traits);
  


Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

ViewCVS 0.9.2