Vláda USA nařídila společnosti Anthropic pozastavit přístup k modelům Fable 5 a Mythos 5 pro všechny cizince, včetně zaměstnanců Anthropicu.
Společnost Murena představila (YouTube) novou verzi 4.0 mobilního operačního systému /e/OS (Wikipedie) založeného na Androidu a LineageOS bez aplikací a služeb od Googlu.
V Arch User Repository (AUR) bylo kompromitováno přes 400 opomíjených balíčků (jejich seznam). Útočník do nich začlenil škodlivý npm balíček atomic-lockfile, který krade citlivá data uživatelů. Publikována byla předběžná analýza spouštěného malwaru deps.
Homebrew, správce balíčků nejen pro macOS, byl vydán ve verzi 6.0.0 (seznam změn). Hlavními novinkami jsou bezpečnostní mechanismus tap trust kvůli důvěryhodnosti závislostí, vylepšení sandboxingu na Linuxu, interní JSON API nebo zlepšení výkonu.
Byla nalezena a 9. června opravena kritická zranitelnost ve FreeBSD v Kernel TLS (KTLS). Pojmenována byla Bumsrakete (FreeBSD-SA-26:26.ktls, CVE-2026-45257). Lokální neprivilegovaný uživatel může přepisovat soubory, ke kterým má právo pouze pro čtení. Přepsáním setuid binárky a jejím spuštěním může získat roota. Na všech verzích od verze 13.0 vydané v dubnu 2021.
Vývojáři open source operačního systému ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows, se na síti 𝕏 pochlubili, že ReactOS zvládne počítačovou hru Half-Life.
Byla vydána nová verze 4.8 multiplatformního integrovaného vývojového prostředí (IDE) pro rychlý vývoj aplikaci (RAD) ve Free Pascalu Lazarus (Wikipedie). Využíván je Free Pascal Compiler (FPC) 3.2.2.
Apple container dospěl do verze 1.0.0. Jedná se o open source nástroj pro spouštění linuxových kontejnerů na macOS postavený nad containerization. Napsaný je v programovacím jazyce Swift a optimalizovaný pro Apple silicon.
Bylo vydáno Eclipse IDE 2026-06 aneb Eclipse 4.40. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.
Asterinas (GitHub) je v Rustu napsané jádro operačního systému poskytující s jádrem Linux kompatibilní ABI. Vydána byla verze 0.18.0. První distribucí postavenou nad jádrem Asterinas je Asterinas NixOS. Nejedná se o oficiální projekt NixOS a nemá nic společného s NixOS Foundation.
// C interface
alias extern(C) void function(void*) CallbackFunc;
extern(C) extern void nejaka_c_fce(CallbackFunc func, void* data);
extern(C) extern void cekej_na_callback();
//
class Bla
{
uint[] nejakyData;
this()
{
nejakyData = new uint[1024*1024*10]; // 40M
nejaka_c_fce(&cCallback, cast(void*)this);
}
void callback()
{
// něco tady
}
static extern(C) cCallback(void *data)
{
Bla self = cast(Bla)data;
self.callback();
}
}
// ...
Bla bla;
void main()
{
while (true)
{
bla = new Bla();
cekej_na_callback();
// tahle fce čeká na nějaký data a až dorazí
// tak zavolá ten callback v tomhle samým vlákně,
// pak vrátí
}
}
Něco v tom stylu výše. Referenci na objekt samozřejmě držím stranou, dokud není zavolán callback, takže problém se zrušením objektu by neměl nastat (a ani nenastane, o čemž jsem se přesvědčil přidáním destruktoru).
const(void*)this, tak kód funguje.
import std.stdio;
import core.thread;
//import wayland.callback;
class Callback
{
void delegate(uint) m_callback;
Callback m_next;
uint[] m_lotsOfData;
public this(void delegate(uint) cb)
{
writefln("Callback %s create", cast(void*)this);
m_lotsOfData = new uint[1024*1024*10]; // 40M
writefln("Callback %s alloc done", cast(void*)this);
m_callback = cb;
}
~this()
{
writefln("Callback %s destroy", cast(void*)this);
}
public void call(uint bla)
{
m_callback(bla);
}
}
class Bla
{
Callback m_callbacks;
Callback m_last;
public Callback createCallback(void delegate(uint) cb)
{
Callback ret = new Callback(cb);
if (m_last is null)
m_callbacks = ret;
else
m_last.m_next = ret;
m_last = ret;
return ret;
}
public Callback createCallback(void function(uint) cb)
{
return createCallback( (uint bla) { cb(bla); } );
}
public void run()
{
while (m_callbacks !is null)
{
Callback cb = m_callbacks;
m_callbacks = cb.m_next;
cb.m_next = null;
if (m_callbacks is null)
m_last = null;
cb.call(111);
}
}
}
Bla bla;
void proc(uint serial)
{
writeln("call");
Thread.sleep(dur!("msecs")(10));
bla.createCallback(&proc);
}
void main()
{
bla = new Bla();
bla.createCallback(&proc);
bla.run();
}
/*
Display display;
SyncCallback cb;
void proc(uint serial)
{
writeln("sync");
Thread.sleep(dur!("msecs")(10));
cb = display.sync(&proc);
}
void main()
{
display = new Display(null);
cb = display.sync(&proc);
while (true)
display.dispatch();
}
*/
Řešení dotazu:
Jseš si jistý, že třída v D bude binárně kompatibilní se třídou v C++? Já si myslím, že to zaručeno není:
http//www.digitalmars.com/d/1.0/class.html
The D compiler is free to rearrange the order of fields in a class to optimally pack them in an implementation-defined manner.
Možná to nefunguje z tohoto důvodu:
http://www.digitalmars.com/d/1.0/garbage.html
void* p; ... int x = cast(int)p; // error: undefined behavior
garbage collector v D takové přetypování nedovoluje udělat
Přečti si všechno, co se píše v tom odkazu. Je úplně jedno, jestli přetypováváš na int nebo na instanci nějaké třídy. Navíc garbage collector v D se může kdykoliv rozhodnout přesunout ten objekt v paměti jinam, takže jakýkoliv void pointer ztrácí platnost (což bude ten důvod, proč to padá):
A copying garbage collector can arbitrarily move objects around in memory
Možný workaround by byl získat pointer na referenci místo objektu, ale musel bys zajistit, že ta reference nezanikne a taky to není hezké řešení.
A copying garbage collector can arbitrarily move objects around in memoryTo zní docela zajímavě. Možná by Jardíkovi pomohl odkaz na nějaké howto jak předávat callbacky s odkazem na třídu, protože to při kombinování D a C musí být každodenní use case. Není něco takového? Přecijem je D novější jazyk než C a tudíž se dá počítat, že chce fungovat i ve stávajícím ekosystému.
// Typical C-style callback mechanism; the passed function
// is invoked with the user-supplied context pointer at a
// later point.
extern(C) void addCallback(void function(void*), void*);
// Allocate an object on the GC heap (this would usually be
)// some application-specific context data.
auto context = new Object;
// Make sure that it is not collected even if it is no
// longer referenced from D code (stack, GC heap, …).
GC.addRoot(cast(void*)context);
// Also ensure that a moving collector does not relocate
// the object.
GC.setAttr(cast(void*)context, GC.BlkAttr.NO_MOVE);
// Now context can be safely passed to the C library.
addCallback(&myHandler, cast(void*)context);
extern(C) void myHandler(void* ctx)
{
// Assuming that the callback is invoked only once, the
// added root can be removed again now to allow the GC
// to collect it later.
GC.removeRoot(ctx);
GC.clrAttr(ctx, GC.BlkAttr.NO_MOVE);
auto context = cast(Object)ctx;
// Use context here…
}
Tiskni
Sdílej: