Perl 6 - the future is here, just unevenly distributed

IRC log for #divine, 2015-11-14

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary

All times shown according to UTC.

Time Nick Message
02:48 ilbot3 joined #divine
02:48 Topic for #divine is now DIVINE: A Parallel LTL Model Checker (http://divine.fi.muni.cz) | http://irclog.perlgeek.de/divine/
05:13 xstill_ joined #divine
05:54 ilbot3 joined #divine
05:54 Topic for #divine is now DIVINE: A Parallel LTL Model Checker (http://divine.fi.muni.cz) | http://irclog.perlgeek.de/divine/
06:25 ilbot3 joined #divine
06:25 Topic for #divine is now DIVINE: A Parallel LTL Model Checker (http://divine.fi.muni.cz) | http://irclog.perlgeek.de/divine/
10:21 mornfall joined #divine
13:25 xstill není to zrovana rychle to přidávání cleanupů
13:34 xstill hm, clang někdy generuje invoke i na nounwind funkce a k nim landingpady které volají terminate…
13:36 xstill a taky generuje terminate landingpady do kterých nevede vůbec nic…
13:42 xstill mornfall: asi z toho udělám samostantnou transformaci, která udělá ty výjimky pozorovatelné v každé funkci a označí kam se dají vkládat cleanupy. Otázka je jestli ty pozice kódovat do mentadat, nebo pomocí nějakých intrinsiků (asi jsem pro metadata)
14:21 mornfall je potřeba je nějak označovat?
14:21 mornfall jsou to právě všechny exity z funkce ne?
14:52 xstill potřebuju označit, co se na tom exitu má smazat a čím je to zastoupené (může tam být phi node mezitím) a krom toho pro nezachycené alloca to může být i dřív (teoreticky)
14:54 xstill ne vždycky jsou totiž alloca deklarované ve vstupním bb
14:55 spito mornfall: pořád se mi nepodařilo zbavit se volání virtuální metody
14:55 spito teď to nechám být, ale možná budu potřebovat asistenci
15:02 xstill hm, to je fakt divný, když mám v té transformaci std::set tak to normálně funguje a valgrind si vůbec na nic nestěžuje,  když to vyměním za std::unordered_set, tak to cyklí a valgrind si stěžuje na neinicializovaný skok, tak nevím jestli mají chybu někde v libstdc++, nebo se mi podařilo rozbít haldu tak, že si toho valgrind nevšimne a náhodou se to rozbije (deterministicky) zrovna v
15:03 xstill tom unordered_set
15:10 mornfall a hasher je v pořádku?
15:11 xstill jo, ale začínám mít tušení, že za to může brick::union
15:12 mornfall union nemá definovanej hash přece?
15:13 xstill ale ten set je v unionu
15:13 mornfall hm
15:15 mornfall když tak koukám na ten union, zajímalo by mě jak se může proměnná jmenovat algignment (když se krom deklarace ještě 2x použije)
15:17 xstill tak, psal jsem to já…
15:45 xstill přemýšlím jestli jsem někdy napsal něco šílenějšího než brick::Union
15:51 xstill jo, blbej swap v unionu
15:59 xstill viz patche, jestli teda odešly
16:01 xstill hm, nejdřív vypnutej postfix, potom greylisting…
17:07 xstill už i lart běží 5x rychlejš v release :-D
17:08 xstill ale je veselý, když vyměním všechny std::unordered_set/map za std::set/map tak to běží víc než 2x tak rychle
18:07 spito xstill: tak a jsem asi v koncích
18:07 spito antea:~xweiser1/dp/lib/test.cpp
18:08 spito hint - tralala se nevzp93e
18:08 spito nevypíše
18:19 spito teda...clang to nedává, gcc v pohodě
18:19 xstill wtf
18:25 xstill a přitom to vypadá, že se to volá přes nějakou virtuální tabulku nebo tak něco
18:27 spito jo, ale nefunguje to
18:27 spito a ani v clangu 3.7
18:30 spito a je fakt krásný, jak se to dojebe
18:30 spito když si tu samou lambdu spustím v tom samém vlákně, tak to funguje, ale jakmile ji procpu skrz std::thread, tak pure virtual call
18:39 xstill to je solidní záhada
18:45 spito tam se regulérně ztrácí this
18:46 xstill ono v té lambdě to fakt má špatnou vtable
18:46 spito co mi ale fakt není jasný, jakto že divine s tímhle funguje
18:47 xstill jo no
18:54 xstill tyvole teď se mi to podařilo v debuggeru dostat do stavu, že se zavol ten správný main
18:54 xstill -> divine na to, je tam race
18:55 xstill nebo tak něco
18:56 xstill hm, divine je zbytečný
18:57 spito heh, až tak?
18:57 spito kde tam je race?
18:57 xstill taková veselá věc, destruktor mění vtable spátky na svou (nevím teda  proč), takže pokud doběhneš na konec scope tak ~Thread přepíše vtable
18:58 xstill zkus dát destruktor toho brick::Thread virtual
18:58 spito no jasně
18:58 xstill asi poprvé jsem úspěšně použil memory watchpoint (na místo kde je ta vtable)
18:58 spito my jsme dementi
18:58 spito ale fakt
18:58 spito
18:59 xstill tak, pořád nevím poroč ten krám přenastavuje vtable, to mi nedává moc smysl
18:59 xstill mornfall: netušíš ^^?
18:59 xstill mornfall: krám = nevirtuální destruktor předka
18:59 xstill spito: takže to pomohlo?
19:00 spito ne
19:00 spito wait for it...
19:00 spito nepomohlo
19:01 xstill nojo, dělá to furt
19:01 xstill proč sakra
19:02 xstill z nějakého úplně nepochopitelného důvodu mění vtable než zavolá stop
19:08 xstill to není až tak úplně nepochopitelný… ty totiž necheš z destruktoru volat metody potomků, protože už jsi je zdestruoval předtím
19:08 xstill ale je to hrozná past
19:09 xstill to asi znamená, že tohle nikdy nemůže fungovat bez race
19:13 spito kterou metodu z potomku volám?
19:14 xstill žádnou, ale on nejspíš "pro jistotu" přenastavuje vtable aby nezavolal v destruktoru něco z potomka
19:16 spito hmm...takže ta bricková věc nemůže z principu fungovat
19:16 xstill asi nemůže
19:16 spito tak proč to tam máme? :D
19:17 xstill tak já nevidím moc výhodu brick::Thread oproti std::thread (spíš nevýhody), ale tenhle problém asi nikoho moc nenapadl, a nasátáv dost zřídka (pokud ten main stihne mezitím nastartovat tak je to ok)
19:17 xstill ale je to pěknej neviditelnej race
19:18 xstill hej, tohle je taky dobrá prasečina: http://en.cppreference.com/w/cpp/language/destructor#Pure_virtual_destructors (něco pro Nikolu :-D) a vlastně toto co tu řešíme mu taky můžem říct :-D
19:19 xstill ale na cpp reference nic o tom našem problému není :-/
19:19 xstill a ve standardu se mi to fakt hledat nechce…
19:23 spito no, takže dobrý vědět, že brick::shmem::Thread můžeme zahodit
19:23 xstill v gcc to funguje stejně
19:23 xstill viz http://pastebin.dqd.cz/LMPX/
19:24 xstill takže jen ty thready v gcc náhodou startovali rychlejš :-D
19:24 spito heh
19:25 xstill to by byla otázka do zkoušky :-D
19:26 spito ohou, ale to tam dávat fakt nechceš
19:26 spito ale dobrý by bylo tohle zmínit na advanced C++
19:26 xstill nechci :-D
19:26 xstill ale jde to opravit
19:27 xstill nebo "opravit"
19:27 xstill obejít je lepší slovo
19:29 spito ne, tak jako jsem tukan, ono by to mělo jít vymyslet
19:29 xstill viz /tmp/bricks/brick-shmem.h
19:29 xstill na antee
19:30 xstill ještě blbě
19:30 xstill aha nejde to
19:30 xstill to je pořád race :-D
19:30 xstill takže to nejde opravit jde to jen "statisticky opravit"
19:31 spito no, právě bys potřeboval signál z toho mainu, který je implementovaný
19:31 spito a nebo sáhnout na destruktor poděděné třídy
19:31 xstill abys to dokázal opravit, tak bys musel být schopný nějak získat tu surovou adresu mainu z vtable a to asi nedáš
19:31 spito no, to nejde
19:32 xstill všechno marný :-D
19:32 spito zahodit a zapálit
19:34 xstill a uplatnit pojistku: https://www.xkcd.com/1469/
19:35 spito tak
19:35 spito ty bys totiž potřeboval dokončit destruktor poděděné třídy až v momentě, když skončí main
19:36 xstill jako pro divine to asi zatím nemusíme řešit, tam se budou stejně všechny ty paralelní algoritmy překopávat, ale jinak nepoužívat…
19:37 xstill jo, jenže to nedokážeš naspecifikovat v té bázové třídě no
19:38 xstill jako mohl bys to předělat tak, že main bude std::function< void() > a v konstrukoru si do toho nastavíš lambdu, ale pak už zase můžeš používat std::thread sámotný, nebo si ho jen obalit nějakým JoiningThread který ti v destruktoru zavolá ten join
19:41 xstill nejhorší je, že to s těma destruktorama asi nejde udělat v principu líp :-/
19:42 xstill jediná alternativa by byla úplně zakázat volat virtuální metody z destruktoru
19:42 xstill i když…
19:43 xstill možná bys mohl chtít aby se  vždycky staticky (ne přes vtable) volali ty podle aktuálního typu
19:44 xstill kdo ví co o tom říká standard
19:44 xstill spito: zkus ten příklad ve visual studiu, jen tak pro zajímavost
19:44 spito to se rozseká úplně stejně
19:45 xstill aha, ty nemůžeš volat ty funkce staticky, ony zase volají jiné funkce, atd… takže to asi fakt nejde líp
19:46 spito ha, nerozsekáno
19:46 spito nejde, musíš explicitně v destruktoru zavolat stop
19:47 spito ale v destruktoru toho X, ne Thread
19:47 spito a to je oser :D
19:48 xstill no jo, to samozřejmě můžeš, ale to je dost na hovno
19:50 xstill takto, kdybys z toho brick Thread udělal mixin a navázal to staticky, tak to bude fungovat
19:51 xstill ale pak to zas nepůjde použít tak jak chceme asi
19:52 xstill protože v parallel.h se to tam dodává pointrem
19:53 xstill jo, musel bys to rozdělit, shmem::thread by měl virtuální start a destruktor, shmem::ThreadImpl by byl mixin implementoval ten start a destruktor
19:53 xstill ale je to těžce nechutný
20:04 xstill ale máme hezký příklad do examples/llvm, jen ho teda bohužel nenašel divine dřív než já
20:16 xstill jo, to s tím mixinem by šlo
20:22 spito teď mi to nemyslí, takže to v tom nevidím
20:23 xstill antea:/tmp/thread.cpp +-
21:04 mornfall jde to opravit, ale není nutně smysluplný to dělat
21:04 xstill a jde to opravit jinak než tím mixinem?
21:04 xstill nebo redefinicí destruktoru v potomkovi
21:22 mornfall hm, asi to nejde opravit tak aby to dávalo smysl, protože když třeba X bude obsahovat vektor, tak se to rozsype ať už uděláš cokoliv; jedna možnost je v start() to naklonovat na haldě, ale to je taky dost nic moc
21:22 mornfall v divine ale chyba není, tam se join() volá explicitně
21:42 spito mornfall: jasný, ale i tak to obecně nechceš používat, protože zavolat destruktor bez předchozího join udělá undef behaviour
21:47 mornfall ?
21:47 mornfall 'i tak'?
22:05 spito no tak ne no

| Channels | #divine index | Today | | Search | Google Search | Plain-Text | summary