<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>memory.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.5 on Mon Oct 14 14:16:37 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>memory.h</h1><div class="fragment"><pre>00001 <font class="comment">//</font> 00002 <font class="comment">// memory.h</font> 00003 <font class="comment">//</font> 00004 <font class="comment">// Copyright (C) 1996 Limit Point Systems, Inc.</font> 00005 <font class="comment">//</font> 00006 <font class="comment">// Author: Curtis Janssen <cljanss@limitpt.com></font> 00007 <font class="comment">// Maintainer: LPS</font> 00008 <font class="comment">//</font> 00009 <font class="comment">// This file is part of the SC Toolkit.</font> 00010 <font class="comment">//</font> 00011 <font class="comment">// The SC Toolkit is free software; you can redistribute it and/or modify</font> 00012 <font class="comment">// it under the terms of the GNU Library General Public License as published by</font> 00013 <font class="comment">// the Free Software Foundation; either version 2, or (at your option)</font> 00014 <font class="comment">// any later version.</font> 00015 <font class="comment">//</font> 00016 <font class="comment">// The SC Toolkit is distributed in the hope that it will be useful,</font> 00017 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00018 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00019 <font class="comment">// GNU Library General Public License for more details.</font> 00020 <font class="comment">//</font> 00021 <font class="comment">// You should have received a copy of the GNU Library General Public License</font> 00022 <font class="comment">// along with the SC Toolkit; see the file COPYING.LIB. If not, write to</font> 00023 <font class="comment">// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.</font> 00024 <font class="comment">//</font> 00025 <font class="comment">// The U.S. Government is granted a limited license as per AL 91-7.</font> 00026 <font class="comment">//</font> 00027 00028 <font class="preprocessor">#ifdef __GNUC__</font> 00029 <font class="preprocessor"></font><font class="preprocessor">#pragma interface</font> 00030 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00031 <font class="preprocessor"></font> 00032 <font class="preprocessor">#ifndef _util_group_memory_h</font> 00033 <font class="preprocessor"></font><font class="preprocessor">#define _util_group_memory_h</font> 00034 <font class="preprocessor"></font> 00035 <font class="preprocessor">#include <iostream></font> 00036 00037 <font class="preprocessor">#include <scconfig.h></font> 00038 <font class="preprocessor">#include <util/class/class.h></font> 00039 <font class="preprocessor">#include <util/group/thread.h></font> 00040 00041 <font class="keyword">namespace </font>sc { 00042 00043 <font class="preprocessor">#if 0 // this can be used to catch accidental conversions to int</font> 00044 <font class="preprocessor"></font><font class="keyword">class </font>distsize_t { 00045 <font class="keyword">friend</font> size_t distsize_to_size(<font class="keyword">const</font> distsize_t &a); 00046 <font class="keyword">friend</font> distsize_t operator *(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b); 00047 <font class="keyword">friend</font> distsize_t operator +(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b); 00048 <font class="keyword">friend</font> distsize_t operator -(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b); 00049 <font class="keyword">friend</font> distsize_t operator /(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b); 00050 <font class="keyword">friend</font> distsize_t operator %(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b); 00051 <font class="keyword">friend</font> ostream& operator <<(ostream& o, <font class="keyword">const</font> distsize_t &s); 00052 <font class="keyword">private</font>: 00053 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> <font class="keywordtype">long</font> s; 00054 <font class="keyword">public</font>: 00055 distsize_t(): s(999999999999999LL) {} 00056 distsize_t(<font class="keywordtype">int</font> a): s(a) {} 00057 distsize_t(<font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> a): s(a) {} 00058 distsize_t(<font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> <font class="keywordtype">long</font> a): s(a) {} 00059 distsize_t &operator =(<font class="keyword">const</font> distsize_t &a)<font class="keyword"></font> 00060 <font class="keyword"> </font>{ s=a.s; <font class="keywordflow">return</font> *<font class="keyword">this</font>; } 00061 distsize_t &operator +=(<font class="keyword">const</font> distsize_t &a)<font class="keyword"></font> 00062 <font class="keyword"> </font>{ s+=a.s; <font class="keywordflow">return</font> *<font class="keyword">this</font>; } 00063 distsize_t operator *(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00064 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s*a.s; } 00065 distsize_t operator +(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00066 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s+a.s; } 00067 distsize_t operator -(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00068 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s-a.s; } 00069 distsize_t operator /(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00070 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s/a.s; } 00071 distsize_t operator %(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00072 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s%a.s; } 00073 <font class="keywordtype">bool</font> operator <(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00074 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s<a.s; } 00075 <font class="keywordtype">bool</font> operator <=(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00076 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s<=a.s; } 00077 <font class="keywordtype">bool</font> operator >(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00078 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s>a.s; } 00079 <font class="keywordtype">bool</font> operator >=(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00080 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s>=a.s; } 00081 <font class="keywordtype">bool</font> operator ==(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> const</font> 00082 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s==a.s; } 00083 distsize_t operator *(<font class="keyword">const</font> <font class="keywordtype">int</font> &a)<font class="keyword"> const</font> 00084 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s*a; } 00085 distsize_t operator +(<font class="keyword">const</font> <font class="keywordtype">int</font> &a)<font class="keyword"> const</font> 00086 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s+a; } 00087 distsize_t operator -(<font class="keyword">const</font> <font class="keywordtype">int</font> &a)<font class="keyword"> const</font> 00088 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s-a; } 00089 distsize_t operator /(<font class="keyword">const</font> <font class="keywordtype">int</font> &a)<font class="keyword"> const</font> 00090 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s/a; } 00091 distsize_t operator %(<font class="keyword">const</font> <font class="keywordtype">int</font> &a)<font class="keyword"> const</font> 00092 <font class="keyword"> </font>{ <font class="keywordflow">return</font> s%a; } 00093 }; 00094 <font class="keyword">inline</font> distsize_t operator *(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b)<font class="keyword"></font> 00095 <font class="keyword"></font>{ <font class="keywordflow">return</font> a*b.s; } 00096 <font class="keyword">inline</font> distsize_t operator +(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b)<font class="keyword"></font> 00097 <font class="keyword"></font>{ <font class="keywordflow">return</font> a+b.s; } 00098 <font class="keyword">inline</font> distsize_t operator -(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b)<font class="keyword"></font> 00099 <font class="keyword"></font>{ <font class="keywordflow">return</font> a-b.s; } 00100 <font class="keyword">inline</font> distsize_t operator /(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b)<font class="keyword"></font> 00101 <font class="keyword"></font>{ <font class="keywordflow">return</font> a/b.s; } 00102 <font class="keyword">inline</font> distsize_t operator %(<font class="keyword">const</font> <font class="keywordtype">int</font> &a,<font class="keyword">const</font> distsize_t &b)<font class="keyword"></font> 00103 <font class="keyword"></font>{ <font class="keywordflow">return</font> a%b.s; } 00104 <font class="keyword">inline</font> ostream& operator <<(ostream& o, <font class="keyword">const</font> distsize_t &s)<font class="keyword"> </font>{ <font class="keywordflow">return</font> o<<s.s; } 00105 <font class="keyword">inline</font> size_t distsize_to_size(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> </font>{<font class="keywordflow">return</font> a.s;} 00106 <font class="preprocessor">#elif defined(HAVE_LONG_LONG)</font> 00107 <font class="preprocessor"></font><font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> <font class="keywordtype">long</font> distsize_t; 00108 <font class="keyword">typedef</font> <font class="keywordtype">long</font> <font class="keywordtype">long</font> distssize_t; 00109 <font class="keyword">inline</font> size_t distsize_to_size(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> </font>{<font class="keywordflow">return</font> a;} 00110 <font class="preprocessor">#else</font> 00111 <font class="preprocessor"></font><font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> distsize_t; 00112 <font class="keyword">typedef</font> <font class="keywordtype">long</font> distssize_t; 00113 <font class="keyword">inline</font> size_t distsize_to_size(<font class="keyword">const</font> distsize_t &a)<font class="keyword"> </font>{<font class="keywordflow">return</font> a;} 00114 <font class="preprocessor">#endif</font> 00115 <font class="preprocessor"></font> <a name="l00155"></a><a class="code" href="class_sc__MemoryGrp.html">00155</a> <font class="keyword">class </font>MemoryGrp: <font class="keyword">public</font> DescribedClass { 00156 <font class="keyword">private</font>: 00157 Ref<ThreadLock> *locks_; 00158 <font class="keywordtype">int</font> nlock_; 00159 00160 <font class="keywordtype">void</font> init_locks(); 00161 00162 00163 <font class="keyword">protected</font>: 00164 <font class="comment">// derived classes must fill in all these</font> 00165 <font class="comment">// ~MemoryGrp deletes the arrays</font> 00166 <font class="keywordtype">int</font> me_; 00167 <font class="keywordtype">int</font> n_; 00168 distsize_t *offsets_; <font class="comment">// offsets_[n_] is the fence for all data</font> 00169 00170 <font class="comment">// set to nonzero for debugging information</font> 00171 <font class="keywordtype">int</font> debug_; 00172 00173 <font class="keywordtype">void</font> obtain_local_lock(size_t start, size_t fence); 00174 <font class="keywordtype">void</font> release_local_lock(size_t start, size_t fence); 00175 <font class="keyword">public</font>: 00176 MemoryGrp(); 00177 MemoryGrp(<font class="keyword">const</font> Ref<KeyVal>&); 00178 <font class="keyword">virtual</font> ~MemoryGrp(); 00179 <a name="l00181"></a><a class="code" href="class_sc__MemoryGrp.html#a3">00181</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__MemoryGrp.html#a3">me</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> me_; } <a name="l00183"></a><a class="code" href="class_sc__MemoryGrp.html#a4">00183</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__MemoryGrp.html#a4">n</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> n_; } 00184 00188 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a5">set_localsize</a>(size_t) = 0; <a name="l00190"></a><a class="code" href="class_sc__MemoryGrp.html#a6">00190</a> size_t <a class="code" href="class_sc__MemoryGrp.html#a6">localsize</a>()<font class="keyword"> </font>{ <font class="keywordflow">return</font> distsize_to_size(offsets_[me_+1]-offsets_[me_]); } 00192 <font class="keyword">virtual</font> <font class="keywordtype">void</font> *<a class="code" href="class_sc__MemoryGrp.html#a7">localdata</a>() = 0; <a name="l00194"></a><a class="code" href="class_sc__MemoryGrp.html#a8">00194</a> distsize_t <a class="code" href="class_sc__MemoryGrp.html#a8">localoffset</a>()<font class="keyword"> </font>{ <font class="keywordflow">return</font> offsets_[me_]; } <a name="l00196"></a><a class="code" href="class_sc__MemoryGrp.html#a9">00196</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__MemoryGrp.html#a9">size</a>(<font class="keywordtype">int</font> node)<font class="keyword"></font> 00197 <font class="keyword"> </font>{ <font class="keywordflow">return</font> distsize_to_size(offsets_[node+1] - offsets_[node]); } <a name="l00199"></a><a class="code" href="class_sc__MemoryGrp.html#a10">00199</a> distsize_t <a class="code" href="class_sc__MemoryGrp.html#a10">offset</a>(<font class="keywordtype">int</font> node)<font class="keyword"> </font>{ <font class="keywordflow">return</font> offsets_[node]; } <a name="l00201"></a><a class="code" href="class_sc__MemoryGrp.html#a11">00201</a> distsize_t <a class="code" href="class_sc__MemoryGrp.html#a11">totalsize</a>()<font class="keyword"> </font>{ <font class="keywordflow">return</font> offsets_[n_]; } 00202 00204 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a12">activate</a>(); 00206 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a13">deactivate</a>(); 00207 00209 <font class="keyword">virtual</font> <font class="keywordtype">void</font> *<a class="code" href="class_sc__MemoryGrp.html#a14">obtain_writeonly</a>(distsize_t offset, <font class="keywordtype">int</font> size) = 0; 00215 <font class="keyword">virtual</font> <font class="keywordtype">void</font> *<a class="code" href="class_sc__MemoryGrp.html#a15">obtain_readwrite</a>(distsize_t offset, <font class="keywordtype">int</font> size) = 0; 00217 <font class="keyword">virtual</font> <font class="keywordtype">void</font> *<a class="code" href="class_sc__MemoryGrp.html#a16">obtain_readonly</a>(distsize_t offset, <font class="keywordtype">int</font> size) = 0; 00219 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a17">release_readonly</a>(<font class="keywordtype">void</font> *data, distsize_t offset, <font class="keywordtype">int</font> size) = 0; 00221 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a18">release_writeonly</a>(<font class="keywordtype">void</font> *data, distsize_t offset, <font class="keywordtype">int</font> size)=0; 00224 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a19">release_readwrite</a>(<font class="keywordtype">void</font> *data, distsize_t offset, <font class="keywordtype">int</font> size)=0; 00225 00226 <font class="keyword">virtual</font> <font class="keywordtype">void</font> sum_reduction(<font class="keywordtype">double</font> *data, distsize_t doffset, <font class="keywordtype">int</font> dsize); 00227 <font class="keyword">virtual</font> <font class="keywordtype">void</font> sum_reduction_on_node(<font class="keywordtype">double</font> *data, size_t doffset, <font class="keywordtype">int</font> dsize, 00228 <font class="keywordtype">int</font> node = -1); 00229 00232 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a22">sync</a>() = 0; 00233 00240 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a23">catchup</a>(); 00241 00243 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#a24">print</a>(std::ostream &o = ExEnv::out0()) <font class="keyword">const</font>; 00244 00252 <font class="keyword">static</font> MemoryGrp* <a class="code" href="class_sc__MemoryGrp.html#d0">initial_memorygrp</a>(<font class="keywordtype">int</font> &argc, <font class="keywordtype">char</font>** argv); 00253 <font class="keyword">static</font> MemoryGrp* <a class="code" href="class_sc__MemoryGrp.html#d0">initial_memorygrp</a>(); 00256 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrp.html#d2">set_default_memorygrp</a>(<font class="keyword">const</font> Ref<MemoryGrp>&); 00258 <font class="keyword">static</font> MemoryGrp* <a class="code" href="class_sc__MemoryGrp.html#d3">get_default_memorygrp</a>(); 00259 }; 00260 00261 00267 template <class data_t> <a name="l00268"></a><a class="code" href="class_sc__MemoryGrpBuf.html">00268</a> <font class="keyword">class </font>MemoryGrpBuf { 00269 Ref<MemoryGrp> grp_; 00270 <font class="keyword">enum</font> AccessType { None, Read, Write, ReadWrite }; 00271 AccessType accesstype_; 00272 data_t *data_; 00273 distsize_t offset_; 00274 <font class="keywordtype">int</font> length_; 00275 <font class="keyword">public</font>: 00279 <a class="code" href="class_sc__MemoryGrpBuf.html#a0">MemoryGrpBuf</a>(<font class="keyword">const</font> Ref<MemoryGrp> &); 00284 data_t *<a class="code" href="class_sc__MemoryGrpBuf.html#a1">writeonly</a>(distsize_t offset, <font class="keywordtype">int</font> length); 00289 data_t *<a class="code" href="class_sc__MemoryGrpBuf.html#a2">readwrite</a>(distsize_t offset, <font class="keywordtype">int</font> length); 00294 <font class="keyword">const</font> data_t *<a class="code" href="class_sc__MemoryGrpBuf.html#a3">readonly</a>(distsize_t offset, <font class="keywordtype">int</font> length); 00298 data_t *<a class="code" href="class_sc__MemoryGrpBuf.html#a4">writeonly_on_node</a>(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node = -1); 00299 data_t *readwrite_on_node(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node = -1); 00300 <font class="keyword">const</font> data_t *readonly_on_node(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node = -1); 00304 <font class="keywordtype">void</font> <a class="code" href="class_sc__MemoryGrpBuf.html#a7">release</a>(); <a name="l00306"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a8">00306</a> <font class="keywordtype">int</font> <a class="code" href="class_sc__MemoryGrpBuf.html#a8">length</a>()<font class="keyword"> const </font>{ <font class="keywordflow">return</font> length_; } 00307 }; 00308 00310 <font class="comment">// MemoryGrpBuf members</font> 00311 00312 template <class data_t> <a name="l00313"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a0">00313</a> MemoryGrpBuf<data_t>::MemoryGrpBuf(<font class="keyword">const</font> Ref<MemoryGrp> & grp)<font class="keyword"></font> 00314 <font class="keyword"></font>{ 00315 grp_ = grp; 00316 accesstype_ = None; 00317 } 00318 00319 template <class data_t> 00320 data_t * <a name="l00321"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a1">00321</a> MemoryGrpBuf<data_t>::writeonly(distsize_t offset, <font class="keywordtype">int</font> length)<font class="keyword"></font> 00322 <font class="keyword"></font>{ 00323 <font class="keywordflow">if</font> (accesstype_ != None) <a class="code" href="class_sc__MemoryGrpBuf.html#a7">release</a>(); 00324 data_ = (data_t *) grp_->obtain_writeonly(<font class="keyword">sizeof</font>(data_t)*offset, 00325 <font class="keyword">sizeof</font>(data_t)*length); 00326 offset_ = offset; 00327 length_ = length; 00328 accesstype_ = Write; 00329 <font class="keywordflow">return</font> data_; 00330 } 00331 00332 template <class data_t> 00333 data_t * <a name="l00334"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a2">00334</a> MemoryGrpBuf<data_t>::readwrite(distsize_t offset, <font class="keywordtype">int</font> length)<font class="keyword"></font> 00335 <font class="keyword"></font>{ 00336 <font class="keywordflow">if</font> (accesstype_ != None) <a class="code" href="class_sc__MemoryGrpBuf.html#a7">release</a>(); 00337 data_ = (data_t *) grp_->obtain_readwrite(<font class="keyword">sizeof</font>(data_t)*offset, 00338 <font class="keyword">sizeof</font>(data_t)*length); 00339 offset_ = offset; 00340 length_ = length; 00341 accesstype_ = ReadWrite; 00342 <font class="keywordflow">return</font> data_; 00343 } 00344 00345 template <class data_t> 00346 <font class="keyword">const</font> data_t * <a name="l00347"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a3">00347</a> MemoryGrpBuf<data_t>::readonly(distsize_t offset, <font class="keywordtype">int</font> length)<font class="keyword"></font> 00348 <font class="keyword"></font>{ 00349 <font class="keywordflow">if</font> (accesstype_ != None) <a class="code" href="class_sc__MemoryGrpBuf.html#a7">release</a>(); 00350 data_ = (data_t *) grp_->obtain_readonly(<font class="keyword">sizeof</font>(data_t)*offset, 00351 <font class="keyword">sizeof</font>(data_t)*length); 00352 offset_ = offset; 00353 length_ = length; 00354 accesstype_ = Read; 00355 <font class="keywordflow">return</font> data_; 00356 } 00357 00358 template <class data_t> 00359 data_t * <a name="l00360"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a4">00360</a> MemoryGrpBuf<data_t>::writeonly_on_node(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node)<font class="keyword"></font> 00361 <font class="keyword"></font>{ 00362 <font class="keywordflow">if</font> (node == -1) node = grp_->me(); 00363 <font class="keywordflow">return</font> <a class="code" href="class_sc__MemoryGrpBuf.html#a1">writeonly</a>(offset + grp_->offset(node)/<font class="keyword">sizeof</font>(data_t), length); 00364 } 00365 00366 template <class data_t> 00367 data_t * 00368 MemoryGrpBuf<data_t>::readwrite_on_node(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node)<font class="keyword"></font> 00369 <font class="keyword"></font>{ 00370 <font class="keywordflow">if</font> (node == -1) node = grp_->me(); 00371 <font class="keywordflow">return</font> <a class="code" href="class_sc__MemoryGrpBuf.html#a2">readwrite</a>(offset + grp_->offset(node)/<font class="keyword">sizeof</font>(data_t), length); 00372 } 00373 00374 template <class data_t> 00375 <font class="keyword">const</font> data_t * 00376 MemoryGrpBuf<data_t>::readonly_on_node(size_t offset, <font class="keywordtype">int</font> length, <font class="keywordtype">int</font> node)<font class="keyword"></font> 00377 <font class="keyword"></font>{ 00378 <font class="keywordflow">if</font> (node == -1) node = grp_->me(); 00379 <font class="keywordflow">return</font> <a class="code" href="class_sc__MemoryGrpBuf.html#a3">readonly</a>(offset + grp_->offset(node)/<font class="keyword">sizeof</font>(data_t), length); 00380 } 00381 00382 template <class data_t> 00383 <font class="keywordtype">void</font> <a name="l00384"></a><a class="code" href="class_sc__MemoryGrpBuf.html#a7">00384</a> MemoryGrpBuf<data_t>::release()<font class="keyword"></font> 00385 <font class="keyword"></font>{ 00386 <font class="keywordflow">if</font> (accesstype_ == Write) 00387 grp_->release_writeonly((data_t *)data_, 00388 <font class="keyword">sizeof</font>(data_t)*offset_, <font class="keyword">sizeof</font>(data_t)*length_); 00389 <font class="keywordflow">if</font> (accesstype_ == Read) 00390 grp_->release_readonly(data_, <font class="keyword">sizeof</font>(data_t)*offset_, 00391 <font class="keyword">sizeof</font>(data_t)*length_); 00392 <font class="keywordflow">if</font> (accesstype_ == ReadWrite) 00393 grp_->release_readwrite(data_, <font class="keyword">sizeof</font>(data_t)*offset_, 00394 <font class="keyword">sizeof</font>(data_t)*length_); 00395 00396 accesstype_ = None; 00397 } 00398 00399 } 00400 00401 <font class="preprocessor">#endif</font> 00402 <font class="preprocessor"></font> 00403 <font class="comment">// Local Variables:</font> 00404 <font class="comment">// mode: c++</font> 00405 <font class="comment">// c-file-style: "CLJ"</font> 00406 <font class="comment">// End:</font> </div></pre><hr> <address> <small> Generated at Mon Oct 14 14:16:37 2002 for <a href="http://aros.ca.sandia.gov/~cljanss/mpqc">MPQC</a> 2.1.2 using the documentation package <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> 1.2.5. </small> </address> </body> </html>