1 2 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewersaws.h> 4 #include <petscsys.h> 5 6 #undef __FUNCT__ 7 #define __FUNCT__ "PetscObjectSAWsTakeAccess" 8 /*@C 9 PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally 10 11 Collective on PetscObject 12 13 Input Parameters: 14 . obj - the Petsc variable 15 Thus must be cast with a (PetscObject), for example, 16 PetscObjectSetName((PetscObject)mat,name); 17 18 Level: advanced 19 20 Concepts: publishing object 21 22 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess() 23 24 @*/ 25 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 26 { 27 if (obj->amsmem) { 28 SAWs_Lock(); 29 } 30 return 0; 31 } 32 33 #undef __FUNCT__ 34 #define __FUNCT__ "PetscObjectSAWsGrantAccess" 35 /*@C 36 PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change 37 38 Collective on PetscObject 39 40 Input Parameters: 41 . obj - the Petsc variable 42 Thus must be cast with a (PetscObject), for example, 43 PetscObjectSetName((PetscObject)mat,name); 44 45 Level: advanced 46 47 Concepts: publishing object 48 49 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 50 51 @*/ 52 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 53 { 54 if (obj->amsmem) { 55 SAWs_Unlock(); 56 } 57 return 0; 58 } 59 60 #undef __FUNCT__ 61 #define __FUNCT__ "PetscObjectSAWsBlock" 62 /*@C 63 PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 64 65 Collective on PetscObject 66 67 Input Parameters: 68 . obj - the Petsc variable 69 Thus must be cast with a (PetscObject), for example, 70 PetscObjectSetName((PetscObject)mat,name); 71 72 73 Level: advanced 74 75 Concepts: publishing object 76 77 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 78 79 @*/ 80 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 81 { 82 PetscErrorCode ierr; 83 84 PetscFunctionBegin; 85 PetscValidHeader(obj,1); 86 87 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 88 ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr); 89 while (obj->amsblock) { 90 ierr = PetscInfo(NULL,"Blocking on AMS\n"); 91 ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr); 92 ierr = PetscSleep(2.0);CHKERRQ(ierr); 93 ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr); 94 } 95 ierr = PetscInfo(NULL,"Out of SAWs block\n"); 96 obj->amsblock = PETSC_TRUE; 97 ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr); 98 PetscFunctionReturn(0); 99 } 100 101 #undef __FUNCT__ 102 #define __FUNCT__ "PetscObjectSAWsSetBlock" 103 /*@C 104 PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() 105 106 Collective on PetscObject 107 108 Input Parameters: 109 + obj - the Petsc variable 110 Thus must be cast with a (PetscObject), for example, 111 PetscObjectSetName((PetscObject)mat,name); 112 - flg - whether it should block 113 114 Level: advanced 115 116 Concepts: publishing object 117 118 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 119 120 @*/ 121 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 122 { 123 PetscFunctionBegin; 124 PetscValidHeader(obj,1); 125 obj->amspublishblock = flg; 126 obj->amsblock = flg; 127 PetscFunctionReturn(0); 128 } 129 130 #undef __FUNCT__ 131 #define __FUNCT__ "PetscObjectSAWsViewOff" 132 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 133 { 134 char dir[1024]; 135 PetscErrorCode ierr; 136 137 PetscFunctionBegin; 138 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 139 ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr); 140 SAWs_Delete(dir); 141 PetscFunctionReturn(0); 142 } 143 144