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 by a `PetscObject` so their values may 8 be changed in the computation 9 10 Collective 11 12 Input Parameters: 13 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat); 14 15 Level: advanced 16 17 Developer Note: 18 The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and `PetscObjectSAWsRestoreAccess()` 19 20 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()` 21 @*/ 22 PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 23 { 24 if (obj->amsmem) { 25 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 26 SAWs_Lock(); 27 } 28 return PETSC_SUCCESS; 29 } 30 31 /*@C 32 PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs called when the changes made during 33 `PetscObjectSAWsTakeAccess()` are complete. This allows the webserve to change the published values. 34 35 Collective 36 37 Input Parameters: 38 . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat); 39 40 Level: advanced 41 42 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()` 43 @*/ 44 PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 45 { 46 if (obj->amsmem) { 47 /* cannot wrap with PetscPushStack() because that also deals with the locks */ 48 SAWs_Unlock(); 49 } 50 return PETSC_SUCCESS; 51 } 52 53 /*@C 54 PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it 55 56 Not Collective 57 58 Level: advanced 59 60 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()` 61 @*/ 62 PetscErrorCode PetscSAWsBlock(void) 63 { 64 volatile PetscBool block = PETSC_TRUE; 65 66 PetscFunctionBegin; 67 PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN)); 68 SAWs_Lock(); 69 while (block) { 70 SAWs_Unlock(); 71 PetscCall(PetscInfo(NULL, "Blocking on SAWs\n")); 72 PetscCall(PetscSleep(.3)); 73 SAWs_Lock(); 74 } 75 SAWs_Unlock(); 76 PetscCallSAWs(SAWs_Delete, ("__Block")); 77 PetscCall(PetscInfo(NULL, "Out of SAWs block\n")); 78 PetscFunctionReturn(PETSC_SUCCESS); 79 } 80 81 /*@C 82 PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called 83 84 Collective 85 86 Input Parameters: 87 . obj - the PETSc variable 88 89 Level: advanced 90 91 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()` 92 @*/ 93 PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 94 { 95 PetscFunctionBegin; 96 PetscValidHeader(obj, 1); 97 98 if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS); 99 PetscCall(PetscSAWsBlock()); 100 PetscFunctionReturn(PETSC_SUCCESS); 101 } 102 103 /*@C 104 PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()` 105 106 Collective 107 108 Input Parameters: 109 + obj - the PETSc variable 110 - flg - whether it should block 111 112 Level: advanced 113 114 .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()` 115 @*/ 116 PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg) 117 { 118 PetscFunctionBegin; 119 PetscValidHeader(obj, 1); 120 obj->amspublishblock = flg; 121 PetscFunctionReturn(PETSC_SUCCESS); 122 } 123 124 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 125 { 126 char dir[PETSC_MAX_PATH_LEN]; 127 128 PetscFunctionBegin; 129 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS); 130 if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS); 131 PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name)); 132 PetscCallSAWs(SAWs_Delete, (dir)); 133 PetscFunctionReturn(PETSC_SUCCESS); 134 } 135