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)); }
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(); }
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(); }