Igor
тем не менее, когда я открыл файл и кастовал в его в такую структуру и попытался обратиться к fp я тоже ловил segfault
Snusmumriken
Есть шанс что оно из-за кастования. Дефайни такую же структуру (или инклюдь ту же файл-либу) и работай.
Snusmumriken
Я нубас в сишке, но предпочитаю не кастовать ничего в воид, потому что сегфолты ))
Igor
мне перекастовать в voidptr нужно файл, чтобы его через линду передать в другой поток (LuaLanes), а юзердату напрямую линда передавать не умеет, луашные файлы в том числе
Snusmumriken
Жуть какая.
Igor
Сам в шоке
Igor
И всё это мне нужно, чтобы через zlib в отдельном потоке записать данные в файл
Snusmumriken
Сам в своё время морочился с лейнсами, ибо они норовили при генерации нового треда копировать всё что было в _G из одного треда в другой, а у меня там были в т.ч. куча вообще сторонней cdata. Поэтому приходилось заставлять её делать девственно чистые вм, в которых реквайрится ровно то что нужно включая стандартную библиотеку.
Igor
LuaLanes по идее копирует только локальные переменные, когда к ним происходит обращение в потоке
Igor
Но не всегда это работает так, как задумано
Igor
У меня, например, поток еррорил из-за того что в месте, где он создавался была открыта библиотека ws2_32 и она была присвоена локальной переменной socket, внутри потока тоже была переменная socket, но он пытался вытащить из основного потока и ловил ошибку с передачей по линде юзердаты
Snusmumriken
Ну мб, я не помню точно. В общем, мне кажется что это чот сложное, и не стоит шарить файл-хендлер по нескольким потокам во-первых, потому что асинхронный неблокирующий доступ к файлам это жесть (как на картинке), а во-вторых, хз кто, когда и сколько раз его закроет.
Snusmumriken
Ну кароч может просто выслать в треды пути до файлов, а там их откроют и сделают с ними что надо? Простые дедулькины способы, всё такое.
Igor
Ну, как только у меня открывается поток уже гарантированно, что к этому хендлу не будет обращаться основной поток
Igor
до момента закрытия потока
Igor
Сейчас мне приходится делать что-то такое
Igor
с ab открываю файл тот же, что был в основном потоке
Igor
потом тащу из памяти uint8_t поинтер на массив огромный
Igor
и сжимаю своей либой
Snusmumriken
Snusmumriken
Не, ничего плохого, мне просто нимношк страшно
Igor
У меня весь этот проект одна большая жуть на 10 с лишним тыщ строк кода
Igor
Это сервер для игры одной, уже около года над ним работаю с другом
Igor
Просто от нечего делать его писать начал, потом присоединился друг
fgntfg
Можно грабить корованы?
Igor
LuaLanes погугли
Igor
linda это канал связи между потоками
Snusmumriken
Что за линда?
Холмса смотрел/читал? В собаке баскервиллей была одна мадам Лора Лайнс. А Линда — её подруга.
Igor
хахаха
Igor
У меня есть ещё и подобная непристойность в этом сервере
Igor
Используется для того, чтобы можно было в консоль сервера писать команды
Igor
И чтобы в этот момент основной поток не блокировался
Snusmumriken
Та норм
Igor
Но и это создаёт свои проблемы, из-за того, что здесь блокируется файл stdin и из него ожидается дата каждый раз, при вызове fflush(NULL) вся программа повиснет пока поток с ожиданием команды не сделает тик
Igor
Пытался придумать что-то простенькое с неблокирующим IO, но все либы жирные и никаких особо полезных функций в каждой ОСи нет, а сервак мой работает как на Linux так и на Windows
Snusmumriken
Ех, я предпочитаю каждый поток логировать в отдельный файл, как раз от блокировок. Ну и тупые способы многопоточки, когда мейн запускает дочек, и время от времени опрашивает "есть чо? нет? ну я ещё подожду", выполняя минимум работы.
Igor
Та же fflush(NULL) вызывается, когда выполняется функция io.popen, чтобы лишняя дата не лезла в вывод
Igor
У меня бы было всё гораздо проще, если бы той же io.read можно было указать таймаут на чтение
Igor
Но нет, она упорно продолжает ждать дату, пока она не появится
Snusmumriken
Есть вроде либы для асинхронного io. Даже что-то кроссплатформенное.
Igor
В том то и дело
Igor
Я пытаюсь использовать как можно меньше внешних зависимостей
Igor
сейчас из внешних зависимостей у меня библиотеки LuaLanes и struct модифицированный
Igor
ну и из не луёвых zlib чистый, без него никак
Snusmumriken
Понял, но лично я бы ради капитального упрощения пожертвовал бы одной лишней зависимостью. Мб даже вывез на одном потоке с корутинами.
Snusmumriken
Вот, например, простенький хттп-сервер на корутинах, довольно быренький и сверхпростой. https://pastebin.com/sJQCK5PJ Операции с сокетами неблокирующие, разумеется.
Igor
сопрограммы тоже тут не лучший помощник, остановить выполнение io.read один фиг нельзя
Snusmumriken
Нельзя-то нельзя, но лично я бы таки пожертвовал одной зависимостью.
Igor
Ну я наоборот думаю даже от LuaLanes отказаться
Igor
И написать самому либу для потокв
Igor
С ffi биндами
Igor
Но у меня просто так удобно LuaLanes встал, что лень делать что-то даже
🐅🤦‍♂️
Snusmumriken
Я прост когда работаю с лейнсом, мысленно вспоминаю то Лору то Линду из глубокой глотки. Самому страшно.
Igor
У меня вообще какая-то маниакальная потребность в написании библиотек самостоятельно
Snusmumriken
Не бойся, это нормально, но над этим надо работать.
Igor
Те же сокеты сам написал, потому что с LuaSocket работать надоело
Igor
Ещё написал либу для websocket'ов потому что не нашёл вменяемых не на роксе, нигде
Snusmumriken
Надо стараться заставлять себя использовать чужие библиотеки и изучать и их тоже. Это может быть сложно, я не всегда могу себя заставить, например. Нужно больше силы воли.
Igor
Я просто в шоке был от того, что там ворочают
Igor
Один вообще вебсокеты на копасе запилил
Igor
Очень жирно получилось
Igor
В итоге после долгих поисков чего-то удобного сел за RFC, начитался вдоволь и написал свою либу
Snusmumriken
Не забудь выложить на гит и луарокс : )
Igor
Ну мои вебсокеты работают только в паре с моими сокетами, а там жуть
Snusmumriken
Потому что затея крутая, я тоже капитально болен велосипедописанием, но стараюсь вылечиться.
Igor
Надо всё рефакторить и отлаживать
Igor
К тому же весь мой проект сервера и так уже на гите, там все эти библиотеки применяются
Igor
Могу поделиться, если интересно посмотреть
Igor
Но там много жути
Snusmumriken
Ой, да ладно. Обычному юзеру пофигу как работает, пока есть дока, и оно соответствует ей.
Igor
https://github.com/igor725/LuaClassic
Igor
Я доки не пилил вообще
Igor
Потому что над проектом только два человека работает, а так больше никто о нём не знает особо и в доках смысла пока не вижу
Snusmumriken
Круть, но велосипедостроительство : )
Igor
Это ещё что такое
Igor
То сегфолты, то Bus error'ы какие-то
Igor
Помню с сегфолтом боролся около двух недель, а оказалось, что он был в функции parseIPv4, я под char array выделил 15 байт, а нужно было 16 и когда ip подключаемого игрока был длиннее 14 символов происходил сегфолт