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