00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <Basics.H>
00024
00025 #include <sstream>
00026
00027
00028 #include <SRPC.H>
00029 #include <LimService.H>
00030
00031
00032 #include <FP.H>
00033
00034
00035 #include <PKPrefix.H>
00036 #include <BitVector.H>
00037 #include <CacheConfig.H>
00038 #include <CacheIntf.H>
00039 #include <Debug.H>
00040 #include <CacheState.H>
00041 #include <Model.H>
00042 #include <CacheIndex.H>
00043 #include <FV.H>
00044 #include <VestaVal.H>
00045
00046
00047 #include "CacheS.H"
00048 #include "ExpCache.H"
00049
00050 using std::ostringstream;
00051 using std::cout;
00052 using std::cerr;
00053 using std::endl;
00054
00055 void ExpCache_NewCall(SRPC *srpc, int procId, void *arg) throw (SRPC::failure)
00056
00057 {
00058 ExpCache *csExp = ((ExpCache::CallArg *)arg)->expCache;
00059
00060 switch (procId) {
00061
00062 case CacheIntf::AddEntryProc: csExp->AddEntry(srpc); break;
00063 case CacheIntf::FreeVarsProc: csExp->FreeVars(srpc); break;
00064 case CacheIntf::LookupProc: csExp->Lookup(srpc); break;
00065 case CacheIntf::CheckpointProc: csExp->Checkpoint(srpc); break;
00066 case CacheIntf::RenewLeasesProc: csExp->RenewLeases(srpc); break;
00067 case CacheIntf::GetCacheInstanceProc:
00068 csExp->GetCacheInstance(srpc); break;
00069
00070
00071 case CacheIntf::WeedRecoverProc: csExp->WeederRecovering(srpc); break;
00072 case CacheIntf::StartMarkProc: csExp->StartMark(srpc); break;
00073 case CacheIntf::SetHitFilterProc: csExp->SetHitFilter(srpc); break;
00074 case CacheIntf::GetLeasesProc: csExp->GetLeases(srpc); break;
00075 case CacheIntf::ResumeLeasesProc: csExp->ResumeLeaseExp(srpc); break;
00076 case CacheIntf::EndMarkProc: csExp->EndMark(srpc); break;
00077 case CacheIntf::CommitChkptProc: csExp->CommitChkpt(srpc); break;
00078
00079
00080 case CacheIntf::FlushAllProc: csExp->FlushAll(srpc); break;
00081 case CacheIntf::GetCacheIdProc: csExp->GetCacheId(srpc); break;
00082 case CacheIntf::GetCacheStateProc: csExp->GetCacheState(srpc); break;
00083
00084
00085 default:
00086 cerr << "Fatal ExpCache error: ";
00087 cerr << "Unknown method code " << procId << endl;
00088 assert(false);
00089 }
00090 }
00091
00092 ExpCache::ExpCache(CacheS *cs, int maxRunning, int maxBlocked,
00093 LimService_FailureCallback failureCallback, const Text& hostName)
00094 throw ()
00095 : debug(cs->DebugLevel())
00096 {
00097
00098 CallArg *arg = NEW_CONSTR(ExpCache::CallArg, (this, cs));
00099
00100
00101 this->cs = cs;
00102 this->ls = NEW_CONSTR(LimService,
00103 (Config_Port, this->cs->Version(),
00104 maxRunning, maxBlocked,
00105 ExpCache_NewCall, failureCallback,
00106 (void *)arg, -1, hostName));
00107 }
00108
00109 void ExpCache::Run() throw (SRPC::failure)
00110 {
00111 this->ls->Run();
00112 }
00113
00114 bool ExpCache::check_server_instance(SRPC *srpc,
00115 const FP::Tag &server_instance,
00116 const char *func_name)
00117 const
00118 throw(SRPC::failure)
00119 {
00120
00121 if(server_instance != cs->GetCacheInstance())
00122 {
00123
00124 srpc->send_int(0);
00125 srpc->send_end();
00126
00127
00128 if (this->debug >= CacheIntf::OtherOps) {
00129 Debug::Lock();
00130 cout << Debug::Timestamp() << "CALLED -- " << func_name << endl;
00131 cout << " server instance mismatch, call aborted" << endl
00132 << " client = " << server_instance << endl
00133 << " server = " << cs->GetCacheInstance() << endl;
00134 cout << endl;
00135 Debug::Unlock();
00136 }
00137
00138
00139
00140 return false;
00141 }
00142
00143
00144 return true;
00145 }
00146
00147 void ExpCache::FreeVars(SRPC *srpc) throw (SRPC::failure)
00148 {
00149
00150 FP::Tag server_instance(*srpc);
00151
00152
00153 FP::Tag pk(*srpc);
00154 srpc->recv_end();
00155
00156
00157 if(!check_server_instance(srpc, server_instance, "FreeVariables"))
00158 {
00159
00160 return;
00161 }
00162
00163
00164 if (this->debug >= CacheIntf::OtherOps) {
00165 Debug::Lock();
00166 cout << Debug::Timestamp() << "CALLED -- FreeVariables" << endl;
00167 cout << " pk = " << pk << endl;
00168 cout << endl;
00169 Debug::Unlock();
00170 }
00171
00172
00173 VPKFile *vf;
00174 cs->FreeVariables(pk, vf);
00175
00176
00177 srpc->send_int(1);
00178
00179 try
00180 {
00181
00182 vf->SendAllNames(srpc, (bool)(this->debug >= CacheIntf::OtherOps));
00183 srpc->send_end();
00184 }
00185
00186
00187
00188
00189
00190 catch (PrefixTbl::Overflow)
00191 {
00192 ostringstream l_msg;
00193 l_msg << "PrefixTbl overflow in sending result of FreeVariables"
00194 << endl
00195 << " pk = " << pk << endl
00196 << "(This means you've exceeded internal limits of the" << endl
00197 << "cache server, and you may have to erase your cache.)";
00198 srpc->send_failure(SRPC::internal_trouble, Text(l_msg.str()));
00199 }
00200 }
00201
00202 void ExpCache::Lookup(SRPC *srpc) throw (SRPC::failure)
00203 {
00204
00205 FP::Tag server_instance(*srpc);
00206
00207
00208 FP::Tag pk(*srpc);
00209 FV::Epoch id = srpc->recv_int();
00210 FP::List fps(*srpc);
00211 srpc->recv_end();
00212
00213
00214 if(!check_server_instance(srpc, server_instance, "Lookup"))
00215 {
00216
00217 return;
00218 }
00219
00220
00221 if (this->debug >= CacheIntf::OtherOps) {
00222 Debug::Lock();
00223 cout << Debug::Timestamp() << "CALLED -- Lookup" << endl;
00224 cout << " pk = " << pk << endl;
00225 cout << " epoch = " << id << endl;
00226 cout << " fps =" << endl; fps.Print(cout, 4);
00227 cout << endl;
00228 Debug::Unlock();
00229 }
00230
00231
00232 CacheEntry::Index ci = 0;
00233 const VestaVal::T *value = (VestaVal::T *)NULL;
00234 CacheIntf::LookupRes res =
00235 cs->Lookup(pk, id, fps, ci, value);
00236
00237
00238 if (this->debug >= CacheIntf::OtherOps) {
00239 Debug::Lock();
00240 cout << Debug::Timestamp() << "RETURNED -- Lookup" << endl;
00241 cout << " result = " << CacheIntf::LookupResName(res) << endl;
00242 if (res == CacheIntf::Hit) {
00243 cout << " index = " << ci << endl;
00244 cout << " value =" << endl; value->Print(cout, 4);
00245 }
00246 cout << endl;
00247 Debug::Unlock();
00248 }
00249
00250
00251 srpc->send_int(1);
00252
00253
00254 srpc->send_int((int)res);
00255 if (res == CacheIntf::Hit) {
00256 srpc->send_int(ci);
00257 value->Send(*srpc);
00258 }
00259 srpc->send_end();
00260 }
00261
00262 void ExpCache::AddEntry(SRPC *srpc) throw (SRPC::failure)
00263 {
00264
00265 FP::Tag server_instance(*srpc);
00266
00267
00268 FP::Tag* pk = NEW_PTRFREE_CONSTR(FP::Tag, (*srpc));
00269 FV::List *names = NEW_CONSTR(FV::List, (*srpc));
00270 FP::List *fps = NEW_CONSTR(FP::List, (*srpc));
00271 VestaVal::T *value = NEW_CONSTR(VestaVal::T, (*srpc));
00272 Model::T model = Model::Recv(*srpc);
00273 CacheEntry::Indices *kids = NEW_CONSTR(CacheEntry::Indices, (*srpc));
00274 Text sourceFunc;
00275 srpc->recv_Text( sourceFunc);
00276 srpc->recv_end();
00277
00278
00279 if(!check_server_instance(srpc, server_instance, "AddEntry"))
00280 {
00281
00282 return;
00283 }
00284
00285
00286 if (this->debug >= CacheIntf::AddEntryOp) {
00287 Debug::Lock();
00288 cout << Debug::Timestamp() << "CALLED -- AddEntry" << endl;
00289 cout << " pk = " << *pk << endl;
00290 cout << " names =" << endl; names->Print(cout, 4);
00291 cout << " fps =" << endl; fps->Print(cout, 4);
00292 cout << " value =" << endl; value->Print(cout, 4);
00293 cout << " model = " << model << endl;
00294 cout << " kids = " << *kids << endl;
00295 cout << " sourceFunc = " << sourceFunc << endl;
00296 cout << endl;
00297 Debug::Unlock();
00298 }
00299
00300
00301 CacheEntry::Index ci;
00302 CacheIntf::AddEntryRes res = cs->AddEntry(pk, names, fps,
00303 value, model, kids, sourceFunc, ci);
00304
00305
00306 if (this->debug >= CacheIntf::AddEntryOp) {
00307 Debug::Lock();
00308 cout << Debug::Timestamp() << "RETURNED -- AddEntry" << endl;
00309 cout << " result = " << CacheIntf::AddEntryResName(res) << endl;
00310 if (res == CacheIntf::EntryAdded) {
00311 cout << " ci = " << ci << endl;
00312 }
00313 cout << endl;
00314 Debug::Unlock();
00315 }
00316
00317
00318 srpc->send_int(1);
00319
00320
00321 srpc->send_int(ci);
00322 srpc->send_int((int)res);
00323 srpc->send_end();
00324 }
00325
00326 void ExpCache::Checkpoint(SRPC *srpc) throw (SRPC::failure)
00327 {
00328
00329 FP::Tag server_instance(*srpc);
00330
00331
00332 FP::Tag pkgVersion(*srpc);
00333 Model::T model = Model::Recv(*srpc);
00334 CacheEntry::Indices *cis = NEW_CONSTR(CacheEntry::Indices,(*srpc));
00335 bool done = (bool)srpc->recv_int();
00336 srpc->recv_end();
00337
00338
00339 if(!check_server_instance(srpc, server_instance, "Checkpoint"))
00340 {
00341
00342 return;
00343 }
00344
00345
00346 if (this->debug >= CacheIntf::LogFlush) {
00347 Debug::Lock();
00348 cout << Debug::Timestamp() << "CALLED -- Checkpoint" << endl;
00349 cout << " pkgVersion = " << pkgVersion << endl;
00350 cout << " model = " << model << endl;
00351 cout << " cis = "; cis->Print(cout, 4);
00352 cout << " done = " << BoolName[done] << endl;
00353 cout << endl;
00354 Debug::Unlock();
00355 }
00356
00357
00358 cs->Checkpoint(pkgVersion, model, cis, done);
00359
00360
00361 if (this->debug >= CacheIntf::LogFlush) {
00362 Debug::Lock();
00363 cout << Debug::Timestamp() << "RETURNED -- Checkpoint" << endl;
00364 cout << endl;
00365 Debug::Unlock();
00366 }
00367
00368
00369 srpc->send_int(1);
00370
00371
00372 srpc->send_end();
00373 }
00374
00375 void ExpCache::RenewLeases(SRPC *srpc) throw (SRPC::failure)
00376 {
00377
00378 FP::Tag server_instance(*srpc);
00379
00380
00381 CacheEntry::Indices *cis = NEW_CONSTR(CacheEntry::Indices, (*srpc));
00382 srpc->recv_end();
00383
00384
00385 if(!check_server_instance(srpc, server_instance, "RenewLeases"))
00386 {
00387
00388 return;
00389 }
00390
00391
00392 if (this->debug >= CacheIntf::LeaseExp) {
00393 Debug::Lock();
00394 cout << Debug::Timestamp() << "CALLED -- RenewLeases" << endl;
00395 cout << " cis = " << *cis << endl;
00396 cout << endl;
00397 Debug::Unlock();
00398 }
00399
00400
00401 bool res = cs->RenewLeases(cis);
00402
00403
00404 if (this->debug >= CacheIntf::LeaseExp) {
00405 Debug::Lock();
00406 cout << Debug::Timestamp() << "RETURNED -- RenewLeases" << endl;
00407 cout << " result = " << BoolName[res] << endl;
00408 cout << endl;
00409 Debug::Unlock();
00410 }
00411
00412
00413 srpc->send_int(1);
00414
00415
00416 srpc->send_int((int)res);
00417 srpc->send_end();
00418 }
00419
00420 void ExpCache::WeederRecovering(SRPC *srpc) throw (SRPC::failure)
00421 {
00422
00423 FP::Tag server_instance(*srpc);
00424
00425
00426 bool doneMarking = srpc->recv_int();
00427 srpc->recv_end();
00428
00429
00430 if(!check_server_instance(srpc, server_instance, "WeederRecovering"))
00431 {
00432
00433 return;
00434 }
00435
00436
00437 if (this->debug >= CacheIntf::WeederOps) {
00438 Debug::Lock();
00439 cout << Debug::Timestamp() << "CALLED -- WeederRecovering" << endl;
00440 cout << " doneMarking = " << BoolName[doneMarking] << endl;
00441 cout << endl;
00442 Debug::Unlock();
00443 }
00444
00445
00446 bool err = cs->WeederRecovering(srpc, doneMarking);
00447
00448
00449 if (this->debug >= CacheIntf::WeederOps) {
00450 Debug::Lock();
00451 cout << Debug::Timestamp() << "RETURNED -- WeederRecovering" << endl;
00452 cout << " err = " << BoolName[err] << endl;
00453 cout << endl;
00454 Debug::Unlock();
00455 }
00456
00457
00458 srpc->send_int(1);
00459
00460
00461 srpc->send_int((int)err);
00462 srpc->send_end();
00463 }
00464
00465 void ExpCache::StartMark(SRPC *srpc) throw (SRPC::failure)
00466 {
00467
00468 FP::Tag server_instance(*srpc);
00469
00470
00471 srpc->recv_end();
00472
00473
00474 if(!check_server_instance(srpc, server_instance, "StartMark"))
00475 {
00476
00477 return;
00478 }
00479
00480
00481 if (this->debug >= CacheIntf::WeederOps) {
00482 Debug::Lock();
00483 cout << Debug::Timestamp() << "CALLED -- StartMark" << endl;
00484 cout << endl;
00485 Debug::Unlock();
00486 }
00487
00488
00489 int newLogVer;
00490 BitVector *res = cs->StartMark( newLogVer);
00491
00492
00493 if (this->debug >= CacheIntf::WeederOps) {
00494 Debug::Lock();
00495 cout << Debug::Timestamp() << "RETURNED -- StartMark" << endl;
00496 cout << " initCIs = " << *res << endl;
00497 cout << " newLogVer = " << newLogVer << endl;
00498 cout << endl;
00499 Debug::Unlock();
00500 }
00501
00502
00503 srpc->send_int(1);
00504
00505
00506 res->Send(*srpc);
00507 srpc->send_int(newLogVer);
00508 srpc->send_end();
00509 }
00510
00511 void ExpCache::SetHitFilter(SRPC *srpc) throw (SRPC::failure)
00512 {
00513
00514 FP::Tag server_instance(*srpc);
00515
00516
00517 BitVector cis(*srpc);
00518 srpc->recv_end();
00519
00520
00521 if(!check_server_instance(srpc, server_instance, "SetHitFilter"))
00522 {
00523
00524 return;
00525 }
00526
00527
00528 if (this->debug >= CacheIntf::WeederOps) {
00529 Debug::Lock();
00530 cout << Debug::Timestamp() << "CALLED -- SetHitFilter" << endl;
00531 cout << " cis = " << cis << endl;
00532 cout << endl;
00533 Debug::Unlock();
00534 }
00535
00536
00537 cs->SetHitFilter(cis);
00538
00539
00540 if (this->debug >= CacheIntf::WeederOps) {
00541 Debug::Lock();
00542 cout << Debug::Timestamp() << "RETURNED -- SetHitFilter" << endl;
00543 cout << endl;
00544 Debug::Unlock();
00545 }
00546
00547
00548 srpc->send_int(1);
00549
00550
00551 srpc->send_end();
00552 }
00553
00554 void ExpCache::GetLeases(SRPC *srpc) throw (SRPC::failure)
00555 {
00556
00557 FP::Tag server_instance(*srpc);
00558
00559
00560 srpc->recv_end();
00561
00562
00563 if(!check_server_instance(srpc, server_instance, "GetLeases"))
00564 {
00565
00566 return;
00567 }
00568
00569
00570 if (this->debug >= CacheIntf::WeederOps) {
00571 Debug::Lock();
00572 cout << Debug::Timestamp() << "CALLED -- GetLeases" << endl;
00573 cout << endl;
00574 Debug::Unlock();
00575 }
00576
00577
00578 BitVector *res = cs->GetLeases();
00579
00580
00581 if (this->debug >= CacheIntf::WeederOps) {
00582 Debug::Lock();
00583 cout << Debug::Timestamp() << "RETURNED -- GetLeases" << endl;
00584 cout << " cis = " << *res << endl;
00585 cout << endl;
00586 Debug::Unlock();
00587 }
00588
00589
00590 srpc->send_int(1);
00591
00592
00593 res->Send(*srpc);
00594 srpc->send_end();
00595 }
00596
00597 void ExpCache::ResumeLeaseExp(SRPC *srpc) throw (SRPC::failure)
00598 {
00599
00600 FP::Tag server_instance(*srpc);
00601
00602
00603 srpc->recv_end();
00604
00605
00606 if(!check_server_instance(srpc, server_instance, "ResumeLeaseExp"))
00607 {
00608
00609 return;
00610 }
00611
00612
00613 if (this->debug >= CacheIntf::WeederOps) {
00614 Debug::Lock();
00615 cout << Debug::Timestamp() << "CALLED -- ResumeLeaseExp" << endl;
00616 cout << endl;
00617 Debug::Unlock();
00618 }
00619
00620
00621 cs->ResumeLeaseExp();
00622
00623
00624 if (this->debug >= CacheIntf::WeederOps) {
00625 Debug::Lock();
00626 cout << Debug::Timestamp() << "RETURNED -- ResumeLeaseExp" << endl;
00627 cout << endl;
00628 Debug::Unlock();
00629 }
00630
00631
00632 srpc->send_int(1);
00633
00634
00635 srpc->send_end();
00636 }
00637
00638 void ExpCache::EndMark(SRPC *srpc) throw (SRPC::failure)
00639 {
00640
00641 FP::Tag server_instance(*srpc);
00642
00643
00644 BitVector cis(*srpc);
00645 PKPrefix::List pfxs(*srpc);
00646 srpc->recv_end();
00647
00648
00649 if(!check_server_instance(srpc, server_instance, "EndMark"))
00650 {
00651
00652 return;
00653 }
00654
00655
00656 if (this->debug >= CacheIntf::WeederOps) {
00657 Debug::Lock();
00658 cout << Debug::Timestamp() << "CALLED -- EndMark" << endl;
00659 cout << " cis = " << cis << endl;
00660 cout << " prefixes ="; pfxs.Print(cout, 4);
00661 cout << endl;
00662 Debug::Unlock();
00663 }
00664
00665
00666 int chkptVer = cs->EndMark(cis, pfxs);
00667
00668
00669 if (this->debug >= CacheIntf::WeederOps) {
00670 Debug::Lock();
00671 cout << Debug::Timestamp() << "RETURNED -- EndMark" << endl;
00672 cout << " chkptVer = " << chkptVer << endl;
00673 cout << endl;
00674 Debug::Unlock();
00675 }
00676
00677
00678 srpc->send_int(1);
00679
00680
00681 srpc->send_int(chkptVer);
00682 srpc->send_end();
00683 }
00684
00685 void ExpCache::CommitChkpt(SRPC *srpc) throw (SRPC::failure)
00686 {
00687
00688 FP::Tag server_instance(*srpc);
00689
00690
00691 Text chkptFileName;
00692 srpc->recv_Text( chkptFileName);
00693 srpc->recv_end();
00694
00695
00696 if(!check_server_instance(srpc, server_instance, "CommitChkpt"))
00697 {
00698
00699 return;
00700 }
00701
00702
00703 if (this->debug >= CacheIntf::WeederOps) {
00704 Debug::Lock();
00705 cout << Debug::Timestamp() << "CALLED -- CommitChkpt" << endl;
00706 cout << " chkptFileName = " << chkptFileName << endl;
00707 cout << endl;
00708 Debug::Unlock();
00709 }
00710
00711
00712 bool l_result = cs->CommitChkpt(chkptFileName);
00713
00714
00715 if (this->debug >= CacheIntf::WeederOps) {
00716 Debug::Lock();
00717 cout << Debug::Timestamp() << "RETURNED -- CommitChkpt" << endl;
00718 cout << " result: checkpoint " << (l_result?"accepted":"rejected")
00719 << endl;
00720 cout << endl;
00721 Debug::Unlock();
00722 }
00723
00724
00725 srpc->send_int(1);
00726
00727
00728 srpc->send_int((int) l_result);
00729 srpc->send_end();
00730 }
00731
00732 void ExpCache::FlushAll(SRPC *srpc) throw (SRPC::failure)
00733 {
00734
00735 srpc->recv_end();
00736
00737
00738 if (this->debug >= CacheIntf::MPKFileFlush) {
00739 Debug::Lock();
00740 cout << Debug::Timestamp() << "CALLED -- FlushAll" << endl;
00741 cout << endl;
00742 Debug::Unlock();
00743 }
00744
00745
00746 cs->FlushAll();
00747
00748
00749 if (this->debug >= CacheIntf::MPKFileFlush) {
00750 Debug::Lock();
00751 cout << Debug::Timestamp() << "RETURNED -- FlushAll" << endl;
00752 cout << endl;
00753 Debug::Unlock();
00754 }
00755
00756
00757 srpc->send_end();
00758 }
00759
00760 void ExpCache::GetCacheId(SRPC *srpc) throw (SRPC::failure)
00761 {
00762
00763 srpc->recv_end();
00764
00765
00766 if (this->debug >= CacheIntf::OtherOps) {
00767 Debug::Lock();
00768 cout << Debug::Timestamp() << "CALLED -- GetCacheId" << endl;
00769 cout << endl;
00770 Debug::Unlock();
00771 }
00772
00773
00774 CacheId id;
00775 cs->GetCacheId( id);
00776
00777
00778 if (this->debug >= CacheIntf::OtherOps) {
00779 Debug::Lock();
00780 cout << Debug::Timestamp() << "RETURNED -- GetCacheId" << endl;
00781 id.Print(cout, 2);
00782 cout << endl;
00783 Debug::Unlock();
00784 }
00785
00786
00787 id.Send(*srpc);
00788 srpc->send_end();
00789 }
00790
00791 void ExpCache::GetCacheInstance(SRPC *srpc) throw (SRPC::failure)
00792 {
00793
00794 srpc->recv_end();
00795
00796
00797 if (this->debug >= CacheIntf::OtherOps) {
00798 Debug::Lock();
00799 cout << Debug::Timestamp() << "CALLED -- GetCacheInstance" << endl;
00800 cout << endl;
00801 Debug::Unlock();
00802 }
00803
00804
00805 FP::Tag fp = cs->GetCacheInstance();
00806
00807
00808 if (this->debug >= CacheIntf::OtherOps) {
00809 Debug::Lock();
00810 cout << Debug::Timestamp() << "RETURNED -- GetCacheInstance" << endl
00811 << " " << fp << endl;;
00812 cout << endl;
00813 Debug::Unlock();
00814 }
00815
00816
00817 fp.Send(*srpc);
00818 srpc->send_end();
00819 }
00820
00821 void ExpCache::GetCacheState(SRPC *srpc) throw (SRPC::failure)
00822 {
00823
00824 srpc->recv_end();
00825
00826
00827 if (this->debug >= CacheIntf::OtherOps) {
00828 Debug::Lock();
00829 cout << Debug::Timestamp() << "CALLED -- GetCacheState" << endl;
00830 cout << endl;
00831 Debug::Unlock();
00832 }
00833
00834
00835 CacheState state;
00836 cs->GetCacheState( state);
00837
00838
00839 if (this->debug >= CacheIntf::OtherOps) {
00840 Debug::Lock();
00841 cout << Debug::Timestamp() << "RETURNED -- GetCacheState" << endl;
00842 state.Print(cout, 2);
00843 cout << endl;
00844 Debug::Unlock();
00845 }
00846
00847
00848 state.Send(*srpc);
00849 srpc->send_end();
00850 }
00851