void ChannelService::CloseAllChannels(bool fireCloseEvent) { ChannelTable tmp = m_channel_table; ChannelTable::iterator it = tmp.begin(); while (it != tmp.end()) { Channel* ch = it->second; if (fireCloseEvent) { ch->Close(); } DeleteChannel(ch); it++; } m_channel_table.clear(); }
void Run() { IdleConn conn; uint64 now = get_current_epoch_millis(); while (lru.PeekFront(conn) && (now - conn.ts >= maxIdleTime)) { Channel* ch = serv->GetChannel(conn.conn_id); if (NULL != ch) { DEBUG_LOG("Closed timeout connection:%d.", ch->GetID()); ch->Close(); } lru.PopFront(); } }
void ServiceProcess::CloseIPCChannel() { if (GetChannelService().GetChannel(m_ipc_channel_ID) == NULL) { m_shm_fifo = NULL; m_fifo = NULL; m_unix_sock = NULL; return; } Channel* ch = GetIPCChannel(); if (NULL != ch) { ch->Close(); } m_shm_fifo = NULL; m_fifo = NULL; m_unix_sock = NULL; }
// SAFECLOSE void FileTransfer::LibeventCleanCallback(int fd, short event, void *arg) { // Arno, 2012-02-24: Why-oh-why, update NOW Channel::Time(); FileTransfer *ft = (FileTransfer *)arg; if (ft == NULL) return; // STL and MS and conditional delete from set not a happy place :-( std::set<Channel *> delset; std::set<Channel *>::iterator iter; bool hasestablishedpeers=false; for (iter=ft->mychannels_.begin(); iter!=ft->mychannels_.end(); iter++) { Channel *c = *iter; if (c != NULL) { if (c->IsScheduled4Close()) delset.insert(c); if (c->is_established ()) { hasestablishedpeers = true; //fprintf(stderr,"%s peer %s\n", ft->file().root_hash().hex().c_str(), c->peer().str() ); } } } for (iter=delset.begin(); iter!=delset.end(); iter++) { Channel *c = *iter; dprintf("%s #%u clean cb close\n",tintstr(),c->id()); c->Close(); ft->mychannels_.erase(c); delete c; } // Arno, 2012-02-24: Check for liveliness. ft->ReConnectToTrackerIfAllowed(hasestablishedpeers); // Reschedule cleanup evtimer_add(&(ft->evclean_),tint2tv(5*TINT_SEC)); }
void ZeroState::LibeventCleanCallback(int fd, short event, void *arg) { //fprintf(stderr,"zero clean: enter\n"); // Arno, 2012-02-24: Why-oh-why, update NOW Channel::Time(); ZeroState *zs = (ZeroState *)arg; if (zs == NULL) return; // See which zero state FileTransfers have no clients tdlist_t tds = swift::GetTransferDescriptors(); tdlist_t::iterator iter; tdlist_t delset; for (iter = tds.begin(); iter != tds.end(); iter++) { int td = *iter; if (!swift::IsZeroState(td)) continue; ContentTransfer *ct = swift::GetActivatedTransfer(td); if (ct == NULL) { // Not activated, so remove in any case delset.push_back(td); continue; } // Arno, 2012-09-20: Work with copy of list, as "delete c" edits list. channels_t copychans(*ct->GetChannels()); if (copychans.size() == 0) delset.push_back(td); else if (zs->connect_timeout_ != TINT_NEVER) { // Garbage collect really slow connections, essential on Mac. dprintf("%s zero clean %s has " PRISIZET " peers\n",tintstr(),ct->swarm_id().hex().c_str(), ct->GetChannels()->size() ); channels_t::iterator iter2; for (iter2=copychans.begin(); iter2!=copychans.end(); iter2++) { Channel *c = *iter2; if (c != NULL) { //fprintf(stderr,"%s F%" PRIu32 " zero clean %s opentime %" PRIi64 " connect %" PRIi64 "\n",tintstr(),ft->fd(), c->peer().str().c_str(), (NOW-c->GetOpenTime()), zs->connect_timeout_ ); // Garbage collect copychans when open for long and slow upload if ((NOW-c->GetOpenTime()) > zs->connect_timeout_) { //fprintf(stderr,"%s F%" PRIu32 " zero clean %s opentime %" PRIi64 " ulspeed %lf\n",tintstr(),ft->fd(), c->peer().str().c_str(), (NOW-c->GetOpenTime())/TINT_SEC, ft->GetCurrentSpeed(DDIR_UPLOAD) ); fprintf(stderr,"%s F%" PRIu32 " zero clean %s close slow channel\n",tintstr(),td, c->peer().str() .c_str()); dprintf("%s F%" PRIu32 " zero clean %s close slow channel\n",tintstr(),td, c->peer().str().c_str() ); c->Close(CLOSE_SEND_IF_ESTABLISHED); delete c; } } } if (ct->GetChannels()->size() == 0) { // Ain't go no clients left, cleanup transfer. delset.push_back(td); } } } // Delete 0-state FileTransfers sans peers for (iter=delset.begin(); iter!=delset.end(); iter++) { int td = *iter; dprintf("%s hash %s zero clean close\n",tintstr(),GetSwarmID(td).hex().c_str() ); //fprintf(stderr,"%s F%" PRIu32 " zero clean close\n",tintstr(),td ); swift::Close(td); } // Reschedule cleanup evtimer_add(&(zs->evclean_),tint2tv(CLEANUP_INTERVAL*TINT_SEC)); }
void ZeroState::LibeventCleanCallback(int fd, short event, void *arg) { //fprintf(stderr,"zero clean: enter\n"); // Arno, 2012-02-24: Why-oh-why, update NOW Channel::Time(); ZeroState *zs = (ZeroState *)arg; if (zs == NULL) return; // See which zero state FileTransfers have no clients std::set<FileTransfer *> delset; for(int i=0; i<FileTransfer::files.size(); i++) { FileTransfer *ft = FileTransfer::files[i]; if (ft == NULL) continue; if (!ft->IsZeroState()) continue; // Arno, 2012-07-20: Some weirdness on Win7 when we use GetChannels() // all the time. Map/set iterators incompatible?! channels_t channels = ft->GetChannels(); if (channels.size() == 0) { // Ain't go no clients, cleanup transfer. delset.insert(ft); } else if (zs->connect_timeout_ != TINT_NEVER) { // Garbage collect really slow connections, essential on Mac. dprintf("%s zero clean %s has %d peers\n",tintstr(),ft->root_hash().hex().c_str(), ft->GetChannels().size() ); channels_t::iterator iter2; for (iter2=channels.begin(); iter2!=channels.end(); iter2++) { Channel *c = *iter2; if (c != NULL) { //fprintf(stderr,"%s F%u zero clean %s opentime %lld connect %lld\n",tintstr(),ft->fd(), c->peer().str(), (NOW-c->GetOpenTime()), zs->connect_timeout_ ); // Garbage collect channels when open for long and slow upload if ((NOW-c->GetOpenTime()) > zs->connect_timeout_) { //fprintf(stderr,"%s F%u zero clean %s opentime %lld ulspeed %lf\n",tintstr(),ft->fd(), c->peer().str(), (NOW-c->GetOpenTime())/TINT_SEC, ft->GetCurrentSpeed(DDIR_UPLOAD) ); fprintf(stderr,"%s F%u zero clean %s close slow channel\n",tintstr(),ft->fd(), c->peer().str() ); c->Close(); delete c; } } } if (ft->GetChannels().size() == 0) { // Ain't go no clients left, cleanup transfer. delset.insert(ft); } } } // Delete 0-state FileTransfers sans peers std::set<FileTransfer *>::iterator iter; for (iter=delset.begin(); iter!=delset.end(); iter++) { FileTransfer *ft = *iter; dprintf("%s F%u zero clean close\n",tintstr(),ft->fd() ); //fprintf(stderr,"%s F%u zero clean close\n",tintstr(),ft->fd() ); swift::Close(ft->fd()); } // Reschedule cleanup evtimer_add(&(zs->evclean_),tint2tv(CLEANUP_INTERVAL*TINT_SEC)); }