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