Some checks failed
ZaStoGram source guards / guards (push) Failing after 45s
Build three ZaStoGram APKs / build (armeabi-v7a, ZaStoGram-standalone-armeabi-v7a, Armv7, armv7) (push) Failing after 3m17s
Build three ZaStoGram APKs / build (arm64-v8a, ZaStoGram-standalone-arm64-v8a, Arm64, arm64) (push) Failing after 3m19s
Build three ZaStoGram APKs / build (x86, ZaStoGram-standalone-x86, X86, x86) (push) Failing after 3m20s
Короткая пачка TCP-таймаутов на старте отключала kws домашнего DC на 10 минут и уводила его в туннель Cloudflare, где на мобильной сети TCP замерзает после ~16 КБ. Теперь таймаут при недавнем успешном TCP к тому же адресу считается потерей потока, провалы в пределах 2 с считаются одним, подавление длится 2 минуты, а включение WSS на старте не рвёт соединения, если ни одно ещё не открыто. Пул держит по одному готовому (TCP+TLS+upgrade) сокету на маршрут kwsN, который соединения недавно запрашивали; неудачи его пробных сокетов не влияют на выбор маршрута.
58 lines
1.6 KiB
C++
58 lines
1.6 KiB
C++
/*
|
|
* This is the source code of tgnet library v. 1.1
|
|
* It is licensed under GNU GPL v. 2 or later.
|
|
* You should have received a copy of the license in this archive (see LICENSE).
|
|
*
|
|
* Copyright Nikolai Kudashov, 2015-2018.
|
|
*/
|
|
|
|
#include <unistd.h>
|
|
#include <sys/eventfd.h>
|
|
#include "EventObject.h"
|
|
#include "Connection.h"
|
|
#include "Timer.h"
|
|
#include "wss/WssPool.h"
|
|
|
|
EventObject::EventObject(void *object, EventObjectType type) {
|
|
eventObject = object;
|
|
eventType = type;
|
|
}
|
|
|
|
void EventObject::onEvent(uint32_t events) {
|
|
switch (eventType) {
|
|
case EventObjectTypeConnection: {
|
|
Connection *connection = (Connection *) eventObject;
|
|
connection->onEvent(events);
|
|
break;
|
|
}
|
|
case EventObjectTypeTimer: {
|
|
Timer *timer = (Timer *) eventObject;
|
|
timer->onEvent();
|
|
break;
|
|
}
|
|
case EventObjectTypePipe: {
|
|
int *pipe = (int *) eventObject;
|
|
char ch;
|
|
ssize_t size = 1;
|
|
while (size > 0) {
|
|
size = read(pipe[0], &ch, 1);
|
|
}
|
|
break;
|
|
}
|
|
case EventObjectTypeWssPool: {
|
|
// Retired pool sockets leave an inert object behind for stale events.
|
|
if (eventObject != nullptr) {
|
|
tgnet::wss::DispatchPoolEvent(eventObject, events);
|
|
}
|
|
break;
|
|
}
|
|
case EventObjectTypeEvent: {
|
|
int *eventFd = (int *) eventObject;
|
|
uint64_t count;
|
|
eventfd_read(eventFd[0], &count);
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|