gentoo.ru
Официальная конференция Direct Connect клиента EiskaltDC++
eiskaltdc@conference.gentoo.ru
Понедельник, 17 июня 2013< ^ >
Tehnick установил(а) тему: Конференция разработчиков EiskaltDC++ | Conference of EiskaltDC++ developers
Site: https://code.google.com/p/eiskaltdc/
Logs: http://gentoo.ru/jabber/logs/eiskaltdc@conference.gentoo.ru/2013/
Bug tracker: https://code.google.com/p/eiskaltdc/issues/list
Notes for developers: https://code.google.com/p/eiskaltdc/wiki/notes_for_developers
How To Ask Questions The Smart Way: http://catb.org/%7Eesr/faqs/smart-questions.html
Как правильно задавать вопросы: http://parallel.ru/cluster/smart-questions-ru.html
Last stable release: 2.2.7 (2012-05-29)
Release schedule:
* 2013-06-23 Release EiskaltDC++ 2.2.8
Конфигурация комнаты
Участники комнаты

GMT+4
[00:28:07] Tehnick установил(а) тему: Конференция разработчиков EiskaltDC++ | Conference of EiskaltDC++ developers
Site: https://code.google.com/p/eiskaltdc/
Logs: http://gentoo.ru/jabber/logs/eiskaltdc@conference.gentoo.ru/2013/
Bug tracker: https://code.google.com/p/eiskaltdc/issues/list
Notes for developers: https://code.google.com/p/eiskaltdc/wiki/notes_for_developers
How To Ask Questions The Smart Way: http://catb.org/%7Eesr/faqs/smart-questions.html
Как правильно задавать вопросы: http://parallel.ru/cluster/smart-questions-ru.html
Last stable release: 2.2.7 (2012-05-29)
Release schedule:
* 2013-06-23 Release EiskaltDC++ 2.2.8

[00:36:17] <Tehnick> soulhunter, что там за ошибка сборки под макосью?
[00:37:21] <soulhunter> Tehnick: слушай, я уже сплю, давай завтра тебе на почту все скину подробно, в том числе где я находил инфу по этому вопросу, щас уже сплю почти? надо все подсобрать в кучу )
[00:37:45] <Tehnick> soulhunter, хорошо. Пока.
[00:38:04] <soulhunter> пока
[00:42:01] dhamp вышел(а) из комнаты
[01:02:45] dhamp вошёл(а) в комнату
[01:58:23] Tehnick вышел(а) из комнаты
[02:30:14] dhamp вышел(а) из комнаты
[03:47:20] soulhunter вышел(а) из комнаты
[08:24:25] dhamp вошёл(а) в комнату
[09:11:58] mars1an вошёл(а) в комнату
[09:40:42] soulhunter вошёл(а) в комнату
[09:41:43] soulhunter вышел(а) из комнаты
[09:49:38] Diger вошёл(а) в комнату
[10:21:53] Alexey вошёл(а) в комнату
[10:33:38] flylinkdc вошёл(а) в комнату
[10:40:25] dhamp вышел(а) из комнаты
[10:44:31] Diger вышел(а) из комнаты
[11:13:09] <flylinkdc> Всем привет. DO_NOT_USE_MUTEX кто может рассказать про конструкцию Lock lock() { return Lock(cs); }  как оно работает?
[11:13:44] <flylinkdc> и как она может быть эквивалента паре опаций
[11:13:45] <flylinkdc>     void lock() noexcept { cs.lock(); }
    void unlock() noexcept { cs.unlock(); }
