00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "Teuchos_Workspace.hpp"
00030
00031 namespace {
00032 Teuchos::RefCountPtr<Teuchos::WorkspaceStore> default_workspace_store(Teuchos::null);
00033 }
00034
00035
00036
00037 void Teuchos::set_default_workspace_store( const Teuchos::RefCountPtr<WorkspaceStore> &default_workspace_store_in )
00038 {
00039 default_workspace_store = default_workspace_store_in;
00040 }
00041
00042 Teuchos::RefCountPtr<Teuchos::WorkspaceStore> Teuchos::get_default_workspace_store()
00043 {
00044 return default_workspace_store;
00045 }
00046
00047 void Teuchos::print_memory_usage_stats( const WorkspaceStore* workspace_store, std::ostream& out )
00048 {
00049 if( workspace_store ) {
00050 out
00051 << "\n*** Statistics for autmatic array workspace:"
00052 << "\n Number of megabytes of preallocated workspace = "
00053 << (workspace_store->num_bytes_total()*1e-6)
00054 << "\n Number of megabytes needed = "
00055 << (workspace_store->num_max_bytes_needed()*1e-6)
00056 << "\n Number of allocations using preallocated workspace = "
00057 << workspace_store->num_static_allocations()
00058 << "\n Number of dynamic allocations beyond preallocated workspace = "
00059 << workspace_store->num_dyn_allocations()
00060 << std::endl;
00061 }
00062 else {
00063 out
00064 << "\n*** Statistics for autmatic array workspace:"
00065 << "\n No workspace storage was allocated!\n";
00066 }
00067 }
00068
00069 namespace Teuchos {
00070
00071
00072
00073 WorkspaceStore::WorkspaceStore(size_t num_bytes)
00074 : workspace_begin_(NULL)
00075 , workspace_end_(NULL)
00076 , curr_ws_ptr_(NULL)
00077 , num_static_allocations_(0)
00078 , num_dyn_allocations_(0)
00079 , num_current_bytes_total_(0)
00080 , num_max_bytes_needed_(0)
00081 {
00082 if(num_bytes)
00083 protected_initialize(num_bytes);
00084 }
00085
00086 WorkspaceStore::~WorkspaceStore() {
00087 if(workspace_begin_) delete [] workspace_begin_;
00088 }
00089
00090 void WorkspaceStore::protected_initialize(size_t num_bytes)
00091 {
00092 TEST_FOR_EXCEPTION(
00093 curr_ws_ptr_ != workspace_begin_, std::logic_error
00094 ,"WorkspaceStore::set_workspace_size(...) : Error, "
00095 "You can not reset the workspace size when any RawWorkspace objects "
00096 "are using workspace!" );
00097 if(workspace_begin_) delete [] workspace_begin_;
00098 workspace_begin_ = ::new char[num_bytes];
00099 workspace_end_ = workspace_begin_ + num_bytes;
00100 curr_ws_ptr_ = workspace_begin_;
00101 num_static_allocations_ = 0;
00102 num_dyn_allocations_ = 0;
00103 num_current_bytes_total_= 0;
00104 num_max_bytes_needed_ = 0;
00105 }
00106
00107
00108
00109 RawWorkspace::RawWorkspace(WorkspaceStore* workspace_store, size_t num_bytes)
00110 {
00111 if(num_bytes) {
00112 workspace_store_ = workspace_store;
00113 if( !workspace_store_ || workspace_store_->num_bytes_remaining() < num_bytes ) {
00114 workspace_begin_ = ::new char[num_bytes];
00115 workspace_end_ = workspace_begin_ + num_bytes;
00116 owns_memory_ = true;
00117 if(workspace_store_)
00118 workspace_store_->num_dyn_allocations_++;
00119 }
00120 else {
00121 workspace_begin_ = workspace_store_->curr_ws_ptr_;
00122 workspace_end_ = workspace_begin_ + num_bytes;
00123 owns_memory_ = false;
00124 workspace_store_->curr_ws_ptr_ += num_bytes;
00125 workspace_store_->num_static_allocations_++;
00126 }
00127 }
00128 else {
00129 workspace_store_ = NULL;
00130 workspace_begin_ = NULL;
00131 workspace_end_ = NULL;
00132 owns_memory_ = false;
00133 }
00134 if(workspace_store_) {
00135 workspace_store_->num_current_bytes_total_ += num_bytes;
00136 if( workspace_store_->num_current_bytes_total_ > workspace_store_->num_max_bytes_needed_ )
00137 workspace_store_->num_max_bytes_needed_ = workspace_store_->num_current_bytes_total_;
00138 }
00139 }
00140
00141 RawWorkspace::~RawWorkspace()
00142 {
00143 if(workspace_store_)
00144 workspace_store_->num_current_bytes_total_ -= this->num_bytes();
00145 if(owns_memory_) {
00146 if(workspace_begin_) delete [] workspace_begin_;
00147 }
00148 else {
00149 if(workspace_store_) {
00150 TEST_FOR_EXCEPTION(
00151 workspace_store_->curr_ws_ptr_ != workspace_end_, std::logic_error
00152 ,"RawWorkspace::~RawWorkspace(...): Error, "
00153 "Invalid usage of RawWorkspace class, corrupted WorspaceStore object!" );
00154 workspace_store_->curr_ws_ptr_ = workspace_begin_;
00155 }
00156 }
00157 }
00158
00159 #ifdef __PGI // Should not have to define this since it should not be called!
00160 void* RawWorkspace::operator new(size_t)
00161 {
00162 assert(0);
00163 return NULL;
00164 }
00165 #endif
00166
00167 }