1 2 #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewersaws.h> 4 #include <petscsys.h> 5 6 /*@C 7 PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally 8 9 Collective on PetscObject 10 11 Input Parameters: 12 . obj - the Petsc variable 13 Thus must be cast with a (PetscObject), for example, 14 PetscObjectSetName((PetscObject)mat,name); 15 16 Level: advanced 17 18 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess() 19 20 @*/ 21 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 22 { 23 if (obj->amsmem) { 24 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 25 SAWs_Lock(); 26 } 27 return 0; 28 } 29 30 /*@C 31 PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to change 32 33 Collective on PetscObject 34 35 Input Parameters: 36 . obj - the Petsc variable 37 Thus must be cast with a (PetscObject), for example, 38 PetscObjectSetName((PetscObject)mat,name); 39 40 Level: advanced 41 42 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess() 43 44 @*/ 45 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 46 { 47 if (obj->amsmem) { 48 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 49 SAWs_Unlock(); 50 } 51 return 0; 52 } 53 54 /*@C 55 PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks 56 57 Not Collective 58 59 Level: advanced 60 61 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock() 62 63 @*/ 64 PetscErrorCode PetscSAWsBlock(void) 65 { 66 volatile PetscBool block = PETSC_TRUE; 67 68 PetscFunctionBegin; 69 PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN)); 70 SAWs_Lock(); 71 while (block) { 72 SAWs_Unlock(); 73 PetscCall(PetscInfo(NULL,"Blocking on SAWs\n")); 74 PetscCall(PetscSleep(.3)); 75 SAWs_Lock(); 76 } 77 SAWs_Unlock(); 78 PetscStackCallSAWs(SAWs_Delete,("__Block")); 79 PetscCall(PetscInfo(NULL,"Out of SAWs block\n")); 80 PetscFunctionReturn(0); 81 } 82 83 /*@C 84 PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called 85 86 Collective on PetscObject 87 88 Input Parameters: 89 . obj - the Petsc variable 90 Thus must be cast with a (PetscObject), for example, 91 PetscObjectSetName((PetscObject)mat,name); 92 93 Level: advanced 94 95 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() 96 97 @*/ 98 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 99 { 100 PetscFunctionBegin; 101 PetscValidHeader(obj,1); 102 103 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); 104 PetscCall(PetscSAWsBlock()); 105 PetscFunctionReturn(0); 106 } 107 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 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() 122 123 @*/ 124 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) 125 { 126 PetscFunctionBegin; 127 PetscValidHeader(obj,1); 128 obj->amspublishblock = flg; 129 PetscFunctionReturn(0); 130 } 131 132 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 133 { 134 char dir[PETSC_MAX_PATH_LEN]; 135 136 PetscFunctionBegin; 137 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 138 if (!obj->amsmem) PetscFunctionReturn(0); 139 PetscCall(PetscSNPrintf(dir,sizeof(dir),"/PETSc/Objects/%s",obj->name)); 140 PetscStackCallSAWs(SAWs_Delete,(dir)); 141 PetscFunctionReturn(0); 142 } 143