xref: /petsc/src/sys/ams/pams.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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
7e04113cfSBarry Smith    PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally
8ec7429eaSBarry Smith 
9ec7429eaSBarry Smith    Collective on PetscObject
10ec7429eaSBarry Smith 
11ec7429eaSBarry Smith    Input Parameters:
12ec7429eaSBarry Smith .  obj - the Petsc variable
13ec7429eaSBarry Smith          Thus must be cast with a (PetscObject), for example,
14ec7429eaSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
15ec7429eaSBarry Smith 
16ec7429eaSBarry Smith    Level: advanced
17ec7429eaSBarry Smith 
18db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()`
19ec7429eaSBarry Smith 
20ec7429eaSBarry Smith @*/
21*9371c9d4SSatish Balay PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj) {
22ec957eceSBarry Smith   if (obj->amsmem) {
2316ad0300SBarry Smith     /* cannot wrap with PetscPushStack() because that also deals with the locks */
249a492a5cSBarry Smith     SAWs_Lock();
25ec7429eaSBarry Smith   }
2667a1e3b6SBarry Smith   return 0;
27ec7429eaSBarry Smith }
28ec7429eaSBarry Smith 
29ec7429eaSBarry Smith /*@C
301e4262caSBarry Smith    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to change
31ec7429eaSBarry Smith 
32ec7429eaSBarry Smith    Collective on PetscObject
33ec7429eaSBarry Smith 
34ec7429eaSBarry Smith    Input Parameters:
35ec7429eaSBarry Smith .  obj - the Petsc variable
36ec7429eaSBarry Smith          Thus must be cast with a (PetscObject), for example,
37ec7429eaSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
38ec7429eaSBarry Smith 
39ec7429eaSBarry Smith    Level: advanced
40ec7429eaSBarry Smith 
41db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
42ec7429eaSBarry Smith 
43ec7429eaSBarry Smith @*/
44*9371c9d4SSatish Balay PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj) {
45ec957eceSBarry Smith   if (obj->amsmem) {
4616ad0300SBarry Smith     /* cannot wrap with PetscPushStack() because that also deals with the locks */
479a492a5cSBarry Smith     SAWs_Unlock();
48ec7429eaSBarry Smith   }
4967a1e3b6SBarry Smith   return 0;
50ec7429eaSBarry Smith }
51ec7429eaSBarry Smith 
527aab2a10SBarry Smith /*@C
531e4262caSBarry Smith    PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks
547aab2a10SBarry Smith 
557aab2a10SBarry Smith    Not Collective
567aab2a10SBarry Smith 
577aab2a10SBarry Smith    Level: advanced
587aab2a10SBarry Smith 
59db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
607aab2a10SBarry Smith 
617aab2a10SBarry Smith @*/
62*9371c9d4SSatish Balay PetscErrorCode PetscSAWsBlock(void) {
637aab2a10SBarry Smith   volatile PetscBool block = PETSC_TRUE;
647aab2a10SBarry Smith 
657aab2a10SBarry Smith   PetscFunctionBegin;
66792fecdfSBarry Smith   PetscCallSAWs(SAWs_Register, ("__Block", (PetscBool *)&block, 1, SAWs_WRITE, SAWs_BOOLEAN));
677aab2a10SBarry Smith   SAWs_Lock();
687aab2a10SBarry Smith   while (block) {
697aab2a10SBarry Smith     SAWs_Unlock();
709566063dSJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Blocking on SAWs\n"));
719566063dSJacob Faibussowitsch     PetscCall(PetscSleep(.3));
727aab2a10SBarry Smith     SAWs_Lock();
737aab2a10SBarry Smith   }
747aab2a10SBarry Smith   SAWs_Unlock();
75792fecdfSBarry Smith   PetscCallSAWs(SAWs_Delete, ("__Block"));
769566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Out of SAWs block\n"));
777aab2a10SBarry Smith   PetscFunctionReturn(0);
787aab2a10SBarry Smith }
797aab2a10SBarry Smith 
80b90c6cbeSBarry Smith /*@C
81e04113cfSBarry Smith    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
82b90c6cbeSBarry Smith 
83b90c6cbeSBarry Smith    Collective on PetscObject
84b90c6cbeSBarry Smith 
85b90c6cbeSBarry Smith    Input Parameters:
86b90c6cbeSBarry Smith .  obj - the Petsc variable
87b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
88b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
89b90c6cbeSBarry Smith 
90b90c6cbeSBarry Smith    Level: advanced
91b90c6cbeSBarry Smith 
92db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`
93b90c6cbeSBarry Smith 
94b90c6cbeSBarry Smith @*/
95*9371c9d4SSatish Balay PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) {
96b90c6cbeSBarry Smith   PetscFunctionBegin;
97b90c6cbeSBarry Smith   PetscValidHeader(obj, 1);
98b90c6cbeSBarry Smith 
9996f8ada6SBarry Smith   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
1009566063dSJacob Faibussowitsch   PetscCall(PetscSAWsBlock());
101b90c6cbeSBarry Smith   PetscFunctionReturn(0);
102b90c6cbeSBarry Smith }
103b90c6cbeSBarry Smith 
104b90c6cbeSBarry Smith /*@C
105e04113cfSBarry Smith    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()
106b90c6cbeSBarry Smith 
107b90c6cbeSBarry Smith    Collective on PetscObject
108b90c6cbeSBarry Smith 
109b90c6cbeSBarry Smith    Input Parameters:
110b90c6cbeSBarry Smith +  obj - the Petsc variable
111b90c6cbeSBarry Smith          Thus must be cast with a (PetscObject), for example,
112b90c6cbeSBarry Smith          PetscObjectSetName((PetscObject)mat,name);
113b90c6cbeSBarry Smith -  flg - whether it should block
114b90c6cbeSBarry Smith 
115b90c6cbeSBarry Smith    Level: advanced
116b90c6cbeSBarry Smith 
117db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`
118b90c6cbeSBarry Smith 
119b90c6cbeSBarry Smith @*/
120*9371c9d4SSatish Balay PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg) {
121b90c6cbeSBarry Smith   PetscFunctionBegin;
122b90c6cbeSBarry Smith   PetscValidHeader(obj, 1);
123b90c6cbeSBarry Smith   obj->amspublishblock = flg;
124b90c6cbeSBarry Smith   PetscFunctionReturn(0);
125b90c6cbeSBarry Smith }
126b90c6cbeSBarry Smith 
127*9371c9d4SSatish Balay PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj) {
1285f80ce2aSJacob Faibussowitsch   char dir[PETSC_MAX_PATH_LEN];
1299a492a5cSBarry Smith 
13092e62aa6SBarry Smith   PetscFunctionBegin;
1319fb22e1aSBarry Smith   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
13216ad0300SBarry Smith   if (!obj->amsmem) PetscFunctionReturn(0);
1339566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name));
134792fecdfSBarry Smith   PetscCallSAWs(SAWs_Delete, (dir));
13592e62aa6SBarry Smith   PetscFunctionReturn(0);
13692e62aa6SBarry Smith }
137