On Mon 08 Jul 2019 at 14:41:26 -0500, Matthew D. Fuller wrote: > On Mon, Jul 08, 2019 at 11:08:25AM -0400 I heard the voice of > Stefan Monnier, and lo! it spake thus: > > > Actually, what we obviously need to do is get rid of TwmWindow > > > structs wholesale, just embed SQLite, and store our runtime data > > > there; then the indexes will find them for us! > > > > I don't follow. Wouldn't a hash-table work just as well? SQLite > > seems like a rather expensive way to implement a hash-table. > > I mean, I'm actually assuming an _array_ would work better than > either. But if I can't dream up insane anti-solutions that would > _technically_ work, what's the point of weekends anyway?
GetTwmWindow() uses XFindContext() to get our TwmWindow pointer from a
Window. That uses a hash table with a crappy hash function:
ctwm's win_utils.c:
stat = XFindContext(dpy, w, TwmContext, (XPointer *)&twmwin);
where TwmContext is from
// Allocate contexts/atoms/etc we use
TwmContext = XUniqueContext();
libX11/dist/src/Context.c:
/* Given an XID and a context, returns a value between 0 and HashSize-1.
* Currently, this requires that HashSize be a power of 2.
* */
#define Hash(db,rid,context) \
(db)->table[(((rid) << 1) + context) & (db)->mask]
/* Given an XID and context, returns the associated data. Note that data
here is a pointer since it is a return value. Returns nonzero error code
if an error has occured, 0 otherwise. Possible errors are Entry-not-found.
*/
int XFindContext(Display *display, XID rid, XContext context, XPointer *data)
{
register DB db;
register TableEntry entry;
#ifdef MOTIFBC
if (!display) db = NullDB; else
#endif
{
LockDisplay(display);
db = display->context_db;
UnlockDisplay(display);
}
if (!db)
return XCNOENT;
_XLockMutex(&db->linfo);
for (entry = Hash(db, rid, context); entry; entry = entry->next)
{
if (entry->rid == rid && entry->context == context) {
*data = (XPointer)entry->data;
_XUnlockMutex(&db->linfo);
return 0;
}
}
_XUnlockMutex(&db->linfo);
return XCNOENT;
}
Just fyi :-)
-Olaf.
--
___ Olaf 'Rhialto' Seibert -- "What good is a Ring of Power
\X/ rhialto/at/falu.nl -- if you're unable...to Speak." - Agent Elrond
signature.asc
Description: PGP signature
