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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 17:02 | Pozvánky

Přijďte si popovídat o open source obecně a openSUSE konkrétně s dalšími uživateli a vývojáři. Oslava nového vydání openSUSE Leap se uskuteční 16. prosince od 17:00 v nových prostorách firmy SUSE v Praze. K dispozici bude nějaké občerstvení a DVD pro ty, kdo je sbírají nebo ještě mají mechaniku. Po párty v kanceláři se bude pokračovat v některé z hospod v okolí.

Miška | Komentářů: 6
dnes 14:55 | Zajímavý software

Byla vydána verze Alpha 1.0 otevřeného operačního systému pro chytré hodinky AsteroidOS. Podporovány jsou hodinky LG G Watch, LG G Watch Urbane, Asus ZenWatch 2 a Sony Smartwatch 3. Ukázka ovládání hodinek na YouTube. Jaroslav Řezník přednášel o AsteroidOS na chytrých hodinkách (videozáznam) na letošní konferenci OpenAlt.

Ladislav Hagara | Komentářů: 0
dnes 13:30 | Zajímavý software

Byly uvolněny zdrojové kódy známé rogue-like hry DoomRL. Počátky hry jsou v roce 2002. Je napsána ve FreePascalu a zdrojový kód je nyní k dispozici na GitHubu pod licencí GNU GPL 2.0. Autor pracuje na nové hře Jupiter Hell, která je moderním nástupcem DoomRL a na jejíž vývoj shání peníze prostřednictvím Kickstarteru.

Blaazen | Komentářů: 0
dnes 13:15 | Pozvánky

Přijďte s námi oslavit vydání Fedory 25. Na programu budou přednášky o novinkách, diskuse, neřízený networking atd. Release Party se bude konat 16. prosince v prostorách společnosti Etnetera. Na party budou volně k dispozici také propagační materiály, nová DVD s Fedorou 25 a samozřejmě občerstvení. Přednášky budou probíhat v češtině. Pro více informací se můžete podívat na web MojeFedora.cz. Jen připomínám, že tentokrát jsme zavedli

… více »
frantisekz | Komentářů: 0
včera 16:38 | Komunita

Byly zveřejněny videozáznamy přednášek a workshopů z letošní konference OpenAlt konané 5. a 6. listopadu v Brně. K videozáznamům lze přistupovat ze stránky na SuperLectures nebo přes program konference, detaily o vybrané přednášce nebo workshopu a dále kliknutím na ikonku filmového pásu. Celkově bylo zpracováno 65 hodin z 89 přednášek a workshopů.

Ladislav Hagara | Komentářů: 0
včera 11:30 | Komunita

Bylo oznámeno, že bude proveden bezpečnostní audit zdrojových kódů open source softwaru pro implementaci virtuálních privátních sítí OpenVPN. Audit provede Matthew D. Green (blog), uznávaný kryptolog a profesor na Univerzitě Johnse Hopkinse. Auditována bude verze 2.4 (aktuálně RC 1, stabilní verze je 2.3.14). Audit bude financován společností Private Internet Access [reddit].

Ladislav Hagara | Komentářů: 4
včera 06:00 | Komunita

Na YouTube byl publikován Blender Institute Reel 2016, ani ne dvouminutový sestřih z filmů, které vznikly za posledních 10 let díky Blender Institutu. V institutu aktuálně pracují na novém filmu Agent 327. Dění kolem filmu lze sledovat na Blender Cloudu. Videoukázka Agenta 327 z června letošního roku na YouTube.

Ladislav Hagara | Komentářů: 0
včera 01:02 | Zajímavý článek

Minulý týden byly vydány verze 1.2.3 a 1.1.7 webového poštovního klienta Roundcube. V oznámení o vydání bylo zmíněno řešení bezpečnostního problému nalezeného společností RIPS a souvisejícího s voláním funkce mail() v PHP. Tento týden byly zveřejněny podrobnosti. Útočník mohl pomocí speciálně připraveného emailu spustit na serveru libovolný příkaz. Stejně, jak je popsáno v článku Exploit PHP’s mail() to get remote code execution z roku 2014.

Ladislav Hagara | Komentářů: 1
8.12. 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

Ladislav Hagara | Komentářů: 1
8.12. 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 5
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (23%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 809 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: epoll, odebrání deskriptoru

6.5.2015 19:24 Jirka
epoll, odebrání deskriptoru
Přečteno: 188×
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 9.5.2015 18:03 pavlix | skóre: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 9.5.2015 18:09 pavlix | skóre: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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.