00001 /* align16New.cc 00002 */ 00003 #include "osl/bits/align16New.h" 00004 #include <cassert> 00005 #include <cstdlib> 00006 00007 void * osl::misc::Align16New::operator new(size_t size) 00008 { 00009 char *ptr = ::new char[size+Alignment]; 00010 for (int i=0; i<Alignment; ++i) { 00011 if (reinterpret_cast<unsigned long>(ptr + i + 1) % Alignment == 0) { 00012 *(ptr + i) = i + 1; 00013 // std::cerr << ">> " << (long)ptr << " => " << (long)(ptr + i + 1) << "\n"; 00014 return ptr + i + 1; 00015 } 00016 } 00017 assert(0); 00018 abort(); 00019 } 00020 00021 void * osl::misc::Align16New::operator new[](size_t size) 00022 { 00023 return operator new(size); 00024 } 00025 00026 void osl::misc::Align16New::operator delete(void *ptr, size_t /*size*/) 00027 { 00028 char *p = static_cast<char*>(ptr); 00029 int offset = *(p-1); 00030 ::delete(p - offset); 00031 // std::cerr << "<< " << (long)p << " => " << (long)(p - offset) << "\n"; 00032 } 00033 00034 void osl::misc::Align16New::operator delete[](void *ptr, size_t size) 00035 { 00036 return operator delete(ptr, size); 00037 } 00038 00039 // ;;; Local Variables: 00040 // ;;; mode:c++ 00041 // ;;; c-basic-offset:2 00042 // ;;; End: