+ multiple process entries per event type

This commit is contained in:
Julian Hinxlage 2019-11-19 11:56:18 +01:00
parent b9882cb181
commit 3c76d941fa
3 changed files with 25 additions and 15 deletions

View File

@ -37,8 +37,11 @@ namespace vkvm {
auto callEvent(EventType type) -> bool {
auto ivt = getInterrupTable();
if (ivt[type].pid != 0) {
sendSignal(ivt[type].pid, ivt[type].signum);
for(int i = 0; i < impl.interruptEntrysPerEventType;i++){
auto &entry= ivt[type * impl.interruptEntrysPerEventType + i];
if (entry.pid != 0) {
sendSignal(entry.pid, entry.signum);
}
}
return true;
}

View File

@ -54,7 +54,8 @@ constexpr int keyboardBufferSize = 16;
int sharedMemoryPid;
key_t sharedMemoryKey;
int sharedMemorySize;
int interruptEntyCount = 64; //NOLINT
int interruptEntyCount = 256; //NOLINT
int interruptEntrysPerEventType = 8;
int reservedSize = 1024; //NOLINT
std::vector<std::function<void()>> eventTable;
};

View File

@ -37,21 +37,27 @@ namespace vkvm {
lockSharedMemory();
ivt[type].pid = getpid();
ivt[type].signum = signum;
impl.eventTable.push_back(handler);
for(int i = 0; i < impl.interruptEntrysPerEventType;i++){
auto &entry= ivt[type * impl.interruptEntrysPerEventType + i];
if (entry.pid == 0) {
onSignal(signum, [](int sig){
if(sig >= SIGUSR1){
if((sig - SIGUSR1) < impl.eventTable.size()){
impl.eventTable[sig - SIGUSR1]();
}
entry.pid = getpid();
entry.signum = signum;
impl.eventTable.push_back(handler);
onSignal(signum, [](int sig){
if(sig >= SIGUSR1){
if((sig - SIGUSR1) < impl.eventTable.size()){
impl.eventTable[sig - SIGUSR1]();
}
}
});
unlockSharedMemory();
return true;
}
});
}
unlockSharedMemory();
return true;
return false;
}
auto setPixel(int x, int y, Color color) -> bool {