freebsd에서 raymond의 알고리즘을 사용하여 분산 상호 배제에 대한 지원을 구축 할 과제가 있습니다.freebsd (+ networking)에서 커널 스레드를 사용하는 올바른 방법
이렇게하려면 커널 스레드가 다른 시스템의 메시지에 대해 항상 udp 포트에서 수신 대기하고 그에 따라 작동해야합니다.
thread_create를 사용하여 스레드를 만들고 있지만, socreate를 호출 할 때마다 커널 패닉이 발생합니다. 내가하고있는 일을하는 가장 좋은 방법은 무엇입니까? freebsd에서 커널 네트워킹에 대한 좋은 자습서를 찾을 수 없었습니다.
또 다른 참고로, mainproc
변수가 올바르게 설정되지 않았을 수 있습니다. 현재 struct proc*
또는 struct thread*
을 어떻게 확인할 수 있습니까?
나의 현재 코드는 다음과 같다 :
static struct proc *mainproc;
static int val;
static int main_thread_finish;
static struct socket *listenso;
static struct sockaddr_in listenadr;
static void main_thread(void* data)
{
static int res;
printf("In thread\n");
res = socreate(AF_INET, &listenso, SOCK_DGRAM, IPPROTO_UDP, mainproc->p_ucred, mainproc->p_singlethread);
printf("socreate res: %d\n", res);
listenadr.sin_family = AF_INET;
listenadr.sin_port = htons(1234);
listenadr.sin_addr.s_addr = 0;
res = sobind(listenso, (struct sockaddr*)&listenadr, mainproc->p_singlethread);
printf("bind res: %d\n", res);
while(!main_thread_finish)
{
pause("DUMMY", hz);
}
printf("kthread exiting...\n");
kthread_exit();
}
static int
raymond_module_load(struct module *module, int cmd, void *arg)
{
int error = 0;
switch (cmd) {
case MOD_LOAD :
val = 12345;
main_thread_finish = 0;
kproc_create(main_thread, NULL, &mainproc, 0, 0, "raymond_main_thread");
printf("Module loaded - kthread created\n");
break;
case MOD_UNLOAD :
main_thread_finish = 1;
printf("Waiting for thread to exit...\n");
pause("TWAIT", 3*hz);
printf("Module unload...\n");
break;
default :
error = EOPNOTSUPP;
break;
}
return (error);
}
static moduledata_t raymond_module_data = {
.name = "raymond_module",
.evhand = raymond_module_load,
.priv = NULL };
DECLARE_MODULE(raymond_module, raymond_module_data, SI_SUB_KLD, SI_ORDER_ANY);