aboutsummaryrefslogtreecommitdiff
path: root/src/connection.h
Commit message (Collapse)AuthorAge
* Fix MSVC compiler warning about passing this pointer in initializer listsapier2014-12-28
|
* Improve timeout calculationsapier2014-08-22
| | | | gf
* Add prefixes to enum values and fix style issueskwolekr2014-06-28
|
* Fix numeric underflow on calculating window size adjustmentsapier2014-05-04
|
* Add download rate to media progress bar (non http mode only!)sapier2014-04-29
| | | | Minor coding style fixes
* Fix all warnings reported by clangSfan52014-04-15
|
* Cleanup client init states by bumping protocol versionsapier2014-04-08
| | | | | | | | | | Don't use TOSERVER_RECEIVED_MEDIA but TOSERVER_CLIENT_READY as indicatio for client ready Handle clients with protocol version < 23 (almost) same way as before Make client tell server about it's version Add client state to not send bogus player position updates prior init complete Add access to statistics information (peer connction time,rtt,version) Fix clients standing stalled in world while preloading item visuals (new clients only) Add get_player_information to read client specific information from lua
* Add the option to bind to a specific addressShadowNinja2014-02-05
|
* Add propper client initializationsapier2014-01-31
| | | | | | | | | | | | | -add client states to avoid server sending data to uninitialized clients -don't show uninitialized clients to other players -propper client disconnect handling Minor comment fixes in server Minor bugfixes in connection -improved peer id calculation -honor NDEBUG flag -improved disconnect handling -increased initial send window Remove some dead code
* Fixed minetest reliable udp implementation (compatible to old clients)sapier2014-01-10
|
* Replace SimpleThread by JThread now implementing same featuressapier2013-12-15
|
* Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenuKahrl2013-08-14
|
* Fix server getting completely choked up on even a little of DoSPerttu Ahola2013-08-04
| | | | | | * If client count is unbearable, immediately delete denied clients * Re-prioritize the checking order of things about incoming clients * Remove a huge CPU-wasting exception in ReliablePacketBuffer
* Add support for IPv6proller2013-06-23
| | | | | | | Two new configuration options are added: - "enable_ipv6" to enable/disable the overall use of IPv6 - "ipv6_server" to enable/disable the use of IPv6 sockets when running a server (when "enable_ipv6" is enabled)
* Migrate to STL containers/algorithms.Ilya Zhuravlev2013-03-11
|
* Update Copyright YearsSfan52013-02-24
|
* Change Minetest-c55 to MinetestPilzAdam2013-02-24
|
* Add congestion control settings to minetest.confPerttu Ahola2012-11-29
|
* Optimize headersPerttu Ahola2012-06-17
|
* Properly and efficiently use split utility headersPerttu Ahola2012-06-17
|
* Switch the license to be LGPLv2/later, with small parts still remaining as ↵Perttu Ahola2012-06-05
| | | | GPLv2/later, by agreement of major contributors
* Proper handling of failing to bind server socketPerttu Ahola2012-03-11
|
* Make Connection::Receive return the data via a SharedBuffer reference, so ↵Kahrl2011-11-07
| | | | | | | | the caller doesn't have to choose the right buffer size in advance. Conflicts: src/test.cpp
* utility.h: Change Buffer's interface to be more compatible with ↵Kahrl2011-11-07
| | | | SharedBuffer's interface, connection.h: use Buffer instead of SharedBuffer in command and event queues
* Improve Connection with threading and some kind of congestion controlPerttu Ahola2011-10-20
|
* Cleaned networking code a bit (had this one on the to-do list for like 4 ↵Perttu Ahola2011-05-21
| | | | months already)
* Players are left on server while server is running. No passwords yet.Perttu Ahola2011-01-15
|
* tinkering aroundPerttu Ahola2010-12-25
|
* disconnect method to connection to be used instead of just timing outPerttu Ahola2010-12-24
|
* license stuffPerttu Ahola2010-11-29
| | | | | --HG-- rename : src/licensecomment.txt => licensecomment.txt
* Initial filesPerttu Ahola2010-11-27
lif defined(_GNU_SOURCE) #include <sys/sysinfo.h> #endif #endif // for setName #if defined(linux) || defined(__linux) #include <sys/prctl.h> #elif defined(__FreeBSD__) || defined(__OpenBSD__) #include <pthread_np.h> #elif defined(_MSC_VER) struct THREADNAME_INFO { DWORD dwType; // Must be 0x1000 LPCSTR szName; // Pointer to name (in user addr space) DWORD dwThreadID; // Thread ID (-1=caller thread) DWORD dwFlags; // Reserved for future use, must be zero }; #endif // for bindToProcessor #if __FreeBSD_version >= 702106 typedef cpuset_t cpu_set_t; #elif defined(__linux) || defined(linux) #include <sched.h> #elif defined(__sun) || defined(sun) #include <sys/types.h> #include <sys/processor.h> #include <sys/procset.h> #elif defined(_AIX) #include <sys/processor.h> #include <sys/thread.h> #elif defined(__APPLE__) #include <mach/mach_init.h> #include <mach/thread_act.h> #endif Thread::Thread(const std::string &name) : m_name(name), m_retval(NULL), m_joinable(false), m_request_stop(false), m_running(false) { #ifdef _AIX m_kernel_thread_id = -1; #endif } Thread::~Thread() { kill(); } bool Thread::start() { MutexAutoLock lock(m_mutex); if (m_running) return false; m_request_stop = false; #if USE_CPP11_THREADS try { m_thread_obj = new std::thread(threadProc, this); m_thread_id = m_thread_obj->get_id(); m_thread_handle = m_thread_obj->native_handle(); } catch (const std::system_error &e) { return false; } #elif USE_WIN_THREADS m_thread_handle = CreateThread(NULL, 0, threadProc, this, 0, &m_thread_id); if (!m_thread_handle) return false; #elif USE_POSIX_THREADS int status = pthread_create(&m_thread_handle, NULL, threadProc, this); if (status) return false; m_thread_id = m_thread_handle; #endif while (!m_running) sleep_ms(1); m_joinable = true; return true; } bool Thread::stop() { m_request_stop = true; return true; } bool Thread::wait() { MutexAutoLock lock(m_mutex); if (!m_joinable) return false; #if USE_CPP11_THREADS m_thread_obj->join(); delete m_thread_obj; m_thread_obj = NULL; #elif USE_WIN_THREADS int ret = WaitForSingleObject(m_thread_handle, INFINITE); assert(ret == WAIT_OBJECT_0); UNUSED(ret); CloseHandle(m_thread_handle); m_thread_handle = NULL; m_thread_id = -1; #elif USE_POSIX_THREADS int ret = pthread_join(m_thread_handle, NULL); assert(ret == 0); UNUSED(ret); #endif assert(m_running == false); m_joinable = false; return true; } bool Thread::kill() { if (!m_running) { wait(); return false; } m_running = false; #ifdef _WIN32 TerminateThread(m_thread_handle, 0); CloseHandle(m_thread_handle); #else // We need to pthread_kill instead on Android since NDKv5's pthread // implementation is incomplete. # ifdef __ANDROID__ pthread_kill(m_thread_handle, SIGKILL); # else pthread_cancel(m_thread_handle); # endif wait(); #endif m_retval = NULL; m_joinable = false; m_request_stop = false; return true; } bool Thread::getReturnValue(void **ret) { if (m_running) return false; *ret = m_retval; return true; } bool Thread::isCurrentThread() { return thr_is_current_thread(m_thread_id); } #if USE_CPP11_THREADS || USE_POSIX_THREADS void *Thread::threadProc(void *param) #elif defined(_WIN32_WCE) DWORD Thread::threadProc(LPVOID param) #elif defined(_WIN32) DWORD WINAPI Thread::threadProc(LPVOID param) #endif { Thread *thr = (Thread *)param; #ifdef _AIX m_kernel_thread_id = thread_self(); #endif thr->setName(thr->m_name); g_logger.registerThread(thr->m_name); thr->m_running = true; thr->m_retval = thr->run(); thr->m_running = false; g_logger.deregisterThread(); return NULL; } void Thread::setName(const std::string &name) { #if defined(linux) || defined(__linux) // It would be cleaner to do this with pthread_setname_np, // which was added to glibc in version 2.12, but some major // distributions are still runing 2.11 and previous versions. prctl(PR_SET_NAME, name.c_str()); #elif defined(__FreeBSD__) || defined(__OpenBSD__) pthread_set_name_np(pthread_self(), name.c_str()); #elif defined(__NetBSD__) pthread_setname_np(pthread_self(), name.c_str()); #elif defined(__APPLE__) pthread_setname_np(name.c_str()); #elif defined(_MSC_VER) // Windows itself doesn't support thread names, // but the MSVC debugger does... THREADNAME_INFO info; info.dwType = 0x1000; info.szName = name.c_str(); info.dwThreadID = -1; info.dwFlags = 0; __try { RaiseException(0x406D1388, 0, sizeof(info) / sizeof(DWORD), (ULONG_PTR *)&info); } __except (EXCEPTION_CONTINUE_EXECUTION) { } #elif defined(_WIN32) || defined(__GNU__) // These platforms are known to not support thread names. // Silently ignore the request. #else #warning "Unrecognized platform, thread names will not be available." #endif } unsigned int Thread::getNumberOfProcessors() { #if __cplusplus >= 201103L return std::thread::hardware_concurrency(); #elif defined(_SC_NPROCESSORS_ONLN) return sysconf(_SC_NPROCESSORS_ONLN); #elif defined(__FreeBSD__) || defined(__NetBSD__) || \ defined(__DragonFly__) || defined(__APPLE__) unsigned int num_cpus = 1; size_t len = sizeof(num_cpus); int mib[2]; mib[0] = CTL_HW; mib[1] = HW_NCPU; sysctl(mib, 2, &num_cpus, &len, NULL, 0); return num_cpus; #elif defined(_GNU_SOURCE) return get_nprocs(); #elif defined(_WIN32) SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; #elif defined(PTW32_VERSION) || defined(__hpux) return pthread_num_processors_np(); #else return 1; #endif } bool Thread::bindToProcessor(unsigned int proc_number) { #if defined(__ANDROID__) return false; #elif defined(_WIN32) return SetThreadAffinityMask(m_thread_handle, 1 << proc_number); #elif __FreeBSD_version >= 702106 || defined(__linux) || defined(linux) cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(proc_number, &cpuset); return pthread_setaffinity_np(m_thread_handle, sizeof(cpuset), &cpuset) == 0; #elif defined(__sun) || defined(sun) return processor_bind(P_LWPID, P_MYID, proc_number, NULL) == 0 #elif defined(_AIX) return bindprocessor(BINDTHREAD, m_kernel_thread_id, proc_number) == 0; #elif defined(__hpux) || defined(hpux) pthread_spu_t answer; return pthread_processor_bind_np(PTHREAD_BIND_ADVISORY_NP, &answer, proc_number, m_thread_handle) == 0; #elif defined(__APPLE__) struct thread_affinity_policy tapol; thread_port_t threadport = pthread_mach_thread_np(m_thread_handle); tapol.affinity_tag = proc_number + 1; return thread_policy_set(threadport, THREAD_AFFINITY_POLICY, (thread_policy_t)&tapol, THREAD_AFFINITY_POLICY_COUNT) == KERN_SUCCESS; #else return false; #endif } bool Thread::setPriority(int prio) { #if defined(_WIN32) return SetThreadPriority(m_thread_handle, prio); #else struct sched_param sparam; int policy; if (pthread_getschedparam(m_thread_handle, &policy, &sparam) != 0) return false; int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); sparam.sched_priority = min + prio * (max - min) / THREAD_PRIORITY_HIGHEST; return pthread_setschedparam(m_thread_handle, policy, &sparam) == 0; #endif }