xref: /petsc/src/sys/ams/pams.c (revision 10450e9e44b354a0a3da7bbd573407bdf051df10)
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