In any case, an implementation along the lines of tprivalloc seems ok,
and passes my naive test program.
#include <u.h>
#include <libc.h>
static Lock privlock;
static int privinit;
static u32int privmap;
extern void **_privates;
extern int _nprivates;
void **
privalloc(void)
{
void **p;
int i;
lock(&privlock);
for(i = 0; i < 32 && i < _nprivates; i++){
if((privmap & (1<<i)) == 0){
privmap |= 1<<i;
unlock(&privlock);
p = &_privates[i];
*p = nil;
return p;
}
}
unlock(&privlock);
return nil;
}
void
privfree(void **p)
{
int i;
if(p != nil){
i = p - _privates;
if(i < 0 || i > _nprivates || (privmap & (1<<i)) == 0)
abort();
lock(&privlock);
privmap &= ~(1<<i);
unlock(&privlock);
}
}