Actual source code: pams.c


  2: #include <petsc/private/petscimpl.h>
  3: #include <petscviewersaws.h>
  4: #include <petscsys.h>

  6: /*@C
  7:    PetscObjectSAWsTakeAccess - Take access of the data fields that have been published to SAWs so they may be changed locally

  9:    Collective on PetscObject

 11:    Input Parameters:
 12: .  obj - the Petsc variable
 13:          Thus must be cast with a (PetscObject), for example,
 14:          PetscObjectSetName((PetscObject)mat,name);

 16:    Level: advanced

 18: .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsGrantAccess()

 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: }

 30: /*@C
 31:    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs to change

 33:    Collective on PetscObject

 35:    Input Parameters:
 36: .  obj - the Petsc variable
 37:          Thus must be cast with a (PetscObject), for example,
 38:          PetscObjectSetName((PetscObject)mat,name);

 40:    Level: advanced

 42: .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsTakeAccess()

 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: }

 54: /*@C
 55:    PetscSAWsBlock - Blocks on SAWs until a client (person using the web browser) unblocks

 57:    Not Collective

 59:    Level: advanced

 61: .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock(), PetscObjectSAWsBlock()

 63: @*/
 64: PetscErrorCode  PetscSAWsBlock(void)
 65: {
 66:   PetscErrorCode     ierr;
 67:   volatile PetscBool block = PETSC_TRUE;

 70:   PetscStackCallSAWs(SAWs_Register,("__Block",(PetscBool*)&block,1,SAWs_WRITE,SAWs_BOOLEAN));
 71:   SAWs_Lock();
 72:   while (block) {
 73:     SAWs_Unlock();
 74:     PetscInfo(NULL,"Blocking on SAWs\n");
 75:     PetscSleep(.3);
 76:     SAWs_Lock();
 77:   }
 78:   SAWs_Unlock();
 79:   PetscStackCallSAWs(SAWs_Delete,("__Block"));
 80:   PetscInfo(NULL,"Out of SAWs block\n");
 81:   return(0);
 82: }

 84: /*@C
 85:    PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called

 87:    Collective on PetscObject

 89:    Input Parameters:
 90: .  obj - the Petsc variable
 91:          Thus must be cast with a (PetscObject), for example,
 92:          PetscObjectSetName((PetscObject)mat,name);

 94:    Level: advanced

 96: .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock()

 98: @*/
 99: PetscErrorCode  PetscObjectSAWsBlock(PetscObject obj)
100: {
101:   PetscErrorCode     ierr;


106:   if (!obj->amspublishblock || !obj->amsmem) return(0);
107:   PetscSAWsBlock();
108:   return(0);
109: }

111: /*@C
112:    PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock()

114:    Collective on PetscObject

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

122:    Level: advanced

124: .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock()

126: @*/
127: PetscErrorCode  PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg)
128: {
131:   obj->amspublishblock = flg;
132:   return(0);
133: }

135: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
136: {
137:   char           dir[1024];

141:   if (obj->classid == PETSC_VIEWER_CLASSID) return(0);
142:   if (!obj->amsmem) return(0);
143:   PetscSNPrintf(dir,1024,"/PETSc/Objects/%s",obj->name);
144:   PetscStackCallSAWs(SAWs_Delete,(dir));
145:   return(0);
146: }