xref: /petsc/src/sys/ams/pams.c (revision 7d5fd1e4d9337468ad3f05b65b7facdcd2dfd2a4)
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   PetscErrorCode     ierr;
67   volatile PetscBool block = PETSC_TRUE;
68 
69   PetscFunctionBegin;
70   PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN));
71   SAWs_Lock();
72   while (block) {
73     SAWs_Unlock();
74     ierr = PetscInfo(NULL,"Blocking on SAWs\n");
75     ierr = PetscSleep(.3);CHKERRQ(ierr);
76     SAWs_Lock();
77   }
78   SAWs_Unlock();
79   PetscStackCallSAWs(SAWs_Delete,("__Block"));
80   ierr = PetscInfo(NULL,"Out of SAWs block\n");
81   PetscFunctionReturn(0);
82 }
83 
84 /*@C
85    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
86 
87    Collective on PetscObject
88 
89    Input Parameters:
90 .  obj - the Petsc variable
91          Thus must be cast with a (PetscObject), for example,
92          PetscObjectSetName((PetscObject)mat,name);
93 
94    Level: advanced
95 
96 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()
97 
98 @*/
99 PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
100 {
101   PetscErrorCode     ierr;
102 
103   PetscFunctionBegin;
104   PetscValidHeader(obj,1);
105 
106   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
107   ierr = PetscSAWsBlock();CHKERRQ(ierr);
108   PetscFunctionReturn(0);
109 }
110 
111 /*@C
112    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()
113 
114    Collective on PetscObject
115 
116    Input Parameters:
117 +  obj - the Petsc variable
118          Thus must be cast with a (PetscObject), for example,
119          PetscObjectSetName((PetscObject)mat,name);
120 -  flg - whether it should block
121 
122    Level: advanced
123 
124 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()
125 
126 @*/
127 PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
128 {
129   PetscFunctionBegin;
130   PetscValidHeader(obj,1);
131   obj->amspublishblock = flg;
132   PetscFunctionReturn(0);
133 }
134 
135 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
136 {
137   char           dir[1024];
138   PetscErrorCode ierr;
139 
140   PetscFunctionBegin;
141   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
142   if (!obj->amsmem) PetscFunctionReturn(0);
143   ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr);
144   PetscStackCallSAWs(SAWs_Delete,(dir));
145   PetscFunctionReturn(0);
146 }
147 
148