LINUX.ORG.RU

Сообщения pavlick

 

Вывод в консоль cout и wcout одновременно

Форум — Development

Всем привет.

  1. Я с никогда не понимал фразу: «при первом испоьзовании cout/wcout, всё это хозяйство берёт ориентацию и в дальнейшем нужно не миксовать w… с безпрефиксными вариантами (без w…)». А что это означает на практике? Как происходит эта «ориентация»? Почему миксовать не получается? В общем хочется деталей для понимания.

  2. Первый вопрос вытекает из того, что юзаю ncurses, внутренне она конвертит все входящие символы в wide символы (судя по необходимости устанавливать локаль, когда входящие символы не ASCII). Логично, что и от неё в консоль идут wide символы, и черт его знает что там сориентируется и в какую сторону. А из-за непонимания механизма - всё это какая-то магия.

  3. Ну чисто собственный наивный взгляд - видимо, wcout и cout пишут в один и тот же файл (очевидно да), принимающая сторона хранит символы в wide, и вот ей нужно определиться - конвертить ли входящий поток narrow->wide или нет. Ну если так, то я не могу после ncurses (которая широкая внутренне) печатного цикла использовать cout и мне нужно переоткрывать stdout как пишут в доках. Кто-нибудь не согласен?

 , ,

pavlick
()

Почему не выодится тип

Форум — Development
struct W{
	template <typename T>
		W(int s, T &&t) {}
	template <typename T>
		W(T &&t) {}
};

int main() {
   W w1( {4} );    // ok
   W w2( 4, {4} ); // error (couldn’t deduce template parameter ‘T’)
	return 0;
}

Может туплю, но не вижу никаких причин для отказа в выводе здесь.

 

pavlick
()

Проход по Clang AST

Форум — Development

Всех приветствую.
Задача такая - найти бинарные операторы и проверить не кастится ли один из операндов signed<->unsigned. Например выражение int res = u + i. Для него AST будет иметь вид:

