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 by a `PetscObject` so their values may
  8:    be changed in the computation

 10:    Collective

 12:    Input Parameters:
 13: .  obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSTakeAccess`((`PetscObject`)mat);

 15:    Level: advanced

 17:    Developer Note:
 18:    The naming should perhaps be changed to `PetscObjectSAWsGetAccess()` and `PetscObjectSAWsRestoreAccess()`

 20: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsGrantAccess()`
 21: @*/
 22: PetscErrorCode PetscObjectSAWsTakeAccess(PetscObject obj)
 23: {
 24:   if (obj->amsmem) {
 25:     /* cannot wrap with PetscPushStack() because that also deals with the locks */
 26:     SAWs_Lock();
 27:   }
 28:   return 0;
 29: }

 31: /*@C
 32:    PetscObjectSAWsGrantAccess - Grants access of the data fields that have been published to SAWs called when the changes made during
 33:    `PetscObjectSAWsTakeAccess()` are complete. This allows the webserve to change the published values.

 35:    Collective

 37:    Input Parameters:
 38: .  obj - the `PetscObject` variable. This must be cast with a (`PetscObject`), for example, `PetscObjectSAWSRestoreAccess`((`PetscObject`)mat);

 40:    Level: advanced

 42: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsTakeAccess()`
 43: @*/
 44: PetscErrorCode PetscObjectSAWsGrantAccess(PetscObject obj)
 45: {
 46:   if (obj->amsmem) {
 47:     /* cannot wrap with PetscPushStack() because that also deals with the locks */
 48:     SAWs_Unlock();
 49:   }
 50:   return 0;
 51: }

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

 56:    Not Collective

 58:    Level: advanced

 60: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscObjectSAWsBlock()`
 61: @*/
 62: PetscErrorCode PetscSAWsBlock(void)
 63: {
 64:   volatile PetscBool block = PETSC_TRUE;

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

 80: /*@C
 81:    PetscObjectSAWsBlock - Blocks the object if `PetscObjectSAWsSetBlock()` has been called

 83:    Collective

 85:    Input Parameters:
 86: .  obj - the PETSc variable

 88:    Level: advanced

 90: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsSetBlock()`, `PetscSAWsBlock()`
 91: @*/
 92: PetscErrorCode PetscObjectSAWsBlock(PetscObject obj)
 93: {

 96:   if (!obj->amspublishblock || !obj->amsmem) return 0;
 97:   PetscSAWsBlock();
 98:   return 0;
 99: }

101: /*@C
102:    PetscObjectSAWsSetBlock - Sets whether an object will block at `PetscObjectSAWsBlock()`

104:    Collective

106:    Input Parameters:
107: +  obj - the PETSc variable
108: -  flg - whether it should block

110:    Level: advanced

112: .seealso: `PetscObjectSetName()`, `PetscObjectSAWsViewOff()`, `PetscObjectSAWsBlock()`, `PetscSAWsBlock()`
113: @*/
114: PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj, PetscBool flg)
115: {
117:   obj->amspublishblock = flg;
118:   return 0;
119: }

121: PetscErrorCode PetscObjectSAWsViewOff(PetscObject obj)
122: {
123:   char dir[PETSC_MAX_PATH_LEN];

125:   if (obj->classid == PETSC_VIEWER_CLASSID) return 0;
126:   if (!obj->amsmem) return 0;
127:   PetscSNPrintf(dir, sizeof(dir), "/PETSc/Objects/%s", obj->name);
128:   SAWs_Delete, (dir);
129:   return 0;
130: }