xref: /petsc/src/sys/ams/pams.c (revision ee85488945bcd0ffd18ad493e356f9b0abf24111)
1 
2 #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3 #include <petscviewersaws.h>
4 #include <petscsys.h>
5 
6 #undef __FUNCT__
7 #define __FUNCT__ "PetscObjectSAWsTakeAccess"
8 /*@C
9    PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally
10 
11    Collective on PetscObject
12 
13    Input Parameters:
14 .  obj - the Petsc variable
15          Thus must be cast with a (PetscObject), for example,
16          PetscObjectSetName((PetscObject)mat,name);
17 
18    Level: advanced
19 
20    Concepts: publishing object
21 
22 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess()
23 
24 @*/
25 PetscErrorCode  PetscObjectSAWsTakeAccess(PetscObject obj)
26 {
27   if (obj->amsmem) {
28     /* cannot wrap with PetscPushStack() because that also deals with the locks */
29     SAWs_Lock();
30   }
31   return 0;
32 }
33 
34 #undef __FUNCT__
35 #define __FUNCT__ "PetscObjectSAWsGrantAccess"
36 /*@C
37    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to the memory snooper to change
38 
39    Collective on PetscObject
40 
41    Input Parameters:
42 .  obj - the Petsc variable
43          Thus must be cast with a (PetscObject), for example,
44          PetscObjectSetName((PetscObject)mat,name);
45 
46    Level: advanced
47 
48    Concepts: publishing object
49 
50 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()
51 
52 @*/
53 PetscErrorCode  PetscObjectSAWsGrantAccess(PetscObject obj)
54 {
55   if (obj->amsmem) {
56     /* cannot wrap with PetscPushStack() because that also deals with the locks */
57     SAWs_Unlock();
58   }
59   return 0;
60 }
61 
62 #undef __FUNCT__
63 #define __FUNCT__ "PetscObjectSAWsBlock"
64 /*@C
65    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called
66 
67    Collective on PetscObject
68 
69    Input Parameters:
70 .  obj - the Petsc variable
71          Thus must be cast with a (PetscObject), for example,
72          PetscObjectSetName((PetscObject)mat,name);
73 
74 
75    Level: advanced
76 
77    Concepts: publishing object
78 
79 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()
80 
81 @*/
82 PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
83 {
84   PetscErrorCode     ierr;
85   volatile PetscBool block = PETSC_TRUE;
86 
87   PetscFunctionBegin;
88   PetscValidHeader(obj,1);
89 
90   if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0);
91   PetscStackCallSAWs(SAWs_Register,("Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN));
92 
93   ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
94   while (block) {
95     ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
96     ierr = PetscInfo(NULL,"Blocking on AMS\n");
97     ierr = PetscSleep(2.0);CHKERRQ(ierr);
98     ierr = PetscObjectSAWsTakeAccess(obj);CHKERRQ(ierr);
99   }
100   ierr = PetscObjectSAWsGrantAccess(obj);CHKERRQ(ierr);
101   PetscStackCallSAWs(SAWs_Delete,("Block"));
102   ierr = PetscInfo(NULL,"Out of SAWs block\n");
103   PetscFunctionReturn(0);
104 }
105 
106 #undef __FUNCT__
107 #define __FUNCT__ "PetscObjectSAWsSetBlock"
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    Concepts: publishing object
122 
123 .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()
124 
125 @*/
126 PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
127 {
128   PetscFunctionBegin;
129   PetscValidHeader(obj,1);
130   obj->amspublishblock = flg;
131   PetscFunctionReturn(0);
132 }
133 
134 #undef __FUNCT__
135 #define __FUNCT__ "PetscObjectSAWsViewOff"
136 PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
137 {
138   char           dir[1024];
139   PetscErrorCode ierr;
140 
141   PetscFunctionBegin;
142   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
143   if (!obj->amsmem) PetscFunctionReturn(0);
144   ierr = PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);CHKERRQ(ierr);
145   PetscStackCallSAWs(SAWs_Delete,(dir));
146   PetscFunctionReturn(0);
147 }
148 
149