distributed_control::~distributed_control() { // detach the instance last_dc = NULL; last_dc_procid = 0; distributed_services->full_barrier(); logstream(LOG_INFO) << "Shutting down distributed control " << std::endl; FREE_CALLBACK_EVENT(EVENT_NETWORK_BYTES); FREE_CALLBACK_EVENT(EVENT_RPC_CALLS); // call all deletion callbacks for (size_t i = 0; i < deletion_callbacks.size(); ++i) { deletion_callbacks[i](); } size_t bytessent = bytes_sent(); for (size_t i = 0;i < senders.size(); ++i) { senders[i]->flush(); } comm->close(); for (size_t i = 0;i < senders.size(); ++i) { delete senders[i]; } senders.clear(); pthread_key_delete(dc_impl::thrlocal_sequentialization_key); pthread_key_delete(dc_impl::thrlocal_send_buffer_key); size_t bytesreceived = bytes_received(); for (size_t i = 0;i < receivers.size(); ++i) { receivers[i]->shutdown(); delete receivers[i]; } receivers.clear(); // shutdown function call handlers for (size_t i = 0;i < fcallqueue.size(); ++i) fcallqueue[i].stop_blocking(); fcallhandlers.join(); logstream(LOG_INFO) << "Bytes Sent: " << bytessent << std::endl; logstream(LOG_INFO) << "Calls Sent: " << calls_sent() << std::endl; logstream(LOG_INFO) << "Network Sent: " << network_bytes_sent() << std::endl; logstream(LOG_INFO) << "Bytes Received: " << bytesreceived << std::endl; logstream(LOG_INFO) << "Calls Received: " << calls_received() << std::endl; delete comm; }
distributed_control::~distributed_control() { distributed_services->full_barrier(); if(last_dc_procid==0) logstream(LOG_INFO) << "Shutting down distributed control " << std::endl; FREE_CALLBACK_EVENT(EVENT_NETWORK_BYTES); FREE_CALLBACK_EVENT(EVENT_RPC_CALLS); // call all deletion callbacks for (size_t i = 0; i < deletion_callbacks.size(); ++i) { deletion_callbacks[i](); } size_t bytessent = bytes_sent(); for (size_t i = 0;i < senders.size(); ++i) { senders[i]->flush(); } comm->close(); for (size_t i = 0;i < senders.size(); ++i) { delete senders[i]; } size_t bytesreceived = bytes_received(); for (size_t i = 0;i < receivers.size(); ++i) { receivers[i]->shutdown(); delete receivers[i]; } senders.clear(); receivers.clear(); // shutdown function call handlers for (size_t i = 0;i < fcallqueue.size(); ++i) fcallqueue[i].stop_blocking(); fcallhandlers.join(); if(last_dc_procid==0){ logstream(LOG_INFO) << "Bytes Sent: " << bytessent << std::endl; logstream(LOG_INFO) << "Calls Sent: " << calls_sent() << std::endl; logstream(LOG_INFO) << "Network Sent: " << network_bytes_sent() << std::endl; logstream(LOG_INFO) << "Bytes Received: " << bytesreceived << std::endl; logstream(LOG_INFO) << "Calls Received: " << calls_received() << std::endl; } delete comm; }
int32 DCCReceive::Transfer(void* arg) { BMessenger msgr(reinterpret_cast<DCCReceive*>(arg)); struct sockaddr_in address; BLooper* looper(NULL); int32 dccSock(-1); if ((dccSock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { UpdateStatus(msgr, S_DCC_ESTABLISH_ERROR); return B_ERROR; } BMessage reply; if (msgr.SendMessage(M_DCC_GET_CONNECT_DATA, &reply) == B_ERROR) return B_ERROR; memset(&address, 0, sizeof(sockaddr_in)); address.sin_family = AF_INET; address.sin_port = htons(atoi(reply.FindString("port"))); address.sin_addr.s_addr = htonl(strtoul(reply.FindString("ip"), 0, 10)); UpdateStatus(msgr, S_DCC_CONNECT_TO_SENDER); if (connect(dccSock, (sockaddr*)&address, sizeof(address)) < 0) { UpdateStatus(msgr, S_DCC_ESTABLISH_ERROR); close(dccSock); return B_ERROR; } BPath path(reply.FindString("name")); BString buffer; off_t file_size(0); buffer << S_DCC_RECV1 << path.Leaf() << S_DCC_RECV2 << reply.FindString("nick") << "."; UpdateStatus(msgr, buffer.String()); BFile file; if (msgr.IsValid()) { if (reply.FindBool("resume")) { if (file.SetTo(reply.FindString("name"), B_WRITE_ONLY | B_OPEN_AT_END) == B_NO_ERROR && file.GetSize(&file_size) == B_NO_ERROR && file_size > 0LL) UpdateBar(msgr, file_size, 0, 0, true); else file_size = 0LL; } else { file.SetTo(reply.FindString("name"), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE); } } uint32 bytes_received(file_size); uint32 size(atol(reply.FindString("size"))); uint32 cps(0); if (file.InitCheck() == B_NO_ERROR) { bigtime_t last(system_time()), now; char inBuffer[8196]; bigtime_t start = system_time(); while ((msgr.Target(&looper) != NULL) && bytes_received < size) { int readSize; if ((readSize = recv(dccSock, inBuffer, 8196, 0)) < 0) break; file.Write(inBuffer, readSize); bytes_received += readSize; BMessage msg(M_DCC_UPDATE_TRANSFERRED); msg.AddInt32("transferred", bytes_received); msgr.SendMessage(&msg); uint32 feed_back(htonl(bytes_received)); send(dccSock, &feed_back, sizeof(uint32), 0); now = system_time(); bool hit(false); if (now - last > 500000) { cps = (int)ceil((bytes_received - file_size) / ((now - start) / 1000000.0)); BMessage updmsg(M_DCC_UPDATE_AVERAGE); updmsg.AddInt32("average", cps); msgr.SendMessage(&updmsg); last = now; hit = true; } DCCConnect::UpdateBar(msgr, readSize, cps, bytes_received, hit); } } if (msgr.IsValid()) { BMessage msg(M_DCC_STOP_BUTTON); msgr.SendMessage(&msg); } if (dccSock > 0) { close(dccSock); } if (file.InitCheck() == B_OK) { file.Unset(); update_mime_info(reply.FindString("name"), 0, 0, 1); } return 0; }