static int dpram_thread(void *data) { int ret = 0; int i; struct file *filp; struct sched_param schedpar; dpram_task = current; daemonize("dpram_thread"); strcpy(current->comm, "multipdp"); schedpar.sched_priority = 1; sched_setscheduler(current, SCHED_FIFO, &schedpar); /* set signals to accept */ siginitsetinv(¤t->blocked, sigmask(SIGUSR1)); recalc_sigpending(); for (i = 0; i < 10; i++) { filp = dpram_open(); if (filp == NULL) { EPRINTK("dpram_open failed! retry\n"); msleep(1000); } else break; } if (filp == NULL) { EPRINTK("dpram_open failed!\n"); goto out; } dpram_filp = filp; /* send start signal */ complete(&dpram_complete); while (1) { ret = dpram_poll(filp); if (ret == -ERESTARTSYS) { if (sigismember(¤t->pending.signal, SIGUSR1)) { sigdelset(¤t->pending.signal, SIGUSR1); recalc_sigpending(); ret = 0; break; } } else if (ret < 0) { EPRINTK("dpram_poll() failed\n"); break; } else { char ch; ret = dpram_read(dpram_filp, &ch, sizeof(ch)); if(ret < 0) { return ret; } if (ch == 0x7f) { pdp_demux(); } } } dpram_close(filp); dpram_filp = NULL; out: dpram_task = NULL; /* send finish signal and exit */ complete_and_exit(&dpram_complete, ret); }
static int dpram_thread(void *data) { int ret = 0; //unsigned long flags; struct file *filp; dpram_task = current; daemonize("dpram_thread"); //reparent_to_init(); // for 2.6 kernel porting : this seems not to be used in driver // current->tty = NULL; // for 2.6 kernel porting strcpy(current->comm, "multipdp"); /* set signals to accept */ //spin_lock_irqsave(¤t->sigmask_lock, flags); // for 2.6 kernel proting siginitsetinv(¤t->blocked, sigmask(SIGUSR1)); //recalc_sigpending(current); recalc_sigpending(); //spin_unlock_irqrestore(¤t->sigmask_lock, flags); // for 2.6 kernel proting filp = dpram_open(); if (filp == NULL) { goto out; } dpram_filp = filp; /* send start signal */ complete(&dpram_complete); while (1) { ret = dpram_poll(filp); if (ret == -ERESTARTSYS) { if (sigismember(¤t->pending.signal, SIGUSR1)) { sigdelset(¤t->pending.signal, SIGUSR1); recalc_sigpending(); ret = 0; break; } } else if (ret < 0) { EPRINTK("dpram_poll() failed\n"); break; } else { char ch; dpram_read(dpram_filp, &ch, sizeof(ch)); if (ch == 0x7f) { pdp_demux(); } } try_to_freeze(); } dpram_close(filp); dpram_filp = NULL; out: dpram_task = NULL; /* send finish signal and exit */ complete_and_exit(&dpram_complete, ret); }