abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 16:44 | IT novinky

    Firma IBM uvedla svůj první mikropočítač Personal Computer před 45 lety, v srpnu 1981. Základní konfigurace modelu 5150 za 1 565 tehdejších dolarů obsahovala desktop s Intel 8088 a 16KB RAM, Color Graphics Adapter a klávesnici. Právě klávesnice Model F/XT vybavené kapacitními spínači, vlivné a s převodníkem dodnes použitelné, připomíná sběratelský web Admiral Shark's Keyboards.

    |🇵🇸 | Komentářů: 0
    včera 14:22 | IT novinky

    Slovensko odhalilo ruské součástky ve dvou testovaných zařízeních na zjišťování přestupků v silničním provozu a označilo je za bezpečnostní riziko. S odvoláním na vyjádření slovenského Národního bezpečnostního úřadu (NBÚ) to včera oznámil ministr vnitra Matúš Šutaj Eštok. Zároveň ohlásil ukončení spolupráce svého úřadu s dodavatelem části uvedeného systému, slovenskou společností Soitron. Opozice, která na problematické kamery upozornila už dříve, vyzvala k odvolání ministra vnitra.

    Ladislav Hagara | Komentářů: 7
    včera 06:00 | IT novinky

    Dle plánu dnes ve 13:00 proběhne veřejný test eDokladů. Jeho cílem je ověřit připravenost aplikace a související infrastruktury na vysokou souběžnou zátěž před podzimními komunálními volbami.

    Ladislav Hagara | Komentářů: 16
    včera 04:11 | Nová verze

    Byla vydána nová verze 3.47 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.13 souvisejícího programovacího jazyka Dart (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    včera 04:00 | Nová verze

    Byla vydána nová verze 26.1 linuxové distribuce Manjaro (Wikipedie). Její kódové jméno je Bian-May. Ke stažení je v edicích GNOME, KDE PLASMA a XFCE.

    Ladislav Hagara | Komentářů: 0
    12.8. 19:00 | IT novinky

    Na akci Made by Google 2026 (YouTube) byla oficiálně představena jedenáctá generace telefonů Pixel s novým čipem Google Tensor G6 a hodinky Pixel Watch 5.

    Ladislav Hagara | Komentářů: 1
    12.8. 17:11 | Bezpečnostní upozornění

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) se spolu s partnery z dalších zemí připojil ke společnému upozornění (Joint Cybersecurity Advisory) týkajícímu se probíhající kybernetické kampaně skupiny LAUNDRY BEAR zaměřené na uživatele e-mailové platformy Zimbra Collaboration Suite (ZCS) nejméně od července 2025. NÚKIB doporučuje organizacím využívajícím Zimbra Collaboration Suite neprodleně ověřit, zda

    … více »
    Ladislav Hagara | Komentářů: 2
    12.8. 14:22 | Nová verze

    Intel vydal 42 upozornění na bezpečnostní chyby ve svých produktech. Současně vydal verzi 20260811 mikrokódů pro své procesory.

    Ladislav Hagara | Komentářů: 0
    12.8. 05:33 | Zajímavý článek

    Sny o designu GNOME Shellu, článek s náhledy a videi, představuje dlouhodobou vizi týmu GNOME pro vylepšení uživatelského rozhraní GNOME Shellu. Zatímco nedávné verze přinášely spíše drobné úpravy, designéři nyní plánují zásadnější změny.

    Ladislav Hagara | Komentářů: 14
    12.8. 05:22 | Nová verze

    Byla vydána nová verze 10.5 sady aplikací pro SSH komunikaci OpenSSH. Přináší řadu důležitých bezpečnostních oprav, vylepšení funkcí a oprav chyb. Nově vyžaduje podporu ECC (Elliptic Curve Cryptography) v libcrypto, včetně křivky NISTP521.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (18%)
     (30%)
     (6%)
     (6%)
     (2%)
     (15%)
     (23%)
    Celkem 2382 hlasů
     Komentářů: 31, poslední včera 00:27
    Rozcestník


    Dotaz: epoll, odebrání deskriptoru

    6.5.2015 19:24 Jirka
    epoll, odebrání deskriptoru
    Přečteno: 404×
    Ve své aplikaci používám epoll, počet monitorovaných file deskriptorů je v řádu stovek. epoll_wait() předávám buffer 100 epoll_event strukturami. Můj problém je, jak vyřešit odebrání deskriptoru. Ke každému mám přiřazeny "user data", jedná se o ukazatel na strukturu, která obsahuje pointer na funkci a další data spojená s daným typem deskriptoru. Přes epoll_ctl odeberu deskriptor, ale nelíbí se mi, že musím projít celé pole (resp. "jen" do výše zaplnění, což je obvykle ~80%), kontrolovat "user data", a pokud najdu ten správný, tak nastavit user data na NULL a pak takový ignoruji. Jde toto vyřešit nějak lépe?

    Odpovědi

    6.5.2015 21:30 Sten
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Moc nechápu, co děláte. epoll_wait vyplní poskytnuté pole epoll_eventů událostmi na registrovaných deskriptorech. Pokud přes epoll_ctl odeberete nějaký deskriptor, nebude epoll_wait události k tomu deskriptoru vracet, takže ve vráceném poli epoll_data_t asociovaný s tím deskriptorem nebude.
    6.5.2015 21:48 Jirka
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Já mám na mysli situaci, kdy mi epoll_wait naplní mé pole a zavolání callbacku - řekněme - prvního deskriptoru má za následek odebrání deskriptoru, který už byl taky "připraven" a vrácen do toho pole. Z epollu samozřejmě odeberu přes epoll_ctl, ale ještě mě to nutí projít celé to pole lineárně a hledat, jestli tam už není v připraveném stavu.
    6.5.2015 22:08 Sten
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    man epoll:
    If you use an event cache or store all the file descriptors returned from epoll_wait(2), then make sure to provide a way to mark its closure dynamically (i.e., caused by a previous event's processing). Suppose you receive 100 events from epoll_wait(2), and in event #47 a condition causes event #13 to be closed. If you remove the structure and close(2) the file descriptor for event #13, then your event cache might still say there are events waiting for that file descriptor causing confusion.

    One solution for this is to call, during the processing of event 47, epoll_ctl(EPOLL_CTL_DEL) to delete file descriptor 13 and close(2), then mark its associated data structure as removed and link it to a cleanup list. If you find another event for file descriptor 13 in your batch processing, you will discover the file descriptor had been previously removed and there will be no confusion.
    8.5.2015 12:29 Jirka
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Takže si mám vybrat mezi lineárním procházením všech nacachovaných položek při každém odebrání, nebo mezi malloc(), extra dereferencí a případným free() malých wrapper struktur při každém přidávání a volání.
    pavlix avatar 9.5.2015 18:03 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Vždyť tam píšou, že stačí tu strukturu namísto uvolnění označit jako zrušenou a teprve po projití všech události ji uvolnit.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 9.5.2015 18:03 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Píšeš to dost nesrozumitelně. Trochu mi to připomíná podobné problémy, které jsem s epoll řešil, tedy mám dojem, že konkrétně race condition mezi zrušením objektu a jeho vrácením v epoll. Můj problém byl hlavně v tom, že jsem měl nad epoll abstrakci a tudíž kód, který odhlašoval zdroj událostí neměl přístup k tomu seznamu. Mám dojem, že jsem použil nějaké nehezké dočasné řešení a měl bych se k tomu ještě vrátit a vyřešit to podle těch instrukcí v manuálové stránce.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 9.5.2015 18:09 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Když nad tím tak přemýšlím, tak ta abstrakce vede k tomu, že ty objekty nemají datovou položku pro označení za smazané a tudíž by v mém případě opravdu došlo na speciální objekt, který by tuto položku obsahoval a k tomu obsahoval i odkaz na ten objekt, kterého se to má týkad. To je mírně neefektivní, ale zásadní problém bych v tom neviděl.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    9.5.2015 19:55 Jirka
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Mé původní řešení je něco takového:
    #include <errno.h>
    #include <inttypes.h>
    #include <stdlib.h>
    #include <sys/epoll.h>
    #include <unistd.h>
    
    typedef struct JRPollable JRPollable;
    typedef void (*JRPollableReady)(JRPollable*, uint32_t);
    typedef struct JREpoll JREpoll;
    
    struct JRPollable
    {
    	JRPollableReady jrCallback;
    	int jrFD;
    	uint32_t jrEvents;
    };
    
    struct JREpoll
    {
    	int jrEpollFD;
    	int jrEventsAvail;
    	struct epoll_event jrEvents[100];
    	
    };
    
    int JREpoll_init(JREpoll *jrEpoll)
    {
    	jrEpoll->jrEpollFD = epoll_create1(EPOLL_CLOEXEC);
    	if (jrEpoll->jrEpollFD == -1)
    		return errno;
    	jrEpoll->jrEventsAvail = 0;
    	return 0;
    }
    
    int JREpoll_add(JREpoll *jrEpoll, JRPollable *jrPollable)
    {
    	struct epoll_event ee = { .events = jrPollable->jrEvents,
    							  .data = { .ptr = jrPollable } };
    
    	if (epoll_ctl(jrEpoll->jrEpollFD, EPOLL_CTL_ADD, jrPollable->jrFD, &ee) != 0)
    		return errno;
    	return 0;
    }
    
    int JREpoll_remove(JREpoll *jrEpoll, JRPollable *jrPollable)
    {
    	struct epoll_event kernelBugDummyEv_lt2_6_9;
    	if (epoll_ctl(jrEpoll->jrEpollFD, EPOLL_CTL_DEL, jrPollable->jrFD,
    				  &kernelBugDummyEv_lt2_6_9) != 0)
    		return errno;
    	
    
    	int avail = jrEpoll->jrEventsAvail;
    	struct epoll_event *events = jrEpoll->jrEvents;
    	
    	for (int i = 0; i < avail; ++i)
    	{
    		if (events[i].data.ptr == jrPollable) {
    			events[i] = events[avail-1];
    			--jrEpoll->jrEventsAvail;
    			break;
    		}
    	}
    
    	return 0;
    }
    
    int JREpoll_destroy(JREpoll *jrEpoll)
    {
    	if (close(jrEpoll->jrEpollFD) != 0)
    		return errno;
    	return 0;
    }
    
    int JREpoll_wait(JREpoll *jrEpoll)
    {
    	int ret = epoll_wait(jrEpoll->jrEpollFD, jrEpoll->jrEvents,
    						 sizeof(jrEpoll->jrEvents) / sizeof(struct epoll_event),
    						 -1);
    	if (ret < 0) {
    		int errnoSave = errno;
    		if (errnoSave != EINTR)
    			return errnoSave;
    		ret = 0;
    	}
    	jrEpoll->jrEventsAvail = ret;
    	return 0;
    }
    
    void JREpoll_dispatch(JREpoll *jrEpoll)
    {
    	struct epoll_event *events = jrEpoll->jrEvents;
    	
    	for (int avail = jrEpoll->jrEventsAvail;
    		 avail > 0;
    		 avail = jrEpoll->jrEventsAvail)
    	{
    		jrEpoll->jrEventsAvail = --avail;
    		
    		struct epoll_event ev = events[avail];
    		JRPollable *pollable = ev.data.ptr;
    		pollable->jrCallback(pollable, ev.events);
    	}
    }
    
    Ta struktura JRPollable může být pak součástí většího objektu, který v příslušném callbacku dostanu po "hrátkách" s offsetof(), nebo přetypováním, pokud je struktura jako první prvek. Schválně jsem to navrhl tímto stylem, abych se vyhnul extra alokacím. Strukturu JRPollable tedy vlastní samotný objekt, nikoliv ten epoll wrapper. Abych dosáhl tedy rychlejšího remove, tak se zdá, že se extra alokacím wrapperům nevyhnu, budu muset udržovat list odebraných položek a ty uvolňovat na konci cyklu, až projdu všechny položky.
    9.5.2015 20:04 Jirka
    Rozbalit Rozbalit vše Re: epoll, odebrání deskriptoru
    Jinak ten dispatch je psán tak, jak je, proto, že to musí být schopno rekurze.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.