Esempio n. 1
0
int sendNewFrame(SwpState *state, Msg *frame, char isSelectRunning, int sd, 
                    fd_set *read_fds, struct timeval *default_timeout, 
                    struct sockaddr_in *remoteServAddr, int sizeAddr){
    struct sendQ_slot *slot;

    struct timeval void_timeout;
    void_timeout.tv_sec = 2147483647;
    void_timeout.tv_usec = 2147483647;


    state->hdr.SeqNum = ++state->LFS;
    slot = &state->sendQ[state->hdr.SeqNum%SWS];
    state->hdr.Flags = 0;
    --state->newSend;
    frame->m[0] = state->hdr.SeqNum;
    frame->m[1] = state->hdr.AckNum;
    frame->m[2] = state->hdr.Flags;
    printf("%d %d %d %c\n", frame->m[0], frame->m[1], frame->m[2], frame->m[3]);
    //printf("%ld\n", sizeof(frame->m));
    deepCopyArray(frame,&slot->msg); 
    slot->acked = 0;
    printf("%d %d %d %c\n", slot->msg.m[0], slot->msg.m[1], slot->msg.m[2], slot->msg.m[3]);
    gettimeofday(&slot->timeout, NULL);
    //Send the frame;
    if(sendto_(sd, slot->msg.m, sizeof(slot->msg.m),0, (struct sockaddr *) remoteServAddr,
                sizeAddr) < 0)
    {
        printf("EROROROEOs\n");
    }
    // //Start select;
    // int noSelects = 1;
    // int i;
    // for(i=0;i<SWS;i++){
    //     if(state->sendQ[i].timeout.tv_sec != void_timeout.tv_sec){
    //         noSelects = 0;
    //         break;
    //     }
    // }
    if(frame->m[0] == 0){
        FD_ZERO(read_fds); //clear the select set
        FD_SET(sd, read_fds); //add socket to the listening list
        if (select(sd+1, read_fds, NULL, NULL, default_timeout) == -1) {
            perror("select");
            exit(4);
        }
    }
    return 3;//sendto_(sd, frame->m, sizeof(frame->m),0, (struct sockaddr *) remoteServAddr,
            //sizeof(remoteServAddr));
}
Esempio n. 2
0
void deepCopy(TypedValue* tv) {
  switch (tv->m_type) {
    DT_UNCOUNTED_CASE:
    case KindOfString:
    case KindOfResource:
    case KindOfRef:
    case KindOfClass:
      return;

    case KindOfArray: {
      auto arr = deepCopyArray(tv->m_data.parr);
      decRefArr(tv->m_data.parr);
      tv->m_data.parr = arr;
      return;
    }

    case KindOfObject: {
      auto obj = tv->m_data.pobj;
      if (!obj->isCollection()) return;
      const auto copyVector = [](BaseVector* vec) {
        Object o = Object::attach(vec);
        vec->mutate();
        assertx(vec->canMutateBuffer());
        auto sz = vec->m_size;
        for (size_t i = 0; i < sz; ++i) {
          deepCopy(&vec->m_data[i]);
        }
        return o.detach();
      };
      const auto copyMap = [](BaseMap* mp) {
        Object o = Object::attach(mp);
        mp->mutate();
        auto used = mp->posLimit();
        for (uint32_t i = 0; i < used; ++i) {
          if (mp->isTombstone(i)) continue;
          auto* e = &mp->data()[i];
          deepCopy(&e->data);
        }
        return o.detach();
      };
      switch (obj->collectionType()) {
        case CollectionType::Pair: {
          auto pair = c_Pair::Clone(static_cast<c_Pair*>(obj));
          Object o = Object::attach(pair);
          deepCopy(&pair->elm0);
          deepCopy(&pair->elm1);
          obj = o.detach();
          break;
        }
        case CollectionType::Vector:
          obj = copyVector(c_Vector::Clone(static_cast<c_Vector*>(obj)));
          break;
        case CollectionType::ImmVector:
          obj = copyVector(c_ImmVector::Clone(static_cast<c_ImmVector*>(obj)));
          break;
        case CollectionType::Map:
          obj = copyMap(c_Map::Clone(static_cast<c_Map*>(obj)));
          break;
        case CollectionType::ImmMap:
          obj = copyMap(c_ImmMap::Clone(static_cast<c_ImmMap*>(obj)));
          break;
        case CollectionType::Set:
          obj = c_Set::Clone(static_cast<c_Set*>(obj));
          break;
        case CollectionType::ImmSet:
          obj = c_ImmSet::Clone(static_cast<c_ImmSet*>(obj));
          break;
        default:
          assertx(false);
      }
      decRefObj(tv->m_data.pobj);
      tv->m_data.pobj = obj;
      return;
    }
  }
  not_reached();
}
Esempio n. 3
0
void deepCopy(TypedValue* tv) {
  switch (tv->m_type) {
    DT_UNCOUNTED_CASE:
    case KindOfString:
    case KindOfResource:
    case KindOfRef:
    case KindOfKeyset:
      return;

    case KindOfVec: {
      auto arr = deepCopyVecArray(tv->m_data.parr);
      decRefArr(tv->m_data.parr);
      tv->m_data.parr = arr;
      return;
    }

    case KindOfDict: {
      auto arr = deepCopyDict(tv->m_data.parr);
      decRefArr(tv->m_data.parr);
      tv->m_data.parr = arr;
      return;
    }

    case KindOfArray: {
      auto arr = deepCopyArray(tv->m_data.parr);
      decRefArr(tv->m_data.parr);
      tv->m_data.parr = arr;
      return;
    }

    case KindOfObject: {
      auto obj = tv->m_data.pobj;
      if (!obj->isCollection()) return;
      const auto copyVector = [](BaseVector* vec) {
        if (vec->size() > 0 && vec->arrayData()->isRefCounted()) {
          vec->mutate();
          auto elm = vec->data();
          auto end = vec->data() + vec->size();
          do {
            deepCopy(elm);
          } while (++elm < end);
        }
        return vec;
      };
      const auto copyMap = [](BaseMap* mp) {
        if (mp->size() > 0 && mp->arrayData()->isRefCounted()) {
          mp->mutate();
          auto used = mp->posLimit();
          for (uint32_t i = 0; i < used; ++i) {
            if (mp->isTombstone(i)) continue;
            auto* e = &mp->data()[i];
            deepCopy(&e->data);
          }
        }
        return mp;
      };
      switch (obj->collectionType()) {
        case CollectionType::Pair: {
          auto pair = c_Pair::Clone(static_cast<c_Pair*>(obj));
          Object o = Object::attach(pair);
          deepCopy(&pair->elm0);
          deepCopy(&pair->elm1);
          obj = o.detach();
          break;
        }
        case CollectionType::Vector:
          obj = copyVector(c_Vector::Clone(static_cast<c_Vector*>(obj)));
          break;
        case CollectionType::ImmVector:
          obj = copyVector(c_ImmVector::Clone(static_cast<c_ImmVector*>(obj)));
          break;
        case CollectionType::Map:
          obj = copyMap(c_Map::Clone(static_cast<c_Map*>(obj)));
          break;
        case CollectionType::ImmMap:
          obj = copyMap(c_ImmMap::Clone(static_cast<c_ImmMap*>(obj)));
          break;
        case CollectionType::Set:
          obj = c_Set::Clone(static_cast<c_Set*>(obj));
          break;
        case CollectionType::ImmSet:
          obj = c_ImmSet::Clone(static_cast<c_ImmSet*>(obj));
          break;
        default:
          assertx(false);
      }
      assert(obj != tv->m_data.pobj || tv->m_data.pobj->hasMultipleRefs());
      decRefObj(tv->m_data.pobj);
      tv->m_data.pobj = obj;
      return;
    }
  }
  not_reached();
}