[11:31:43] Diger вошёл(а) в комнату
[11:48:00] Diger вышел(а) из комнаты
[11:59:12] soulhunter вошёл(а) в комнату
[12:40:53] gelraen вошёл(а) в комнату
[12:45:26] soulhunter вышел(а) из комнаты
[13:23:30] Tehnick вошёл(а) в комнату
[13:23:48] <Tehnick> flylinkdc: что ты знаешь о мьютексах?
[13:24:34] <Tehnick> flylinkdc: на самом деле там все просто: нить блокируется при создании мьютекса и разблокируется при его уничтожении.
[13:26:32] <Tehnick> flylinkdc: самый простой вариант реализован в lock_guard:
https://github.com/eiskaltdcpp/eiskaltdcpp/blob/master/dcpp/CriticalSection.h#L30
[13:27:06] Diger вошёл(а) в комнату
[13:27:50] <Tehnick> s/при создании мьютекса/при создании блокировщика (который lock)/
[13:28:35] <Tehnick> Diger:
[23:55:28] <Tehnick> Diger, мастер-верка должна сейчас собираться в гайке без дополнительных телодвижений.
[23:55:42] <Tehnick> Diger, и работать тоже.
[13:29:08] <Diger> Tehnick: немного освобожусь - проверю
[13:29:19] Tehnick вышел(а) из комнаты
[13:31:33] Diger вышел(а) из комнаты
[13:32:47] Diger вошёл(а) в комнату
[13:36:02] Diger вышел(а) из комнаты
[13:36:25] Diger вошёл(а) в комнату
[13:43:25] Diger вышел(а) из комнаты
[14:17:16] FiliN вошёл(а) в комнату
[14:21:11] <flylinkdc> 1. функция lock внутри себя конструирует std::unique_lock<std::recursive_mutex>
[14:21:36] <flylinkdc> 2. по выходу из области видимости зовется деструктор для объекта Lock ?
[14:25:49] FiliN вышел(а) из комнаты: offline
[14:26:41] Diger вошёл(а) в комнату
[14:30:29] Tehnick вошёл(а) в комнату
[14:30:37] <Tehnick> flylinkdc: именно так
[14:32:18] <flylinkdc> при вызове деструктора идет временный unlock?
[14:32:56] <Tehnick> flylinkdc: не понял, почему временный?
[14:32:57] <flylinkdc> если идет, то это хрень
[14:33:20] <flylinkdc> когда функция заканчивается делается unlock и сразу lock
[14:33:53] <Tehnick> Нить должна блочиться, только когда отрабатывает конкретная функция или цикл.
[14:33:59] <Tehnick> Все нормально.
[14:34:13] <Tehnick> И разницы со старым вариантом кода нет.
[14:34:13] <flylinkdc> вот тело функции { return Lock(cs); }
[14:34:28] <flylinkdc> что защищает этот объект Lock ?
[14:34:35] <flylinkdc> он временный. создается и сразу разрушается
[14:34:37] <flylinkdc> так?
[14:35:07] <flylinkdc> Возвращаемый объект Lock уже имеет большее время жизни
[14:35:20] <flylinkdc> но я думаю что было и что стало не эквивалентно
[14:35:42] <flylinkdc> счас наверно сделаю мелкий текст где залогирую вызов деструткоров
[14:39:45] <Tehnick> flylinkdc:
[14:39:47] <Tehnick> typedef std::unique_lock<std::recursive_mutex> Lock;
[14:40:25] <Tehnick> Если я не ошибаюсь, мьютекс здесь рекурсивный...
[14:40:46] <flylinkdc> а рекурсивность тут причем?
[14:40:59] <flylinkdc> она просто позволяет одному потоку входить несколько раз в него
[14:41:30] <flylinkdc> в общем если деструктор в функции lcok срабатывает то данный код кривой
[14:41:50] <flylinkdc> он на определенный момент разлочивает мютекс
[14:42:16] <flylinkdc> вообще этот код откуда взялся?
[14:42:22] <flylinkdc> вы его сами написали?
[14:42:52] <Tehnick> flylinkdc: это вопрос к dhamp.
[14:43:16] <Tehnick> flylinkdc: но насколько я понимаю этот код, он не отличается от того, что было.
[14:43:40] <flylinkdc> как не отличается - ведь было две функции. с локом и анлоком
[14:44:35] <flylinkdc> я dhamp задавал вопрос когда он делал коммит - он проигнорил
[14:44:37] <Tehnick> И? Они вызывались вручную. А теперь то же самое делает простая обертка.
[14:45:37] <Tehnick> flylinkdc: я сейчас на работе и ограничен в возможностях. Если я простой пример сейчас напишу, ты сможешь проверить?
[14:45:57] <flylinkdc> {
Lock l_guard(cs);
.....
защищаемый код
.....
} // неявно зовется ~Lock для объекта l_guard и освобождается cs;
[14:46:08] <flylinkdc> вот как делается защита через лок
[14:46:26] <Tehnick> Да.
[14:46:31] <flylinkdc> в той функции что сейчас я не вижу подобного.
[14:47:02] <flylinkdc> я в онлайн компиляторе счас накидаю пример и кину
[14:47:06] <Tehnick> flylinkdc: в которой функции?
[14:47:14] <flylinkdc> его вывод. посмотрим сколько раз возовется unlock
[14:47:23] <Tehnick> flylinkdc: нука-нука, что за онлайн-компилятор?
[14:47:41] <flylinkdc> Lock lock() { return Lock(cs); } это функция?
[14:48:06] <flylinkdc> я вот этим пользуюсь - но их много http://codepad.org
[14:52:07] <Tehnick> Интересная штука, я попробую.
[14:52:13] dhamp вошёл(а) в комнату
[14:54:56] <flylinkdc> вот смотри - http://codepad.org/vJwvG1om
[14:54:59] <flylinkdc> аналог вашего кода
[14:55:07] <dhamp> [14:42:16] <flylinkdc> вообще этот код откуда взялся?
[14:42:22] <flylinkdc> вы его сами написали?
см исходники нашей CS(там где через boost::recursive_mutex && boost::detail::spinlock), исходники dc++ - тот же файл CS.h
[14:55:10] <flylinkdc> тут два раза срабатывает деструктор и конструктор
[14:55:31] <flylinkdc> dhamp не убегай
[14:55:54] <flylinkdc> вот этот код - Lock lock() { return Lock(cs); }  два раза лочит секцию и два раза ее отпускает
[14:55:59] <flylinkdc> ты согласен с этим?
[14:56:35] <flylinkdc> вот мини пример  http://codepad.org/vJwvG1om (только без секции)
[14:56:57] <dhamp> flylinkdc,не уверен что dданном случает при return сработает ещё раз конструктор
[14:57:04] <dhamp> в данном*
[14:57:36] <flylinkdc> доказательства?
[14:57:58] <flylinkdc> я на нашел в dc++ файла cs.h
[14:58:40] <flylinkdc> объект выходит из области видимости. по правилам С++ должен сработать деструктор
[14:58:55] <flylinkdc> т.к. он может содержать код который нужно выполнить.
[14:59:04] <dhamp> flylinkdc, "The class lock_guard is a mutex wrapper that provides a convenient RAII-style mechanism for owning a mutex for the duration of a scoped block.
When a lock_guard object is created, it attempts to take ownership of the mutex it is given. When control leaves the scope in which the lock_guard object was created, the lock_guard is destructed and the mutex is released.
[b]The lock_guard class is non-copyable[/b]"
[14:59:08] <dhamp> "The class unique_lock is a general-purpose mutex ownership wrapper allowing deferred locking, timed locking, recursive locking, transfer of lock ownership, and use with condition variables.
The unique_lock class is movable, but not copyable -- it meets the requirements of MoveConstructible and MoveAssignable but not of CopyConstructible or CopyAssignable. "
[14:59:10] <flylinkdc> компилятор не должен это игнорироовтаь даже если оно инлайнится
[14:59:36] <dhamp> разве для non-copyable - зовётся конструктор ?
[15:00:04] <dhamp> flylinkdc,
[15:00:58] <dhamp> flylinkdc, если бы у нас были просто std::mutex, std::recursive_mutex тогда да надо было бы делать cs.lock & cs.unlock
[15:01:05] <flylinkdc> в бусте как запрет копирования сделан? там тупо конструктор копии и оператор = делается приватным
[15:01:12] <dhamp> для буста аналогично
[15:01:24] <flylinkdc> ты можешь бреку поставить в том месте?
[15:01:31] <flylinkdc> и под отладкой пройти по шагам
[15:01:37] <flylinkdc> попадешь в деструктор или нет?
[15:02:19] <Tehnick> А мой код не компилится. =(
[15:03:07] <Tehnick> flylinkdc:
https://gist.github.com/tehnick/5796116
https://gist.github.com/tehnick/5796155
[15:03:33] <dhamp> flylinkdc, шас соберу демона, ибо его быстрее всего собирать.
breakpoint ты предлагаешь поставить в CS.h  или на Lock lock() { return Lock(cs); } ?
[15:03:38] <dhamp> или и там и там лучше
[15:03:39] <dhamp> ?
[15:04:01] <flylinkdc> на Lock lock() { return Lock(cs); } ?
[15:04:15] <dhamp> Tehnick, скопипастил же примеры
[15:05:09] <flylinkdc> кстати если сделато не копируемый то оно вообще не собирается http://codepad.org/3wA0n2lU
[15:05:27] <flylinkdc> error: 'boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)' is private compilation terminated due to -Wfatal-errors.
[15:07:14] <Tehnick> dhamp: первый --- измененная копипаста, второй --- аналогисный вариант с нашим подходом.
[15:07:23] <Tehnick> *аналогичный
[15:07:50] <flylinkdc> 2tehnick - может там компилер не новый и не все умеет.
[15:08:23] <flylinkdc> я еще вот этим пользовался http://liveworkspace.org/ тту можно версию гсс выбирать. но он счас что-то не работает.
[15:11:44] <Tehnick> "Read-only mode. At the moment the site is under maintenance."
[15:11:56] <Tehnick> Печально.
[15:12:40] <flylinkdc> dhamp ну как брека?
[15:12:47] <Tehnick> Попробую достучаться до домашнего ноута по ссш.
[15:18:52] FiliN вошёл(а) в комнату
[15:28:23] <dhamp> flylinkdc, гм поставил break на dcpp/ClientManager.h:147 у меня gdb останавливается на ClientManaget::newInstance() куда нужно через next & step не попасть.
в geany breakpoint не ставится.
[15:29:15] <flylinkdc> а в деструкторе CS.h можешь поставить отладочный std::cout << ?
[15:29:44] <flylinkdc> у тебя наверно релизный вариант. он инлайнит функции и поэтмоу не может зайти
[15:29:51] <flylinkdc> или DEBUG?
[15:30:22] <flylinkdc> не могу найти файл cs.h
[15:30:26] <flylinkdc> где он?
[15:30:42] <dhamp> CriticalSection.h
[15:31:12] <flylinkdc> )) не знал что ты файлы сокращаешь
[15:31:36] <dhamp> flylinkdc, -O2 -g -DNDEBUG флаги сборки
[15:31:56] <dhamp> или нужно вообще оптимизацию вырубить ?
[15:32:29] <flylinkdc> попробуй выключить
[15:32:43] <flylinkdc> а NDEBUG это ведь релиз?
[15:33:52] <dhamp> RELWITHDEBINFO - то бишь релиз с дебаг инфой
[15:34:34] <flylinkdc> NDEBUG в винде выключает Assert
[15:34:59] <flylinkdc> ну поэтому не заходит в функции. он их инлайнит
[15:35:26] <flylinkdc> инлайн выключить опцией в gcc ведь можно?
[15:35:32] <flylinkdc> знаешь как флаг зовется?
[15:35:52] <flylinkdc> или -O0 это сделает сам
[15:36:05] Tehnick вышел(а) из комнаты
[15:36:17] <dhamp> гм у демоне оказывается этот вызов вообще не делается
[15:36:29] <dhamp> только в gtk морде
[15:36:57] <flylinkdc> а демон что без синхронизации работает?
[15:37:09] <flylinkdc> там чем лочится ?
[15:37:10] <dhamp> там просто эта функция не нужна
[15:37:54] <dhamp> void Search::initHubs_gui()
{
    auto lock = ClientManager::getInstance()->lock();
    Client::List& clients = ClientManager::getInstance()->getClients();
    Client *client = NULL;
    for (auto it = clients.begin(); it != clients.end(); ++it)
    {
        client = *it;
        if (client->isConnected())
            addHub_gui(client->getHubName(), client->getHubUrl());
    }
#ifdef DO_NOT_USE_MUTEX
    ClientManager::getInstance()->unlock();
#endif // DO_NOT_USE_MUTEX
}
вообще я не пойму зачем тут лочится даже
[15:39:16] <dhamp> едиственный вариант если у нас getClients внезапно станет короче чем был будет сегфолт
[15:40:38] <flylinkdc> clients - это ведь контенер
[15:40:47] <flylinkdc> он может меняться другим потоком
[15:41:01] <flylinkdc> соответсвенно его нужно защищать
[15:41:08] <flylinkdc> а вот
[15:43:14] <dhamp> flylinkdc, а вот что ?
[15:43:34] <flylinkdc> данный код проще унести внутрь ClientManager в функции которая вертает vactor<pair<string,string>>
[15:43:56] <flylinkdc> а внтури юзать классический Lock l(cs)
[15:44:23] <flylinkdc> но это наверно не единственное место где так юзается?
[15:45:16] <flylinkdc> нашел поиском  auto lock несколько мест
[15:45:57] <flylinkdc> в общем у текущего кода возникает короткий дребезг мьютекса при формировании auto lock
[15:46:25] <dhamp> (gdb) bt
#0  __gthread_active_p () at /usr/include/c++/4.8.1/i686-pc-linux-gnu/bits/gthr-default.h:252
#1  0x0813b64d in __gthread_mutex_lock (__mutex=0x83540e8) at /usr/include/c++/4.8.1/i686-pc-linux-gnu/bits/gthr-default.h:747
#2  0x0813b6a3 in __gthread_recursive_mutex_lock (__mutex=0x83540e8) at /usr/include/c++/4.8.1/i686-pc-linux-gnu/bits/gthr-default.h:810
#3  0x0815eea9 in std::recursive_mutex::lock (this=0x83540e8) at /usr/include/c++/4.8.1/mutex:175
#4  0x08163973 in std::unique_lock<std::recursive_mutex>::lock (this=0xbfffebe4) at /usr/include/c++/4.8.1/mutex:511
#5  0x08160ca6 in std::unique_lock<std::recursive_mutex>::unique_lock (this=0xbfffebe4, __m=...) at /usr/include/c++/4.8.1/mutex:443
#6  0x081da0cf in dcpp::ClientManager::lock (this=0x83540a0) at /home/egik/work2/c/eiskaltdcpp/dcpp/ClientManager.h:147
[15:47:15] <dhamp> flylinkdc, и где тут искать конструктор ? )
[15:48:57] <flylinkdc> это брека в каком месте?
[15:49:49] <dhamp> dcpp::ClientManager::lock (this=0x83540a0) at /home/egik/work2/c/eiskaltdcpp/dcpp/ClientManager.h:147
[15:50:05] <dhamp>     Lock lock() { return Lock(cs); }
[15:50:05] Diger вышел(а) из комнаты
[15:50:20] <flylinkdc> а теперь выйди из этой функции
[15:50:22] Diger вошёл(а) в комнату
[15:50:37] <flylinkdc> будет вызван ~unique_lock() ?
[15:50:45] <flylinkdc> В котором будет _mutex.unlock();
[15:51:52] <dhamp> flylinkdc, нет такого вызова не было
[15:52:40] <flylinkdc> хм. вечером под виндой пройдусь под отладкой
[15:53:13] <flylinkdc> а когда деструктор срабатывает когда уже завершается initHubs_gui() ?
[15:55:30] Nikoli вышел(а) из комнаты
[15:55:57] <dhamp> step
std::unique_lock<std::recursive_mutex>::~unique_lock (this=0xbfffebe4, __in_chrg=<optimized out>) at /usr/include/c++/4.8.1/mutex:477
477          }
на выходе из функции initHubs_gui()
[15:56:04] <dhamp> flylinkdc,
[15:57:28] Nikoli вошёл(а) в комнату
[16:00:45] <flylinkdc> тогда значит все верно работает, но почему не понятно.
[16:01:22] <dhamp> flylinkdc, магия видать :D
[16:02:26] <flylinkdc> не думаю, вечером под отладкой в винде проверю. может это фишка auto
[16:03:10] <dhamp>       unique_lock(const unique_lock&) = delete;
      unique_lock& operator=(const unique_lock&) = delete;
      unique_lock(unique_lock&& __u) noexcept
      : _M_device(__u._M_device), _M_owns(__u._M_owns)
      {
    __u._M_device = 0;
    __u._M_owns = false;
      }
      unique_lock& operator=(unique_lock&& __u) noexcept
      {
    if(_M_owns)
      unlock();
    unique_lock(std::move(__u)).swap(*this);
    __u._M_device = 0;
    __u._M_owns = false;
    return *this;
      }
