ZaStoGram/TMessagesProj/jni/tgnet/EventObject.cpp
loop-uh 4669d9cc02
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
Держать WSS на релее и открывать соединения из пула
Короткая пачка TCP-таймаутов на старте отключала kws домашнего DC на
10 минут и уводила его в туннель Cloudflare, где на мобильной сети
TCP замерзает после ~16 КБ. Теперь таймаут при недавнем успешном TCP
к тому же адресу считается потерей потока, провалы в пределах 2 с
считаются одним, подавление длится 2 минуты, а включение WSS на
старте не рвёт соединения, если ни одно ещё не открыто.

Пул держит по одному готовому (TCP+TLS+upgrade) сокету на маршрут
kwsN, который соединения недавно запрашивали; неудачи его пробных
сокетов не влияют на выбор маршрута.
2026-09-24 19:39:26 +03:00

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