Esempio n. 1
0
void ARMCIX_DCMF_RecvRMWRequest (void           * clientdata,
                                 const DCQuad   * msginfo,
                                 unsigned         count,
                                 unsigned         peer,
                                 const char     * src,
                                 unsigned         bytes)
{
  ARMCIX_DCMF_RMWRequest_t * info = (ARMCIX_DCMF_RMWRequest_t *) msginfo;

  /* Initialize the RMW response data                                        */
  ARMCIX_DCMF_RMWResponse_t response;
  response.op = info->op;
  response.ploc = info->ploc;
  response.active = info->active;

  //fprintf (stderr, "ARMCIX_DCMF_RecvRMWRequest() - info->op == %d, info->ploc == %p, info->prem == %p, info->extra == %d, peer == %d\n", info->op, info->ploc, info->prem, info->extra, peer);

  switch (info->op) 
  {
    case ARMCI_FETCH_AND_ADD:
    case ARMCI_SWAP:
      response.ival = *((int *) info->prem);
      break;
    case ARMCI_FETCH_AND_ADD_LONG:
    case ARMCI_SWAP_LONG:
      response.lval = *((long *) info->prem);
      break;
    default: 
      armci_die("rmw: operation not supported",info->op);
      break;
  }

  /* Send the rmw response.                                                  */
  DCMF_Control (&__rmw_response_protocol,
                DCMF_SEQUENTIAL_CONSISTENCY,
                peer,
                (DCMF_Control_t *) &response);

  /* Perform the swap or add                                                 */
  switch (info->op) 
  {
    case ARMCI_FETCH_AND_ADD:
      *((int *) info->prem) += info->extra;
      break;
    case ARMCI_FETCH_AND_ADD_LONG:
      *((long *) info->prem) += info->extra;
      break;
    case ARMCI_SWAP:
      *((int *) info->prem) = info->extra;
      break;
    case ARMCI_SWAP_LONG:
      *((long *) info->prem) = info->extra;
      break;
    default: 
      armci_die("rmw: operation not supported",info->op);
      break;
  }
}
Esempio n. 2
0
/**
 * \brief DCMF ARMCI Extention receive short fence request callback
 *
 * \see ARMCIX_Fence
 * \see ARMCIX_AllFence
 * \see ARMCIX_DCMF_ReceiveFenceAck
 * \see DCMF_RecvSendShort
 */
void ARMCIX_DCMF_ReceiveFenceRequest (void           * clientdata,
                                      const DCQuad   * msginfo,
                                      unsigned         count,
                                      unsigned         peer,
                                      const char     * src,
                                      unsigned         bytes)
{
    DCMF_Callback_t * cb = (DCMF_Callback_t *) msginfo;
    DCMF_Control_t info;
    DCMF_Callback_t * ack = (DCMF_Callback_t *) &info;
    *ack = *cb;

    DCMF_Control (&__fence_ack_protocol,
                  DCMF_SEQUENTIAL_CONSISTENCY,
                  peer,
                  &info);
}