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