📄 mk_discrim.cxx
字号:
/* * Copyright (C) 1998, 1999, 2001, Jonathan S. Shapiro. * * This file is part of the EROS Operating System. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <kerninc/kernel.hxx>#include <kerninc/Key.hxx>#include <kerninc/Invocation.hxx>#include <kerninc/Thread.hxx>#include <eros/Invoke.h>#include <eros/StdKeyType.h>#include <eros/DiscrimKey.h>voidDiscrimKey(Invocation& inv){ switch(inv.entry.code) { case OC_Discrim_Classify: inv.entry.key[0]->Prepare(); COMMIT_POINT(); inv.exit.code = RC_OK; /* until proven otherwise */ switch(inv.entry.key[0]->GetType()) { case KT_Number: inv.exit.w1 = Discrim_Class_Number; break; case KT_Resume: inv.exit.w1 = Discrim_Class_Resume; break; case KT_Page: case KT_Node: case KT_Segment:#ifdef KT_Wrapper case KT_Wrapper: /* FIX: Is this correct? */#endif inv.exit.w1 = Discrim_Class_Memory; break; case KT_Sched: inv.exit.w1 = Discrim_Class_Sched; break; case KT_Void: inv.exit.w1 = Discrim_Class_Void; break; default: inv.exit.w1 = Discrim_Class_Other; break; } return; case OC_Discrim_Verify: inv.entry.key[0]->Prepare(); COMMIT_POINT(); inv.exit.code = RC_OK; inv.exit.w1 = 0; /* default is not discreet */ switch(inv.entry.key[0]->GetType()) { case KT_Page: if (inv.entry.key[0]->IsReadOnly()) inv.exit.w1 = 1; break;#ifdef KT_Wrapper case KT_Wrapper:#endif case KT_Segment: case KT_Node: if (inv.entry.key[0]->IsReadOnly() && inv.entry.key[0]->IsNoCall() && inv.entry.key[0]->IsWeak()) inv.exit.w1 = 1; break; case KT_Number: inv.exit.w1 = 1; break; case KT_Discrim: case KT_Void: case KT_Returner: inv.exit.w1 = 1; break; default: break; } return; case OC_Discrim_Compare: inv.entry.key[0]->Prepare(); inv.entry.key[1]->Prepare(); COMMIT_POINT(); inv.exit.code = RC_OK; inv.exit.w1 = 1; if (inv.entry.key[0]->GetType() != inv.entry.key[1]->GetType()) inv.exit.w1 = 0; else if ( inv.entry.key[0]->IsObjectKey() ) { if ( inv.entry.key[0]->ok.pObj != inv.entry.key[1]->ok.pObj ) inv.exit.w1 = 0; } else { if (inv.entry.key[0]->nk.value[0] != inv.entry.key[0]->nk.value[0]) inv.exit.w1 = 0; if (inv.entry.key[0]->nk.value[1] != inv.entry.key[0]->nk.value[1]) inv.exit.w1 = 0; if (inv.entry.key[0]->nk.value[2] != inv.entry.key[0]->nk.value[2]) inv.exit.w1 = 0; } /* We do not compare the flags fields, as all of those bits are * purely kernel-internal. */ if (inv.entry.key[0]->keyData != inv.entry.key[1]->keyData) inv.exit.w1 = 0; return; case OC_KeyType: COMMIT_POINT(); inv.exit.code = RC_OK; inv.exit.w1 = inv.keyType; return; default: COMMIT_POINT(); break; } inv.exit.code = RC_UnknownRequest; return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -