feat: add PidfdEntry and pidfdAt
This commit is contained in:
1 parent
fc4688937b
commit
41415c6d3c
1 file changed
+67
+67
@@ -0,0 +1,67 @@
|
||||
#include "pidfd.h"
|
||||
#include "sched.h"
|
||||
|
||||
typedef struct PidfdEntry {
|
||||
bool used;
|
||||
uint32 targetId;
|
||||
uint32 targetGeneration;
|
||||
} PidfdEntry;
|
||||
|
||||
static PidfdEntry pidfds[maxPidfds];
|
||||
|
||||
static PidfdEntry* pidfdAt(int handle)
|
||||
{
|
||||
if (handle < 0 || handle >= (int)maxPidfds)
|
||||
return nullptr;
|
||||
if (!pidfds[handle].used)
|
||||
return nullptr;
|
||||
return &pidfds[handle];
|
||||
}
|
||||
|
||||
static int allocPidfdSlot(void)
|
||||
{
|
||||
for (int i = 0; i < (int)maxPidfds; i++)
|
||||
if (!pidfds[i].used)
|
||||
return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int pidfdOpen(uint32 targetId)
|
||||
{
|
||||
if (targetId == 0 || targetId >= threadCapacity())
|
||||
return -1;
|
||||
if (threadAt(targetId)->state == threadUnused)
|
||||
return -1;
|
||||
|
||||
int slot = allocPidfdSlot();
|
||||
if (slot < 0)
|
||||
return -1;
|
||||
|
||||
pidfds[slot].used = true;
|
||||
pidfds[slot].targetId = targetId;
|
||||
pidfds[slot].targetGeneration = threadAt(targetId)->generation;
|
||||
return slot;
|
||||
}
|
||||
|
||||
uint32 pidfdTarget(int handle)
|
||||
{
|
||||
PidfdEntry* p = pidfdAt(handle);
|
||||
if (!p)
|
||||
return threadInvalidId;
|
||||
/* targetId was range/liveness-checked once, at pidfdOpen time, and
|
||||
never changes afterward -- threadAt is safe here without repeating
|
||||
that check. A mismatch means the slot has since been freed
|
||||
(threadReap/threadDiscard's memset zeroes Thread.generation back to
|
||||
0) or handed to an entirely different, unrelated thread. */
|
||||
if (threadAt(p->targetId)->generation != p->targetGeneration)
|
||||
return threadInvalidId;
|
||||
return p->targetId;
|
||||
}
|
||||
|
||||
void pidfdClose(int handle)
|
||||
{
|
||||
PidfdEntry* p = pidfdAt(handle);
|
||||
if (!p)
|
||||
return;
|
||||
p->used = false;
|
||||
}
|
||||
Reference in new issue
Block a user