Uživatelé komunikátoru Signal si mohou svá data přímo v Signalu bezpečně zálohovat a v případě rozbití nebo ztráty telefonu následně na novém telefonu obnovit. Zálohování posledních 45 dnů je zdarma. Nad 45 dnů je zpoplatněno částkou 1,99 dolaru měsíčně.
Server Groklaw, zaměřený na kauzy jako právní spory SCO týkající se Linuxu, skončil před 12 lety, resp. doména stále existuje, ale web obsahuje spam propagující hazardní hry. LWN.net proto v úvodníku připomíná důležitost zachovávání komunitních zdrojů a upozorňuje, že Internet Archive je také jen jeden.
Jakub Vrána vydal Adminer ve verzi 5.4.0: "Delší dobu se v Admineru neobjevila žádná závažná chyba, tak jsem nemusel vydávat novou verzi, až počet změn hodně nabobtnal."
V Německu slavnostně uvedli do provozu (en) nejrychlejší počítač v Evropě. Superpočítač Jupiter se nachází ve výzkumném ústavu v Jülichu na západě země, podle německého kancléře Friedricha Merze otevírá nové možnosti pro trénování modelů umělé inteligence (AI) i pro vědecké simulace. Superpočítač Jupiter je nejrychlejší v Evropě a čtvrtý nejrychlejší na světě (TOP500). „Chceme, aby se z Německa stal národ umělé inteligence,“ uvedl na
… více »V Berlíně probíhá konference vývojářů a uživatelů desktopového prostředí KDE Plasma Akademy 2025. Při té příležitosti byla oznámena alfa verze nové linuxové distribuce KDE Linux.
Byl vydán Debian 13.1, tj. první opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.12, tj. dvanáctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
Evropská komise potrestala Google ze skupiny Alphabet pokutou 2,95 miliardy eur (71,9 miliardy Kč) za porušení antimonopolní legislativy. Podle EK, která mimo jiné plní funkci antimonopolního orgánu EU, se Google dopustil protisoutěžních praktik ve svém reklamním byznysu. Google v reakci uvedl, že rozhodnutí považuje za chybné a hodlá se proti němu odvolat. EK ve věci rozhodovala na základě stížnosti Evropské rady vydavatelů. Podle
… více »Podpora 32bitového Firefoxu pro Linux skončí v roce 2026. Poslední podporované 32bitové verze budou Firefox 144 a Firefox 140 s rozšířenou podporou, jehož podpora skončí v září 2026.
Společnost Raspberry Pi nově nabízí Raspberry Pi SSD s kapacitou 1 TB za 70 dolarů.
Microsoft BASIC pro mikroprocesor 6502 byl uvolněn jako open source. Zdrojový kód je k dispozici na GitHubu.
asyncns_isdone(asyncns, q0)
, protoze pred nim se vola asyncns_cancel(asyncns, q0)
, ktera na q0 zavola free. Je to napsane i v tom headeru.
Pak pri asyncns_wait
u failne !q->done
v complete_query
. Teprve po odstraneni toho assertu to failuje jak je popsano ve clanku.
Vypada to ze pri pouziti asyncns_cancel
prijde nejaka odpoved (q1 nebo q2) dvakrat a proto failne ten assert !q->done
. Mozna mam tuseni cim to je. asyncns_cancel
asi zadnym zpusobem nerekne tomu threadu ktere vyrizuje q0, ze se na ten pozadavek ma vykaslat, akorat smaze veskere zaznamy o q0, takze ten thread pak posle odpoved na q0, asyncns_wait
se ji snazi zpracovat a chybne urci, ze se jedna o odpoved na q1 nebo q2. Kdyz dam asyncns_wait(asyncns, 1);
pred ten cancel, test funguje.
Failoval mi asyncns_isdone(asyncns, q0), protoze pred nim se vola asyncns_cancel(asyncns, q0), ktera na q0 zavola free.Tak na ten jsem se zatím nikdy nechytil, ale good catch, tahle kontrola tam nepatří.
Teprve po odstraneni toho assertu to failuje jak je popsano ve clanku.Takže teď jsme na stejné situaci.
Vypada to ze pri pouziti asyncns_cancel prijde nejaka odpoved (q1 nebo q2) dvakrat a proto failne ten assert !q->done.Ale mně failují až ty
getnext
, ne done
, a dokonce jako první odpověď vždy dostanu q1 nebo q2, až potom i to failuje. Trochu jsem to vylepšil.
diff --git a/tests/test-asyncns.c b/tests/test-asyncns.c index 80ed7b8..5194682 100644 --- a/tests/test-asyncns.c +++ b/tests/test-asyncns.c @@ -102,7 +102,6 @@ main(int argc, char **argv) asyncns_cancel(asyncns, q0); assert(asyncns_getnqueries(asyncns) == 0); assert(asyncns_getnext(asyncns) == NULL); - assert(!asyncns_isdone(asyncns, q0)); } /* Start first real query */ @@ -144,6 +143,9 @@ main(int argc, char **argv) status = asyncns_wait(asyncns, 0); assert(status == 0); + /* Check that the first query is no longer there */ + assert(asyncns_getnext(asyncns) != q1); + /* Now second query should be available via `asycns_getnext()` */ assert(asyncns_getnext(asyncns) == q2); @@ -157,6 +159,10 @@ main(int argc, char **argv) status = asyncns_wait(asyncns, 0); assert(status == 0); + /* Check that the old queries are no longer there */ + assert(asyncns_getnext(asyncns) != q1); + assert(asyncns_getnext(asyncns) != q2); + /* Now no more queries should be available via `asycns_getnext()` */ assert(asyncns_getnext(asyncns) == NULL);Zjistil jsem, že když to pustím v cyklu, tak se mi to náhodně zastaví na jedné z těch podmínek, kde to kontroluje, zda next není q1, což mi přijde dost divoké, zvlášť když je libasyncns schopná vrátit q1, po jeho zrušení q2 a po jeho zrušení zrušený q1.
diff --git a/tests/test-asyncns.c b/tests/test-asyncns.c index 5194682..099d78f 100644 --- a/tests/test-asyncns.c +++ b/tests/test-asyncns.c @@ -143,7 +143,8 @@ main(int argc, char **argv) status = asyncns_wait(asyncns, 0); assert(status == 0); - /* Check that the first query is no longer there */ + /* Check that the old queries are no longer there */ + assert(asyncns_getnext(asyncns) != q0); assert(asyncns_getnext(asyncns) != q1); /* Now second query should be available via `asycns_getnext()` */ @@ -160,6 +161,7 @@ main(int argc, char **argv) assert(status == 0); /* Check that the old queries are no longer there */ + assert(asyncns_getnext(asyncns) != q0); assert(asyncns_getnext(asyncns) != q1); assert(asyncns_getnext(asyncns) != q2);To je ale docela problém, protože libasyncns tak drží referenci na zrušená data, jestli to správně chápu, tu referenci dále používá a ještě navíc ji předává volajícímu. Ta funkce
asyncns_cancel()
je tím pádem v podstatě nevolatelná, pokud si člověk nechce rozsypat stav knihovny a aplikace.
Nevidim zadny mechanismus, ktery by mohl zabranit probihajicimu threadu poslat odpovedTo zní jako bug.
takze to k tomu asi neni vubec urcene.Erm...
/** Cancel a currently running query. q is is destroyed by this call * and may not be used any futher. */ void asyncns_cancel(asyncns_t *asyncns, asyncns_query_t* q);Dle dokumentace je to k tomu jednoznačně určené, jen to není naimplementované. Ovšem nemůžu přijít na minimální test, protože pokud vyzvednu zavolám
poll(timeout=100)
a asyncns_wait(block=1)
, tak asyncns_getnext()
správně vrátí NULL
a zdá se, že se to rozsype až s dalším dotazem a to ještě podle všeho nedeterministicky.
zavolám poll(timeout=100) a asyncns_wait(block=1), tak asyncns_getnext() správně vrátí NULL a zdá se, že se to rozsype až s dalším dotazemVe funkci handle_response (kterou vola wait na vsechny odpovedi) je:
if (!(q = lookup_query(asyncns, resp->id))) return 0;Pokud je jedinny query ten smazany, pak lookup_query nenajde zadny query odpovidajici id odpovedi a getnext vraci NULL. Pri vytvoreni noveho query se muze stat, ze se prideli stejne id jako q0. Nedeterministicke je to mozna proto, ze prideleni toho id je ovlivnene tim, jestli thread pro q0 uz skoncil.
MAX_QUERIES
.
diff --git a/libasyncns/asyncns.c b/libasyncns/asyncns.c index bc0b708..ada1d55 100644 --- a/libasyncns/asyncns.c +++ b/libasyncns/asyncns.c @@ -1474,6 +1474,10 @@ void asyncns_cancel(asyncns_t *asyncns, asyncns_query_t* q) { asyncns->n_queries--; free(q); + /* This is needed to avoid allocating the same id for the next query. */ + asyncns->current_index++; + asyncns->current_id++; + errno = saved_errno; }S tímhle patchem mi test probíhá bez problémů.
1) Schopnost redakčního systému kurvit blogy po každém uložení tím, že vyrábí falešné prázdné odstavce mezi kusy textu, které mají být skutečnými odstavci.
To robí wysiwyg. Vypnúť a pôjde to (teda aspoň mne to ide)
3) Emulátor terminálu Terminology zdá se občas vynechá prázdnou řádku a občas ne, netuším proč.
Nie sú tie riadky vypísané nejakým exotickejším spôsobom než \n? Ak sú vypísané pomocou riadiacich sekvencií mohlo by to znamenať, že terminology kopíruje relatívne surové dáta z terminálu. Možno sa mýlim, neskúšal som.
To robí wysiwyg.Nikoliv, ten nepoužívám.
Nie sú tie riadky vypísané nejakým exotickejším spôsobom než \n?Jsou to úplně stejné nové řádky jako ty, které to vezme. Ale není se čemu divit, celý Enlightenment 0.19 je tak nějak po různu pojebaný, chtělo by to ještě trochu péče.
Tiskni
Sdílej: