1b3506946SBarry Smith 2afcb2eb5SJed Brown #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 3e04113cfSBarry Smith #include <petscviewersaws.h> 4ec7429eaSBarry Smith #include <petscsys.h> 5b3506946SBarry Smith 6b3506946SBarry Smith #undef __FUNCT__ 7e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsTakeAccess" 8ec7429eaSBarry Smith /*@C 9e04113cfSBarry Smith PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally 10ec7429eaSBarry Smith 11ec7429eaSBarry Smith Collective on PetscObject 12ec7429eaSBarry Smith 13ec7429eaSBarry Smith Input Parameters: 14ec7429eaSBarry Smith . obj - the Petsc variable 15ec7429eaSBarry Smith Thus must be cast with a (PetscObject), for example, 16ec7429eaSBarry Smith PetscObjectSetName((PetscObject)mat,name); 17ec7429eaSBarry Smith 18ec7429eaSBarry Smith Level: advanced 19ec7429eaSBarry Smith 20ec7429eaSBarry Smith Concepts: publishing object 21ec7429eaSBarry Smith 22e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess() 23ec7429eaSBarry Smith 24ec7429eaSBarry Smith @*/ 25e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 26ec7429eaSBarry Smith { 27ec957eceSBarry Smith if (obj->amsmem) { 2816ad0300SBarry Smith /* cannot wrap with PetscPushStack() because that also deals with the locks */ 299a492a5cSBarry Smith SAWs_Lock(); 30ec7429eaSBarry Smith } 3167a1e3b6SBarry Smith return 0; 32ec7429eaSBarry Smith } 33ec7429eaSBarry Smith 34ec7429eaSBarry Smith #undef __FUNCT__ 35e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsGrantAccess" 36ec7429eaSBarry Smith /*@C 37e04113cfSBarry Smith PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change 38ec7429eaSBarry Smith 39ec7429eaSBarry Smith Collective on PetscObject 40ec7429eaSBarry Smith 41ec7429eaSBarry Smith Input Parameters: 42ec7429eaSBarry Smith . obj - the Petsc variable 43ec7429eaSBarry Smith Thus must be cast with a (PetscObject), for example, 44ec7429eaSBarry Smith PetscObjectSetName((PetscObject)mat,name); 45ec7429eaSBarry Smith 46ec7429eaSBarry Smith Level: advanced 47ec7429eaSBarry Smith 48ec7429eaSBarry Smith Concepts: publishing object 49ec7429eaSBarry Smith 50e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 51ec7429eaSBarry Smith 52ec7429eaSBarry Smith @*/ 53e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 54ec7429eaSBarry Smith { 55ec957eceSBarry Smith if (obj->amsmem) { 5616ad0300SBarry Smith /* cannot wrap with PetscPushStack() because that also deals with the locks */ 579a492a5cSBarry Smith SAWs_Unlock(); 58ec7429eaSBarry Smith } 5967a1e3b6SBarry Smith return 0; 60ec7429eaSBarry Smith } 61ec7429eaSBarry Smith 62ec7429eaSBarry Smith #undef __FUNCT__ 637aab2a10SBarry Smith #define __FUNCT__ "PetscSAWsBlock" 647aab2a10SBarry Smith /*@C 657aab2a10SBarry Smith PetscSAWsBlock - Blocks on SAWs until a client unblocks 667aab2a10SBarry Smith 677aab2a10SBarry Smith Not Collective 687aab2a10SBarry Smith 697aab2a10SBarry Smith Level: advanced 707aab2a10SBarry Smith 717aab2a10SBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock() 727aab2a10SBarry Smith 737aab2a10SBarry Smith @*/ 747aab2a10SBarry Smith PetscErrorCode PetscSAWsBlock(void) 757aab2a10SBarry Smith { 767aab2a10SBarry Smith PetscErrorCode ierr; 777aab2a10SBarry Smith volatile PetscBool block = PETSC_TRUE; 787aab2a10SBarry Smith 797aab2a10SBarry Smith PetscFunctionBegin; 80*d50831c4SBarry Smith PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN)); 817aab2a10SBarry Smith SAWs_Lock(); 827aab2a10SBarry Smith while (block) { 837aab2a10SBarry Smith SAWs_Unlock(); 847aab2a10SBarry Smith ierr = PetscInfo(NULL,"Blocking on SAWs\n"); 85485c7403SBarry Smith ierr = PetscSleep(.3);CHKERRQ(ierr); 867aab2a10SBarry Smith SAWs_Lock(); 877aab2a10SBarry Smith } 887aab2a10SBarry Smith SAWs_Unlock(); 89*d50831c4SBarry Smith PetscStackCallSAWs(SAWs_Delete,("__Block")); 907aab2a10SBarry Smith ierr = PetscInfo(NULL,"Out of SAWs block\n"); 917aab2a10SBarry Smith PetscFunctionReturn(0); 927aab2a10SBarry Smith } 937aab2a10SBarry Smith 947aab2a10SBarry Smith #undef __FUNCT__ 95e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsBlock" 96b90c6cbeSBarry Smith /*@C 97e04113cfSBarry Smith PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 98b90c6cbeSBarry Smith 99b90c6cbeSBarry Smith Collective on PetscObject 100b90c6cbeSBarry Smith 101b90c6cbeSBarry Smith Input Parameters: 102b90c6cbeSBarry Smith . obj - the Petsc variable 103b90c6cbeSBarry Smith Thus must be cast with a (PetscObject), for example, 104b90c6cbeSBarry Smith PetscObjectSetName((PetscObject)mat,name); 105b90c6cbeSBarry Smith 106b90c6cbeSBarry Smith 107b90c6cbeSBarry Smith Level: advanced 108b90c6cbeSBarry Smith 109b90c6cbeSBarry Smith Concepts: publishing object 110b90c6cbeSBarry Smith 111e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 112b90c6cbeSBarry Smith 113b90c6cbeSBarry Smith @*/ 114e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 115b90c6cbeSBarry Smith { 116a332a263SBarry Smith PetscErrorCode ierr; 117a332a263SBarry Smith 118b90c6cbeSBarry Smith PetscFunctionBegin; 119b90c6cbeSBarry Smith PetscValidHeader(obj,1); 120b90c6cbeSBarry Smith 12196f8ada6SBarry Smith if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 1227aab2a10SBarry Smith ierr = PetscSAWsBlock();CHKERRQ(ierr); 123b90c6cbeSBarry Smith PetscFunctionReturn(0); 124b90c6cbeSBarry Smith } 125b90c6cbeSBarry Smith 126b90c6cbeSBarry Smith #undef __FUNCT__ 127e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsSetBlock" 128b90c6cbeSBarry Smith /*@C 129e04113cfSBarry Smith PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() 130b90c6cbeSBarry Smith 131b90c6cbeSBarry Smith Collective on PetscObject 132b90c6cbeSBarry Smith 133b90c6cbeSBarry Smith Input Parameters: 134b90c6cbeSBarry Smith + obj - the Petsc variable 135b90c6cbeSBarry Smith Thus must be cast with a (PetscObject), for example, 136b90c6cbeSBarry Smith PetscObjectSetName((PetscObject)mat,name); 137b90c6cbeSBarry Smith - flg - whether it should block 138b90c6cbeSBarry Smith 139b90c6cbeSBarry Smith Level: advanced 140b90c6cbeSBarry Smith 141b90c6cbeSBarry Smith Concepts: publishing object 142b90c6cbeSBarry Smith 143e04113cfSBarry Smith .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 144b90c6cbeSBarry Smith 145b90c6cbeSBarry Smith @*/ 146e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 147b90c6cbeSBarry Smith { 148b90c6cbeSBarry Smith PetscFunctionBegin; 149b90c6cbeSBarry Smith PetscValidHeader(obj,1); 150b90c6cbeSBarry Smith obj->amspublishblock = flg; 151b90c6cbeSBarry Smith PetscFunctionReturn(0); 152b90c6cbeSBarry Smith } 153b90c6cbeSBarry Smith 154b90c6cbeSBarry Smith #undef __FUNCT__ 155e04113cfSBarry Smith #define __FUNCT__ "PetscObjectSAWsViewOff" 156e04113cfSBarry Smith PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 15792e62aa6SBarry Smith { 1589a492a5cSBarry Smith char dir[1024]; 1599a492a5cSBarry Smith PetscErrorCode ierr; 1609a492a5cSBarry Smith 16192e62aa6SBarry Smith PetscFunctionBegin; 1629fb22e1aSBarry Smith if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 16316ad0300SBarry Smith if (!obj->amsmem) PetscFunctionReturn(0); 1649a492a5cSBarry Smith ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr); 16516ad0300SBarry Smith PetscStackCallSAWs(SAWs_Delete,(dir)); 16692e62aa6SBarry Smith PetscFunctionReturn(0); 16792e62aa6SBarry Smith } 16892e62aa6SBarry Smith 169