[16:03:24] <dhamp> flylinkdc, auto здесь вообще не причём
[16:03:24] Diger вышел(а) из комнаты
[16:04:25] <flylinkdc> понятно тут && юзается
[16:04:31] <flylinkdc> а какая версия буста?
[16:05:12] <dhamp> flylinkdc, это stl вообще то
[16:05:34] <flylinkdc> упс. точно
[16:05:47] <flylinkdc> в VC++2010 этого еще нет
[16:05:53] <flylinkdc> только в 2012 появилось.
[16:06:18] <dhamp> flylinkdc, не думаю что в бусте как-то подругому
[16:07:14] <flylinkdc> boost\boost\signals2\detail\unique_lock.hpp
[16:07:24] <flylinkdc>       template<typename Mutex>
      class unique_lock: public noncopyable
      {
      public:
        unique_lock(Mutex &m): _mutex(m)
        {
          _mutex.lock();
        }
        ~unique_lock()
        {
          _mutex.unlock();
        }
      private:
        Mutex &_mutex;
      };
[16:07:50] <flylinkdc> тут нет С++11
[16:08:23] <flylinkdc> нет перемещения
[16:09:33] <dhamp> flylinkdc, это хуже/лучше ?
[16:10:07] <flylinkdc> хуже. должен быть двойной вызов деструктора
[16:10:08] <flylinkdc> typedef boost::unique_lock<boost::recursive_mutex> Lock;
[16:10:20] <flylinkdc> у вас для win32 версии юзается буствоский
[16:10:28] <flylinkdc> это почему так сделали?
[16:11:12] <flylinkdc> виндовая версия ведь всеравно собирается gcc 4.8.1 ?
[16:11:43] <dhamp> flylinkdc, pavelvat собирает 4.6.3
[16:12:13] <flylinkdc> а почему не последней которая умеет С++11 ?
[16:12:23] <dhamp> flylinkdc, c его слов с помощью gcc 4.7 и 4.8 не собрать
[16:12:27] <flylinkdc> ту багу с Qt не победили?
[16:12:37] <flylinkdc> понятно.
[16:12:37] <dhamp> вообще никак
[16:54:18] FiliN вышел(а) из комнаты
[17:41:13] dhamp вышел(а) из комнаты
[17:41:23] dhamp вошёл(а) в комнату
[17:53:11] mars1an вышел(а) из комнаты
[18:27:36] Кирилл вошёл(а) в комнату
[18:43:46] flylinkdc вышел(а) из комнаты
[18:45:58] flylinkdc вошёл(а) в комнату
[20:18:01] nixtrian|home вышел(а) из комнаты
[20:18:11] nixtrian|home вошёл(а) в комнату
[21:15:15] Diger вошёл(а) в комнату
[21:37:49] Tehnick вошёл(а) в комнату
[22:13:21] gelraen вышел(а) из комнаты
[22:26:28] Alexey вышел(а) из комнаты
[22:29:33] Diger вышел(а) из комнаты
[22:30:47] Diger вошёл(а) в комнату
[22:31:18] Diger вышел(а) из комнаты
[22:42:56] dhamp вышел(а) из комнаты
[23:02:28] Кирилл вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!