DeclStmt 0x56320fa43ef0 <line:4:2, col:17>
    | `-VarDecl 0x56320fa43dc8 <col:2, col:16> col:6 res 'int' cinit
    |   `-ImplicitCastExpr 0x56320fa43ed8 <col:12, col:16> 'int' <IntegralCast>
    |     `-BinaryOperator 0x56320fa43eb8 <col:12, col:16> 'unsigned int' '+'
    |       |-ImplicitCastExpr 0x56320fa43e70 <col:12> 'unsigned int' <LValueToRValue>
    |       | `-DeclRefExpr 0x56320fa43e30 <col:12> 'unsigned int' lvalue Var 0x56320fa43cf8 'u' 'unsigned int'
    |       `-ImplicitCastExpr 0x56320fa43ea0 <col:16> 'unsigned int' <IntegralCast>
    |         `-ImplicitCastExpr 0x56320fa43e88 <col:16> 'int' <LValueToRValue>
    |           `-DeclRefExpr 0x56320fa43e50 <col:16> 'int' lvalue Var 0x56320fa43c40 'i' 'int'

Пишу Visitor для парсинг шланговского дерева:

class Visitor
: public RecursiveASTVisitor<Visitor> {
public:
	explicit FindNamedClassVisitor(ASTContext *Context)
		: Context(Context) {}
	bool VisitBinaryOperator(BinaryOperator *bo) {
		clang::Expr* lhs = bo->getLHS();
		clang::Expr* rhs = bo->getRHS();
		auto lt = lhs->getType();
		auto rt = rhs->getType();

		return true;
	}
private:
	ASTContext *Context;
};

В lhs/rhs содержатся левая/правая часть выражения, в lt/rt - квалифицированный тип, но уже после каста, т.е. левый и правый тип совпадают (я ищу операции для встроенных типов). Мне нужно взять lhs и rhs и проверить там наличие signed<->unsigned (третья строка снизу в дампе дерева -ImplicitCastExpr 0x56320fa43ea0 col:16 ‘unsigned int’ ).

Проверил все методы у clang::Expr и родственников, ничего не подходит, вроде. Может нужно кастануть Expr в какой-то Layout compatible тип? А может я вовсе не так парсить начал, а надо идти по всем нодам и сохранять интересующие пути.

Запутался немного, как сделать, может кто уже копал шланг.

 , , ,

pavlick
()

Парсинг c++ кода

Форум — Development

Ребята, такой вопрос - имеем на руках некоторое полное цпп выражение (от ; до ;), куда его можно скормить, чтобы получить на выходе набор операторов и операндов к ним? Парсить руками как-то настроения нет, всякие возможности вроде obj.operator()(arg), … . Может быть какой-нибудь статический анализатор родил какое-то готовое решение?

 

pavlick
()

Получить воринг

Форум — Development

Привет. Вопрос - мелочовка, но хотелось бы уметь. Условно у нас такой код:

int i = 1;
unsigned u = 2;
auto res = i - u + 1LL;

Можно заметить, что результат будет таким: res = long long(unsigned(i-u)+1). Возможно хотелось signed в первом действии, а каст не сделал т.к. не сильно задумывался при написании. Хочется получать предупреждение, когда в выражении более одного действия с участием знакового и беззнакового микса. Компилятор жалуется лишь на сравнение, прогнал через clang-tidy со всеми проверками - нулевой эффект. Кто-нибудь знает способ?

А в целом по вопросу - не очень понятно, почему integer promotion кастит лишь в int, особенно после появления в стандарте long long, по идее нужно кастовать в самый жирный тип. А в до цпп11 почему int, а не long, который может быть больше.

UPDATE:
Свои потребности закрыл вот этой поделкой https://github.com/sfpvk/Wsign-arithmetic

 ,

pavlick
()

Механическая рука

Форум — Linux-hardware

Привет. Думаю как повторить человеческую руку (лишь два сустава - плечевой и логтевой, без вращательного движения в них). Мне не нужна прецизионная точность в движениях, рука должна быть быстрой (почти как настоящая). С программной частью и электроникой особых проблем не будет, а вот с приводами для руки у меня куча вопросов. Заюзать гидравлику (скорее всего, ибо компактно т.к двигатель в сторонке)? Где брать цилиндры/поршни или самому точить, насос, клапана … . В общем множество деталей, который не хотелось познавать самостоятельно с самого начала.

Может вы знаете какие-то похожие проекты, где авторы делятся опытом, рассказывают где и от чего брали детали, демонстрируют свои шишки.

Не спрашивайте зачем, пожалуйста.

 ,

pavlick
()

C++ модули

Форум — Development

Все никак допилится не могут. Хотел бы сразу завернуть поделки, которые рождаются сейчас, в модули. гцц со шлангом говорят, что сыро, cmake там что-то костылит. В общем - кто щупал, можно ли в данный момент взять гцц или шланг + cmake (бэкэнд без разницы) и заюзать их без особой боли, т.е:

  1. без каких либо временных костылей в cmake
  2. без серьезных модульных багов
  3. как там с поддержкой со стороны cmake based tools? Видны ли для них символы из модулей?

В общем - можно ли комфортно пользоваться, или пока не лезть? Тратить время чтобы «просто потыкать» игрушку не хочется.

 

pavlick
()

Обмен с .so'шкой полиморфными объектами и баги компилятора?

Форум — Development

Привет. Хочу этого: есть приложение APP, есть модули в виде разделямых либ, которые дописываются в процессе, модули отправляют APP производные классы от базового интерфейсного, и APP с ними однотипно работает. Короче, обычный полиморфизм только между разными elf’ами, значит нельзя исключить личный комплект всяких libstdc++, libc, поэтому либо делать костыль в виде free() торчащий из модулей для удаления полученных APP’ом объектов, либо так (vector не будет перебрасываться между разными elf’ами, конечно же, просто для теста воткнул):

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

struct Animal {
	void (*speak)() = nullptr;
	unique_ptr<Animal> (*copy)(Animal *p) = nullptr;
	void (*print)(Animal *p) = nullptr;
	void (*dstr)(Animal *p) = nullptr;
	bool m_first_destruction = true;
	~Animal() {
		if (m_first_destruction) {
			m_first_destruction = false;
			(*dstr)(this);
		}
	}
};

struct Dog : Animal {
	vector<int> m_v{34, 54, 543};
	static unique_ptr<Animal> copy(Animal *p) {
		Dog *ptr = static_cast<Dog*>(p);
		return unique_ptr<Animal>{new Dog(*ptr)};
	}
	static void print(Animal *p) {
		Dog *ptr = static_cast<Dog*>(p);
		for (int v : ptr->m_v)
			cout << v << endl;
	}
	static void dstr(Animal *p) {
		Dog *ptr = static_cast<Dog*>(p);
		ptr->~Dog();
	}
	Dog() : Animal{[](){cout << "woof\n";},
		&Dog::copy,
		&Dog::print,
		&Dog::dstr} {}
};

struct Cat : Animal {
	vector<int> m_v{2, 4, 1};
	static unique_ptr<Animal> copy(Animal *p) {
		Cat *ptr = static_cast<Cat*>(p);
		return unique_ptr<Animal>{new Cat(*ptr)};
	}
	static void print(Animal *p) {
		Cat *ptr = static_cast<Cat*>(p);
		for (int v : ptr->m_v)
			cout << v << endl;
	}
	static void dstr(Animal *p) {
		Cat *ptr = static_cast<Cat*>(p);
		ptr->~Cat();
	}
	Cat() : Animal{[](){cout << "meow\n";},
		&Cat::copy,
		&Cat::print,
		&Cat::dstr} {}
};

int main() {
	unique_ptr<Animal> cat{new Cat};
	unique_ptr<Animal> cat_cp = cat->copy(cat.get());
	cat_cp->speak();
	cat_cp->print(cat.get());

	unique_ptr<Animal> dog{new Dog};
	unique_ptr<Animal> dog_cp = dog->copy(dog.get());
	dog_cp->speak();
	dog_cp->print(dog.get());
}

т.е. получаю от модуля unique_ptr, делаю его копию через copy(), и дергаю другие «виртуальные» методы. Все вроде норм, в целом устраивает, но есть две проблемки:

  1. Ругается гцц санитайзер на данный код (шланговский нет):
pavlick /tmp $ g++ 3.cc -fsanitize=address
pavlick /tmp $ ./a.out
meow
2
4
1
woof
34
54
543
=================================================================
==10127==ERROR: AddressSanitizer: new-delete-type-mismatch on 0x606000000200 in thread T0:
  object passed to delete has wrong type:
  size of the allocated type:   64 bytes;
  size of the deallocated type: 40 bytes.
    #0 0x7f4977684009 in operator delete(void*, unsigned long) /build/gcc/src/gcc/libsanitizer/asan/asan_new_delete.cpp:172
    #1 0x558db4b088ae in std::default_delete<Animal>::operator()(Animal*) const (/tmp/a.out+0x48ae)
    #2 0x558db4b07c8a in std::unique_ptr<Animal, std::default_delete<Animal> >::~unique_ptr() (/tmp/a.out+0x3c8a)
    #3 0x558db4b065c3 in main (/tmp/a.out+0x25c3)
    #4 0x7f49770edb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)
    #5 0x558db4b0620d in _start (/tmp/a.out+0x220d)

0x606000000200 is located 0 bytes inside of 64-byte region [0x606000000200,0x606000000240)
allocated by thread T0 here:
    #0 0x7f4977682f41 in operator new(unsigned long) /build/gcc/src/gcc/libsanitizer/asan/asan_new_delete.cpp:99
    #1 0x558db4b068e9 in Dog::copy(Animal*) (/tmp/a.out+0x28e9)
    #2 0x558db4b06543 in main (/tmp/a.out+0x2543)
    #3 0x7f49770edb24 in __libc_start_main (/usr/lib/libc.so.6+0x27b24)

SUMMARY: AddressSanitizer: new-delete-type-mismatch /build/gcc/src/gcc/libsanitizer/asan/asan_new_delete.cpp:172 in operator delete(void*, unsigned long)
==10127==HINT: if you don't care about these errors you may set ASAN_OPTIONS=new_delete_type_mismatch=0
==10127==ABORTING

Я туплю или надо отправить багрепорт? Я так понимаю, что дело хитрого хака внутри деструктор Animal() он не понимает, видимо, что все деструкторы отрабатывают нормально.

  1. Ну и не очень нравится вот это:
unique_ptr<Animal> cat_cp = cat->copy(cat.get());

т.е. мне приходится дважды передавать указатель, что излишне, достаточно однажды это делать. Либо обмазывать макросами, либо закостылить что такое:

struct Base {
	void (Base::*fp)() = nullptr;
};
struct Derived : Base {
	void fd();
	Derived(): Base{&fd} {}
};

чтобы потом дергать как-то так без дублирования (baseptr->*fp)(); Но я пока не могу сообразить как. Какие-нибудь идеи?

 

pavlick
()

Отправить баг репорт

Форум — Development

Написал случайно примерно такое:

#include <iostream>

class Curses_table {
public:
	void draw_row() {std::cout << "draw_row fn" << std::endl;};
	void draw_table();
	int dir = 0;
};

void Curses_table::draw_table() {
	auto Curses_table::*draw_fn = &Curses_table::draw_row; //  line 14
	(this->*draw_fn)();
}

int main() {
	Curses_table t;
	t.draw_table();
}
$ g++ 1.cc -Wall
$ ./a.out
draw_row fn
$ g++ 1.cc -Wall -fsanitize=address
$ ./a.out
'draw_fn' (line 14) <== Memory access at offset 40 overflows this variable

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (GCC)

Компилируется без ошибок. На 14 строке каким-то лютым синтаксисом создаю указатель на член-функцию. Программа отрабатывает норм. Потом компилирую с сантайзером, запускаю, он жалуется на «Memory access at offset 40 overflows this variable». С clang всё аналогично.

Я, собственно, чего пишу - меня на баг трекере gcc забанили, в общем проблемы у меня там с регистрацией. Сделайте доброе дело - отправьте. Сначала отписаться - «я отправлю», чтобы не было повтора.

 

pavlick
()

Сохранение фолдинга

Форум — Development

Приветствую. Я осознал, что мне крайне необходим фолдинг. Хочу такое: если в текущей директории (та что :pwd) находится ./vimview, то при закрытии/открытии окна в нее сохраняется/загружается выхлоп :mkview для сохранении инфы о фолдинге. Если по пунктам, то:

  1. Проверяем существование ./vimview
  2. Получаем полный путь к файлу, заменяем в нем все ‘/’ на ‘_’ например.
  3. Сохраняем/загружаем образ.
    В теории все понятно, но всем же надо обязательно придумать свой особенный язык вместо заюзывания всем понятного си подобного, в общем застрял. Пока такая заготовка:
function Load_fold()
	if isdirectory("./vimview")
	endif
endfunction

function Save_fold()
	if isdirectory("./vimview")
		let name = expand('%:t')
		let qq = "kjkjk" . "kjjjjk"
		mkview! expand(qq)
	endif
endfunction

augroup Remember_folds
  autocmd!
  autocmd BufWinLeave * call Save_fold()
  autocmd BufWinEnter * call Load_fold()
augroup END

Я там по всякому пытался раскрыть значение qq для mkview!, никак не выходит. В общем надо взять выхлоп expand(‘%:e’), заменить / на _, слепить «./vimview» с этим выхлопом, отдать это mkview. Очевидно, что там какая-нибудь subst() + немного магии, и вообще это нубвопрос, но хочется сделать быстро, а не к вечеру.

 ,

pavlick
()

IPC, сигналы

Форум — Development

Штудирую ncurses доки, там заюзаны сигналы, идти распыляться и штудировать все подряд не хочется, а вопросы появились. В целом сигналы понимаю, а вот мелочи - не очень. Такой код:

static void finish(int sig);

int
main(int argc, char *argv[])
{
...
    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */
...
    finish(0);               /* we are done */
}

static void finish(int sig)
{
    endwin();
    exit(0);
}
  1. Вызов endwin() в хендлере. Равзе это не говнокод? Как бы хз в каком состоянии находилась ncurses после последнего кванта проц времени, а тут дергается ее deinit.

  2. Второй вопрос важнее - если закомментить exit() в хендлере, то что происходит с процессом после возврата из обработчика? Опыт показывает, что процесс после этого нормально не работает, но и не завршается совсем. Какая там магия? Что, если я хочу выполнить некое действие в хендлере и продолжить выполнение основного кода (установить некий exit_flag), как я должен это сделать (там какую-то функцию надо дернуть, да? Какую?).

Зы: начинаешь гуглить про сигналы, там тебе рассказывают про $ kill.

 ,

pavlick
()

Почему крашится

Форум — Development

Привет.

    window = SDL_CreateWindow("msdl",
            SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED,
            WINDOW_WIDTH,
            WINDOW_HEIGHT,
            SDL_WINDOW_OPENGL     // STRING
            );   
    window2 = SDL_CreateWindow("msdl2",
            SDL_WINDOWPOS_CENTERED,
            SDL_WINDOWPOS_CENTERED,
            WINDOW_WIDTH,
            WINDOW_HEIGHT,
            SDL_WINDOW_OPENGL    // STRING
            );   
    renderer = SDL_CreateRenderer(window,
            -1,
            //SDL_RENDERER_SOFTWARE
            //SDL_RENDERER_HARDWARE
            0
            );   
    renderer2 = SDL_CreateRenderer(window2,
            -1,
            //SDL_RENDERER_SOFTWARE
            //SDL_RENDERER_HARDWARE
            0
            );   

Ничего хитрого, создаю два окошка через SDL, но если закомментить STRING (и передать ноль как флаг), то приложение падает (можно лишь одно окно создать). Почему? Тесты показывают, что даже без флага SDL_WINDOW_OPENGL и SDL_RENDERER_HARDWARE картинка рендерится на ГПУ (заметно по FPS), отрисовка на ЦПУ лишь при флаге SDL_RENDERER_SOFTWARE в SDL_CreateRenderer(). Это не возврат какого-то нулевого указателя, а падение с дампом внутри первого SDL_CreateRenderer().

 

pavlick
()

Телефон не для хомячков

Форум — General

Привет. Мне как-то не доводилось вертеть свежие телефоны до последенего времени (стоял старенький андройд), подарили. Если честно, от обилия зондов и откровенного навязывания тошнит. Можно ли накатить «линукс» на телефон вместо андройда? Т.е. некоторый свободный аналог-проект, без всего этого коммерческого непотребства, существуют ли такие? А может можно прям линуск впендюрить? Кто-нибудь пробовал? Я бы с радостью. Ну невозможно этим пользоваться, меня там не уважают.

 

pavlick
()

Дружба с глобальной функцией

Форум — Development

Привет, вопрос элементарный, но что-то сообразить совсем не получается. Было примерно так (работало):

class Q {
   friend int main();
   Q() = default;
};

int main() {
   Q q;
}

Потом было добавлено namespace:

namespace NS {
class Q {
   friend int main();
   Q() = default;
};
} //NS

И теперь никак не удается назначить друга для Q из file scope. friend int main() не срабатывает (согласен), но также не помогает friend int ::main(), хотя на цппреференс есть пример:

friend class ::F; // friends the global F

Как правильно? Делать декларацию main в NS - не хочу. Компилятор выдает:

error: 'int main()' should have been declared inside '::'
   36 |  friend int ::main();

 

pavlick
()

3д модель из объекта в реале, обработка видео

Форум — General

Всем привет, вопроса два:

  1. Представим, что у меня есть некоторый видео ролик, где движется некий предмет. Нужно получить серию кадров, где все является прозрачным кроме самого объекта. Я себе это как-то так представляю: я беру первый кадр, обвожу желаемый объект руками, отдаю это в какую-то софтину и она сама корректируют заданную обводку по мере поступления новых кадров (ориентируясь на контраст цветов между областями, которые разделены обводкой), все пиксели, которые не попали в заданную рамку, подвергаются установке непрозрачности в ноль (альфа канал).

  2. Перед нами есть собака, например, хочу создать ее 3д модель. Т.е. получить что-то вроде набора векторов, к которым потом смогу применять всякие трансформации (вращать, масштабировать и т.п). Как это можно сделать? Пусть это будет даже не по вектору на пиксель, а грубо, векторов 100 на модель. Т.е. на выходе хочется иметь функцую, которая принимает трансформационную матрицу и отдает трансформированный рисунок. Оцифровать контрольные точки - не сильно сложно, думаю (что-то на основе дальномера, например), но как на это наложить потом шкуру собаки. Да, знаю что наверняка проще найти готовую модель для какого-нибудь блендера, но интересно именно так сделать - насколько это реально/хлопотно/дорого.

 , ,

pavlick
()

Архитектура boost::asio

Форум — Development

Привет. Что-то я не совсем до конца понял как что за ливер в асио и как он функционирует. Наткнулся на такое и не понял зачем в аксептор отдают стрэнд. Чисто инуитивно - видимо альтернативная форма вместо той, когда стрэнд предается через async_…().

tcp::acceptor acceptor_;
net::io_context& ioc_;
...
acceptor_(net::make_strand(ioc))

В терминах асио, strand - executor. Разжуйте в целом механизм - как происходит вызов конечной функции-обработчика в асио и какую функцию в этом играет экзекъютер. Как бы понятно про проактор и все такое, поставили в очередь, задание запустилось на другом потоке (зашедшем в ран()), поток закончил, вызвали функтор обработчик события. Интересно именно роль в этом процессе executor’а, хочется понять принцип синхронизации через strand. Например, экзекъютер - контейнер асинхронных заданий с обработчиками, который выдает задание из своей очереди по запросу. Тут реализованы различные стратегии вроде strand (предыдущий не закончил, следущее задание strand не отдаст).

И еще не понял такое из асио доков

In the case of composed asynchronous operations, such as async_read() or async_read_until(), if a completion handler goes through a strand, then all intermediate handlers should also go through the same strand. 

Что за промежуточные хендлеры? Под хендлером ведь понимаются обработчики, которые передал в read_async(), например, но видимо я что-то не понял. Или промежуточный хендлер - это само чтение из сокета?

PS: конструктор аксептора в доках видел, но сильно яснее не становится:

The I/O executor that the acceptor will use, by default, to dispatch handlers for any asynchronous operations performed on the acceptor. 

PPS: нет бы в доках нарисовать достаточно подробную схему взаимодействия основных сущностей вместо тысячи слов, иначе идти в отладчик и штудировать backtrace, весело.

 

pavlick
()

Накостылить IPC

Форум — Development

Ребята, нужно придумать эффективную схему inter process communication. Имеются несколько процессов (назовем их slaves), которые общаются с одним главным процессом (назовем master). Подчеркиваю - речь о процессах, а не о потоках. Между master и slaves гоняются весьма большие куски данных. FIFO отмел ввиду тормознутости, остановился на shared memory. И вот тут нужно по уму сделать. У меня примерно такая схема родилась

https://pasteboard.co/JKcwhO7.jpg

Идея в следующем подгружаю в пространство master и slaves модуль, он состоит из таких вот блоков для передачи инфы, таких блоков (на картинке изображен один блок) штук 10 всего. Работает примерно так: slave подходит к блоку, берет семафор slave-slave, который запрещает доступ к блоку для других slave (возможно откажусь вовсе от slave-slave семафора и за каждым slave будет закреплен свой блок). Далее берет семафор slave-master, пишет в общую память, освобождает slave-master семафор, подает сингал через fifo master’у о готовности данных для чтения, подключается к fifo для ожидания сигнала о наличии ответа в общей памяти, берет slave-master семафор, читает, уходит. Как вам в целом схема? Можете предложить лучше? Насколько разумно использовать fifo в качестве condition variable? Они весьма тормознутые (shared memory быстрее раз в сто, если не ошибаюсь), возможно там и пробуждение процесса по сигналу из него тоже не на высоте (а куда торопиться, если они и так тормознутые), может можно чем-то заменить?

 , ,

pavlick
()

Сортировка файлов в директории для ускорения открытия

Форум — Development

Привет. Интересует вот что - существует некоторая директория /dir, в ней много тысяч файлов, дальше я пятаюсь открыть некоторый файл, сортирует ли linux их имена как-то для быстрого открытия искомого элемента или будет тупо пробигать по списку всех файлов в директории? Может мне нужно самому делать поддиректории получив тем самым сортировку? В общем, какая сложность алгоритма открытия файла? Линейная, логарифмическая, константная.

UPD: вопрос Сортировка файлов в директории для ускорения открытия (комментарий)

 , ,

pavlick
()

Многопоточность/многопроцессорность в kore.io

Форум — Development

Ребята, речь об этой софтие https://kore.io/. В общем я несколько не понимаю модель работы данного софта. На старте запускается несколько worker’ов, это отдельные процессы (у меня их запускается два, я так понимаю, что по числу ядер, но хз). Было предположение, что каждый воркер берет на себя по серверу, я запустил два

server tls {
	bind 127.0.0.1 8888
	bind 127.0.0.1 8889
}

$ kodev run
[wrk 1]: worker 1 started (cpu#1, pid#13654)
[wrk 2]: worker 2 started (cpu#0, pid#13655)

но нет, все запросы обрабатываются одним процессом, более того - одним потоком.

Вопросы - 1. Нафиг запускается несколько worker’ов, если работает лишь один (да и вообще, разве так можно - обслуживать один сокет несколькими процессами)? 2. Сишный модуль, который я пишу, он всегда выполняется одним потоком (ну если я сам ничего не запускаю руками, черза task’и kore’а, например), т.е. мне не нужно заморачиваться со всякой синхронизацией ожидая какой-нибудь лихой поток, который все сломает?

ЗЫ: я сильно извиняюсь за такие вопросы, это надо читать в доках, но доки совсем неинформативны, многие вопросы не освещены. Нужно идти и изучать исходники для понимания.

 

pavlick
()

Отличить клиентов за NAT'ом

Форум — Web-development

Привет. Вопрос в общем-то в названии - допустим, что два клиента выходят в сеть через один и тот же NAT, подключаются к http серверу, и, собственно, - как их отличть друг от друга можно? Если бы был голый tcp, то там можно пакет выпотрошить и найти инфу, а как в случае с хттп сделать? Может это какая-то элементарщина, сильно не гуглил, мысли опережают руки. Ну а нафиг мне это надо - под клиентов выделяются некоторые ресурсы, надо как-то бороться с потенциальными негодяями, хотя бы понимать как это делать.

 ,

pavlick
()

RSS подписка на новые темы