1b3506946SBarry Smith 2af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 3e04113cfSBarry Smith #include <petscviewersaws.h> 4ec7429eaSBarry Smith #include <petscsys.h> 5b3506946SBarry Smith 6ec7429eaSBarry Smith /*@C 7*10450e9eSJacob Faibussowitsch PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs 8*10450e9eSJacob Faibussowitsch by a `PetscObject` so their values may be changed in the computation 9ec7429eaSBarry Smith 10c3339decSBarry Smith Collective 11ec7429eaSBarry Smith 122fe279fdSBarry Smith Input Parameter: 13811af0c4SBarry Smith . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat); 14ec7429eaSBarry Smith 15ec7429eaSBarry Smith Level: advanced 16ec7429eaSBarry Smith 17*10450e9eSJacob Faibussowitsch Developer Notes: 18*10450e9eSJacob Faibussowitsch The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and 19*10450e9eSJacob Faibussowitsch `PetscObjectSAWsRestoreAccess()` 20ec7429eaSBarry Smith 21811af0c4SBarry Smith .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()` 22ec7429eaSBarry Smith @*/ 23d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) 24d71ae5a4SJacob Faibussowitsch { 25ec957eceSBarry Smith if (obj->amsmem) { 2616ad0300SBarry Smith /* cannot wrap with PetscPushStack() because that also deals with the locks */ 279a492a5cSBarry Smith SAWs_Lock(); 28ec7429eaSBarry Smith } 293ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 30ec7429eaSBarry Smith } 31ec7429eaSBarry Smith 32ec7429eaSBarry Smith /*@C 33*10450e9eSJacob Faibussowitsch PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to 34*10450e9eSJacob Faibussowitsch SAWs called when the changes made during `PetscObjectSAWsTakeAccess()` are complete. 35ec7429eaSBarry Smith 36c3339decSBarry Smith Collective 37ec7429eaSBarry Smith 382fe279fdSBarry Smith Input Parameter: 39811af0c4SBarry Smith . obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat); 40ec7429eaSBarry Smith 41ec7429eaSBarry Smith Level: advanced 42ec7429eaSBarry Smith 43*10450e9eSJacob Faibussowitsch Notes: 44*10450e9eSJacob Faibussowitsch This allows the webserve to change the published values. 45*10450e9eSJacob Faibussowitsch 46db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()` 47ec7429eaSBarry Smith @*/ 48d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) 49d71ae5a4SJacob Faibussowitsch { 50ec957eceSBarry Smith if (obj->amsmem) { 5116ad0300SBarry Smith /* cannot wrap with PetscPushStack() because that also deals with the locks */ 529a492a5cSBarry Smith SAWs_Unlock(); 53ec7429eaSBarry Smith } 543ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 55ec7429eaSBarry Smith } 56ec7429eaSBarry Smith 577aab2a10SBarry Smith /*@C 58811af0c4SBarry Smith PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks it 597aab2a10SBarry Smith 607aab2a10SBarry Smith Not Collective 617aab2a10SBarry Smith 627aab2a10SBarry Smith Level: advanced 637aab2a10SBarry Smith 64db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()` 657aab2a10SBarry Smith @*/ 66d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSAWsBlock(void) 67d71ae5a4SJacob Faibussowitsch { 687aab2a10SBarry Smith volatile PetscBool block = PETSC_TRUE; 697aab2a10SBarry Smith 707aab2a10SBarry Smith PetscFunctionBegin; 71792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN)); 727aab2a10SBarry Smith SAWs_Lock(); 737aab2a10SBarry Smith while (block) { 747aab2a10SBarry Smith SAWs_Unlock(); 759566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Blocking on SAWs\n")); 769566063dSJacob Faibussowitsch PetscCall(PetscSleep(.3)); 777aab2a10SBarry Smith SAWs_Lock(); 787aab2a10SBarry Smith } 797aab2a10SBarry Smith SAWs_Unlock(); 80792fecdfSBarry Smith PetscCallSAWs(SAWs_Delete, ("__Block")); 819566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Out of SAWs block\n")); 823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 837aab2a10SBarry Smith } 847aab2a10SBarry Smith 85b90c6cbeSBarry Smith /*@C 86811af0c4SBarry Smith PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called 87b90c6cbeSBarry Smith 88c3339decSBarry Smith Collective 89b90c6cbeSBarry Smith 902fe279fdSBarry Smith Input Parameter: 91811af0c4SBarry Smith . obj - the PETSc variable 92b90c6cbeSBarry Smith 93b90c6cbeSBarry Smith Level: advanced 94b90c6cbeSBarry Smith 95811af0c4SBarry Smith .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()` 96b90c6cbeSBarry Smith @*/ 97d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) 98d71ae5a4SJacob Faibussowitsch { 99b90c6cbeSBarry Smith PetscFunctionBegin; 100b90c6cbeSBarry Smith PetscValidHeader(obj, 1); 101b90c6cbeSBarry Smith 1023ba16761SJacob Faibussowitsch if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS); 1039566063dSJacob Faibussowitsch PetscCall(PetscSAWsBlock()); 1043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 105b90c6cbeSBarry Smith } 106b90c6cbeSBarry Smith 107b90c6cbeSBarry Smith /*@C 108811af0c4SBarry Smith PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()` 109b90c6cbeSBarry Smith 110c3339decSBarry Smith Collective 111b90c6cbeSBarry Smith 112b90c6cbeSBarry Smith Input Parameters: 113811af0c4SBarry Smith + obj - the PETSc variable 114b90c6cbeSBarry Smith - flg - whether it should block 115b90c6cbeSBarry Smith 116b90c6cbeSBarry Smith Level: advanced 117b90c6cbeSBarry Smith 118811af0c4SBarry Smith .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()` 119b90c6cbeSBarry Smith @*/ 120d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg) 121d71ae5a4SJacob Faibussowitsch { 122b90c6cbeSBarry Smith PetscFunctionBegin; 123b90c6cbeSBarry Smith PetscValidHeader(obj, 1); 124b90c6cbeSBarry Smith obj->amspublishblock = flg; 1253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 126b90c6cbeSBarry Smith } 127b90c6cbeSBarry Smith 128d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) 129d71ae5a4SJacob Faibussowitsch { 1305f80ce2aSJacob Faibussowitsch char dir[PETSC_MAX_PATH_LEN]; 1319a492a5cSBarry Smith 13292e62aa6SBarry Smith PetscFunctionBegin; 1333ba16761SJacob Faibussowitsch if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(PETSC_SUCCESS); 1343ba16761SJacob Faibussowitsch if (!obj->amsmem) PetscFunctionReturn(PETSC_SUCCESS); 1359566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name)); 136792fecdfSBarry Smith PetscCallSAWs(SAWs_Delete, (dir)); 1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13892e62aa6SBarry Smith } 139