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