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