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

Attachment: signature.asc
Description: PGP signature

Reply via email to