xref: /petsc/src/sys/ams/pams.c (revision a332a2633cacb19031bcd0b6831ff4f96baa26e5)
1 
2 #include <petsc-private/petscimpl.h>        /*I    "petscsys.h"   I*/
3 #include <petscviewerams.h>
4 #include <petscsys.h>
5 
6 #undef __FUNCT__
7 #define __FUNCT__ "PetscObjectAMSTakeAccess"
8 /*@C
9    PetscObjectAMSTakeAccess - Take access of the data fields that have been published to AMS 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(), PetscObjectAMSViewOff(), PetscObjectAMSGrantAccess()
23 
24 @*/
25 PetscErrorCode  PetscObjectAMSTakeAccess(PetscObject obj)
26 {
27   PetscFunctionBegin;
28   if (obj->amsmem != -1) {
29     PetscStackCallAMS(AMS_Memory_take_access,(obj->amsmem));
30   }
31   PetscFunctionReturn(0);
32 }
33 
34 #undef __FUNCT__
35 #define __FUNCT__ "PetscObjectAMSGrantAccess"
36 /*@C
37    PetscObjectAMSGrantAccess - Grants access of the data fields that have been published to AMS 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(), PetscObjectAMSViewOff(), PetscObjectAMSTakeAccess()
51 
52 @*/
53 PetscErrorCode  PetscObjectAMSGrantAccess(PetscObject obj)
54 {
55   PetscFunctionBegin;
56   if (obj->amsmem != -1) {
57     PetscStackCallAMS(AMS_Memory_grant_access,(obj->amsmem));
58   }
59   PetscFunctionReturn(0);
60 }
61 
62 #undef __FUNCT__
63 #define __FUNCT__ "PetscObjectAMSBlock"
64 /*@C
65    PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() 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(), PetscObjectAMSViewOff(), PetscObjectAMSSetBlock()
80 
81 @*/
82 PetscErrorCode  PetscObjectAMSBlock(PetscObject obj)
83 {
84   PetscErrorCode ierr;
85 
86   PetscFunctionBegin;
87   PetscValidHeader(obj,1);
88 
89   if (!obj->amspublishblock) PetscFunctionReturn(0);
90   ierr = PetscObjectAMSTakeAccess(obj);CHKERRQ(ierr);
91   while (obj->amsblock) {
92     ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr);
93     ierr = PetscSleep(2);CHKERRQ(ierr);
94     ierr = PetscObjectAMSTakeAccess(obj);CHKERRQ(ierr);
95   }
96   obj->amsblock = PETSC_TRUE;
97   ierr = PetscObjectAMSGrantAccess(obj);CHKERRQ(ierr);
98   PetscFunctionReturn(0);
99 }
100 
101 #undef __FUNCT__
102 #define __FUNCT__ "PetscObjectAMSSetBlock"
103 /*@C
104    PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock()
105 
106    Collective on PetscObject
107 
108    Input Parameters:
109 +  obj - the Petsc variable
110          Thus must be cast with a (PetscObject), for example,
111          PetscObjectSetName((PetscObject)mat,name);
112 -  flg - whether it should block
113 
114    Level: advanced
115 
116    Concepts: publishing object
117 
118 .seealso: PetscObjectSetName(), PetscObjectAMSViewOff(), PetscObjectAMSBlock()
119 
120 @*/
121 PetscErrorCode  PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg)
122 {
123   PetscFunctionBegin;
124   PetscValidHeader(obj,1);
125   obj->amspublishblock = flg;
126   obj->amsblock        = flg;
127   PetscFunctionReturn(0);
128 }
129 
130 #undef __FUNCT__
131 #define __FUNCT__ "PetscObjectAMSViewOff"
132 PetscErrorCode PetscObjectAMSViewOff(PetscObject obj)
133 {
134   PetscErrorCode ierr;
135 
136   PetscFunctionBegin;
137   if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0);
138   if (obj->amsmem == -1) PetscFunctionReturn(0);
139   ierr        = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr);
140   obj->amsmem = -1;
141   PetscFunctionReturn(0);
142 }
143 
144