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 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 29 SAWs_Lock(); 30 } 31 return 0; 32 } 33 34 #undef __FUNCT__ 35 #define __FUNCT__ "PetscObjectSAWsGrantAccess" 36 /*@C 37 PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change 38 39 Collective on PetscObject 40 41 Input Parameters: 42 . obj - the Petsc variable 43 Thus must be cast with a (PetscObject), for example, 44 PetscObjectSetName((PetscObject)mat,name); 45 46 Level: advanced 47 48 Concepts: publishing object 49 50 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 51 52 @*/ 53 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 54 { 55 if (obj->amsmem) { 56 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 57 SAWs_Unlock(); 58 } 59 return 0; 60 } 61 62 #undef __FUNCT__ 63 #define __FUNCT__ "PetscObjectSAWsBlock" 64 /*@C 65 PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 66 67 Collective on PetscObject 68 69 Input Parameters: 70 . obj - the Petsc variable 71 Thus must be cast with a (PetscObject), for example, 72 PetscObjectSetName((PetscObject)mat,name); 73 74 75 Level: advanced 76 77 Concepts: publishing object 78 79 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 80 81 @*/ 82 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 83 { 84 PetscErrorCode ierr; 85 volatile PetscBool block = PETSC_TRUE; 86 87 PetscFunctionBegin; 88 PetscValidHeader(obj,1); 89 90 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 91 PetscStackCallSAWs(SAWs_Register,("Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN)); 92 93 ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr); 94 while (block) { 95 ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr); 96 ierr = PetscInfo(NULL,"Blocking on AMS\n"); 97 ierr = PetscSleep(2.0);CHKERRQ(ierr); 98 ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr); 99 } 100 ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr); 101 PetscStackCallSAWs(SAWs_Delete,("Block")); 102 ierr = PetscInfo(NULL,"Out of SAWs block\n"); 103 PetscFunctionReturn(0); 104 } 105 106 #undef __FUNCT__ 107 #define __FUNCT__ "PetscObjectSAWsSetBlock" 108 /*@C 109 PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() 110 111 Collective on PetscObject 112 113 Input Parameters: 114 + obj - the Petsc variable 115 Thus must be cast with a (PetscObject), for example, 116 PetscObjectSetName((PetscObject)mat,name); 117 - flg - whether it should block 118 119 Level: advanced 120 121 Concepts: publishing object 122 123 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 124 125 @*/ 126 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 127 { 128 PetscFunctionBegin; 129 PetscValidHeader(obj,1); 130 obj->amspublishblock = flg; 131 PetscFunctionReturn(0); 132 } 133 134 #undef __FUNCT__ 135 #define __FUNCT__ "PetscObjectSAWsViewOff" 136 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 137 { 138 char dir[1024]; 139 PetscErrorCode ierr; 140 141 PetscFunctionBegin; 142 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 143 if (!obj->amsmem) PetscFunctionReturn(0); 144 ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr); 145 PetscStackCallSAWs(SAWs_Delete,(dir)); 146 PetscFunctionReturn(0); 147 } 148 149