Portál AbcLinuxu, 30. dubna 2025 16:48
Záviset na rozšíření konkrétního kompilátoru mi přijde jako kravina.Není to rozšíření konkrétního kompilátoru a nemám zjištěno, zda na nějakých rozšířeních nezávisíme už teď, nebo zda na nich tak jako tak nezávisí některá z našich závislostí :).
Krom toho nejsem fanda snah dělat z C něco, co není (aka C++).My spíš řešíme, jestli nám to jako vývojářům a projektu pomůže nebo uškodí. Mně osobně z mnoha důvodů C++ nevyhovuje, zatímco tahle funkcionalita by mohla. A nezapomeň, že se bavíš o projektu postaveném nad knihovnou Glib s vlastním objektovým modelem.
Tady je především dobré si rozmyslet, kolik práce použití takového rozšíření ušetří. Teprve pokud se ukaže, že hodně, stojí to za případné problémy s kompatibilitou.Asi dost záleží na stylu práce. My používáme jako utility knihovnu Glib. Hodně věcí se za běhu programu kontroluje na chyby, ale obvykle nejde použít assert, protože je to systémový démon. Spousta chyb přitom vyloženě vyžaduje jen nějaký ladící výstup a ukončení funkce s jasně daným výsledkem (g_return_val_if_fail, g_return_val_if_reached apod). A nebo prosté return. Něco se dá uklízet pozpátku volanými GOTO, ale v tom se zase dělají chyby.
zrovna u cleanupů si tím ale vůbec nejsem jistý.NetworkManager je trochu specifický v tom, že většina jeho práce spočívá v komunikaci s dalšími knihovnami či procesy, případně udržuje informace datových stukturách, které si předávají signály. Takže velká část kódu spočívá v tom, že vyzískám třeba přes libnl od kernelu nějaké objekty, zkontroluju je, a na jejich základě předám další komponentě nějaké další informace. Colin tvrdí, že jenom na základě alokací může z NM vykopnout 1500 řádků kódu. Mně to v celkovém množství kódu až tak neoslňuje a zda nám to skutečně pomůže, to netuším. Ale zatím to vypadá, že když to umí i LLVM a když to bude muset umět každý kompilátor s ambicemi kompilovat běžné linuxové služby, tak by se s tím dalo smířit.
Hodně věcí se za běhu programu kontroluje na chyby, ale obvykle nejde použít assert, protože je to systémový démon.Opravdu nejde použít? Někdy je nejjednodušší všechen úklid při fatálních chybách zařídit tak, že se příslušná část programu spustí jako samostatný proces a až doběhne, vše se samo uvolní.
Něco se dá uklízet pozpátku volanými GOTO, ale v tom se zase dělají chyby.Myslíš? Mně naopak konstrukce typu
bool ok = 0;
if (!(x = malloc(sizeof(*x)))
goto failed_malloc;
if ((fd = open(...)) < 0)
goto failed_open;
ok = 1;
close(fd);
failed_open:
free(x);
failed_malloc:
return ok;
přijde jako jedna z nejpřehlednějších možných. Hlavně proto, že je v ní naprosto jasné, kudy program chodí a co kdy alokuje a uvolňuje. Cleanupovací atribut někdy až příliš zamlžuje, v jakém pořadí se věci dějí.
Opravdu nejde použít? Někdy je nejjednodušší všechen úklid při fatálních chybách zařídit tak, že se příslušná část programu spustí jako samostatný proces a až doběhne, vše se samo uvolní.Jde o volbu granularity. Abych aplikaci rozdělil tak, aby změna chyb z nefatálních na fatální udělala co nejméně škody, tak by těch procesů mohlo být docela hodně a jejich správa a komunikace s nimi by byla zbytečně náročná.
přijde jako jedna z nejpřehlednějších možných. Hlavně proto, že je v ní naprosto jasné, kudy program chodí a co kdy alokuje a uvolňuje. Cleanupovací atribut někdy až příliš zamlžuje, v jakém pořadí se věci dějí.Ale jo, já ti rozumím, že chceš všechno vidět jako by to bylo v assembleru :). Ale asi je ti jasné, že nám je pořadí nezávislých dealokací či třeba uvolnění file deskriptorů putna.
Ale asi je ti jasné, že nám je pořadí nezávislých dealokací či třeba uvolnění file deskriptorů putna.Jenže ono na tom pořadí tu a tam záleží a když ho popletu, dějí se věci... Proto mi přijde praktičtější pořadí dodržovat vždy a nepřemýšlet nad tím, kdy je to potřeba a kdy ne. Zkrátka alokace a dealokace jsou jako závorky a program by měl být správně uzávorkovaný.
Jenže ono na tom pořadí tu a tam záleží a když ho popletu, dějí se věci...Bavíme se stále ještě o pořadí uvolnění několika nezávislých alokací?
Zkrátka alokace a dealokace jsou jako závorkyTady se asi neshodneme.
Bavíme se stále ještě o pořadí uvolnění několika nezávislých alokací?Nikoliv. Bavíme se o uvolňování alokací, aniž by bylo potřeba přemýšlet o tom, zda zrovna jsou nezávislé nebo ne. V prakticky jakémkoliv větším programu dřív nebo později potkáš alokace, které nezávislé nejsou. Pokud si to o nich neuvědomíš, objeví se dost těžko debugovatelné chyby. Takže alternativy jsou dvě: buďto pokaždé přemýšlet, zda jsou nezávislé (nejen při psaní, ale i při každé budoucí úpravě kódu), nebo si zvyknout dodržovat pořadí všude. Mně se daleko víc osvědčilo dodržovat pořadí všude, protože je to zjevně správně a myšlenkovou kapacitu si mohu šetřit na ty části programu, které ji skutečně potřebují. Tohle je nejspíš největší problém programátorů v Céčku: stráví příliš mnoho úsilí ošetřováním všelijakých technických detailů a nezbude jim sil na to hlavní. Dobrý céčkař věnuje úsilí především na to, aby se těmi technickými detaily nemusel zabývat (třeba zavedením nějakých memory poolů, automatického resource trackingu, či třeba transakčního systému, nebo prostě jenom šikovnými konvencemi) a pak už od technikálií má klid na důležité věci.
Nikoliv. Bavíme se o uvolňování alokací, aniž by bylo potřeba přemýšlet o tom, zda zrovna jsou nezávislé nebo ne.To pak ano. Ale na to nenarážím, protože uvolňuju objekty a ne kusy paměti, tudíž v případě závislosti už v tuto chvíli, tedy i bez 'cleanup' nevolám free, ale specifickou uvolňovací funkci. Pokud bych to tak nedělal, což je možná tvůj případ, tak by to opravdu stálo za úvahu.
V prakticky jakémkoliv větším programu dřív nebo později potkáš alokace, které nezávislé nejsou. Pokud si to o nich neuvědomíš, objeví se dost těžko debugovatelné chyby. Takže alternativy jsou dvě: buďto pokaždé přemýšlet, zda jsou nezávislé (nejen při psaní, ale i při každé budoucí úpravě kódu), nebo si zvyknout dodržovat pořadí všude.V tuto chvíli opravdu pokaždé závislosti řešíme. To by se mělo týkat jak kódu NetworkManageru, tak nejspíš i většiny dalších projektů psaných nad Glib. A přemýšlím nad tím ne ve chvíli, kdy řeším dealokaci, ale už ve chvíli, kdy řeším alokaci.
Mně se daleko víc osvědčilo dodržovat pořadí všude, protože je to zjevně správně a myšlenkovou kapacitu si mohu šetřit na ty části programu, které ji skutečně potřebují.Chápu. Nicméně nám by to asi nic neušetřilo.
Tohle je nejspíš největší problém programátorů v Céčku: stráví příliš mnoho úsilí ošetřováním všelijakých technických detailů a nezbude jim sil na to hlavní. Dobrý céčkař věnuje úsilí především na to, aby se těmi technickými detaily nemusel zabývat (třeba zavedením nějakých memory poolů, automatického resource trackingu, či třeba transakčního systému, nebo prostě jenom šikovnými konvencemi) a pak už od technikálií má klid na důležité věci.Tak u nás se z toho důvodu na část věcí používají hotové prostředky z Glib a na většinu ostatních se používají alespoň stejné nebo podobné konvence. Tohle je věc, která přišla rovněž ze světa Glib, ale kvůli nepodpoře na MSVC nebyla zařazena přímo do Glib.
primarne jej pouziva Gnome a to si drzi striktni C89 kompatibilituNo jo, není od věci se občas podívat na kalendář a zkontrolovat, jaké se píše století
for
, mimo jiné proto, že je pak evidentní, že na proměnnou nesahám někde mimo cyklus, kde už nemá její hodnota smysl.
Sice NetworkManager je freedesktop.org projekt, ale primarne jej pouziva GnomeGnome je jen jedním z projektů, které komunikují s NetworkManagerem.
a to si drzi striktni C89 kompatibilitu.NetworkManager prý striktní C89 kompatibilitu nedrží, podle toho, co říkal Dan. Možná mi dával i nějaký konkrétní příklad, ale nevzpomínám si.
Je to predevsim z historickych duvodu a dnes mozna jiz tyto duvody pominuly, predpokladajic, ze Solaris, OpenBSD a dalsi uz presli na gcc ci clang.A jak je to s tím Gnome a případnou závislostí na systemd?
A jak je to s tím Gnome a případnou závislostí na systemd?Zatim se o tom dohadujou, neni to jen vec systemd, ale obecne tvrdych zavislosti. Vypada to tak, ze pro zakladni funkcionalitu bude relativne minimum zavislosti a pro tu rozsirenou uz bude potreba systemd. Takze zkompilovat to pujde, ale nebude se jednat o full feature set (coz ja to tak v podstate pouzivam v Gentoo, bez nekterych zbytecnych veci). Diskuze ale stale probiha.
Zatim se o tom dohadujou, neni to jen vec systemd, ale obecne tvrdych zavislosti. Vypada to tak, ze pro zakladni funkcionalitu bude relativne minimum zavislosti a pro tu rozsirenou uz bude potreba systemd.To by mě zajímalo, jaké volitelné funkce můžu těžit ze systemd.
systemd-logind
nahrazuje ConsoleKit, čili drobnosti jako zamykání session, uspávání, zakázání logind, aby obsluhoval některé speciální klávesy a podobně.
Stejně tak pro DM je logind
nezbytný, takže minimálně gdm
, tak i kdm
jej používají namísto ConsoleKitu.
No a systemd
byl od počátku psán jako univerzální správce "sezení", takže do budoucna i gnome-systemd-session
, nebo tak něco, ale to by nejspíše nešlo o volitelnou závislost Jednak systemd-logind nahrazuje ConsoleKit, čili drobnosti jako zamykání session, uspávání, zakázání logind, aby obsluhoval některé speciální klávesy a podobně.Ok, takže z toho máš pak takové XFCE…
Stejně tak pro DM je logind nezbytný, takže minimálně gdm, tak i kdm jej používají namísto ConsoleKitu.Co si tak pamatuju, tak gdm by mělo predatovat jak systemd, tak consolekit.
No a systemd byl od počátku psán jako univerzální správce "sezení"Až na to, že ne každý si pod slovem univerzální představuje Linux-only.
Další projekty, které na tomto rozšíření závisí jsou upstart a systemd, a pravděpodobně se přidají další. To naznačuje, že kompilátor pro linuxový svět tento atribut bude muset tak jako tak implementovat.Upstart neznam, ale vsadim se ze jako spravna canonicalovina nereflektuje nic za hranicemi LTS ubuntu. Systemd je, bez urazky, ditko stejnych rukou jako pulse audio. To bych nepovazoval za reprezentativni vzorek linuxoveho sveta. To spis samotnej network manager by se za nej dal povazovat.
To spis samotnej network manager by se za nej dal povazovat.To mě zajímá :).
Tak nejak mi pripada ze NM uspesne pronika ruznyma distrama bez toho aby vzbuzoval kontroverze jako vytvory canonicalu nebo poetteringa.Takhle… NetworkManager způsobuje problémy spíše chybami nebo chybějícími funkcemi, než vědomě vtisknutými vlastnostmi. A případné problémy se snažíme řešit. Ale v některých ohledech je jeho použití jako reprezentativního vzorku dosti nelichotivé.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.