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__ "PetscSAWsBlock" 64 /*@C 65 PetscSAWsBlock - Blocks on SAWs until a client unblocks 66 67 Not Collective 68 69 Level: advanced 70 71 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock() 72 73 @*/ 74 PetscErrorCode PetscSAWsBlock(void) 75 { 76 PetscErrorCode ierr; 77 volatile PetscBool block = PETSC_TRUE; 78 79 PetscFunctionBegin; 80 PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN)); 81 SAWs_Lock(); 82 while (block) { 83 SAWs_Unlock(); 84 ierr = PetscInfo(NULL,"Blocking on SAWs\n"); 85 ierr = PetscSleep(.3);CHKERRQ(ierr); 86 SAWs_Lock(); 87 } 88 SAWs_Unlock(); 89 PetscStackCallSAWs(SAWs_Delete,("__Block")); 90 ierr = PetscInfo(NULL,"Out of SAWs block\n"); 91 PetscFunctionReturn(0); 92 } 93 94 #undef __FUNCT__ 95 #define __FUNCT__ "PetscObjectSAWsBlock" 96 /*@C 97 PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 98 99 Collective on PetscObject 100 101 Input Parameters: 102 . obj - the Petsc variable 103 Thus must be cast with a (PetscObject), for example, 104 PetscObjectSetName((PetscObject)mat,name); 105 106 107 Level: advanced 108 109 Concepts: publishing object 110 111 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 112 113 @*/ 114 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 115 { 116 PetscErrorCode ierr; 117 118 PetscFunctionBegin; 119 PetscValidHeader(obj,1); 120 121 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 122 ierr = PetscSAWsBlock();CHKERRQ(ierr); 123 PetscFunctionReturn(0); 124 } 125 126 #undef __FUNCT__ 127 #define __FUNCT__ "PetscObjectSAWsSetBlock" 128 /*@C 129 PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() 130 131 Collective on PetscObject 132 133 Input Parameters: 134 + obj - the Petsc variable 135 Thus must be cast with a (PetscObject), for example, 136 PetscObjectSetName((PetscObject)mat,name); 137 - flg - whether it should block 138 139 Level: advanced 140 141 Concepts: publishing object 142 143 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 144 145 @*/ 146 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 147 { 148 PetscFunctionBegin; 149 PetscValidHeader(obj,1); 150 obj->amspublishblock = flg; 151 PetscFunctionReturn(0); 152 } 153 154 #undef __FUNCT__ 155 #define __FUNCT__ "PetscObjectSAWsViewOff" 156 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 157 { 158 char dir[1024]; 159 PetscErrorCode ierr; 160 161 PetscFunctionBegin; 162 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 163 if (!obj->amsmem) PetscFunctionReturn(0); 164 ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr); 165 PetscStackCallSAWs(SAWs_Delete,(dir)); 166 PetscFunctionReturn(0); 167 } 168 169